raise windows smartly when merging desktops
authorDana Jansens <danakj@orodu.net>
Wed, 13 Jun 2007 17:16:08 +0000 (17:16 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 13 Jun 2007 17:16:08 +0000 (17:16 +0000)
openbox/action.c
openbox/client.c
openbox/screen.c

index 5f78366..7c79969 100644 (file)
@@ -2056,29 +2056,41 @@ void action_add_desktop(union ActionData *data)
 
 void action_remove_desktop(union ActionData *data)
 {
+    guint rmdesktop, movedesktop;
+    GList *it, *stacking_copy;
+
     if (screen_num_desktops < 2) return;
 
     client_action_start(data);
 
-    if (screen_desktop == screen_num_desktops - 1)
-        data->addremovedesktop.current = FALSE;
+    /* what desktop are we removing and moving to? */
+    if (data->addremovedesktop.current)
+        rmdesktop = screen_desktop;
+    else
+        rmdesktop = screen_num_desktops - 1;
+    if (rmdesktop < screen_num_desktops - 1)
+        movedesktop = rmdesktop + 1;
+    else
+        movedesktop = rmdesktop;
 
-    /* move all the clients over */
-    if (data->addremovedesktop.current) {
-        GList *it, *stacking_copy;
-
-        /* make a copy of the list cuz we're changing it */
-        stacking_copy = g_list_copy(stacking_list);
-        for (it = g_list_last(stacking_copy); it; it = g_list_previous(it)) {
-            if (WINDOW_IS_CLIENT(it->data)) {
-                ObClient *c = it->data;
-                if (c->desktop != DESKTOP_ALL && c->desktop > screen_desktop)
-                    client_set_desktop(c, c->desktop - 1, TRUE, TRUE);
-                /* raise all the windows that are on the current desktop which
-                   is being merged */
-                else if (c->desktop == DESKTOP_ALL ||
-                         c->desktop == screen_desktop)
-                    stacking_raise(CLIENT_AS_WINDOW(c));
+    /* make a copy of the list cuz we're changing it */
+    stacking_copy = g_list_copy(stacking_list);
+    for (it = g_list_last(stacking_copy); it; it = g_list_previous(it)) {
+        if (WINDOW_IS_CLIENT(it->data)) {
+            ObClient *c = it->data;
+            guint d = c->desktop;
+            if (d != DESKTOP_ALL && d >= movedesktop) {
+                client_set_desktop(c, c->desktop - 1, TRUE, TRUE);
+                ob_debug("moving window %s\n", c->title);
+            }
+            /* raise all the windows that are on the current desktop which
+               is being merged */
+            if ((screen_desktop == rmdesktop - 1 ||
+                 screen_desktop == rmdesktop) &&
+                (d == DESKTOP_ALL || d == screen_desktop))
+            {
+                stacking_raise(CLIENT_AS_WINDOW(c));
+                ob_debug("raising window %s\n", c->title);
             }
         }
     }
index fed902f..f8ebd13 100644 (file)
@@ -2509,7 +2509,6 @@ gboolean client_hide(ObClient *self)
 
         frame_hide(self->frame);
         hide = TRUE;
-        ob_debug("hiding client %s\n", self->title);
 
         /* According to the ICCCM (sec 4.1.3.1) when a window is not visible,
            it needs to be in IconicState. This includes when it is on another
index 720fc04..f9b1eb6 100644 (file)
@@ -526,8 +526,9 @@ void screen_set_num_desktops(guint num)
                 client_set_desktop(c, num - 1, FALSE, TRUE);
             /* raise all the windows that are on the current desktop which
                is being merged */
-            else if (c->desktop == DESKTOP_ALL ||
-                     c->desktop == num - 1)
+            else if (screen_desktop == num - 1 &&
+                     (c->desktop == DESKTOP_ALL ||
+                      c->desktop == screen_desktop))
                 stacking_raise(WINDOW_AS_CLIENT(c));
         }
     }