X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=d13df1dd7fe2231b1d78c808d933b84dcb1714f6;hb=ac3a588266c1353721a776a1676b416e6258d7f6;hp=1006c72557b8d9e1db9d9ad09594cf60419f665d;hpb=2d1b5d6e0a46cd8d3c89dec7662e28106dee0b88;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 1006c725..d13df1dd 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -179,27 +179,45 @@ void focus_fallback(ObFocusFallbackType type) */ focus_set_client(NULL); - if (!config_focus_last && config_focus_follow) - if (focus_under_pointer()) - return; - if (type == OB_FOCUS_FALLBACK_UNFOCUSING && old) { - /* try for transient relations */ if (old->transient_for) { - if (old->transient_for == OB_TRAN_GROUP) { - for (it = focus_order[screen_desktop]; it; it = it->next) { - GSList *sit; + gboolean trans = FALSE; - for (sit = old->group->members; sit; sit = sit->next) - if (sit->data == it->data) - if (focus_fallback_transient(sit->data, old)) - return; + if (config_focus_last || !config_focus_follow) + trans = TRUE; + else { + ObClient *c; + + if ((c = client_under_pointer()) && + client_search_transient(client_search_top_transient(c), + old)) + trans = TRUE; + } + + g_message("trans %d", trans); + + /* try for transient relations */ + if (trans) { + if (old->transient_for == OB_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) + if (focus_fallback_transient(sit->data, old)) + return; + } + } else { + if (focus_fallback_transient(old->transient_for, old)) + return; } - } else { - if (focus_fallback_transient(old->transient_for, old)) - return; } } + } + + if (!config_focus_last && config_focus_follow) + if (focus_under_pointer()) + return; #if 0 /* try for group relations */ @@ -217,16 +235,10 @@ void focus_fallback(ObFocusFallbackType type) } } #endif - } for (it = focus_order[screen_desktop]; it != NULL; it = it->next) if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old) - if (client_normal(it->data) && - /* dont fall back to 'anonymous' fullscreen windows. theres no - checks for this is in transient/group fallbacks, so they can - be fallback targets there. */ - !((ObClient*)it->data)->fullscreen && - client_can_focus(it->data)) { + if (client_normal(it->data) && client_can_focus(it->data)) { gboolean r = client_focus(it->data); assert(r); return; @@ -281,7 +293,7 @@ static gboolean valid_focus_target(ObClient *ft) focus an iconic window, but we want to be able to, so we just check if the focus flags on the window allow it, and its on the current desktop */ - return (ft->transients == NULL && client_normal(ft) && + return (!ft->transients && client_normal(ft) && ((ft->can_focus || ft->focus_notify) && !ft->skip_taskbar && (ft->desktop == screen_desktop || ft->desktop == DESKTOP_ALL))); @@ -294,7 +306,7 @@ void focus_cycle(gboolean forward, gboolean linear, static ObClient *t = NULL; static GList *order = NULL; GList *it, *start, *list; - ObClient *ft; + ObClient *ft = NULL; if (cancel) { if (focus_cycle_target) @@ -329,7 +341,6 @@ void focus_cycle(gboolean forward, gboolean linear, it = it->prev; if (it == NULL) it = g_list_last(list); } - /*ft = client_focus_target(it->data);*/ ft = it->data; if (valid_focus_target(ft)) { if (ft != focus_cycle_target) { /* prevents flicker */