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
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;
}
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) {
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 */
(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;
}
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;
}
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
*/
focus_set_client(NULL);
- if ((new = focus_fallback_target(type, old)))
+ if ((new = focus_fallback_target(type)))
client_focus(new);
}