if (detail == NotifyNonlinearVirtual)
return TRUE;
- /* This means focus reverted off of a client */
- if (detail == NotifyInferior)
- return TRUE;
-
/* Otherwise.. */
return FALSE;
} else {
{
switch(e->type) {
case FocusIn:
+ if (!wanted_focusevent(e))
+ return TRUE;
+ break;
case FocusOut:
+ if (client == NULL)
+ return TRUE;
if (!wanted_focusevent(e))
return TRUE;
break;
/* crossing events for menu */
event_handle_menu(e);
} else if (e->type == FocusIn) {
- if (e->xfocus.detail == NotifyPointerRoot ||
- e->xfocus.detail == NotifyDetailNone) {
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to root\n");
- /* Focus has been reverted to the root window or nothing
- FocusOut events come after UnmapNotify, so we don't need to
- worry about focusing an invalid window
- */
- focus_fallback(TRUE);
- } else if (e->xfocus.detail == NotifyInferior) {
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to parent\n");
- /* Focus has been reverted to parent, which is our frame window,
- or the root window
- FocusOut events come after UnmapNotify, so we don't need to
- worry about focusing an invalid window
- */
- focus_fallback(TRUE);
- } else if (client && client != focus_client) {
+ if (client && client != focus_client) {
frame_adjust_focus(client->frame, TRUE);
- client_calc_layer(client);
focus_set_client(client);
+ client_calc_layer(client);
}
} else if (e->type == FocusOut) {
gboolean nomove = FALSE;
/* nothing is focused */
focus_set_client(NULL);
} else if (ce.xany.window == e->xany.window) {
+ ob_debug_type(OB_DEBUG_FOCUS, "Focus didn't go anywhere\n");
/* If focus didn't actually move anywhere, there is nothing to do*/
nomove = TRUE;
+ } else if (ce.xfocus.detail == NotifyPointerRoot ||
+ ce.xfocus.detail == NotifyDetailNone ||
+ ce.xfocus.detail == NotifyInferior) {
+ ob_debug_type(OB_DEBUG_FOCUS, "Focus went to root\n");
+ /* Focus has been reverted to the root window or nothing
+ FocusOut events come after UnmapNotify, so we don't need to
+ worry about focusing an invalid window
+ */
+ focus_fallback(TRUE);
} else {
/* Focus did move, so process the FocusIn event */
ObEventData ed = { .ignored = FALSE };
if (client && !nomove) {
frame_adjust_focus(client->frame, FALSE);
+ /* focus_set_client has already been called for sure */
client_calc_layer(client);
}
} else if (group)
void focus_fallback(gboolean allow_refocus)
{
ObClient *new;
- ObClient *old;
-
- /* save this before moving focus away to nothing */
- old = focus_client;
+ 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
screen_install_colormap(NULL, TRUE);
}
+ focus_client = NULL;
+
/* when nothing will be focused, send focus to the backup target */
XSetInputFocus(ob_display, screen_support_win, RevertToPointerRoot,
event_curtime);
}
}
- /* reduce flicker by hiliting now rather than waiting for the server
- FocusIn event */
- if ((c = focus_fallback_target(TRUE, focus_client)))
+ /* have to try focus here because when you leave an empty desktop
+ there is no focus out to watch for */
+ if ((c = focus_fallback_target(TRUE, focus_client))) {
+ /* reduce flicker by hiliting now rather than waiting for the server
+ FocusIn event */
frame_adjust_focus(c->frame, TRUE);
+ client_focus(c);
+ }
event_ignore_queued_enters();
}