diff options
| author | Manolo Gouy <Manolo> | 2016-03-27 06:58:54 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2016-03-27 06:58:54 +0000 |
| commit | 5f14fc3e9b81d082966665209c4246cbdfee0005 (patch) | |
| tree | fc67bdd993d6e88dccf8200e096d2b1bb09d5bc5 /src | |
| parent | c7b1591486bf03becbf7414b2d9cac908bd7ee3c (diff) | |
Rewrite Fl_Overlay_Window class under the driver model.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11440 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Menu_Window.cxx | 3 | ||||
| -rw-r--r-- | src/Fl_Overlay_Window.cxx | 91 | ||||
| -rw-r--r-- | src/Fl_Window_Driver.cxx | 11 | ||||
| -rw-r--r-- | src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx | 8 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 2 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/X11/Fl_X11_Window_Driver.cxx | 80 |
7 files changed, 105 insertions, 92 deletions
diff --git a/src/Fl_Menu_Window.cxx b/src/Fl_Menu_Window.cxx index 4a2bb1709..44098817b 100644 --- a/src/Fl_Menu_Window.cxx +++ b/src/Fl_Menu_Window.cxx @@ -32,10 +32,7 @@ // WIN32 note: HAVE_OVERLAY is false #if HAVE_OVERLAY #include <FL/x.H> -extern XVisualInfo *fl_find_overlay_visual(); extern XVisualInfo *fl_overlay_visual; -extern Colormap fl_overlay_colormap; -extern unsigned long fl_transparent_pixel; extern uchar fl_overlay; // changes how fl_color(x) works #endif diff --git a/src/Fl_Overlay_Window.cxx b/src/Fl_Overlay_Window.cxx index 464ed1fb3..31769da68 100644 --- a/src/Fl_Overlay_Window.cxx +++ b/src/Fl_Overlay_Window.cxx @@ -21,10 +21,8 @@ // on top of that. Uses the hardware to draw the overlay if // possible, otherwise it just draws in the front buffer. -#include <config.h> #include <FL/Fl.H> #include <FL/Fl_Overlay_Window.H> -#include <FL/fl_draw.H> #include <FL/Fl_Window_Driver.H> @@ -70,93 +68,20 @@ Fl_Overlay_Window::~Fl_Overlay_Window() { // delete overlay; this is done by ~Fl_Group } -#if !HAVE_OVERLAY - -int Fl_Overlay_Window::can_do_overlay() {return 0;} - -/** - Call this to indicate that the overlay data has changed and needs to - be redrawn. The overlay will be clear until the first time this is - called, so if you want an initial display you must call this after - calling show(). -*/ -void Fl_Overlay_Window::redraw_overlay() { - overlay_ = this; - clear_damage((uchar)(damage()|FL_DAMAGE_OVERLAY)); - Fl::damage(FL_DAMAGE_CHILD); -} - -#else -#include <FL/x.H> - -extern XVisualInfo *fl_find_overlay_visual(); -extern XVisualInfo *fl_overlay_visual; -extern Colormap fl_overlay_colormap; -extern unsigned long fl_transparent_pixel; -extern uchar fl_overlay; // changes how fl_color(x) works - -class _Fl_Overlay : public Fl_Window { - friend class Fl_Overlay_Window; - void flush(); - void show(); -public: - _Fl_Overlay(int x, int y, int w, int h) : - Fl_Window(x,y,w,h) {set_flag(INACTIVE);} -}; - int Fl_Overlay_Window::can_do_overlay() { - return fl_find_overlay_visual() != 0; -} - -void _Fl_Overlay::show() { - if (shown()) {Fl_Window::show(); return;} - fl_background_pixel = int(fl_transparent_pixel); - Fl_X::make_xid(this, fl_overlay_visual, fl_overlay_colormap); - fl_background_pixel = -1; - // find the outermost window to tell wm about the colormap: - Fl_Window *w = window(); - for (;;) {Fl_Window *w1 = w->window(); if (!w1) break; w = w1;} - XSetWMColormapWindows(fl_display, fl_xid(w), &(Fl_X::i(this)->xid), 1); -} - -void _Fl_Overlay::flush() { - fl_window = fl_xid(this); -#if defined(FLTK_USE_CAIRO) - if (Fl::cairo_autolink_context()) Fl::cairo_make_current(this); // capture gc changes automatically to update the cairo context adequately -#endif - fl_overlay = 1; - Fl_Overlay_Window *w = (Fl_Overlay_Window *)parent(); - Fl_X *myi = Fl_X::i(this); - if (damage() != FL_DAMAGE_EXPOSE) XClearWindow(fl_display, fl_xid(this)); - fl_clip_region(myi->region); myi->region = 0; - w->draw_overlay(); - fl_overlay = 0; + return driver()->can_do_overlay(); } +/** + Call this to indicate that the overlay data has changed and needs to + be redrawn. The overlay will be clear until the first time this is + called, so if you want an initial display you must call this after + calling show(). + */ void Fl_Overlay_Window::redraw_overlay() { - if (!fl_display) return; // this prevents fluid -c from opening display - if (!overlay_) { - if (can_do_overlay()) { - Fl_Group::current(this); - overlay_ = new _Fl_Overlay(0,0,w(),h()); - Fl_Group::current(0); - } else { - overlay_ = this; // fake the overlay - } - } - if (shown()) { - if (overlay_ == this) { - clear_damage(damage()|FL_DAMAGE_OVERLAY); - Fl::damage(FL_DAMAGE_CHILD); - } else if (!overlay_->shown()) - overlay_->show(); - else - overlay_->redraw(); - } + driver()->redraw_overlay(); } -#endif - // // End of "$Id$". // diff --git a/src/Fl_Window_Driver.cxx b/src/Fl_Window_Driver.cxx index 517178ff0..7cb42cbba 100644 --- a/src/Fl_Window_Driver.cxx +++ b/src/Fl_Window_Driver.cxx @@ -20,6 +20,7 @@ #include <config.h> #include <FL/Fl_Window_Driver.H> +#include <FL/Fl_Overlay_Window.H> #include <FL/fl_draw.H> #include <FL/Fl.H> #include <FL/x.H> @@ -209,6 +210,16 @@ void Fl_Window_Driver::size_range() { pWindow->size_range_set = 1; } +int Fl_Window_Driver::can_do_overlay() { + return 0; +} + +void Fl_Window_Driver::redraw_overlay() { + ((Fl_Overlay_Window*)pWindow)->overlay_ = pWindow; + pWindow->clear_damage((uchar)(pWindow->damage()|FL_DAMAGE_OVERLAY)); + Fl::damage(FL_DAMAGE_CHILD); +} + // // End of "$Id$". // diff --git a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx index 22a819dcb..3e60db8a9 100644 --- a/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx +++ b/src/drivers/Cocoa/Fl_Cocoa_Window_Driver.cxx @@ -64,7 +64,7 @@ void Fl_Cocoa_Window_Driver::flush_double() { void Fl_Cocoa_Window_Driver::flush_overlay() { Fl_Overlay_Window *oWindow = pWindow->as_overlay_window(); - int erase_overlay = (pWindow->damage()&FL_DAMAGE_OVERLAY) | (oWindow->overlay_ == oWindow); + int erase_overlay = (pWindow->damage()&FL_DAMAGE_OVERLAY) | (overlay() == oWindow); pWindow->clear_damage((uchar)(pWindow->damage()&~FL_DAMAGE_OVERLAY)); if (!oWindow->shown()) return; @@ -80,10 +80,10 @@ void Fl_Cocoa_Window_Driver::flush_overlay() if ( myi->other_xid ) { fl_begin_offscreen( myi->other_xid ); fl_clip_region( 0 ); - oWindow->draw(); + draw(); fl_end_offscreen(); } else { - oWindow->draw(); + draw(); } } if (erase_overlay) fl_clip_region(0); @@ -92,7 +92,7 @@ void Fl_Cocoa_Window_Driver::flush_overlay() int X,Y,W,H; fl_clip_box(0,0,oWindow->w(),oWindow->h(),X,Y,W,H); if (myi->other_xid) fl_copy_offscreen(X, Y, W, H, myi->other_xid, X, Y); - if (oWindow->overlay_ == oWindow) oWindow->draw_overlay(); + if (overlay() == oWindow) oWindow->draw_overlay(); } diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx index ebb118ef5..5c59818a8 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx @@ -313,7 +313,7 @@ void Fl_WinAPI_Window_Driver::flush_overlay() int X, Y, W, H; fl_clip_box(0, 0, w(), h(), X, Y, W, H); if (i->other_xid) fl_copy_offscreen(X, Y, W, H, i->other_xid, X, Y); - if (oWindow->overlay_ == oWindow) oWindow->draw_overlay(); + if (overlay() == oWindow) oWindow->draw_overlay(); } diff --git a/src/drivers/X11/Fl_X11_Window_Driver.H b/src/drivers/X11/Fl_X11_Window_Driver.H index 000ee1548..ea6e3d649 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.H +++ b/src/drivers/X11/Fl_X11_Window_Driver.H @@ -110,6 +110,8 @@ public: virtual void free_icons(); virtual void capture_titlebar_and_borders(Fl_Shared_Image*& top, Fl_Shared_Image*& left, Fl_Shared_Image*& bottom, Fl_Shared_Image*& right); virtual void wait_for_expose(); + virtual int can_do_overlay(); + virtual void redraw_overlay(); }; diff --git a/src/drivers/X11/Fl_X11_Window_Driver.cxx b/src/drivers/X11/Fl_X11_Window_Driver.cxx index 79939410a..861aaf972 100644 --- a/src/drivers/X11/Fl_X11_Window_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Window_Driver.cxx @@ -41,6 +41,7 @@ extern XVisualInfo *fl_find_overlay_visual(); extern XVisualInfo *fl_overlay_visual; extern Colormap fl_overlay_colormap; extern unsigned long fl_transparent_pixel; +extern uchar fl_overlay; // changes how fl_color(x) works #endif Window fl_window; @@ -242,7 +243,7 @@ void Fl_X11_Window_Driver::flush_overlay() #endif flush_double(erase_overlay); Fl_Overlay_Window *oWindow = pWindow->as_overlay_window(); - if (oWindow->overlay_ == oWindow) oWindow->draw_overlay(); + if (overlay() == oWindow) oWindow->draw_overlay(); } @@ -555,6 +556,83 @@ void Fl_X11_Window_Driver::show_with_args_end(int argc, char **argv) { delete[] buffer; } + +#if HAVE_OVERLAY + +class _Fl_Overlay : public Fl_Window { + friend class Fl_Overlay_Window; + void flush(); + void show(); +public: + _Fl_Overlay(int x, int y, int w, int h) : Fl_Window(x,y,w,h) { + set_flag(INACTIVE); + } +}; + +/*int Fl_Overlay_Window::can_do_overlay() { + return fl_find_overlay_visual() != 0; + }*/ + +void _Fl_Overlay::show() { + if (shown()) {Fl_Window::show(); return;} + fl_background_pixel = int(fl_transparent_pixel); + Fl_X::make_xid(this, fl_overlay_visual, fl_overlay_colormap); + fl_background_pixel = -1; + // find the outermost window to tell wm about the colormap: + Fl_Window *w = window(); + for (;;) {Fl_Window *w1 = w->window(); if (!w1) break; w = w1;} + XSetWMColormapWindows(fl_display, fl_xid(w), &(Fl_X::i(this)->xid), 1); +} + +void _Fl_Overlay::flush() { + fl_window = fl_xid(this); +#if defined(FLTK_USE_CAIRO) + if (Fl::cairo_autolink_context()) Fl::cairo_make_current(this); // capture gc changes automatically to update the cairo context adequately +#endif + fl_overlay = 1; + Fl_Overlay_Window *w = (Fl_Overlay_Window *)parent(); + Fl_X *myi = Fl_X::i(this); + if (damage() != FL_DAMAGE_EXPOSE) XClearWindow(fl_display, fl_xid(this)); + fl_clip_region(myi->region); myi->region = 0; + w->draw_overlay(); + fl_overlay = 0; +} +#endif // HAVE_OVERLAY + + +int Fl_X11_Window_Driver::can_do_overlay() { +#if HAVE_OVERLAY + return fl_find_overlay_visual() != 0; +#endif + return Fl_Window_Driver::can_do_overlay(); +} + +void Fl_X11_Window_Driver::redraw_overlay() { +#if HAVE_OVERLAY + if (!fl_display) return; // this prevents fluid -c from opening display + if (!overlay()) { + if (can_do_overlay()) { + Fl_Group::current(pWindow); + overlay(new _Fl_Overlay(0,0,w(),h())); + Fl_Group::current(0); + } else { + overlay(pWindow); // fake the overlay + } + } + if (shown()) { + if (overlay() == pWindow) { + pWindow->clear_damage(pWindow->damage()|FL_DAMAGE_OVERLAY); + Fl::damage(FL_DAMAGE_CHILD); + } else if (!overlay()->shown()) + overlay()->show(); + else + overlay()->redraw(); + } + return; +#endif + Fl_Window_Driver::redraw_overlay(); +} + // // End of "$Id$". // |
