From: Dana Jansens Date: Mon, 17 Mar 2003 02:03:45 +0000 (+0000) Subject: speed up workspace switching by causing the minimal number of expose events (none... X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=216a04bdd057c03a719a0908cd003503b4f73fdb;p=chaz%2Fopenbox speed up workspace switching by causing the minimal number of expose events (none for the hiding windows!) --- diff --git a/openbox/client.c b/openbox/client.c index 40c61208..2b95a598 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -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(); } diff --git a/openbox/client.h b/openbox/client.h index 0f9eaa4b..4df3893e 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -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 diff --git a/openbox/screen.c b/openbox/screen.c index d077c495..3c83baa4 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -2,6 +2,8 @@ #include "prop.h" #include "screen.h" #include "client.h" +#include "frame.h" +#include "engine.h" #include "focus.h" #include @@ -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); } }