From 101c4d516d1938a8f192ee883f67687acda32401 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Sun, 18 Mar 2012 20:27:22 -0700 Subject: [PATCH] Make use of cairo for drawing optional at runtime with fl_push_use_cairo() and fl_pop_use_cairo() --- FL/x.H | 4 ++++ src/Fl_x.cxx | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/FL/x.H b/FL/x.H index ed08670..f9c6f20 100644 --- a/FL/x.H +++ b/FL/x.H @@ -70,6 +70,10 @@ FL_EXPORT void fl_open_display(); FL_EXPORT void fl_open_display(Display*); FL_EXPORT void fl_close_display(); + +FL_EXPORT void fl_push_use_cairo( bool v ); +FL_EXPORT void fl_pop_use_cairo( void ); + // constant info about the X server connection: extern FL_EXPORT Display *fl_display; extern FL_EXPORT int fl_screen; diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index 4f6a6d9..11f3430 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -54,10 +54,10 @@ # include #if FLTK_USE_CAIRO -static Fl_Cairo_Graphics_Driver fl_xlib_driver; -#else -static Fl_Xlib_Graphics_Driver fl_xlib_driver; +static Fl_Cairo_Graphics_Driver fl_cairo_driver; #endif +static Fl_Xlib_Graphics_Driver fl_xlib_driver; + static Fl_Display_Device fl_xlib_display(&fl_xlib_driver); FL_EXPORT Fl_Graphics_Driver *fl_graphics_driver = (Fl_Graphics_Driver*)&fl_xlib_driver; // the current target device of graphics operations Fl_Surface_Device* Fl_Surface_Device::_surface = (Fl_Surface_Device*)&fl_xlib_display; // the current target surface of graphics operations @@ -66,6 +66,44 @@ Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platfor //////////////////////////////////////////////////////////////// // interface to poll/select call: +static bool use_cairo_stack[100]; +static int use_cairo_ptr = 0; + +FL_EXPORT void fl_push_use_cairo ( bool v ) +{ +#if FLTK_USE_CAIRO + if ( v ) + fl_graphics_driver = &fl_cairo_driver; + else + fl_graphics_driver = &fl_xlib_driver; + + if ( use_cairo_ptr < (int) (sizeof( use_cairo_stack ) / sizeof( bool ) )) + use_cairo_stack[++use_cairo_ptr] = v; +#else + /* noop */ + ; +#endif +} + +FL_EXPORT void fl_pop_use_cairo ( void ) +{ +#if FLTK_USE_CAIRO + bool v = false; + + if ( use_cairo_ptr > 0 ) + v = use_cairo_stack[--use_cairo_ptr]; + + if ( v ) + fl_graphics_driver = &fl_cairo_driver; + else + fl_graphics_driver = &fl_xlib_driver; +#else + /* noop */ + ; +#endif +} + + # if USE_POLL # include