]> Dogcows Code - chaz/openbox/commitdiff
speed up workspace switching by causing the minimal number of expose events (none...
authorDana Jansens <danakj@orodu.net>
Mon, 17 Mar 2003 02:03:45 +0000 (02:03 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 17 Mar 2003 02:03:45 +0000 (02:03 +0000)
openbox/client.c
openbox/client.h
openbox/screen.c

index 40c61208ca821113fb65a5c47636ad021c8c9cd9..2b95a598ea21c57c5e0cb56ea53d7168771f102f 100644 (file)
@@ -204,7 +204,7 @@ void client_manage(Window window)
 
     HOOKFIRECLIENT(managed, client);
 
-    client_showhide(client, TRUE);
+    client_showhide(client);
 
     /* grab all mouse bindings */
     pointer_grab_all(client, TRUE);
@@ -1223,21 +1223,25 @@ void client_calc_layer(Client *self)
     }
 }
 
-void client_showhide(Client *self, gboolean firehook)
+gboolean client_should_show(Client *self)
 {
-    gboolean show;
-
-    if (self->iconic) show = FALSE;
+    if (self->iconic) return FALSE;
     else if (!(self->desktop == screen_desktop ||
-              self->desktop == DESKTOP_ALL)) show = FALSE;
-    else if (client_normal(self) && screen_showing_desktop) show = FALSE;
-    else show = TRUE;
+              self->desktop == DESKTOP_ALL)) return FALSE;
+    else if (client_normal(self) && screen_showing_desktop) return FALSE;
+    
+    return TRUE;
+}
 
-    if (show) engine_frame_show(self->frame);
-    else      engine_frame_hide(self->frame);
+void client_showhide(Client *self)
+{
+
+    if (client_should_show(self))
+        engine_frame_show(self->frame);
+    else
+        engine_frame_hide(self->frame);
 
-    if (firehook)
-       HOOKFIRECLIENT(visible, self);
+    HOOKFIRECLIENT(visible, self);
 }
 
 gboolean client_normal(Client *self) {
@@ -1491,7 +1495,7 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
        XMapWindow(ob_display, self->window);
     }
     client_change_state(self);
-    client_showhide(self, TRUE);
+    client_showhide(self);
     screen_update_struts();
 }
 
@@ -1657,7 +1661,7 @@ void client_set_desktop(Client *self, unsigned int 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, TRUE);
+    client_showhide(self);
     screen_update_struts();
 }
 
index 0f9eaa4b2c4df9da37855d41b989e01baf6ab68a..4df3893e08cc1eb0d11a1f573d7a45459c5f58bb 100644 (file)
@@ -309,7 +309,12 @@ void client_remaximize(Client *self);
 
 /*! Shows the window if it should be shown, or hides it
   Used when changing desktops, the window's state, etc. */
-void client_showhide(Client *self, gboolean firehook);
+void client_showhide(Client *self);
+
+/*! Determines if the client should be shown or hidden currently.
+  @return TRUE if it should be visible; otherwise, FALSE.
+*/
+gboolean client_should_show(Client *self);
 
 /*! Returns if the window should be treated as a normal window.
   Some windows (desktops, docks, splash screens) have special rules applied
index d077c495e74b1f7c79b67f96ec028de4cc4ea228..3c83baa4d0f1a0a2218efca6cc727aac855467a2 100644 (file)
@@ -2,6 +2,8 @@
 #include "prop.h"
 #include "screen.h"
 #include "client.h"
+#include "frame.h"
+#include "engine.h"
 #include "focus.h"
 
 #include <X11/Xlib.h>
@@ -251,8 +253,19 @@ void screen_set_desktop(guint num)
 
     if (old == num) return;
 
-    for (it = stacking_list; it != NULL; it = it->next)
-       client_showhide(it->data, FALSE);
+    /* hide windows from bottom to top */
+    for (it = g_list_last(stacking_list); it != NULL; it = it->prev) {
+        Client *c = it->data;
+       if (c->frame->visible && !client_should_show(c))
+            engine_frame_hide(c->frame);
+    }
+
+    /* show windows from top to bottom */
+    for (it = stacking_list; it != NULL; it = it->next) {
+        Client *c = it->data;
+       if (!c->frame->visible && client_should_show(c))
+            engine_frame_show(c->frame);
+    }
 
     /* force the callbacks to fire */
     if (focus_client == NULL)
@@ -356,15 +369,15 @@ void screen_show_desktop(gboolean show)
            Client *client = it->data;
            if (client->type == Type_Desktop)
                client_focus(client);
-           else
-               client_showhide(client, FALSE);
+           else if (client->frame->visible && !client_should_show(client))
+                engine_frame_hide(client->frame);
        }
     } else {
         /* top to bottom */
        for (it = stacking_list; it != NULL; it = it->next) {
            Client *client = it->data;
-           if (client->type != Type_Desktop)
-               client_showhide(client, FALSE);
+           if (!client->frame->visible && client_should_show(client))
+                engine_frame_show(client->frame);
        }
     }
 
This page took 0.030772 seconds and 4 git commands to generate.