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.
This commit is contained in:
Dana Jansens 2007-04-12 02:26:26 +00:00
parent 7059cde13b
commit c03c08415f
3 changed files with 41 additions and 11 deletions

View file

@ -455,7 +455,7 @@ void client_manage(Window window)
/* this has to happen before we try focus the window, but we want it to /* 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 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 /* 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 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; 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) void client_showhide(ObClient *self)
{ {
@ -2066,10 +2093,6 @@ void client_showhide(ObClient *self)
} }
else { else {
frame_hide(self->frame); 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 /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it

View file

@ -458,6 +458,12 @@ void client_kill(ObClient *self);
desktop has been changed. Generally this should be FALSE. */ desktop has been changed. Generally this should be FALSE. */
void client_set_desktop(ObClient *self, guint target, gboolean donthide); 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 /*! Show the client if it should be shown, and hide it if it should be
hidden. This is for example, when switching desktops. hidden. This is for example, when switching desktops.
*/ */

View file

@ -435,11 +435,11 @@ void screen_set_desktop(guint num)
/* show windows before hiding the rest to lessen the enter/leave events */ /* 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)) { for (it = stacking_list; it; it = g_list_next(it)) {
if (WINDOW_IS_CLIENT(it->data)) { if (WINDOW_IS_CLIENT(it->data)) {
ObClient *c = 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)) { for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
if (WINDOW_IS_CLIENT(it->data)) { if (WINDOW_IS_CLIENT(it->data)) {
ObClient *c = 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); frame_adjust_focus(focus_hilite->frame, TRUE);
/*! /*!
When this focus_client check is not used, you can end up with races, When this focus_client check is not used, you can end up with
as demonstrated with gnome-panel, sometmies the window you click on races, as demonstrated with gnome-panel, sometimes the window
another desktop ends up losing focus cuz of the focus change here. you click on another desktop ends up losing focus cuz of the
focus change here.
*/ */
/*if (!focus_client)*/ /*if (!focus_client)*/
client_focus(focus_hilite); client_focus(focus_hilite);