diff options
author | Jedidiah Barber <contact@jedbarber.id.au> | 2024-11-27 12:32:46 +1300 |
---|---|---|
committer | Jedidiah Barber <contact@jedbarber.id.au> | 2024-11-27 12:32:46 +1300 |
commit | 6f1e7c19776d10878db0eb674339cf656972811f (patch) | |
tree | 91e8572ab443e881a6d970c3dfc8e431e0daed9d /src/c_fl_cairo_window.cpp | |
parent | edbb0173d98b170ef75eda0149a132b9836e239d (diff) |
Fl_Cairo_Window binding added
Diffstat (limited to 'src/c_fl_cairo_window.cpp')
-rw-r--r-- | src/c_fl_cairo_window.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/c_fl_cairo_window.cpp b/src/c_fl_cairo_window.cpp new file mode 100644 index 0000000..59b03ed --- /dev/null +++ b/src/c_fl_cairo_window.cpp @@ -0,0 +1,110 @@ + + +// Programmed by Jedidiah Barber +// Released into the public domain + + +#include <FL/Fl_Cairo_Window.H> +#include <FL/Fl_Double_Window.H> +#include "c_fl_cairo_window.h" + + + + +// Exports from Ada + +extern "C" void widget_draw_hook(void * ud); +extern "C" int widget_handle_hook(void * ud, int e); + + + + +// Attaching all relevant hooks and friends + +class My_Cairo_Window : +#ifdef FLTK_HAVE_CAIRO +public Fl_Cairo_Window +#else +public Fl_Double_Window +#endif +{ +public: +#ifdef FLTK_HAVE_CAIRO + using Fl_Cairo_Window::Fl_Cairo_Window; +#else + using Fl_Double_Window::Fl_Double_Window; +#endif + + friend void fl_cairo_window_draw(CAIROWINDOW w); + + int handle(int e); + +protected: + void draw(); +}; + + +void My_Cairo_Window::draw() { + widget_draw_hook(this->user_data()); +} + +int My_Cairo_Window::handle(int e) { + return widget_handle_hook(this->user_data(), e); +} + + + + +// Flattened C API begins here + +CAIROWINDOW new_fl_cairo_window(int x, int y, int w, int h, char * label) { + My_Cairo_Window *c = new My_Cairo_Window(x, y, w, h, label); + return c; +} + +CAIROWINDOW new_fl_cairo_window2(int w, int h, char * label) { + My_Cairo_Window *c = new My_Cairo_Window(w, h, label); + return c; +} + +CAIROWINDOW new_fl_cairo_window3(int w, int h) { + My_Cairo_Window *c = new My_Cairo_Window(w, h); + return c; +} + +void free_fl_cairo_window(CAIROWINDOW w) { + delete reinterpret_cast<My_Cairo_Window*>(w); +} + + + + +void fl_cairo_window_set_draw_cb(CAIROWINDOW w, void * cb) { + #ifdef FLTK_HAVE_CAIRO + reinterpret_cast<Fl_Cairo_Window*>(w)->set_draw_cb(reinterpret_cast<cairo_draw_cb>(cb)); + #else + (void)(w); + (void)(cb); + #endif +} + + + + +void fl_cairo_window_draw(CAIROWINDOW w) { + #ifdef FLTK_HAVE_CAIRO + reinterpret_cast<My_Cairo_Window*>(w)->Fl_Cairo_Window::draw(); + #else + reinterpret_cast<My_Cairo_Window*>(w)->Fl_Double_Window::draw(); + #endif +} + +int fl_cairo_window_handle(CAIROWINDOW w, int e) { + #ifdef FLTK_HAVE_CAIRO + return reinterpret_cast<My_Cairo_Window*>(w)->Fl_Cairo_Window::handle(e); + #else + return reinterpret_cast<My_Cairo_Window*>(w)->Fl_Double_Window::handle(e); + #endif +} + + |