static void event_handle_menu(Menu *menu, Client *c, XEvent *e);
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
+ (e)->xfocus.detail == NotifyAncestor || \
(e)->xfocus.detail > NotifyNonlinearVirtual)
#define INVALID_FOCUSOUT(e) ((e)->xfocus.mode == NotifyGrab || \
(e)->xfocus.detail == NotifyInferior || \
g_message("found pending FocusIn");
#endif
/* is the focused window getting a FocusOut/In back to
- itself? */
+ itself?
+ */
if (fe.xfocus.window == e->xfocus.window &&
!event_ignore(&fe, client)) {
+ /*
+ if focus_client is not set, then we can't do
+ this. we need the FocusIn. This happens in the
+ case when the set_focus_client(NULL) in the
+ focus_fallback function fires and then
+ focus_fallback picks the currently focused
+ window (such as on a SendToDesktop-esque action.
+ */
+ if (focus_client) {
#ifdef DEBUG_FOCUS
- g_message("focused window got an Out/In back to "
- "itself IGNORED both");
+ g_message("focused window got an Out/In back to "
+ "itself IGNORED both");
#endif
- return TRUE;
+ return TRUE;
+ } else {
+ event_process(&fe);
+#ifdef DEBUG_FOCUS
+ g_message("focused window got an Out/In back to "
+ "itself but focus_client was null "
+ "IGNORED just the Out");
+#endif
+ return TRUE;
+ }
}
/* once all the FocusOut's have been dealt with, if there
#ifdef DEBUG_FOCUS
g_message("FocusIn on client for %lx", client->window);
#endif
- focus_set_client(client);
- frame_adjust_focus(client->frame, TRUE);
+ if (client != focus_client) {
+ focus_set_client(client);
+ frame_adjust_focus(client->frame, TRUE);
+ }
break;
case FocusOut:
#ifdef DEBUG_FOCUS