From 9348c8013431bbd5de165d8fbac13b783d983324 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Mon, 1 May 2017 11:49:21 +1000 Subject: Draw method implemented for all Window subpackages --- src/c_fl_double_window.cpp | 52 ++++++++++++++++++--- src/c_fl_double_window.h | 3 ++ src/c_fl_menu_window.cpp | 60 +++++++++++++++++++++---- src/c_fl_menu_window.h | 3 ++ src/c_fl_single_window.cpp | 52 ++++++++++++++++++--- src/c_fl_single_window.h | 3 ++ src/fltk-widgets-groups-windows-double.adb | 34 ++++++++++++++ src/fltk-widgets-groups-windows-double.ads | 8 ++++ src/fltk-widgets-groups-windows-single-menu.adb | 34 ++++++++++++++ src/fltk-widgets-groups-windows-single-menu.ads | 8 ++++ src/fltk-widgets-groups-windows-single.adb | 34 ++++++++++++++ src/fltk-widgets-groups-windows-single.ads | 8 ++++ 12 files changed, 280 insertions(+), 19 deletions(-) diff --git a/src/c_fl_double_window.cpp b/src/c_fl_double_window.cpp index 7f29af8..ff9a596 100644 --- a/src/c_fl_double_window.cpp +++ b/src/c_fl_double_window.cpp @@ -4,29 +4,71 @@ #include "c_fl_double_window.h" +typedef void (hook)(void*); +typedef hook* hook_p; + + + + +class My_Double_Window : public Fl_Double_Window { + public: + using Fl_Double_Window::Fl_Double_Window; + friend void double_window_set_draw_hook(DOUBLEWINDOW n, void * d); + friend void fl_double_window_draw(DOUBLEWINDOW n); + protected: + void draw(); + void real_draw(); + hook_p draw_hook; +}; + + +void My_Double_Window::draw() { + (*draw_hook)(this->user_data()); +} + + +void My_Double_Window::real_draw() { + Fl_Double_Window::draw(); +} + + +void double_window_set_draw_hook(DOUBLEWINDOW n, void * d) { + reinterpret_cast(n)->draw_hook = reinterpret_cast(d); +} + + +void fl_double_window_draw(DOUBLEWINDOW n) { + reinterpret_cast(n)->real_draw(); +} + + + + DOUBLEWINDOW new_fl_double_window(int x, int y, int w, int h, char* label) { - Fl_Double_Window *d = new Fl_Double_Window(x, y, w, h, label); + My_Double_Window *d = new My_Double_Window(x, y, w, h, label); return d; } DOUBLEWINDOW new_fl_double_window2(int w, int h) { - Fl_Double_Window *d = new Fl_Double_Window(w, h); + My_Double_Window *d = new My_Double_Window(w, h); return d; } void free_fl_double_window(DOUBLEWINDOW d) { - delete reinterpret_cast(d); + delete reinterpret_cast(d); } + + void fl_double_window_show(DOUBLEWINDOW d) { - reinterpret_cast(d)->show(); + reinterpret_cast(d)->show(); } void fl_double_window_hide(DOUBLEWINDOW d) { - reinterpret_cast(d)->hide(); + reinterpret_cast(d)->hide(); } diff --git a/src/c_fl_double_window.h b/src/c_fl_double_window.h index 3be3588..7cadafb 100644 --- a/src/c_fl_double_window.h +++ b/src/c_fl_double_window.h @@ -7,6 +7,9 @@ typedef void* DOUBLEWINDOW; +extern "C" void double_window_set_draw_hook(DOUBLEWINDOW n, void * d); +extern "C" void fl_double_window_draw(DOUBLEWINDOW n); + extern "C" DOUBLEWINDOW new_fl_double_window(int x, int y, int w, int h, char* label); extern "C" DOUBLEWINDOW new_fl_double_window2(int w, int h); extern "C" void free_fl_double_window(DOUBLEWINDOW d); diff --git a/src/c_fl_menu_window.cpp b/src/c_fl_menu_window.cpp index 66ad6f3..8445978 100644 --- a/src/c_fl_menu_window.cpp +++ b/src/c_fl_menu_window.cpp @@ -4,49 +4,91 @@ #include "c_fl_menu_window.h" +typedef void (hook)(void*); +typedef hook* hook_p; + + + + +class My_Menu_Window : public Fl_Menu_Window { + public: + using Fl_Menu_Window::Fl_Menu_Window; + friend void menu_window_set_draw_hook(MENUWINDOW n, void * d); + friend void fl_menu_window_draw(MENUWINDOW n); + protected: + void draw(); + void real_draw(); + hook_p draw_hook; +}; + + +void My_Menu_Window::draw() { + (*draw_hook)(this->user_data()); +} + + +void My_Menu_Window::real_draw() { + Fl_Menu_Window::draw(); +} + + +void menu_window_set_draw_hook(MENUWINDOW n, void * d) { + reinterpret_cast(n)->draw_hook = reinterpret_cast(d); +} + + +void fl_menu_window_draw(MENUWINDOW n) { + reinterpret_cast(n)->real_draw(); +} + + + + MENUWINDOW new_fl_menu_window(int x, int y, int w, int h, char* label) { - Fl_Menu_Window *m = new Fl_Menu_Window(x, y, w, h, label); + My_Menu_Window *m = new My_Menu_Window(x, y, w, h, label); return m; } MENUWINDOW new_fl_menu_window2(int w, int h) { - Fl_Menu_Window *m = new Fl_Menu_Window(w, h); + My_Menu_Window *m = new My_Menu_Window(w, h); return m; } void free_fl_menu_window(MENUWINDOW m) { - delete reinterpret_cast(m); + delete reinterpret_cast(m); } + + void fl_menu_window_show(MENUWINDOW m) { - reinterpret_cast(m)->show(); + reinterpret_cast(m)->show(); } void fl_menu_window_hide(MENUWINDOW m) { - reinterpret_cast(m)->hide(); + reinterpret_cast(m)->hide(); } void fl_menu_window_flush(MENUWINDOW m) { - reinterpret_cast(m)->flush(); + reinterpret_cast(m)->flush(); } void fl_menu_window_set_overlay(MENUWINDOW m) { - reinterpret_cast(m)->set_overlay(); + reinterpret_cast(m)->set_overlay(); } void fl_menu_window_clear_overlay(MENUWINDOW m) { - reinterpret_cast(m)->clear_overlay(); + reinterpret_cast(m)->clear_overlay(); } unsigned int fl_menu_window_overlay(MENUWINDOW m) { - return reinterpret_cast(m)->overlay(); + return reinterpret_cast(m)->overlay(); } diff --git a/src/c_fl_menu_window.h b/src/c_fl_menu_window.h index 3322b29..89d02c3 100644 --- a/src/c_fl_menu_window.h +++ b/src/c_fl_menu_window.h @@ -7,6 +7,9 @@ typedef void* MENUWINDOW; +extern "C" void menu_window_set_draw_hook(MENUWINDOW n, void * d); +extern "C" void fl_menu_window_draw(MENUWINDOW n); + extern "C" MENUWINDOW new_fl_menu_window(int x, int y, int w, int h, char* label); extern "C" MENUWINDOW new_fl_menu_window2(int w, int h); extern "C" void free_fl_menu_window(MENUWINDOW m); diff --git a/src/c_fl_single_window.cpp b/src/c_fl_single_window.cpp index ec9a315..75fbd67 100644 --- a/src/c_fl_single_window.cpp +++ b/src/c_fl_single_window.cpp @@ -4,29 +4,71 @@ #include "c_fl_single_window.h" +typedef void (hook)(void*); +typedef hook* hook_p; + + + + +class My_Single_Window : public Fl_Single_Window { + public: + using Fl_Single_Window::Fl_Single_Window; + friend void single_window_set_draw_hook(SINGLEWINDOW n, void * d); + friend void fl_single_window_draw(SINGLEWINDOW n); + protected: + void draw(); + void real_draw(); + hook_p draw_hook; +}; + + +void My_Single_Window::draw() { + (*draw_hook)(this->user_data()); +} + + +void My_Single_Window::real_draw() { + Fl_Single_Window::draw(); +} + + +void single_window_set_draw_hook(SINGLEWINDOW n, void * d) { + reinterpret_cast(n)->draw_hook = reinterpret_cast(d); +} + + +void fl_single_window_draw(SINGLEWINDOW n) { + reinterpret_cast(n)->real_draw(); +} + + + + SINGLEWINDOW new_fl_single_window(int x, int y, int w, int h, char* label) { - Fl_Single_Window *sw = new Fl_Single_Window(x, y, w, h, label); + My_Single_Window *sw = new My_Single_Window(x, y, w, h, label); return sw; } SINGLEWINDOW new_fl_single_window2(int x, int y) { - Fl_Single_Window *sw = new Fl_Single_Window(x, y); + My_Single_Window *sw = new My_Single_Window(x, y); return sw; } void free_fl_single_window(SINGLEWINDOW w) { - delete reinterpret_cast(w); + delete reinterpret_cast(w); } + + void fl_single_window_show(SINGLEWINDOW w) { - reinterpret_cast(w)->show(); + reinterpret_cast(w)->show(); } void fl_single_window_flush(SINGLEWINDOW w) { - reinterpret_cast(w)->flush(); + reinterpret_cast(w)->flush(); } diff --git a/src/c_fl_single_window.h b/src/c_fl_single_window.h index 96f6d5b..a0af35b 100644 --- a/src/c_fl_single_window.h +++ b/src/c_fl_single_window.h @@ -7,6 +7,9 @@ typedef void* SINGLEWINDOW; +extern "C" void single_window_set_draw_hook(SINGLEWINDOW n, void * d); +extern "C" void fl_single_window_draw(SINGLEWINDOW n); + extern "C" SINGLEWINDOW new_fl_single_window(int x, int y, int w, int h, char* label); extern "C" SINGLEWINDOW new_fl_single_window2(int x, int y); extern "C" void free_fl_single_window(SINGLEWINDOW w); diff --git a/src/fltk-widgets-groups-windows-double.adb b/src/fltk-widgets-groups-windows-double.adb index 407c018..3fc13a4 100644 --- a/src/fltk-widgets-groups-windows-double.adb +++ b/src/fltk-widgets-groups-windows-double.adb @@ -8,6 +8,14 @@ use type System.Address; package body FLTK.Widgets.Groups.Windows.Double is + procedure double_window_set_draw_hook + (W, D : in System.Address); + pragma Import (C, double_window_set_draw_hook, "double_window_set_draw_hook"); + + procedure fl_double_window_draw + (W : in System.Address); + pragma Import (C, fl_double_window_draw, "fl_double_window_draw"); + function new_fl_double_window (X, Y, W, H : in Interfaces.C.int; Text : in Interfaces.C.char_array) @@ -34,6 +42,30 @@ package body FLTK.Widgets.Groups.Windows.Double is + procedure Draw_Hook (U : in System.Address); + pragma Convention (C, Draw_Hook); + + procedure Draw_Hook + (U : in System.Address) + is + Ada_Window : access Double_Window'Class := + Double_Window_Convert.To_Pointer (U); + begin + Ada_Window.Draw; + end Draw_Hook; + + + + + procedure Draw + (This : in out Double_Window) is + begin + fl_double_window_draw (This.Void_Ptr); + end Draw; + + + + procedure Finalize (This : in out Double_Window) is begin @@ -64,6 +96,7 @@ package body FLTK.Widgets.Groups.Windows.Double is fl_widget_set_user_data (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); + double_window_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); end return; end Create; @@ -82,6 +115,7 @@ package body FLTK.Widgets.Groups.Windows.Double is fl_widget_set_user_data (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); + double_window_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); end return; end Create; diff --git a/src/fltk-widgets-groups-windows-double.ads b/src/fltk-widgets-groups-windows-double.ads index 214f698..802e067 100644 --- a/src/fltk-widgets-groups-windows-double.ads +++ b/src/fltk-widgets-groups-windows-double.ads @@ -28,6 +28,10 @@ package FLTK.Widgets.Groups.Windows.Double is private + procedure Draw + (This : in out Double_Window); + + type Double_Window is new Window with null record; @@ -35,5 +39,9 @@ private (This : in out Double_Window); + package Double_Window_Convert is new System.Address_To_Access_Conversions + (Double_Window'Class); + + end FLTK.Widgets.Groups.Windows.Double; diff --git a/src/fltk-widgets-groups-windows-single-menu.adb b/src/fltk-widgets-groups-windows-single-menu.adb index 8345308..9d38a37 100644 --- a/src/fltk-widgets-groups-windows-single-menu.adb +++ b/src/fltk-widgets-groups-windows-single-menu.adb @@ -9,6 +9,14 @@ use type Interfaces.C.unsigned; package body FLTK.Widgets.Groups.Windows.Single.Menu is + procedure menu_window_set_draw_hook + (W, D : in System.Address); + pragma Import (C, menu_window_set_draw_hook, "menu_window_set_draw_hook"); + + procedure fl_menu_window_draw + (W : in System.Address); + pragma Import (C, fl_menu_window_draw, "fl_menu_window_draw"); + function new_fl_menu_window (X, Y, W, H : in Interfaces.C.int; Label : in Interfaces.C.char_array) @@ -52,6 +60,30 @@ package body FLTK.Widgets.Groups.Windows.Single.Menu is + procedure Draw_Hook (U : in System.Address); + pragma Convention (C, Draw_Hook); + + procedure Draw_Hook + (U : in System.Address) + is + Ada_Window : access Menu_Window'Class := + Menu_Window_Convert.To_Pointer (U); + begin + Ada_Window.Draw; + end Draw_Hook; + + + + + procedure Draw + (This : in out Menu_Window) is + begin + fl_menu_window_draw (This.Void_Ptr); + end Draw; + + + + procedure Finalize (This : in out Menu_Window) is begin @@ -82,6 +114,7 @@ package body FLTK.Widgets.Groups.Windows.Single.Menu is fl_widget_set_user_data (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); + menu_window_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); end return; end Create; @@ -100,6 +133,7 @@ package body FLTK.Widgets.Groups.Windows.Single.Menu is fl_widget_set_user_data (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); + menu_window_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); end return; end Create; diff --git a/src/fltk-widgets-groups-windows-single-menu.ads b/src/fltk-widgets-groups-windows-single-menu.ads index f5d88e7..c7fa063 100644 --- a/src/fltk-widgets-groups-windows-single-menu.ads +++ b/src/fltk-widgets-groups-windows-single-menu.ads @@ -42,6 +42,10 @@ package FLTK.Widgets.Groups.Windows.Single.Menu is private + procedure Draw + (This : in out Menu_Window); + + type Menu_Window is new Single_Window with null record; @@ -49,5 +53,9 @@ private (This : in out Menu_Window); + package Menu_Window_Convert is new System.Address_To_Access_Conversions + (Menu_Window'Class); + + end FLTK.Widgets.Groups.Windows.Single.Menu; diff --git a/src/fltk-widgets-groups-windows-single.adb b/src/fltk-widgets-groups-windows-single.adb index 16c5f44..320ea3c 100644 --- a/src/fltk-widgets-groups-windows-single.adb +++ b/src/fltk-widgets-groups-windows-single.adb @@ -8,6 +8,14 @@ use type System.Address; package body FLTK.Widgets.Groups.Windows.Single is + procedure single_window_set_draw_hook + (W, D : in System.Address); + pragma Import (C, single_window_set_draw_hook, "single_window_set_draw_hook"); + + procedure fl_single_window_draw + (W : in System.Address); + pragma Import (C, fl_single_window_draw, "fl_single_window_draw"); + function new_fl_single_window (X, Y, W, H : in Interfaces.C.int; Text : in Interfaces.C.char_array) @@ -34,6 +42,30 @@ package body FLTK.Widgets.Groups.Windows.Single is + procedure Draw_Hook (U : in System.Address); + pragma Convention (C, Draw_Hook); + + procedure Draw_Hook + (U : in System.Address) + is + Ada_Window : access Single_Window'Class := + Single_Window_Convert.To_Pointer (U); + begin + Ada_Window.Draw; + end Draw_Hook; + + + + + procedure Draw + (This : in out Single_Window) is + begin + fl_single_window_draw (This.Void_Ptr); + end Draw; + + + + procedure Finalize (This : in out Single_Window) is begin @@ -64,6 +96,7 @@ package body FLTK.Widgets.Groups.Windows.Single is fl_widget_set_user_data (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); + single_window_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); end return; end Create; @@ -82,6 +115,7 @@ package body FLTK.Widgets.Groups.Windows.Single is fl_widget_set_user_data (This.Void_Ptr, Widget_Convert.To_Address (This'Unchecked_Access)); + single_window_set_draw_hook (This.Void_Ptr, Draw_Hook'Address); end return; end Create; diff --git a/src/fltk-widgets-groups-windows-single.ads b/src/fltk-widgets-groups-windows-single.ads index 07a2bca..32b5c65 100644 --- a/src/fltk-widgets-groups-windows-single.ads +++ b/src/fltk-widgets-groups-windows-single.ads @@ -28,6 +28,10 @@ package FLTK.Widgets.Groups.Windows.Single is private + procedure Draw + (This : in out Single_Window); + + type Single_Window is new Window with null record; @@ -35,5 +39,9 @@ private (This : in out Single_Window); + package Single_Window_Convert is new System.Address_To_Access_Conversions + (Single_Window'Class); + + end FLTK.Widgets.Groups.Windows.Single; -- cgit