#include "config.h"
#include "screen.h"
#include "frame.h"
+#include "grab.h"
#include "menu.h"
#include "menuframe.h"
#include "keyboard.h"
return FALSE;
}
- /* This means focus moved to the frame window */
- if (detail == NotifyInferior && !in_client_only)
- return TRUE;
-
/* It was on a client, was it a valid one?
It's possible to get a FocusIn event for a client that was managed
but has disappeared.
/* This means focus moved from one client to another */
if (detail == NotifyNonlinearVirtual)
return TRUE;
- /* This means focus had moved to our frame window and now moved off */
- if (detail == NotifyNonlinear)
- return TRUE;
/* Otherwise.. */
return FALSE;
case NotifyDetailNone: detailstr="NotifyDetailNone"; break;
}
+ if (mode == NotifyGrab || mode == NotifyUngrab)
+ return;
+
g_assert(modestr);
g_assert(detailstr);
ob_debug_type(OB_DEBUG_FOCUS, "Focus%s 0x%x mode=%s detail=%s\n",
{
XEvent ce;
- ob_debug_type(OB_DEBUG_FOCUS,
- "Focus went to pointer root/none or to our frame "
- "window\n");
+ ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none\n");
/* If another FocusIn is in the queue then don't fallback yet. This
fixes the fun case of:
ob_debug_type(OB_DEBUG_FOCUS,
" but another FocusIn is coming\n");
} else {
- /* Focus has been reverted to the root window, nothing, or to
- our frame window.
+ /* 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
*/
- /* In this case we know focus is in our screen */
- if (e->xfocus.detail == NotifyInferior)
- focus_left_screen = FALSE;
-
if (!focus_left_screen)
focus_fallback(TRUE);
}
}
else if (!client)
{
- XEvent ce;
-
ob_debug_type(OB_DEBUG_FOCUS,
"Focus went to a window that is already gone\n");
/* If you send focus to a window and then it disappears, you can
- get the FocusIn FocusOut for it, after it is unmanaged.
- */
- if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client,
- NULL))
- {
- XPutBackEvent(ob_display, &ce);
- ob_debug_type(OB_DEBUG_FOCUS,
- " but another FocusIn is coming\n");
- } else {
- focus_fallback(TRUE);
- }
+ get the FocusIn for it, after it is unmanaged.
+ Just wait for the next FocusOut/FocusIn pair. */
}
else if (client != focus_client) {
focus_left_screen = FALSE;
if (config) {
client_find_onscreen(client, &x, &y, w, h, FALSE);
- client_configure_full(client, x, y, w, h, FALSE, TRUE);
+ client_configure(client, x, y, w, h, FALSE, TRUE);
+
+ /* ignore enter events caused by these like ob actions do */
+ event_ignore_queued_enters();
}
break;
}
client->window);
client_set_state(client, e->xclient.data.l[0],
e->xclient.data.l[1], e->xclient.data.l[2]);
+
+ /* ignore enter events caused by these like ob actions do */
+ event_ignore_queued_enters();
} else if (msgtype == prop_atoms.net_close_window) {
ob_debug("net_close_window for 0x%lx\n", client->window);
client_close(client);
e->xclient.data.l[0] & 1 << 9, y);
client_convert_gravity(client, grav, &x, &y, w, h);
client_find_onscreen(client, &x, &y, w, h, FALSE);
+
client_configure(client, x, y, w, h, FALSE, TRUE);
+
+ /* ignore enter events caused by these like ob actions do */
+ event_ignore_queued_enters();
} else if (msgtype == prop_atoms.net_restack_window) {
if (e->xclient.data.l[0] != 2) {
ob_debug_type(OB_DEBUG_APP_BUGS,
e->xclient.data.l[2], FALSE);
/* send a synthetic ConfigureNotify, cuz this is supposed
to be like a ConfigureRequest. */
- client_configure_full(client, client->area.x,
- client->area.y,
- client->area.width,
- client->area.height,
- FALSE, TRUE);
+ client_reconfigure(client);
} else
ob_debug_type(OB_DEBUG_APP_BUGS,
"_NET_RESTACK_WINDOW sent for window %s "