summaryrefslogtreecommitdiff
path: root/window.c
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2006-12-29 17:16:12 +0000
committerDarkvater <Darkvater@openttd.org>2006-12-29 17:16:12 +0000
commitd78d12fdfe09eb6d1b08baf6725cd5aed9b4ea07 (patch)
tree6b85f6db41b539878c171e1f6c86ea6e5b4632ff /window.c
parent684ec92c19dd9d749d3c60c3ed5e0078a2e08299 (diff)
downloadopenttd-d78d12fdfe09eb6d1b08baf6725cd5aed9b4ea07.tar.xz
(svn r7619) -Feature (Internal): Add support for modal children. It's a window-child that
will block activity for the parent window until the modal popup is dismissed.
Diffstat (limited to 'window.c')
-rw-r--r--window.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/window.c b/window.c
index 14aef6bb7..75da457b5 100644
--- a/window.c
+++ b/window.c
@@ -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 */