From 92bea590c0eff5f56f70093dfa1edef2f65b113f Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 28 Mar 2003 08:11:02 +0000 Subject: [PATCH] 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 --- openbox/action.c | 8 ++++---- openbox/client.c | 26 +++++++++++++++++++------- openbox/client.h | 2 +- openbox/event.c | 3 ++- openbox/screen.c | 2 +- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/openbox/action.c b/openbox/action.c index ce96ad41..f0c703ff 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -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); } diff --git a/openbox/client.c b/openbox/client.c index 6c1a6add..278ee38e 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -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); diff --git a/openbox/client.h b/openbox/client.h index a4e5c2ea..e01e2ebe 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -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. diff --git a/openbox/event.c b/openbox/event.c index 7e0dc0aa..13586f70 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -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", diff --git a/openbox/screen.c b/openbox/screen.c index a051d250..5cf2bc55 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -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); -- 2.39.2