diff --git a/CHANGES b/CHANGES index 24461aa88..56fa5e126 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ CHANGES IN FLTK 1.3.3 RELEASED: MMM DD YYYY + - fix crash if Fl_Window::flush() was called, but window not shown() (STR #3028). - new method Fl::scheme_is(const char *name) returns 1 if current scheme is name. - Fixed recent MinGW build WRT configure not finding strcasecmp() (STR #2994). Note: This fix is temporary and should be revisited later. diff --git a/src/Fl.cxx b/src/Fl.cxx index fcb16555d..1916052ce 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -1750,6 +1750,7 @@ void Fl_Widget::damage(uchar fl, int X, int Y, int W, int H) { Fl::damage(FL_DAMAGE_CHILD); } void Fl_Window::flush() { + if (!shown()) return; make_current(); //if (damage() == FL_DAMAGE_EXPOSE && can_boxcheat(box())) fl_boxcheat = this; fl_clip_region(i->region); i->region = 0; diff --git a/src/Fl_Double_Window.cxx b/src/Fl_Double_Window.cxx index 943e065af..fb93c9cd9 100644 --- a/src/Fl_Double_Window.cxx +++ b/src/Fl_Double_Window.cxx @@ -369,6 +369,7 @@ void Fl_Double_Window::flush() {flush(0);} and leaving the clip region set to the entire window. */ void Fl_Double_Window::flush(int eraseoverlay) { + if (!shown()) return; make_current(); // make sure fl_gc is non-zero Fl_X *myi = Fl_X::i(this); if (!myi) return; // window not yet created diff --git a/src/Fl_Gl_Window.cxx b/src/Fl_Gl_Window.cxx index f5b41a2a0..9c29a7b38 100644 --- a/src/Fl_Gl_Window.cxx +++ b/src/Fl_Gl_Window.cxx @@ -292,6 +292,7 @@ int fl_overlay_depth = 0; void Fl_Gl_Window::flush() { + if (!shown()) return; uchar save_valid = valid_f_ & 1; #if HAVE_GL_OVERLAY && defined(WIN32) uchar save_valid_f = valid_f_; diff --git a/src/Fl_Menu_Window.cxx b/src/Fl_Menu_Window.cxx index 28e121d0a..02bee699e 100644 --- a/src/Fl_Menu_Window.cxx +++ b/src/Fl_Menu_Window.cxx @@ -54,6 +54,7 @@ void Fl_Menu_Window::show() { } void Fl_Menu_Window::flush() { + if (!shown()) return; #if HAVE_OVERLAY if (!fl_overlay_visual || !overlay()) {Fl_Single_Window::flush(); return;} Fl_X *myi = Fl_X::i(this); diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index e1831b5c4..22acff7e9 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -34,6 +34,7 @@ # include # include # include +# include # include # include # include "flstring.h" @@ -2339,6 +2340,10 @@ GC fl_gc; // make X drawing go into this window (called by subclass flush() impl.) void Fl_Window::make_current() { static GC gc; // the GC used by all X windows + if (!shown()) { + fl_alert("Fl_Window::make_current(), but window is not shown()."); + Fl::fatal("Fl_Window::make_current(), but window is not shown()."); + } if (!gc) gc = XCreateGC(fl_display, i->xid, 0, 0); fl_window = i->xid; fl_gc = gc;