summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES1
-rw-r--r--src/Fl.cxx1
-rw-r--r--src/Fl_Double_Window.cxx1
-rw-r--r--src/Fl_Gl_Window.cxx1
-rw-r--r--src/Fl_Menu_Window.cxx1
-rw-r--r--src/Fl_x.cxx5
6 files changed, 10 insertions, 0 deletions
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 <FL/Fl_Tooltip.H>
# include <FL/fl_draw.H>
# include <FL/Fl_Paged_Device.H>
+# include <FL/fl_ask.H>
# include <stdio.h>
# include <stdlib.h>
# 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;