summaryrefslogtreecommitdiff
path: root/src/drivers/WinAPI
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2018-03-24 08:08:32 +0000
committerManolo Gouy <Manolo>2018-03-24 08:08:32 +0000
commitdb55dfbbd6e161ab1388583ef6834137a4a380e1 (patch)
treeb81cde233d40bb97cd380c5a806367743d367eff /src/drivers/WinAPI
parenta3a5a3d924a2c4103647b52d80458ffc62dbcd84 (diff)
Windows: avoid changing the current Fl_Surface_Device when drawing an Fl_Double_Window.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12792 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/WinAPI')
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
index 3492f9d6d..687950fc9 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
@@ -307,12 +307,30 @@ void Fl_WinAPI_Window_Driver::flush_double()
}
if (pWindow->damage() & ~FL_DAMAGE_EXPOSE) {
fl_clip_region(i->region); i->region = 0;
+#if 0 /* Short form that transiently changes the current Fl_Surface_Device */
fl_begin_offscreen(other_xid);
fl_graphics_driver->clip_region( 0 );
draw();
fl_end_offscreen();
+#else
+ /* Alternative form that avoids changing the current Fl_Surface_Device.
+ The code run in the window draw() method can call Fl_Surface_Device::surface()
+ and conclude that it's drawing to the display, which is ultimately true
+ for an Fl_Double_Window.
+ */
+ HDC sgc = fl_gc;
+ Window save_w = fl_window; fl_window = (Window)other_xid;
+ fl_gc = fl_makeDC(other_xid);
+ int savedc = SaveDC(fl_gc);
+ fl_graphics_driver->gc(fl_gc);
+ fl_graphics_driver->restore_clip(); // duplicate clip region into new gc
+ draw();
+ RestoreDC(fl_gc, savedc);
+ DeleteDC(fl_gc);
+ fl_window = save_w;
+ fl_graphics_driver->gc(sgc);
+#endif
}
-
int X,Y,W,H; fl_clip_box(0,0,w(),h(),X,Y,W,H);
if (other_xid) fl_copy_offscreen(X, Y, W, H, other_xid, X, Y);
}