don't fallback when a window is hidden right away, it's redundant, we'll get a focuso...
authorDana Jansens <danakj@orodu.net>
Thu, 12 Apr 2007 02:26:26 +0000 (02:26 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 12 Apr 2007 02:26:26 +0000 (02:26 +0000)
show new windows when switching desktops before hiding the old windows.

openbox/client.c
openbox/client.h
openbox/screen.c

index eb00e6d..24fc264 100644 (file)
@@ -455,7 +455,7 @@ void client_manage(Window window)
     /* this has to happen before we try focus the window, but we want it to
        happen after the client's stacking has been determined or it looks bad
     */
-    client_showhide(self);
+    client_show(self);
 
     /* use client_focus instead of client_activate cuz client_activate does
        stuff like switch desktops etc and I'm not interested in all that when
@@ -2058,6 +2058,33 @@ gboolean client_should_show(ObClient *self)
     return FALSE;
 }
 
+void client_show(ObClient *self)
+{
+
+    if (client_should_show(self)) {
+        frame_show(self->frame);
+    }
+
+    /* 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
+       desktop!
+    */
+    client_change_wm_state(self);
+}
+
+void client_hide(ObClient *self)
+{
+    if (!client_should_show(self)) {
+        frame_hide(self->frame);
+    }
+
+    /* 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
+       desktop!
+    */
+    client_change_wm_state(self);
+}
+
 void client_showhide(ObClient *self)
 {
 
@@ -2066,10 +2093,6 @@ void client_showhide(ObClient *self)
     }
     else {
         frame_hide(self->frame);
-
-        /* Fall back focus since we're disappearing */
-        if (focus_client == self)
-            client_unfocus(self);
     }
 
     /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
index 53a318e..4046415 100644 (file)
@@ -458,6 +458,12 @@ void client_kill(ObClient *self);
          desktop has been changed. Generally this should be FALSE. */
 void client_set_desktop(ObClient *self, guint target, gboolean donthide);
 
+/*! Show the client if it should be shown. */
+void client_show(ObClient *self);
+
+/*! Show the client if it should be shown. */
+void client_hide(ObClient *self);
+
 /*! Show the client if it should be shown, and hide it if it should be
   hidden. This is for example, when switching desktops.
 */
index 298a0b2..1705fa8 100644 (file)
@@ -435,11 +435,11 @@ void screen_set_desktop(guint num)
 
     /* show windows before hiding the rest to lessen the enter/leave events */
 
-    /* show windows from top to bottom */
+    /* show/hide windows from top to bottom */
     for (it = stacking_list; it; it = g_list_next(it)) {
         if (WINDOW_IS_CLIENT(it->data)) {
             ObClient *c = it->data;
-            client_showhide(c);
+            client_show(c);
         }
     }
 
@@ -447,7 +447,7 @@ void screen_set_desktop(guint num)
     for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
         if (WINDOW_IS_CLIENT(it->data)) {
             ObClient *c = it->data;
-            client_showhide(c);
+            client_hide(c);
         }
     }
 
@@ -458,9 +458,10 @@ void screen_set_desktop(guint num)
         frame_adjust_focus(focus_hilite->frame, TRUE);
 
         /*!
-          When this focus_client check is not used, you can end up with races,
-          as demonstrated with gnome-panel, sometmies the window you click on
-          another desktop ends up losing focus cuz of the focus change here.
+          When this focus_client check is not used, you can end up with
+          races, as demonstrated with gnome-panel, sometimes the window
+          you click on another desktop ends up losing focus cuz of the
+          focus change here.
         */
         /*if (!focus_client)*/
         client_focus(focus_hilite);