From c03c08415f01a52584158aa4f0356f3a0d7a46aa Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 12 Apr 2007 02:26:26 +0000 Subject: [PATCH] don't fallback when a window is hidden right away, it's redundant, we'll get a focusout for the window after the unmapnotify anyways. show new windows when switching desktops before hiding the old windows. --- openbox/client.c | 33 ++++++++++++++++++++++++++++----- openbox/client.h | 6 ++++++ openbox/screen.c | 13 +++++++------ 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index eb00e6d6..24fc2647 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -455,7 +455,7 @@ void client_manage(Window window) /* this has to happen before we try focus the window, but we want it to happen after the client's stacking has been determined or it looks bad */ - client_showhide(self); + client_show(self); /* use client_focus instead of client_activate cuz client_activate does stuff like switch desktops etc and I'm not interested in all that when @@ -2058,6 +2058,33 @@ gboolean client_should_show(ObClient *self) return FALSE; } +void client_show(ObClient *self) +{ + + if (client_should_show(self)) { + frame_show(self->frame); + } + + /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it + needs to be in IconicState. This includes when it is on another + desktop! + */ + client_change_wm_state(self); +} + +void client_hide(ObClient *self) +{ + if (!client_should_show(self)) { + frame_hide(self->frame); + } + + /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it + needs to be in IconicState. This includes when it is on another + desktop! + */ + client_change_wm_state(self); +} + void client_showhide(ObClient *self) { @@ -2066,10 +2093,6 @@ void client_showhide(ObClient *self) } else { frame_hide(self->frame); - - /* Fall back focus since we're disappearing */ - if (focus_client == self) - client_unfocus(self); } /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it diff --git a/openbox/client.h b/openbox/client.h index 53a318e0..40464151 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -458,6 +458,12 @@ void client_kill(ObClient *self); desktop has been changed. Generally this should be FALSE. */ void client_set_desktop(ObClient *self, guint target, gboolean donthide); +/*! Show the client if it should be shown. */ +void client_show(ObClient *self); + +/*! Show the client if it should be shown. */ +void client_hide(ObClient *self); + /*! Show the client if it should be shown, and hide it if it should be hidden. This is for example, when switching desktops. */ diff --git a/openbox/screen.c b/openbox/screen.c index 298a0b22..1705fa89 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -435,11 +435,11 @@ void screen_set_desktop(guint num) /* show windows before hiding the rest to lessen the enter/leave events */ - /* show windows from top to bottom */ + /* show/hide windows from top to bottom */ for (it = stacking_list; it; it = g_list_next(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; - client_showhide(c); + client_show(c); } } @@ -447,7 +447,7 @@ void screen_set_desktop(guint num) for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) { if (WINDOW_IS_CLIENT(it->data)) { ObClient *c = it->data; - client_showhide(c); + client_hide(c); } } @@ -458,9 +458,10 @@ void screen_set_desktop(guint num) frame_adjust_focus(focus_hilite->frame, TRUE); /*! - When this focus_client check is not used, you can end up with races, - as demonstrated with gnome-panel, sometmies the window you click on - another desktop ends up losing focus cuz of the focus change here. + When this focus_client check is not used, you can end up with + races, as demonstrated with gnome-panel, sometimes the window + you click on another desktop ends up losing focus cuz of the + focus change here. */ /*if (!focus_client)*/ client_focus(focus_hilite); -- 2.39.2