diff options
Diffstat (limited to 'window.c')
-rw-r--r-- | window.c | 33 |
1 files changed, 26 insertions, 7 deletions
@@ -1405,8 +1405,17 @@ static bool HandleViewportScroll(void) return false; } -static void MaybeBringWindowToFront(const Window *w) -{ +/** Check if a window can be made top-most window, and if so do + * it. If a window does not obscure any other windows, it will not + * be brought to the foreground. Also if the only obscuring windows + * are so-called system-windows, the window will not be moved. + * The function will return false when a child window of this window is a + * modal-popup; function returns a false and child window gets a white border + * @param w Window to bring on-top + * @return false if the window has an active modal child, true otherwise */ +static bool MaybeBringWindowToFront(const Window *w) +{ + bool bring_to_front = false; Window* const *wz; Window* const *uz; @@ -1414,12 +1423,19 @@ static void MaybeBringWindowToFront(const Window *w) IsVitalWindow(w) || w->window_class == WC_TOOLTIPS || w->window_class == WC_DROPDOWN_MENU) { - return; + return true; } wz = FindWindowZPosition(w); for (uz = wz; ++uz != _last_z_window;) { - const Window *u = *uz; + Window *u = *uz; + + /* A modal child will prevent the activation of the parent window */ + if (u->parent == w && (u->desc_flags & WDF_MODAL)) { + u->flags4 |= WF_WHITE_BORDER_MASK; + SetWindowDirty(u); + return false; + } if (u->window_class == WC_MAIN_WINDOW || IsVitalWindow(u) || @@ -1428,6 +1444,7 @@ static void MaybeBringWindowToFront(const Window *w) continue; } + /* Window sizes don't interfere, leave z-order alone */ if (w->left + w->width <= u->left || u->left + u->width <= w->left || w->top + w->height <= u->top || @@ -1435,9 +1452,11 @@ static void MaybeBringWindowToFront(const Window *w) continue; } - BringWindowToFront(w); - return; + bring_to_front = true; } + + if (bring_to_front) BringWindowToFront(w); + return true; } /** Send a message from one window to another. The receiving window is found by @@ -1616,7 +1635,7 @@ void MouseLoop(int click, int mousewheel) w = FindWindowFromPt(x, y); if (w == NULL) return; - MaybeBringWindowToFront(w); + if (!MaybeBringWindowToFront(w)) return; vp = IsPtInWindowViewport(w, x, y); /* Don't allow any action in a viewport if either in menu of in generating world */ |