]> Dogcows Code - chaz/openbox/blobdiff - openbox/action.c
don't activate on raise
[chaz/openbox] / openbox / action.c
index da4eee75464f4960ac92cda345e7a4bef49411a1..4268987f43142738b5557ef8652614b8d4c455a0 100644 (file)
@@ -1368,7 +1368,7 @@ void action_raiselower(union ActionData *data)
     ObClient *c = data->client.any.c;
 
     client_action_start(data);
-    stacking_restack_request(c, NULL, Opposite, FALSE);
+    stacking_restack_request(c, NULL, Opposite);
     client_action_end(data, config_focus_under_mouse);
 }
 
@@ -1462,8 +1462,8 @@ void action_move_to_center(union ActionData *data)
     Rect *area;
     area = screen_area(c->desktop, client_monitor(c), NULL);
     client_action_start(data);
-    client_move(c, area->width / 2 - c->area.width / 2,
-                area->height / 2 - c->area.height / 2);
+    client_move(c, area->x + area->width / 2 - c->area.width / 2,
+                area->y + area->height / 2 - c->area.height / 2);
     client_action_end(data, FALSE);
     g_free(area);
 }
@@ -1677,7 +1677,8 @@ void action_send_to_desktop_dir(union ActionData *data)
 
 void action_desktop_last(union ActionData *data)
 {
-    screen_set_desktop(screen_last_desktop, TRUE);
+    if (screen_last_desktop < screen_num_desktops)
+        screen_set_desktop(screen_last_desktop, TRUE);
 }
 
 void action_toggle_decorations(union ActionData *data)
@@ -2036,6 +2037,7 @@ void action_break_chroot(union ActionData *data)
 
 void action_add_desktop(union ActionData *data)
 {
+    client_action_start(data);
     screen_set_num_desktops(screen_num_desktops+1);
 
     /* move all the clients over */
@@ -2048,22 +2050,60 @@ void action_add_desktop(union ActionData *data)
                 client_set_desktop(c, c->desktop+1, FALSE, TRUE);
         }
     }
+
+    client_action_end(data, config_focus_under_mouse);
 }
 
 void action_remove_desktop(union ActionData *data)
 {
+    guint rmdesktop, movedesktop;
+    GList *it, *stacking_copy;
+
     if (screen_num_desktops < 2) return;
 
-    /* move all the clients over */
-    if (data->addremovedesktop.current) {
-        GList *it;
+    client_action_start(data);
 
-        for (it = client_list; it; it = g_list_next(it)) {
+    /* 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;
+
+    /* 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, FALSE, TRUE);
+            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);
+            }
         }
     }
 
+    /* act like we're changing desktops */
+    if (screen_desktop < screen_num_desktops - 1) {
+        gint d = screen_desktop;
+        screen_desktop = screen_last_desktop;
+        screen_set_desktop(d, TRUE);
+        ob_debug("fake desktop change\n");
+    }
+
     screen_set_num_desktops(screen_num_desktops-1);
+
+    client_action_end(data, config_focus_under_mouse);
 }
This page took 0.021603 seconds and 4 git commands to generate.