raise windows smartly when merging desktops

This commit is contained in:
Dana Jansens 2007-06-13 17:16:08 +00:00
parent e048751f91
commit 8923bd7026
3 changed files with 33 additions and 21 deletions

View file

@ -2056,29 +2056,41 @@ void action_add_desktop(union ActionData *data)
void action_remove_desktop(union ActionData *data) void action_remove_desktop(union ActionData *data)
{ {
guint rmdesktop, movedesktop;
GList *it, *stacking_copy;
if (screen_num_desktops < 2) return; if (screen_num_desktops < 2) return;
client_action_start(data); client_action_start(data);
if (screen_desktop == screen_num_desktops - 1) /* what desktop are we removing and moving to? */
data->addremovedesktop.current = FALSE; if (data->addremovedesktop.current)
rmdesktop = screen_desktop;
/* move all the clients over */ else
if (data->addremovedesktop.current) { rmdesktop = screen_num_desktops - 1;
GList *it, *stacking_copy; if (rmdesktop < screen_num_desktops - 1)
movedesktop = rmdesktop + 1;
else
movedesktop = rmdesktop;
/* make a copy of the list cuz we're changing it */ /* make a copy of the list cuz we're changing it */
stacking_copy = g_list_copy(stacking_list); stacking_copy = g_list_copy(stacking_list);
for (it = g_list_last(stacking_copy); it; it = g_list_previous(it)) { for (it = g_list_last(stacking_copy); 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;
if (c->desktop != DESKTOP_ALL && c->desktop > screen_desktop) guint d = c->desktop;
if (d != DESKTOP_ALL && d >= movedesktop) {
client_set_desktop(c, c->desktop - 1, TRUE, TRUE); client_set_desktop(c, c->desktop - 1, TRUE, TRUE);
ob_debug("moving window %s\n", c->title);
}
/* raise all the windows that are on the current desktop which /* raise all the windows that are on the current desktop which
is being merged */ is being merged */
else if (c->desktop == DESKTOP_ALL || if ((screen_desktop == rmdesktop - 1 ||
c->desktop == screen_desktop) screen_desktop == rmdesktop) &&
(d == DESKTOP_ALL || d == screen_desktop))
{
stacking_raise(CLIENT_AS_WINDOW(c)); stacking_raise(CLIENT_AS_WINDOW(c));
ob_debug("raising window %s\n", c->title);
} }
} }
} }

View file

@ -2509,7 +2509,6 @@ gboolean client_hide(ObClient *self)
frame_hide(self->frame); frame_hide(self->frame);
hide = TRUE; hide = TRUE;
ob_debug("hiding client %s\n", self->title);
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, /* 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 it needs to be in IconicState. This includes when it is on another

View file

@ -526,8 +526,9 @@ void screen_set_num_desktops(guint num)
client_set_desktop(c, num - 1, FALSE, TRUE); client_set_desktop(c, num - 1, FALSE, TRUE);
/* raise all the windows that are on the current desktop which /* raise all the windows that are on the current desktop which
is being merged */ is being merged */
else if (c->desktop == DESKTOP_ALL || else if (screen_desktop == num - 1 &&
c->desktop == num - 1) (c->desktop == DESKTOP_ALL ||
c->desktop == screen_desktop))
stacking_raise(WINDOW_AS_CLIENT(c)); stacking_raise(WINDOW_AS_CLIENT(c));
} }
} }