all repos — openbox @ f278ec41e4c310da218563e7d443df32783e26e4

openbox fork - make it a bit more like ryudo

fallback to transients' parents when possible.
return the Client* which was focused from focus_cycle
Dana Jansens danakj@orodu.net
commit

f278ec41e4c310da218563e7d443df32783e26e4

parent

fc32577766755a84ac883b4d862fab3c5e681642

2 files changed, 24 insertions(+), 6 deletions(-)

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