From 1c0ddbf9eeb33f6bedc1fb9156e124b3a7b17bbc Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Sat, 13 May 2017 12:35:40 +1000 Subject: Handle method added for Boxes, Buttons, Widgets --- src/c_fl_box.cpp | 39 +++++++++++++++++++++++++++++++++++---- src/c_fl_box.h | 3 +++ src/c_fl_button.cpp | 39 +++++++++++++++++++++++++++++++++++---- src/c_fl_button.h | 2 ++ src/c_fl_widget.cpp | 27 +++++++++++++++++++++++---- src/c_fl_widget.h | 1 + src/fltk-enums.ads | 29 +++++++++++++++++++++++++++++ src/fltk-widgets-boxes.adb | 23 +++++++++++++++++++++++ src/fltk-widgets-boxes.ads | 6 ++++++ src/fltk-widgets-buttons.adb | 23 +++++++++++++++++++++++ src/fltk-widgets-buttons.ads | 6 ++++++ src/fltk-widgets.adb | 30 ++++++++++++++++++++++++++++++ src/fltk-widgets.ads | 16 ++++++++++++++++ 13 files changed, 232 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/c_fl_box.cpp b/src/c_fl_box.cpp index 18afb1a..40e527d 100644 --- a/src/c_fl_box.cpp +++ b/src/c_fl_box.cpp @@ -4,8 +4,14 @@ #include "c_fl_box.h" -typedef void (hook)(void*); -typedef hook* hook_p; + + +typedef void (d_hook)(void*); +typedef d_hook* d_hook_p; + + +typedef int (h_hook)(void*,int); +typedef h_hook* h_hook_p; @@ -15,10 +21,15 @@ class My_Box : public Fl_Box { using Fl_Box::Fl_Box; friend void box_set_draw_hook(BOX n, void * d); friend void fl_box_draw(BOX n); + friend void box_set_handle_hook(BOX n, void * h); + friend int fl_box_handle(BOX n, int e); protected: void draw(); void real_draw(); - hook_p draw_hook; + int handle(int e); + int real_handle(int e); + d_hook_p draw_hook; + h_hook_p handle_hook; }; @@ -32,8 +43,18 @@ void My_Box::real_draw() { } +int My_Box::handle(int e) { + return (*handle_hook)(this->user_data(), e); +} + + +int My_Box::real_handle(int e) { + return Fl_Box::handle(e); +} + + void box_set_draw_hook(BOX n, void * d) { - reinterpret_cast(n)->draw_hook = reinterpret_cast(d); + reinterpret_cast(n)->draw_hook = reinterpret_cast(d); } @@ -42,6 +63,16 @@ void fl_box_draw(BOX n) { } +void box_set_handle_hook(BOX n, void * h) { + reinterpret_cast(n)->handle_hook = reinterpret_cast(h); +} + + +int fl_box_handle(BOX n, int e) { + return reinterpret_cast(n)->real_handle(e); +} + + BOX new_fl_box(int x, int y, int w, int h, char* label) { diff --git a/src/c_fl_box.h b/src/c_fl_box.h index d1b69b1..22ab587 100644 --- a/src/c_fl_box.h +++ b/src/c_fl_box.h @@ -9,6 +9,9 @@ typedef void* BOX; extern "C" void box_set_draw_hook(BOX n, void * d); extern "C" void fl_box_draw(BOX n); +extern "C" void box_set_handle_hook(BOX n, void * h); +extern "C" int fl_box_handle(BOX n, int e); + extern "C" BOX new_fl_box(int x, int y, int w, int h, char * label); extern "C" void free_fl_box(BOX b); diff --git a/src/c_fl_button.cpp b/src/c_fl_button.cpp index f031ff9..725a0bc 100644 --- a/src/c_fl_button.cpp +++ b/src/c_fl_button.cpp @@ -4,8 +4,14 @@ #include "c_fl_button.h" -typedef void (hook)(void*); -typedef hook* hook_p; + + +typedef void (d_hook)(void*); +typedef d_hook* d_hook_p; + + +typedef int (h_hook)(void*,int); +typedef h_hook* h_hook_p; @@ -15,10 +21,15 @@ class My_Button : public Fl_Button { using Fl_Button::Fl_Button; friend void button_set_draw_hook(BUTTON b, void * d); friend void fl_button_draw(BUTTON b); + friend void button_set_handle_hook(BUTTON b, void * h); + friend int fl_button_handle(BUTTON b, int e); protected: void draw(); void real_draw(); - hook_p draw_hook; + int handle(int e); + int real_handle(int e); + d_hook_p draw_hook; + h_hook_p handle_hook; }; @@ -32,8 +43,18 @@ void My_Button::real_draw() { } +int My_Button::handle(int e) { + return (*handle_hook)(this->user_data(), e); +} + + +int My_Button::real_handle(int e) { + return Fl_Button::handle(e); +} + + void button_set_draw_hook(BUTTON b, void * d) { - reinterpret_cast(b)->draw_hook = reinterpret_cast(d); + reinterpret_cast(b)->draw_hook = reinterpret_cast(d); } @@ -42,6 +63,16 @@ void fl_button_draw(BUTTON b) { } +void button_set_handle_hook(BUTTON b, void * h) { + reinterpret_cast(b)->handle_hook = reinterpret_cast(h); +} + + +int fl_button_handle(BUTTON b, int e) { + return reinterpret_cast(b)->real_handle(e); +} + + BUTTON new_fl_button(int x, int y, int w, int h, char* label) { diff --git a/src/c_fl_button.h b/src/c_fl_button.h index 14faa2b..002c173 100644 --- a/src/c_fl_button.h +++ b/src/c_fl_button.h @@ -9,6 +9,8 @@ typedef void* BUTTON; extern "C" void button_set_draw_hook(BUTTON b, void * d); extern "C" void fl_button_draw(BUTTON b); +extern "C" void button_set_handle_hook(BUTTON b, void * h); +extern "C" int fl_button_handle(BUTTON b, int e); extern "C" BUTTON new_fl_button(int x, int y, int w, int h, char* label); extern "C" void free_fl_button(BUTTON b); diff --git a/src/c_fl_widget.cpp b/src/c_fl_widget.cpp index 6dab9fa..d13d612 100644 --- a/src/c_fl_widget.cpp +++ b/src/c_fl_widget.cpp @@ -5,8 +5,14 @@ #include "c_fl_widget.h" -typedef void (hook)(void*); -typedef hook* hook_p; + + +typedef void (d_hook)(void*); +typedef d_hook* d_hook_p; + + +typedef int (h_hook)(void*,int); +typedef h_hook* h_hook_p; @@ -15,10 +21,13 @@ class My_Widget : public Fl_Widget { public: using Fl_Widget::Fl_Widget; friend void widget_set_draw_hook(WIDGET w, void * d); + friend void widget_set_handle_hook(WIDGET w, void * h); friend WIDGET new_fl_widget(int x, int y, int w, int h, char* label); protected: void draw(); - hook_p draw_hook; + int handle(int e); + d_hook_p draw_hook; + h_hook_p handle_hook; }; @@ -27,8 +36,18 @@ void My_Widget::draw() { } +int My_Widget::handle(int e) { + return (*handle_hook)(this->user_data(), e); +} + + void widget_set_draw_hook(WIDGET w, void * d) { - reinterpret_cast(w)->draw_hook = reinterpret_cast(d); + reinterpret_cast(w)->draw_hook = reinterpret_cast(d); +} + + +void widget_set_handle_hook(WIDGET w, void * h) { + reinterpret_cast(w)->handle_hook = reinterpret_cast(h); } diff --git a/src/c_fl_widget.h b/src/c_fl_widget.h index b56d3e9..edb7ed3 100644 --- a/src/c_fl_widget.h +++ b/src/c_fl_widget.h @@ -8,6 +8,7 @@ typedef void* WIDGET; extern "C" void widget_set_draw_hook(WIDGET w, void * d); +extern "C" void widget_set_handle_hook(WIDGET w, void * h); extern "C" WIDGET new_fl_widget(int x, int y, int w, int h, char* label); diff --git a/src/fltk-enums.ads b/src/fltk-enums.ads index 91f7353..0057cec 100644 --- a/src/fltk-enums.ads +++ b/src/fltk-enums.ads @@ -99,6 +99,35 @@ package FLTK.Enums is Free_Label); + type Event_Kind is + (No_Event, + Push, + Release, + Enter, + Leave, + Drag, + Focus, + Unfocus, + Keydown, + Keyup, + Close, + Move, + Shortcut, + Deactivate, + Activate, + Hide, + Show, + Paste, + Selection_Clear, + Mouse_Wheel, + DnD_Enter, + DnD_Drag, + DnD_Leave, + DnD_Release, + Screen_Config_Changed, + Fullscreen); + + -- type Modifier_Key is private; type Modifier_Key is new Interfaces.Unsigned_8; diff --git a/src/fltk-widgets-boxes.adb b/src/fltk-widgets-boxes.adb index ed61168..a2d2335 100644 --- a/src/fltk-widgets-boxes.adb +++ b/src/fltk-widgets-boxes.adb @@ -12,10 +12,20 @@ package body FLTK.Widgets.Boxes is (W, D : in System.Address); pragma Import (C, box_set_draw_hook, "box_set_draw_hook"); + procedure box_set_handle_hook + (W, H : in System.Address); + pragma Import (C, box_set_handle_hook, "box_set_handle_hook"); + procedure fl_box_draw (W : in System.Address); pragma Import (C, fl_box_draw, "fl_box_draw"); + function fl_box_handle + (W : in System.Address; + E : in Interfaces.C.int) + return Interfaces.C.int; + pragma Import (C, fl_box_handle, "fl_box_handle"); + function new_fl_box (X, Y, W, H : in Interfaces.C.int; Text : in Interfaces.C.char_array) @@ -55,6 +65,18 @@ package body FLTK.Widgets.Boxes is + function Handle + (This : in out Box; + Event : in Event_Kind) + return Event_Outcome is + begin + return Event_Outcome'Val + (fl_box_handle (This.Void_Ptr, Event_Kind'Pos (Event))); + end Handle; + + + + procedure Finalize (This : in out Box) is begin @@ -86,6 +108,7 @@ package body FLTK.Widgets.Boxes is (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); box_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); + box_set_handle_hook (This.Void_Ptr, Handle_Hook'Address); end return; end Create; diff --git a/src/fltk-widgets-boxes.ads b/src/fltk-widgets-boxes.ads index 8fd5571..b3d2abd 100644 --- a/src/fltk-widgets-boxes.ads +++ b/src/fltk-widgets-boxes.ads @@ -16,6 +16,12 @@ package FLTK.Widgets.Boxes is (This : in out Box); + function Handle + (This : in out Box; + Event : in Event_Kind) + return Event_Outcome; + + private diff --git a/src/fltk-widgets-buttons.adb b/src/fltk-widgets-buttons.adb index bdc4810..aa9e7f3 100644 --- a/src/fltk-widgets-buttons.adb +++ b/src/fltk-widgets-buttons.adb @@ -12,10 +12,20 @@ package body FLTK.Widgets.Buttons is (W, D : in System.Address); pragma Import (C, button_set_draw_hook, "button_set_draw_hook"); + procedure button_set_handle_hook + (W, H : in System.Address); + pragma Import (C, button_set_handle_hook, "button_set_handle_hook"); + procedure fl_button_draw (W : in System.Address); pragma Import (C, fl_button_draw, "fl_button_draw"); + function fl_button_handle + (W : in System.Address; + E : in Interfaces.C.int) + return Interfaces.C.int; + pragma Import (C, fl_button_handle, "fl_button_handle"); + function new_fl_button (X, Y, W, H : in Interfaces.C.int; Text : in Interfaces.C.char_array) @@ -69,6 +79,18 @@ package body FLTK.Widgets.Buttons is + function Handle + (This : in out Button; + Event : in Event_Kind) + return Event_Outcome is + begin + return Event_Outcome'Val + (fl_button_handle (This.Void_Ptr, Event_Kind'Pos (Event))); + end Handle; + + + + procedure Finalize (This : in out Button) is begin @@ -100,6 +122,7 @@ package body FLTK.Widgets.Buttons is (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); button_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); + button_set_handle_hook (This.Void_Ptr, Draw_Hook'Address); end return; end Create; diff --git a/src/fltk-widgets-buttons.ads b/src/fltk-widgets-buttons.ads index f21fed4..981c313 100644 --- a/src/fltk-widgets-buttons.ads +++ b/src/fltk-widgets-buttons.ads @@ -33,6 +33,12 @@ package FLTK.Widgets.Buttons is (This : in out Button); + function Handle + (This : in out Button; + Event : in Event_Kind) + return Event_Outcome; + + private diff --git a/src/fltk-widgets.adb b/src/fltk-widgets.adb index 458a88c..6fee044 100644 --- a/src/fltk-widgets.adb +++ b/src/fltk-widgets.adb @@ -22,6 +22,10 @@ package body FLTK.Widgets is (W, D : in System.Address); pragma Import (C, widget_set_draw_hook, "widget_set_draw_hook"); + procedure widget_set_handle_hook + (W, H : in System.Address); + pragma Import (C, widget_set_handle_hook, "widget_set_handle_hook"); + function new_fl_widget (X, Y, W, H : in Interfaces.C.int; Text : in Interfaces.C.char_array) @@ -143,6 +147,31 @@ package body FLTK.Widgets is + function Handle_Hook + (U : in System.Address; + E : in Interfaces.C.int) + return Interfaces.C.int + is + Ada_Widget : access Widget'Class := + Widget_Convert.To_Pointer (U); + begin + return Event_Outcome'Pos (Ada_Widget.Handle (Event_Kind'Val (E))); + end Handle_Hook; + + + + + function Handle + (This : in out Widget; + Event : in Event_Kind) + return Event_Outcome is + begin + return Not_Handled; + end Handle; + + + + procedure Finalize (This : in out Widget) is begin @@ -173,6 +202,7 @@ package body FLTK.Widgets is (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); widget_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); + widget_set_handle_hook (This.Void_Ptr, Handle_Hook'Address); end return; end Create; diff --git a/src/fltk-widgets.ads b/src/fltk-widgets.ads index 56bad0a..f724507 100644 --- a/src/fltk-widgets.ads +++ b/src/fltk-widgets.ads @@ -6,6 +6,7 @@ limited with FLTK.Widgets.Groups; private with System; private with System.Address_To_Access_Conversions; private with Ada.Unchecked_Conversion; +private with Interfaces.C; package FLTK.Widgets is @@ -22,6 +23,8 @@ package FLTK.Widgets is Normal_Size : constant Font_Size := 14; type Color is new Natural; + type Event_Outcome is (Not_Handled, Handled); + function Create (X, Y, W, H : in Integer; @@ -133,6 +136,12 @@ package FLTK.Widgets is (This : in out Widget) is null; + function Handle + (This : in out Widget; + Event : in Event_Kind) + return Event_Outcome; + + private @@ -143,6 +152,13 @@ private end record; + function Handle_Hook + (U : in System.Address; + E : in Interfaces.C.int) + return Interfaces.C.int; + pragma Convention (C, Handle_Hook); + + overriding procedure Finalize (This : in out Widget); -- cgit