mirror of
https://github.com/fltk/fltk.git
synced 2026-06-05 16:12:13 +08:00
Fix STR #2627: if an X11 window is externally destroyed, FLTK now reacts coherently
either deleting the corresponding FLTK window, or recreating the X11 window. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8723 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
+2
-1
@@ -1439,7 +1439,8 @@ void Fl_Window::hide() {
|
||||
# if USE_XFT
|
||||
fl_destroy_xft_draw(ip->xid);
|
||||
# endif
|
||||
XDestroyWindow(fl_display, ip->xid);
|
||||
// this test makes sure ip->xid has not been destroyed already
|
||||
if (ip->xid) XDestroyWindow(fl_display, ip->xid);
|
||||
#elif defined(WIN32)
|
||||
// this little trickery seems to avoid the popup window stacking problem
|
||||
HWND p = GetForegroundWindow();
|
||||
|
||||
@@ -1070,6 +1070,19 @@ int fl_handle(const XEvent& thisevent)
|
||||
|
||||
if (window) switch (xevent.type) {
|
||||
|
||||
case DestroyNotify: { // an X11 window was closed externally from the program
|
||||
Fl::handle(FL_CLOSE, window);
|
||||
Fl_X* X = Fl_X::i(window);
|
||||
if (X) { // indicates the FLTK window was not closed
|
||||
X->xid = NULL; // indicates the X11 window was already destroyed
|
||||
window->hide();
|
||||
int oldx = window->x(), oldy = window->y();
|
||||
window->position(0, 0);
|
||||
window->position(oldx, oldy);
|
||||
window->show(); // recreate the X11 window in support of the FLTK window
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
case ClientMessage: {
|
||||
Atom message = fl_xevent->xclient.message_type;
|
||||
const long* data = fl_xevent->xclient.data.l;
|
||||
|
||||
Reference in New Issue
Block a user