speed up workspace switching by causing the minimal number of expose events (none for the hiding windows!)
This commit is contained in:
parent
432ac0983e
commit
216a04bdd0
3 changed files with 43 additions and 21 deletions
|
@ -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;
|
||||
|
||||
if (show) engine_frame_show(self->frame);
|
||||
else engine_frame_hide(self->frame);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (firehook)
|
||||
HOOKFIRECLIENT(visible, self);
|
||||
void client_showhide(Client *self)
|
||||
{
|
||||
|
||||
if (client_should_show(self))
|
||||
engine_frame_show(self->frame);
|
||||
else
|
||||
engine_frame_hide(self->frame);
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue