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
This commit is contained in:
parent
3a33642be4
commit
6b7cc88c9d
2 changed files with 14 additions and 4 deletions
|
@ -2937,6 +2937,9 @@ gboolean client_focus(ObClient *self)
|
||||||
/* choose the correct target */
|
/* choose the correct target */
|
||||||
self = client_focus_target(self);
|
self = client_focus_target(self);
|
||||||
|
|
||||||
|
if (!client_validate(self))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (!client_can_focus(self)) {
|
if (!client_can_focus(self)) {
|
||||||
if (!self->frame->visible) {
|
if (!self->frame->visible) {
|
||||||
/* update the focus lists */
|
/* update the focus lists */
|
||||||
|
|
|
@ -223,8 +223,12 @@ static ObClient *find_transient_recursive(ObClient *c, ObClient *top,
|
||||||
for (it = c->transients; it; it = g_slist_next(it)) {
|
for (it = c->transients; it; it = g_slist_next(it)) {
|
||||||
if (it->data == top) return NULL;
|
if (it->data == top) return NULL;
|
||||||
ret = find_transient_recursive(it->data, top, skip);
|
ret = find_transient_recursive(it->data, top, skip);
|
||||||
if (ret && ret != skip && client_normal(ret)) return ret;
|
if (ret && ret != skip && client_normal(ret) &&
|
||||||
if (it->data != skip && client_normal(it->data)) return it->data;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -301,7 +305,8 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
|
||||||
(type == OB_FOCUS_FALLBACK_UNFOCUSING || !config_focus_last))
|
(type == OB_FOCUS_FALLBACK_UNFOCUSING || !config_focus_last))
|
||||||
{
|
{
|
||||||
if ((target = client_under_pointer()))
|
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");
|
ob_debug("found in pointer stuff\n");
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
@ -324,7 +329,9 @@ ObClient* focus_fallback_target(ObFocusFallbackType type)
|
||||||
ob_debug("trying the focus order\n");
|
ob_debug("trying the focus order\n");
|
||||||
for (it = focus_order[screen_desktop]; it; it = g_list_next(it))
|
for (it = focus_order[screen_desktop]; it; it = g_list_next(it))
|
||||||
if (type != OB_FOCUS_FALLBACK_UNFOCUSING || it->data != old)
|
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");
|
ob_debug("found in focus order\n");
|
||||||
return it->data;
|
return it->data;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue