all repos — openbox @ 216a04bdd057c03a719a0908cd003503b4f73fdb

openbox fork - make it a bit more like ryudo

speed up workspace switching by causing the minimal number of expose events (none for the hiding windows!)
Dana Jansens danakj@orodu.net
commit

216a04bdd057c03a719a0908cd003503b4f73fdb

parent

432ac0983e058133e03885171f266dc4ba07f488

3 files changed, 43 insertions(+), 21 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -204,7 +204,7 @@ Py_DECREF(cw);

HOOKFIRECLIENT(managed, client); - client_showhide(client, TRUE); + client_showhide(client); /* grab all mouse bindings */ pointer_grab_all(client, TRUE);

@@ -1223,21 +1223,25 @@ stacking_raise(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 @@ self->wmstate = self->shaded ? IconicState : NormalState;

XMapWindow(ob_display, self->window); } client_change_state(self); - client_showhide(self, TRUE); + client_showhide(self); screen_update_struts(); }

@@ -1657,7 +1661,7 @@ PROP_SET32(self->window, net_wm_desktop, cardinal, 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(); }
M openbox/client.hopenbox/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
M openbox/screen.copenbox/screen.c

@@ -2,6 +2,8 @@ #include "openbox.h"

#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 @@ PROP_SET32(ob_root, net_current_desktop, cardinal, 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 @@ for (it = g_list_last(stacking_list); it != NULL; it = it->prev) {

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); } }