X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Ffocus.c;h=201a43492bf88103c26c5f152d92e7becd0040c0;hb=53109b7592500b71f8c670ea58b0182193ba9a71;hp=7b40db5e585bd1a512a2980afeb96fe2a797e668;hpb=d113b9f33fb7031add7026d123f34b31888d7411;p=chaz%2Fopenbox diff --git a/openbox/focus.c b/openbox/focus.c index 7b40db5e..201a4349 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -2,7 +2,7 @@ focus.c for the Openbox window manager Copyright (c) 2006 Mikael Magnusson - Copyright (c) 2003 Ben Jansens + Copyright (c) 2003-2007 Dana Jansens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -223,8 +223,12 @@ static ObClient *find_transient_recursive(ObClient *c, ObClient *top, for (it = c->transients; it; it = g_slist_next(it)) { if (it->data == top) return NULL; ret = find_transient_recursive(it->data, top, skip); - if (ret && ret != skip && client_normal(ret)) return ret; - if (it->data != skip && client_normal(it->data)) return it->data; + if (ret && ret != skip && client_normal(ret) && + client_can_focus(ret) && client_validate(ret)) + return ret; + if (it->data != skip && client_normal(it->data) && + client_can_focus(it->data) && client_validate(it->data)) + return it->data; } return NULL; } @@ -244,11 +248,14 @@ static ObClient* focus_fallback_transient(ObClient *top, ObClient *old) return NULL; } -ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old) +ObClient* focus_fallback_target(ObFocusFallbackType type) { GList *it; + ObClient *old; ObClient *target = NULL; + old = focus_client; + if ((type == OB_FOCUS_FALLBACK_UNFOCUSING || type == OB_FOCUS_FALLBACK_CLOSED) && old) { if (old->transient_for) { @@ -257,8 +264,8 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old) if (!config_focus_follow || config_focus_last) trans = TRUE; else if ((target = client_under_pointer()) && - (client_search_transient - (client_search_top_parent(target), old))) + client_search_transient + (client_search_top_parent(target), old)) trans = TRUE; /* try for transient relations */ @@ -298,7 +305,8 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old) (type == OB_FOCUS_FALLBACK_UNFOCUSING || !config_focus_last)) { if ((target = client_under_pointer())) - if (client_normal(target) && client_can_focus(target)) { + if (client_normal(target) && client_can_focus(target) && + client_validate(target)) { ob_debug("found in pointer stuff\n"); return target; } @@ -321,7 +329,9 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old) ob_debug("trying the focus order\n"); for (it = focus_order[screen_desktop]; it; it = g_list_next(it)) if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old) - if (client_normal(it->data) && client_can_focus(it->data)) { + if (client_normal(it->data) && client_can_focus(it->data) && + client_validate(it->data)) + { ob_debug("found in focus order\n"); return it->data; } @@ -337,7 +347,6 @@ ObClient* focus_fallback_target(ObFocusFallbackType type, ObClient *old) void focus_fallback(ObFocusFallbackType type) { ObClient *new; - ObClient *old = focus_client; /* unfocus any focused clients.. they can be focused by Pointer events and such, and then when I try focus them, I won't get a FocusIn event @@ -345,7 +354,7 @@ void focus_fallback(ObFocusFallbackType type) */ focus_set_client(NULL); - if ((new = focus_fallback_target(type, old))) + if ((new = focus_fallback_target(type))) client_focus(new); }