]> Dogcows Code - chaz/openbox/blobdiff - openbox/stacking.c
Merge branch 'backport' into work
[chaz/openbox] / openbox / stacking.c
index 63819ae254bc19075d26ecad1efe9fd2dec8c7aa..cb710e5e0f8940a4be76fba10058be00623b4028 100644 (file)
 */
 
 #include "openbox.h"
-#include "prop.h"
 #include "screen.h"
 #include "focus.h"
 #include "client.h"
 #include "group.h"
 #include "frame.h"
 #include "window.h"
+#include "event.h"
 #include "debug.h"
+#include "obt/prop.h"
 
 GList  *stacking_list = NULL;
 /*! When true, stacking changes will not be reflected on the screen.  This is
@@ -54,8 +55,8 @@ void stacking_set_list(void)
         }
     }
 
-    PROP_SETA32(RootWindow(ob_display, ob_screen),
-                net_client_list_stacking, window, (gulong*)windows, i);
+    OBT_PROP_SETA32(obt_root(ob_screen), NET_CLIENT_LIST_STACKING, WINDOW,
+                    (gulong*)windows, i);
 
     g_free(windows);
 }
@@ -68,6 +69,8 @@ static void do_restack(GList *wins, GList *before)
 
 #ifdef DEBUG
     GList *next;
+
+    g_assert(wins);
     /* pls only restack stuff in the same layer at a time */
     for (it = wins; it; it = next) {
         next = g_list_next(it);
@@ -104,7 +107,7 @@ static void do_restack(GList *wins, GList *before)
 #endif
 
     if (!pause_changes)
-        XRestackWindows(ob_display, win, i);
+        XRestackWindows(obt_display, win, i);
     g_free(win);
 
     stacking_set_list();
@@ -131,7 +134,7 @@ void stacking_temp_raise(ObWindow *window)
 
     win[1] = window_top(window);
     start = event_start_ignore_all_enters();
-    XRestackWindows(ob_display, win, 2);
+    XRestackWindows(obt_display, win, 2);
     event_end_ignore_all_enters(start);
 
     pause_changes = TRUE;
@@ -149,7 +152,7 @@ void stacking_restore(void)
     for (i = 1, it = stacking_list; it; ++i, it = g_list_next(it))
         win[i] = window_top(it->data);
     start = event_start_ignore_all_enters();
-    XRestackWindows(ob_display, win, i);
+    XRestackWindows(obt_display, win, i);
     event_end_ignore_all_enters(start);
     g_free(win);
 
@@ -215,11 +218,21 @@ static void restack_windows(ObClient *selected, gboolean raise)
     GList *it, *last, *below, *above, *next;
     GList *wins = NULL;
 
+    GList *group_helpers = NULL;
     GList *group_modals = NULL;
     GList *group_trans = NULL;
     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);
@@ -236,6 +249,8 @@ static void restack_windows(ObClient *selected, gboolean raise)
 
                 /* only move windows in the same stacking layer */
                 if (ch->layer == selected->layer &&
+                    /* looking for windows that are transients, and so would
+                       remain above the selected window */
                     client_search_transient(selected, ch))
                 {
                     if (client_is_direct_child(selected, ch)) {
@@ -244,6 +259,13 @@ static void restack_windows(ObClient *selected, gboolean raise)
                         else
                             trans = g_list_prepend(trans, ch);
                     }
+                    else if (client_helper(ch)) {
+                        if (selected->transient) {
+                            /* helpers do not stay above transient windows */
+                            continue;
+                        }
+                        group_helpers = g_list_prepend(group_helpers, ch);
+                    }
                     else {
                         if (ch->modal)
                             group_modals = g_list_prepend(group_modals, ch);
@@ -256,8 +278,13 @@ static void restack_windows(ObClient *selected, gboolean raise)
         }
     }
 
-    /* put transients of the selected window right above it */
+    /* put modals above other direct transients */
     wins = g_list_concat(modals, trans);
+
+    /* put helpers below direct transients */
+    wins = g_list_concat(wins, group_helpers);
+
+    /* put the selected window right below these children */
     wins = g_list_append(wins, selected);
 
     /* if selected window is transient for group then raise it above others */
@@ -623,21 +650,20 @@ gboolean stacking_restack_request(ObClient *client, ObClient *sibling,
                     sibling->iconic))
     {
         ob_debug("Setting restack sibling to NULL, they are not on the same "
-                 "desktop or it is iconified\n");
+                 "desktop or it is iconified");
         sibling = NULL;
     }
 
     switch (detail) {
     case Below:
-        ob_debug("Restack request Below for client %s sibling %s\n",
+        ob_debug("Restack request Below for client %s sibling %s",
                  client->title, sibling ? sibling->title : "(all)");
         /* just lower it */
         stacking_lower(CLIENT_AS_WINDOW(client));
         ret = TRUE;
         break;
     case BottomIf:
-        ob_debug("Restack request BottomIf for client %s sibling "
-                 "%s\n",
+        ob_debug("Restack request BottomIf for client %s sibling %s",
                  client->title, sibling ? sibling->title : "(all)");
         /* if this client occludes sibling (or anything if NULL), then
            lower it to the bottom */
@@ -647,13 +673,13 @@ gboolean stacking_restack_request(ObClient *client, ObClient *sibling,
         }
         break;
     case Above:
-        ob_debug("Restack request Above for client %s sibling %s\n",
+        ob_debug("Restack request Above for client %s sibling %s",
                  client->title, sibling ? sibling->title : "(all)");
         stacking_raise(CLIENT_AS_WINDOW(client));
         ret = TRUE;
         break;
     case TopIf:
-        ob_debug("Restack request TopIf for client %s sibling %s\n",
+        ob_debug("Restack request TopIf for client %s sibling %s",
                  client->title, sibling ? sibling->title : "(all)");
         if (stacking_occluded(client, sibling)) {
             stacking_raise(CLIENT_AS_WINDOW(client));
@@ -661,8 +687,7 @@ gboolean stacking_restack_request(ObClient *client, ObClient *sibling,
         }
         break;
     case Opposite:
-        ob_debug("Restack request Opposite for client %s sibling "
-                 "%s\n",
+        ob_debug("Restack request Opposite for client %s sibling %s",
                  client->title, sibling ? sibling->title : "(all)");
         if (stacking_occluded(client, sibling)) {
             stacking_raise(CLIENT_AS_WINDOW(client));
This page took 0.025088 seconds and 4 git commands to generate.