let a window be 'moved' to a new desktop without actually show/hiding it. useful...
authorDana Jansens <danakj@orodu.net>
Fri, 28 Mar 2003 08:11:02 +0000 (08:11 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 28 Mar 2003 08:11:02 +0000 (08:11 +0000)
openbox/action.c
openbox/client.c
openbox/client.h
openbox/event.c
openbox/screen.c

index ce96ad4..f0c703f 100644 (file)
@@ -235,7 +235,7 @@ void action_toggle_omnipresent(union ActionData *data)
     if (data->client.c)
         client_set_desktop(data->client.c,
                            data->client.c->desktop == DESKTOP_ALL ?
-                           screen_desktop : DESKTOP_ALL);
+                           screen_desktop : DESKTOP_ALL, FALSE);
 }
 
 void action_move_relative_horz(union ActionData *data)
@@ -336,7 +336,7 @@ void action_send_to_desktop(union ActionData *data)
     if (data->sendto.c)
         if (data->sendto.desktop < screen_num_desktops ||
             data->sendto.desktop == DESKTOP_ALL)
-            client_set_desktop(data->sendto.c, data->sendto.desktop);
+            client_set_desktop(data->sendto.c, data->sendto.desktop, TRUE);
 }
 
 void action_send_to_next_desktop(union ActionData *data)
@@ -350,7 +350,7 @@ void action_send_to_next_desktop(union ActionData *data)
         if (!data->sendtonextprev.wrap) return;
         d = 0;
     }
-    client_set_desktop(data->sendtonextprev.c, d);
+    client_set_desktop(data->sendtonextprev.c, d, data->sendtonextprev.follow);
     if (data->sendtonextprev.follow) screen_set_desktop(d);
 }
 
@@ -365,7 +365,7 @@ void action_send_to_previous_desktop(union ActionData *data)
         if (!data->sendtonextprev.wrap) return;
         d = screen_num_desktops - 1;
     }
-    client_set_desktop(data->sendtonextprev.c, d);
+    client_set_desktop(data->sendtonextprev.c, d, data->sendtonextprev.follow);
     if (data->sendtonextprev.follow) screen_set_desktop(d);
 }
 
index 6c1a6ad..278ee38 100644 (file)
@@ -1541,7 +1541,7 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
        XUnmapWindow(ob_display, self->window);
     } else {
        if (curdesk)
-           client_set_desktop(self, screen_desktop);
+           client_set_desktop(self, screen_desktop, FALSE);
        self->wmstate = self->shaded ? IconicState : NormalState;
        XMapWindow(ob_display, self->window);
     }
@@ -1702,13 +1702,14 @@ void client_kill(Client *self)
     XKillClient(ob_display, self->window);
 }
 
-void client_set_desktop(Client *self, guint target)
+void client_set_desktop(Client *self, guint target, gboolean donthide)
 {
     guint old, i;
+    ConfigValue focus_new;
 
     if (target == self->desktop) return;
   
-    g_message("Setting desktop %u\n", target);
+    g_message("Setting desktop %u", target);
 
     g_assert(target < screen_num_desktops || target == DESKTOP_ALL);
 
@@ -1718,19 +1719,30 @@ void client_set_desktop(Client *self, guint target)
     /* the frame can display the current desktop state */
     engine_frame_adjust_state(self->frame);
     /* 'move' the window to the new desktop */
-    client_showhide(self);
+    if (!donthide)
+        client_showhide(self);
+    stacking_raise(self);
     screen_update_struts();
 
     /* update the focus lists */
+    if (!config_get("focusNew", Config_Bool, &focus_new))
+        g_assert_not_reached();
     if (old == DESKTOP_ALL) {
         for (i = 0; i < screen_num_desktops; ++i)
             focus_order[i] = g_list_remove(focus_order[i], self);
-        focus_order[target] = g_list_prepend(focus_order[target], self);
+        if (focus_new.bool)
+            focus_order[target] = g_list_prepend(focus_order[target], self);
+        else
+            focus_order[target] = g_list_append(focus_order[target], self);
     } else {
         focus_order[old] = g_list_remove(focus_order[old], self);
         if (target == DESKTOP_ALL)
-            for (i = 0; i < screen_num_desktops; ++i)
-                focus_order[i] = g_list_prepend(focus_order[i], self);
+            for (i = 0; i < screen_num_desktops; ++i) {
+                if (focus_new.bool)
+                    focus_order[i] = g_list_prepend(focus_order[i], self);
+                else
+                    focus_order[i] = g_list_append(focus_order[i], self);
+            }
     }
 
     dispatch_client(Event_Client_Desktop, self, target, old);
index a4e5c2e..e01e2eb 100644 (file)
@@ -382,7 +382,7 @@ void client_close(Client *self);
 void client_kill(Client *self);
 
 /*! Sends the window to the specified desktop */
-void client_set_desktop(Client *self, guint target);
+void client_set_desktop(Client *self, guint target, gboolean donthide);
 
 /*! Return a modal child of the client window
     @return A modal child of the client window, or 0 if none was found.
index 7e0dc0a..13586f7 100644 (file)
@@ -523,7 +523,8 @@ static void event_handle_client(Client *client, XEvent *e)
            }
             if ((unsigned)e->xclient.data.l[0] < screen_num_desktops ||
                 (unsigned)e->xclient.data.l[0] == DESKTOP_ALL)
-                client_set_desktop(client, (unsigned)e->xclient.data.l[0]);
+                client_set_desktop(client, (unsigned)e->xclient.data.l[0],
+                                   FALSE);
        } else if (msgtype == prop_atoms.net_wm_state) {
            /* can't compress these */
            g_message("net_wm_state %s %ld %ld for 0x%lx",
index a051d25..5cf2bc5 100644 (file)
@@ -244,7 +244,7 @@ void screen_set_num_desktops(guint num)
     for (it = client_list; it != NULL; it = it->next) {
         Client *c = it->data;
         if (c->desktop >= num)
-            client_set_desktop(c, num - 1);
+            client_set_desktop(c, num - 1, FALSE);
     }
 
     dispatch_ob(Event_Ob_NumDesktops, num, old);