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
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

View file

@ -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.
*/

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 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);