diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2010-06-09 08:36:25 +0000 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2010-06-09 08:36:25 +0000 |
| commit | 755f354ebe0a2f9c3ee287c53013279fd864ebbe (patch) | |
| tree | eb13f8d9150977b4977764698b67e558b8c63ebb /src | |
| parent | d7fdaf8262180573de0e838a70c1368641b82a8e (diff) | |
Fixed X11/XDBE double buffering (STR #2152, #2197). Both bugs could only be
seen if configure was run with --enable-xdbe (default in FLTK 1.3, optional
in FLTK 1.1).
src/Fl_Double_Window.cxx/Fl_Double_Window::resize():
STR #2152: deallocate back buffer when window is enlarged in any
dimension to force allocation of a new back buffer. This appears
to be necessary for some window managers (e.g. Cygwin).
src/Fl_Overlay_Window.cxx/Fl_Overlay_Window::flush() and
src/Fl_Double_Window.cxx/Fl_Double_Window::flush():
STR #2197: make sure that the entire overlay window will be drawn
after a window redraw, because Fl_Double_Window::flush(1) erases
the overlay as documented.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7636 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl_Double_Window.cxx | 12 | ||||
| -rw-r--r-- | src/Fl_Overlay_Window.cxx | 2 |
2 files changed, 11 insertions, 3 deletions
diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx index bd2155329..88ccfd962 100644 --- a/src/Fl_Double_Window.cxx +++ b/src/Fl_Double_Window.cxx @@ -296,7 +296,7 @@ void Fl_Double_Window::flush(int eraseoverlay) { } #if USE_XDBE if (use_xdbe) { - if (myi->backbuffer_bad) { + if (myi->backbuffer_bad || eraseoverlay) { // Make sure we do a complete redraw... if (myi->region) {XDestroyRegion(myi->region); myi->region = 0;} clear_damage(FL_DAMAGE_ALL); @@ -360,7 +360,15 @@ void Fl_Double_Window::resize(int X,int Y,int W,int H) { int oh = h(); Fl_Window::resize(X,Y,W,H); #if USE_XDBE - if (use_xdbe) return; + if (use_xdbe) { + Fl_X* myi = Fl_X::i(this); + if (myi && myi->other_xid && (ow < w() || oh < h())) { + // STR #2152: Deallocate the back buffer to force creation of a new one. + XdbeDeallocateBackBufferName(fl_display,myi->other_xid); + myi->other_xid = 0; + } + return; + } #endif Fl_X* myi = Fl_X::i(this); if (myi && myi->other_xid && (ow != w() || oh != h())) { diff --git a/src/Fl_Overlay_Window.cxx b/src/Fl_Overlay_Window.cxx index 8acb4af35..581c7057d 100644 --- a/src/Fl_Overlay_Window.cxx +++ b/src/Fl_Overlay_Window.cxx @@ -61,7 +61,7 @@ void Fl_Overlay_Window::flush() { return; } #endif - int erase_overlay = (damage()&FL_DAMAGE_OVERLAY); + int erase_overlay = (damage()&FL_DAMAGE_OVERLAY) | (overlay_ == this); clear_damage((uchar)(damage()&~FL_DAMAGE_OVERLAY)); Fl_Double_Window::flush(erase_overlay); if (overlay_ == this) draw_overlay(); |
