summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-03-12 05:57:30 +0000
committerDana Jansens <danakj@orodu.net>2007-03-12 05:57:30 +0000
commit6b7cc88c9d4ae2019f3b8fcd300dd3069f2bc680 (patch)
treed7c7d9f72e187618e3e5051e334bb334915df1c7 /openbox
parent3a33642be4be34d57b355b273461e49549cdf554 (diff)
validate clients before trying to focus them in fallback
also validate before trying to set the focus on a window this should fix those crashes, and should just be better over all
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c3
-rw-r--r--openbox/focus.c15
2 files changed, 14 insertions, 4 deletions
diff --git a/openbox/client.c b/openbox/client.c
index e4bef71d..7e936036 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -2937,6 +2937,9 @@ gboolean client_focus(ObClient *self)
/* choose the correct target */
self = client_focus_target(self);
+ if (!client_validate(self))
+ return FALSE;
+
if (!client_can_focus(self)) {
if (!self->frame->visible) {
/* update the focus lists */
diff --git a/openbox/focus.c b/openbox/focus.c
index 417ffa96..201a4349 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -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;
}
@@ -301,7 +305,8 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
(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;
}
@@ -324,7 +329,9 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
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;
}