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/drivers | |
| 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/drivers')
| -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 |
4 files changed, 86 insertions, 6 deletions
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$". // |
