let a window be 'moved' to a new desktop without actually show/hiding it. useful for sending a window when following it, so theres no flash/flicker
This commit is contained in:
parent
42bbf005c8
commit
92bea590c0
5 changed files with 27 additions and 14 deletions
|
@ -235,7 +235,7 @@ void action_toggle_omnipresent(union ActionData *data)
|
|||
if (data->client.c)
|
||||
client_set_desktop(data->client.c,
|
||||
data->client.c->desktop == DESKTOP_ALL ?
|
||||
screen_desktop : DESKTOP_ALL);
|
||||
screen_desktop : DESKTOP_ALL, FALSE);
|
||||
}
|
||||
|
||||
void action_move_relative_horz(union ActionData *data)
|
||||
|
@ -336,7 +336,7 @@ void action_send_to_desktop(union ActionData *data)
|
|||
if (data->sendto.c)
|
||||
if (data->sendto.desktop < screen_num_desktops ||
|
||||
data->sendto.desktop == DESKTOP_ALL)
|
||||
client_set_desktop(data->sendto.c, data->sendto.desktop);
|
||||
client_set_desktop(data->sendto.c, data->sendto.desktop, TRUE);
|
||||
}
|
||||
|
||||
void action_send_to_next_desktop(union ActionData *data)
|
||||
|
@ -350,7 +350,7 @@ void action_send_to_next_desktop(union ActionData *data)
|
|||
if (!data->sendtonextprev.wrap) return;
|
||||
d = 0;
|
||||
}
|
||||
client_set_desktop(data->sendtonextprev.c, d);
|
||||
client_set_desktop(data->sendtonextprev.c, d, data->sendtonextprev.follow);
|
||||
if (data->sendtonextprev.follow) screen_set_desktop(d);
|
||||
}
|
||||
|
||||
|
@ -365,7 +365,7 @@ void action_send_to_previous_desktop(union ActionData *data)
|
|||
if (!data->sendtonextprev.wrap) return;
|
||||
d = screen_num_desktops - 1;
|
||||
}
|
||||
client_set_desktop(data->sendtonextprev.c, d);
|
||||
client_set_desktop(data->sendtonextprev.c, d, data->sendtonextprev.follow);
|
||||
if (data->sendtonextprev.follow) screen_set_desktop(d);
|
||||
}
|
||||
|
||||
|
|
|
@ -1541,7 +1541,7 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
|
|||
XUnmapWindow(ob_display, self->window);
|
||||
} else {
|
||||
if (curdesk)
|
||||
client_set_desktop(self, screen_desktop);
|
||||
client_set_desktop(self, screen_desktop, FALSE);
|
||||
self->wmstate = self->shaded ? IconicState : NormalState;
|
||||
XMapWindow(ob_display, self->window);
|
||||
}
|
||||
|
@ -1702,13 +1702,14 @@ void client_kill(Client *self)
|
|||
XKillClient(ob_display, self->window);
|
||||
}
|
||||
|
||||
void client_set_desktop(Client *self, guint target)
|
||||
void client_set_desktop(Client *self, guint target, gboolean donthide)
|
||||
{
|
||||
guint old, i;
|
||||
ConfigValue focus_new;
|
||||
|
||||
if (target == self->desktop) return;
|
||||
|
||||
g_message("Setting desktop %u\n", target);
|
||||
g_message("Setting desktop %u", target);
|
||||
|
||||
g_assert(target < screen_num_desktops || target == DESKTOP_ALL);
|
||||
|
||||
|
@ -1718,19 +1719,30 @@ void client_set_desktop(Client *self, guint target)
|
|||
/* the frame can display the current desktop state */
|
||||
engine_frame_adjust_state(self->frame);
|
||||
/* 'move' the window to the new desktop */
|
||||
client_showhide(self);
|
||||
if (!donthide)
|
||||
client_showhide(self);
|
||||
stacking_raise(self);
|
||||
screen_update_struts();
|
||||
|
||||
/* update the focus lists */
|
||||
if (!config_get("focusNew", Config_Bool, &focus_new))
|
||||
g_assert_not_reached();
|
||||
if (old == DESKTOP_ALL) {
|
||||
for (i = 0; i < screen_num_desktops; ++i)
|
||||
focus_order[i] = g_list_remove(focus_order[i], self);
|
||||
focus_order[target] = g_list_prepend(focus_order[target], self);
|
||||
if (focus_new.bool)
|
||||
focus_order[target] = g_list_prepend(focus_order[target], self);
|
||||
else
|
||||
focus_order[target] = g_list_append(focus_order[target], self);
|
||||
} else {
|
||||
focus_order[old] = g_list_remove(focus_order[old], self);
|
||||
if (target == DESKTOP_ALL)
|
||||
for (i = 0; i < screen_num_desktops; ++i)
|
||||
focus_order[i] = g_list_prepend(focus_order[i], self);
|
||||
for (i = 0; i < screen_num_desktops; ++i) {
|
||||
if (focus_new.bool)
|
||||
focus_order[i] = g_list_prepend(focus_order[i], self);
|
||||
else
|
||||
focus_order[i] = g_list_append(focus_order[i], self);
|
||||
}
|
||||
}
|
||||
|
||||
dispatch_client(Event_Client_Desktop, self, target, old);
|
||||
|
|
|
@ -382,7 +382,7 @@ void client_close(Client *self);
|
|||
void client_kill(Client *self);
|
||||
|
||||
/*! Sends the window to the specified desktop */
|
||||
void client_set_desktop(Client *self, guint target);
|
||||
void client_set_desktop(Client *self, guint target, gboolean donthide);
|
||||
|
||||
/*! Return a modal child of the client window
|
||||
@return A modal child of the client window, or 0 if none was found.
|
||||
|
|
|
@ -523,7 +523,8 @@ static void event_handle_client(Client *client, XEvent *e)
|
|||
}
|
||||
if ((unsigned)e->xclient.data.l[0] < screen_num_desktops ||
|
||||
(unsigned)e->xclient.data.l[0] == DESKTOP_ALL)
|
||||
client_set_desktop(client, (unsigned)e->xclient.data.l[0]);
|
||||
client_set_desktop(client, (unsigned)e->xclient.data.l[0],
|
||||
FALSE);
|
||||
} else if (msgtype == prop_atoms.net_wm_state) {
|
||||
/* can't compress these */
|
||||
g_message("net_wm_state %s %ld %ld for 0x%lx",
|
||||
|
|
|
@ -244,7 +244,7 @@ void screen_set_num_desktops(guint num)
|
|||
for (it = client_list; it != NULL; it = it->next) {
|
||||
Client *c = it->data;
|
||||
if (c->desktop >= num)
|
||||
client_set_desktop(c, num - 1);
|
||||
client_set_desktop(c, num - 1, FALSE);
|
||||
}
|
||||
|
||||
dispatch_ob(Event_Ob_NumDesktops, num, old);
|
||||
|
|
Loading…
Reference in a new issue