From db55dfbbd6e161ab1388583ef6834137a4a380e1 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Sat, 24 Mar 2018 08:08:32 +0000 Subject: 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 --- src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx') 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); } -- cgit v1.2.3