diff --git a/misc_gui.c b/misc_gui.c index 2f2a8d3bfe..92ba1b4fa1 100644 --- a/misc_gui.c +++ b/misc_gui.c @@ -1226,7 +1226,10 @@ static void QueryWndProc(Window *w, WindowEvent *e) break; case WE_DESTROY: /* Call callback function (if any) on window close if not yet called */ - if (!q->calledback && q->proc != NULL) q->proc(w->parent, false); + if (!q->calledback && q->proc != NULL) { + q->calledback = true; + q->proc(w->parent, false); + } break; } } diff --git a/window.c b/window.c index 75da457b5e..1a12c7c6b9 100644 --- a/window.c +++ b/window.c @@ -308,10 +308,13 @@ Window **FindWindowZPosition(const Window *w) { Window **wz; - for (wz = _z_windows;; wz++) { - assert(wz < _last_z_window); + for (wz = _z_windows; wz != _last_z_window; wz++) { if (*wz == w) return wz; } + + DEBUG(misc, 3, "Window (class %d, number %d) is not open, probably removed by recursive calls", + w->window_class, w->window_number); + return NULL; } void DeleteWindow(Window *w) @@ -342,6 +345,7 @@ void DeleteWindow(Window *w) /* Find the window in the z-array, and effectively remove it * by moving all windows after it one to the left */ wz = FindWindowZPosition(w); + if (wz == NULL) return; memmove(wz, wz + 1, (byte*)_last_z_window - (byte*)wz); _last_z_window--; }