summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2008-02-02 22:17:32 -0500
committerDana Jansens <danakj@orodu.net>2008-02-02 22:17:32 -0500
commita19f2f8bc9964b89a500a2c5aac0b8d3a3dc2ff4 (patch)
tree80981bf45bbdb6513c0698e4a46b58dc21ea4c1e
parent751f85003f080d79baa2d4b3b989b12a0ee9d469 (diff)
when focusing or raising a window which is modal child for a direct parent, raise its parent and move it to the top of the stacking order too, ie. treat them like one window (this is already done elsewhere, like when moving between desktops for example)
-rw-r--r--openbox/focus.c8
-rw-r--r--openbox/stacking.c9
2 files changed, 17 insertions, 0 deletions
diff --git a/openbox/focus.c b/openbox/focus.c
index a4eb2cfa..c2d7e11e 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -57,6 +57,14 @@ void focus_shutdown(gboolean reconfig)
static void push_to_top(ObClient *client)
{
+ ObClient *p;
+
+ /* if it is modal for a single window, then put that window at the top
+ of the focus order first, so it will be right after ours. the same is
+ done with stacking */
+ if (client->modal && (p = client_direct_parent(client)))
+ push_to_top(p);
+
focus_order = g_list_remove(focus_order, client);
focus_order = g_list_prepend(focus_order, client);
}
diff --git a/openbox/stacking.c b/openbox/stacking.c
index 92a5285d..4c24e3e8 100644
--- a/openbox/stacking.c
+++ b/openbox/stacking.c
@@ -221,6 +221,15 @@ static void restack_windows(ObClient *selected, gboolean raise)
GList *modals = NULL;
GList *trans = NULL;
+ if (raise) {
+ ObClient *p;
+
+ /* if a window is modal for another single window, then raise it to the
+ top too, the same is done with the focus order */
+ while (selected->modal && (p = client_direct_parent(selected)))
+ selected = p;
+ }
+
/* remove first so we can't run into ourself */
it = g_list_find(stacking_list, selected);
g_assert(it);