HOOKFIRECLIENT(managed, client);
- client_showhide(client, TRUE);
+ client_showhide(client);
/* grab all mouse bindings */
pointer_grab_all(client, TRUE);
}
}
-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) {
XMapWindow(ob_display, self->window);
}
client_change_state(self);
- client_showhide(self, TRUE);
+ client_showhide(self);
screen_update_struts();
}
/* 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();
}
/*! 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
#include "prop.h"
#include "screen.h"
#include "client.h"
+#include "frame.h"
+#include "engine.h"
#include "focus.h"
#include <X11/Xlib.h>
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)
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);
}
}