fallback to transients' parents when possible. return the Client* which was focused from focus_cycle
Dana Jansens danakj@orodu.net
2 files changed,
24 insertions(+),
6 deletions(-)
M
openbox/focus.c
→
openbox/focus.c
@@ -3,6 +3,7 @@ #include "openbox.h"
#include "client.h" #include "frame.h" #include "screen.h" +#include "group.h" #include "prop.h" #include "dispatch.h" #include "focus.h"@@ -185,6 +186,21 @@ if (focus_follow) focus_under_pointer();
return; } + if (old && old->transient_for) { + if (old->transient_for == TRAN_GROUP) { + for (it = focus_order[screen_desktop]; it != NULL; it = it->next) { + GSList *sit; + + for (sit = old->group->members; sit; sit = sit->next) + if (sit->data == it->data && client_focus(sit->data)) + return; + } + } else { + if (client_focus(old->transient_for)) + return; + } + } + for (it = focus_order[screen_desktop]; it != NULL; it = it->next) if (it->data != old && client_normal(it->data)) if (client_focus(it->data))@@ -194,7 +210,7 @@ /* nothing to focus */
focus_set_client(NULL); } -void focus_cycle(gboolean forward, gboolean linear, gboolean done, +Client *focus_cycle(gboolean forward, gboolean linear, gboolean done, gboolean cancel) { static Client *first = NULL;@@ -235,15 +251,16 @@ ft = client_focus_target(it->data);
if (ft == it->data && focus_client != ft && client_focusable(ft)) { if (client_focus(ft)) { noreorder++; /* avoid reordering the focus_order */ - break; + return ft; } } } while (it != start); - return; + return NULL; done_cycle: t = NULL; first = NULL; g_list_free(order); order = NULL; + return NULL; }
M
openbox/focus.h
→
openbox/focus.h
@@ -30,8 +30,9 @@
/*! Call this when you need to focus something! */ void focus_fallback(gboolean switching_desks); -/*! Cycle focus amongst windows */ -void focus_cycle(gboolean forward, gboolean linear, gboolean done, - gboolean cancel); +/*! Cycle focus amongst windows + Returns the Client to which focus has been cycled, or NULL if none. */ +struct Client *focus_cycle(gboolean forward, gboolean linear, gboolean done, + gboolean cancel); #endif