summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2016-03-27 06:58:54 +0000
committerManolo Gouy <Manolo>2016-03-27 06:58:54 +0000
commit5f14fc3e9b81d082966665209c4246cbdfee0005 (patch)
treefc67bdd993d6e88dccf8200e096d2b1bb09d5bc5 /src/drivers
parentc7b1591486bf03becbf7414b2d9cac908bd7ee3c (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.cxx8
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx2
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.H2
-rw-r--r--src/drivers/X11/Fl_X11_Window_Driver.cxx80
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$".
//