when you focus a window, bring any modal children it has to that desktop when falling back, return the window which actually was focused by client_focus let you focus cycle to windows when their modal window is on another desktop (it will be brought over)
Dana Jansens danakj@orodu.net
4 files changed,
25 insertions(+),
6 deletions(-)
M
openbox/client.c
→
openbox/client.c
@@ -3463,6 +3463,8 @@ }
gboolean client_focus(ObClient *self) { + client_bring_modal_windows(self); + /* choose the correct target */ self = client_focus_target(self);@@ -3582,15 +3584,18 @@ /* don't focus it but tell the user it wants attention */
client_hilite(self, TRUE); } -static void client_bring_helper_windows_recursive(ObClient *self, - guint desktop) +static void client_bring_windows_recursive(ObClient *self, + guint desktop, + gboolean helpers, + gboolean modals) { GSList *it; for (it = self->transients; it; it = g_slist_next(it)) - client_bring_helper_windows_recursive(it->data, desktop); + client_bring_windows_recursive(it->data, desktop, helpers, modals); - if (client_helper(self) && + if (((helpers && client_helper(self)) || + (modals && self->modal))&& self->desktop != desktop && self->desktop != DESKTOP_ALL) { client_set_desktop(self, desktop, FALSE);@@ -3599,7 +3604,12 @@ }
void client_bring_helper_windows(ObClient *self) { - client_bring_helper_windows_recursive(self, self->desktop); + client_bring_windows_recursive(self, self->desktop, TRUE, FALSE); +} + +void client_bring_modal_windows(ObClient *self) +{ + client_bring_windows_recursive(self, self->desktop, FALSE, TRUE); } gboolean client_focused(ObClient *self)
M
openbox/client.h
→
openbox/client.h
@@ -562,6 +562,9 @@ /*! Bring all of its helper windows to its desktop. These are the utility and
stuff windows. */ void client_bring_helper_windows(ObClient *self); +/*! Bring all of its modal windows to its desktop. */ +void client_bring_modal_windows(ObClient *self); + /*! Calculates the stacking layer for the client window */ void client_calc_layer(ObClient *self);
M
openbox/focus.c
→
openbox/focus.c
@@ -166,6 +166,8 @@ event at all for them. */
focus_nothing(); new = focus_fallback_target(allow_refocus, allow_pointer, old); + /* get what was really focused */ + if (new) new = client_focus_target(new); return new; }
M
openbox/focus_cycle.c
→
openbox/focus_cycle.c
@@ -150,7 +150,11 @@ ft->modal ||
!ft->skip_taskbar); /* it's not going to just send fous off somewhere else (modal window) */ - ok = ok && ft == client_focus_target(ft); + { + ObClient *cft = client_focus_target(ft); + ok = ok && (ft == cft || (cft->desktop != DESKTOP_ALL && + cft->desktop != ft->desktop)); + } return ok; }