all repos — openbox @ 16fcb1213d4ccfccd4e4a8ad5e8b0c826dc5c16e

openbox fork - make it a bit more like ryudo

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
commit

16fcb1213d4ccfccd4e4a8ad5e8b0c826dc5c16e

parent

8874ec1fc4a142ea67d7c5a45ae9ea92ffdec5ea

4 files changed, 25 insertions(+), 6 deletions(-)

jump to
M openbox/client.copenbox/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.hopenbox/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.copenbox/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.copenbox/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; }