screen_install_colormap(focus_client, FALSE);
screen_install_colormap(client, TRUE);
- /* in the middle of cycling..? kill it. CurrentTime is fine, time won't
- be used.
- */
+ /* in the middle of cycling..? kill it. */
focus_cycle_stop();
focus_client = client;
}
}
-static ObClient* focus_fallback_target(gboolean allow_refocus)
+static ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old,
+ gboolean send_focus)
{
GList *it;
ObClient *c;
- ObClient *old = focus_client;
ob_debug_type(OB_DEBUG_FOCUS, "trying pointer stuff\n");
if (config_focus_follow && !config_focus_last)
if ((c = client_under_pointer()) &&
(allow_refocus || c != old) &&
- (client_normal(c) &&
- client_focus(c)))
+ client_normal(c) &&
+ /* if we're sending focus then try to */
+ ((send_focus && client_focus(c)) ||
+ /* if not just see if we could try, or it's already focused */
+ (!send_focus && (c == old || client_can_focus(c)))))
{
- ob_debug_type(OB_DEBUG_FOCUS, "found in pointer stuff\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "found in pointer stuff (%d)\n",
+ send_focus);
return c;
}
if (allow_refocus && old &&
old->desktop == DESKTOP_ALL &&
client_normal(old) &&
- client_focus(old))
+ /* this one is only for when not sending focus, to keep it there */
+ !send_focus)
{
- ob_debug_type(OB_DEBUG_FOCUS, "found in omnipresentness\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "found in omnipresentness (%d)\n",
+ send_focus);
return old;
}
if (c->desktop == screen_desktop &&
client_normal(c) &&
(allow_refocus || c != old) &&
- client_focus(c))
+ /* if we're sending focus then try to */
+ ((send_focus && client_focus(c)) ||
+ /* if not just see if we could try, or it's already focused */
+ (!send_focus && (c == old || client_can_focus(c)))))
{
- ob_debug_type(OB_DEBUG_FOCUS, "found in focus order\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "found in focus order (%d) 0x%x "
+ "from 0x%x\n",
+ send_focus, c, old);
return c;
}
}
*/
if (c->type == OB_CLIENT_TYPE_DESKTOP &&
(allow_refocus || c != old) &&
- client_focus(c))
+ /* if we're sending focus then try to */
+ ((send_focus && client_focus(c)) ||
+ /* if not just see if we could try, or it's already focused */
+ (!send_focus && (c == old || client_can_focus(c)))))
{
- ob_debug_type(OB_DEBUG_FOCUS, "found a desktop window\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "found a desktop window (%d)\n",
+ send_focus);
return c;
}
}
ObClient* focus_fallback(gboolean allow_refocus)
{
ObClient *new;
+ ObClient *old = focus_client;
+
+ new = focus_fallback_target(allow_refocus, old, FALSE);
+ if (new == old) return;
/* unfocus any focused clients.. they can be focused by Pointer events
and such, and then when we try focus them, we won't get a FocusIn
event at all for them. */
focus_nothing();
- new = focus_fallback_target(allow_refocus);
+ new = focus_fallback_target(allow_refocus, old, TRUE);
return new;
}
screen_install_colormap(NULL, TRUE);
}
- /* Don't set focus_client to NULL here. It will be set to NULL when the
- FocusOut event comes. Otherwise, if we focus nothing and then focus the
- same window again, The focus code says nothing changed, but focus_client
- ends up being NULL anyways.
- focus_client = NULL;
- */
+ /* nothing is focused, update the colormap and _the root property_ */
+ focus_set_client(NULL);
/* if there is a grab going on, then we need to cancel it. if we move
focus during the grab, applications will get NotifyWhileGrabbed events