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/Fl_Overlay_Window.cxx | |
| 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/Fl_Overlay_Window.cxx')
| -rw-r--r-- | src/Fl_Overlay_Window.cxx | 91 |
1 files changed, 8 insertions, 83 deletions
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$". // |
