diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-04-17 18:21:19 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-04-17 18:21:19 +0000 |
| commit | cfe3dc9ec4d582cf71df06d45e6045b3e32464af (patch) | |
| tree | 4751307172a19a6a1dff9a2378c0ade7d23ad678 /openbox | |
| parent | 322b2d0a05daf0c0c9de07baf5e27e4945f7bfd5 (diff) | |
a) put transient windows on the same desktop as their parent
b) if a window is attempted to be focused but it is not on the current desktop,
then move it to the top of the focus order on its desktop
Diffstat (limited to 'openbox')
| -rw-r--r-- | openbox/client.c | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/openbox/client.c b/openbox/client.c index 17172dd9..4d3010dc 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -492,11 +492,12 @@ static void client_get_all(Client *self) self->nicons = 0; client_get_area(self); + client_update_transient_for(self); + client_update_wmhints(self); client_get_desktop(self); client_get_state(self); client_get_shaped(self); - client_update_transient_for(self); client_get_mwm_hints(self); client_get_type(self);/* this can change the mwmhints for special cases */ @@ -510,7 +511,6 @@ static void client_get_all(Client *self) (min/max sizes), so we're ready to set up the decorations/functions */ client_setup_decor_and_functions(self); - client_update_wmhints(self); client_update_title(self); client_update_icon_title(self); client_update_class(self); @@ -541,9 +541,28 @@ static void client_get_desktop(Client *self) if (d >= screen_num_desktops && d != DESKTOP_ALL) d = screen_num_desktops - 1; self->desktop = d; - } else { - /* defaults to the current desktop */ - self->desktop = screen_desktop; + } else { + gboolean trdesk = FALSE; + + if (self->transient_for) { + if (self->transient_for != TRAN_GROUP) { + self->desktop = self->transient_for->desktop; + trdesk = TRUE; + } else { + GSList *it; + + for (it = self->group->members; it; it = it->next) + if (it->data != self && + ((Client*)it->data)->transient_for != TRAN_GROUP) { + self->desktop = ((Client*)it->data)->desktop; + trdesk = TRUE; + break; + } + } + } + if (!trdesk) + /* defaults to the current desktop */ + self->desktop = screen_desktop; /* set the desktop hint, to make sure that it always exists */ PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop); @@ -2086,10 +2105,26 @@ gboolean client_focusable(Client *self) 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); + } + return FALSE; + } + if (!client_focusable(self)) return FALSE; |
