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:
parent
7059cde13b
commit
c03c08415f
3 changed files with 41 additions and 11 deletions
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue