diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-04-25 21:27:16 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-04-25 21:27:16 +0000 |
| commit | 92d3f2342db3d3bfd5d41a6c3dc165efa7766ffa (patch) | |
| tree | 7a2167c4fe40b93838d7cbb91d13442367532c49 /openbox/client.c | |
| parent | 16a9ac018ed77e245e873be60729be509fa1ce92 (diff) | |
add helper functions for manipulating the focus_order list.
move the focus popup into focus.c, out of action.c
allow cycling to iconic windows, which are kept at the bottom of the focus_order lists.
Diffstat (limited to 'openbox/client.c')
| -rw-r--r-- | openbox/client.c | 75 |
1 files changed, 19 insertions, 56 deletions
diff --git a/openbox/client.c b/openbox/client.c index 2fcbd003..c9b7baa1 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -152,7 +152,6 @@ void client_manage(Window window) XWindowAttributes attrib; XSetWindowAttributes attrib_set; /* XWMHints *wmhint; */ - guint i; grab_server(TRUE); @@ -222,13 +221,7 @@ void client_manage(Window window) g_hash_table_insert(client_map, &self->window, self); /* update the focus lists */ - if (self->desktop == DESKTOP_ALL) { - for (i = 0; i < screen_num_desktops; ++i) - focus_order[i] = g_list_insert(focus_order[i], self, 1); - } else { - i = self->desktop; - focus_order[i] = g_list_insert(focus_order[i], self, 1); - } + focus_order_add_new(self); stacking_raise(self); @@ -300,7 +293,6 @@ void client_unmanage_all() void client_unmanage(Client *self) { - guint i; int j; GSList *it; @@ -322,13 +314,7 @@ void client_unmanage(Client *self) g_hash_table_remove(client_map, &self->window); /* update the focus lists */ - if (self->desktop == DESKTOP_ALL) { - for (i = 0; i < screen_num_desktops; ++i) - focus_order[i] = g_list_remove(focus_order[i], self); - } else { - i = self->desktop; - focus_order[i] = g_list_remove(focus_order[i], self); - } + focus_order_remove(self); /* once the client is out of the list, update the struts to remove it's influence */ @@ -1750,6 +1736,9 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk) /* we unmap the client itself so that we can get MapRequest events, and because the ICCCM tells us to! */ XUnmapWindow(ob_display, self->window); + + /* update the focus lists.. iconic windows go to the bottom */ + focus_order_to_bottom(self); } else { if (curdesk) client_set_desktop(self, screen_desktop, FALSE); @@ -1918,7 +1907,7 @@ void client_kill(Client *self) void client_set_desktop(Client *self, guint target, gboolean donthide) { - guint old, i; + guint old; if (target == self->desktop) return; @@ -1926,6 +1915,9 @@ void client_set_desktop(Client *self, guint target, gboolean donthide) g_assert(target < screen_num_desktops || target == DESKTOP_ALL); + /* remove from the old desktop(s) */ + focus_order_remove(self); + old = self->desktop; self->desktop = target; PROP_SET32(self->window, net_wm_desktop, cardinal, target); @@ -1939,25 +1931,11 @@ void client_set_desktop(Client *self, guint target, gboolean donthide) stacking_raise(self); screen_update_struts(); - /* update the focus lists */ - if (old == DESKTOP_ALL) { - for (i = 0; i < screen_num_desktops; ++i) - focus_order[i] = g_list_remove(focus_order[i], self); - } else - focus_order[old] = g_list_remove(focus_order[old], self); - if (target == DESKTOP_ALL) { - for (i = 0; i < screen_num_desktops; ++i) { - if (config_focus_new) - focus_order[i] = g_list_prepend(focus_order[i], self); - else - focus_order[i] = g_list_append(focus_order[i], self); - } - } else { - if (config_focus_new) - focus_order[target] = g_list_prepend(focus_order[target], self); - else - focus_order[target] = g_list_append(focus_order[target], self); - } + /* add to the new desktop(s) */ + if (config_focus_new) + focus_order_to_top(self); + else + focus_order_to_bottom(self); dispatch_client(Event_Client_Desktop, self, target, old); } @@ -2144,38 +2122,23 @@ Client *client_focus_target(Client *self) return self; } -gboolean client_focusable(Client *self) -{ - /* won't try focus if the client doesn't want it, or if the window isn't - visible on the screen */ - return self->frame->visible && - (self->can_focus || self->focus_notify); -} - gboolean client_focus(Client *self) { XEvent ev; - guint i; /* choose the correct target */ self = client_focus_target(self); if (self->desktop != DESKTOP_ALL && self->desktop != screen_desktop) { /* update the focus lists */ - if (self->desktop == DESKTOP_ALL) { - for (i = 0; i < screen_num_desktops; ++i) { - focus_order[i] = g_list_remove(focus_order[i], self); - focus_order[i] = g_list_prepend(focus_order[i], self); - } - } else { - i = self->desktop; - focus_order[i] = g_list_remove(focus_order[i], self); - focus_order[i] = g_list_prepend(focus_order[i], self); - } + focus_order_to_top(self); return FALSE; } - if (!client_focusable(self)) + if (!((self->can_focus || self->focus_notify) && + (self->desktop == screen_desktop || + self->desktop == DESKTOP_ALL) && + !self->iconic)) return FALSE; /* do a check to see if the window has already been unmapped or destroyed |
