summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/client.c32
-rw-r--r--openbox/client.h7
-rw-r--r--openbox/screen.c25
3 files changed, 43 insertions, 21 deletions
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 <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);
}
}