all repos — openbox @ 06663c245ae0bffcc80bf4f0c3a0780679b8d544

openbox fork - make it a bit more like ryudo

when unfocusing a window (e.g. unmanaging) try fallback to transient relations, if that fails, try group relations, then fallback to other window.
Dana Jansens danakj@orodu.net
commit

06663c245ae0bffcc80bf4f0c3a0780679b8d544

parent

9d16ced24e0bdcba0998be008850372055d16a09

1 files changed, 39 insertions(+), 23 deletions(-)

jump to
M openbox/focus.copenbox/focus.c

@@ -122,7 +122,8 @@ }

return FALSE; } -/* finds the first transient that isn't 'skip' */ +/* finds the first transient that isn't 'skip' and ensure's that client_normal + is true for it */ static Client *find_transient_recursive(Client *c, Client *top, Client *skip) { GSList *it;

@@ -132,13 +133,25 @@ for (it = c->transients; it; it = it->next) {

g_message("looking"); if (it->data == top) return NULL; ret = find_transient_recursive(it->data, top, skip); - if (ret && ret != skip) return ret; - if (it->data != skip) return it->data; + if (ret && ret != skip && client_normal(ret)) return ret; + if (it->data != skip && client_normal(it->data)) return it->data; g_message("not found"); } return NULL; } +static gboolean focus_fallback_transient(Client *top, Client *old) +{ + Client *target = find_transient_recursive(top, top, old); + if (!target) { + /* make sure client_normal is true always */ + if (!client_normal(top)) + return FALSE; + target = top; /* no transient, keep the top */ + } + return client_focus(target); +} + void focus_fallback(FallbackType type) { GList *it;

@@ -158,30 +171,33 @@ if (config_focus_follow) focus_under_pointer();

return; } - if (type == Fallback_Unfocusing && old && old->transient_for) { - Client *c = NULL; - - if (old->transient_for == TRAN_GROUP) { - for (it = focus_order[screen_desktop]; it != NULL; it = it->next) { - GSList *sit; + if (type == Fallback_Unfocusing && old) { + /* try for transient relations */ + if (old->transient_for) { + if (old->transient_for == TRAN_GROUP) { + for (it = focus_order[screen_desktop]; it; it = it->next) { + GSList *sit; - for (sit = old->group->members; sit; sit = sit->next) - if (sit->data == it->data && client_normal(sit->data) && - client_focusable(sit->data)) { - c = sit->data; - break; - } + for (sit = old->group->members; sit; sit = sit->next) + if (sit->data == it->data) + if (focus_fallback_transient(sit->data, old)) + return; + } + } else { + if (focus_fallback_transient(old->transient_for, old)) + return; } - } else { - if (client_normal(old->transient_for)) - c = old->transient_for; } - if (c) { - Client *t = find_transient_recursive(c, c, old); - if (!t) t = c; /* no transient, keep the top */ - if (client_focus(t)) - return; + /* try for group relations */ + if (old->group) { + GSList *sit; + + for (it = focus_order[screen_desktop]; it != NULL; it = it->next) + for (sit = old->group->members; sit; sit = sit->next) + if (sit->data == it->data) + if (sit->data != old && client_focus(sit->data)) + return; } }