another little focus cleanup/rearrangement, for focus going to windows that
are no longer there.
This commit is contained in:
parent
53e75c5be4
commit
9d7608789c
2 changed files with 25 additions and 3 deletions
|
@ -525,7 +525,8 @@ void client_manage(Window window)
|
|||
/* update the list hints */
|
||||
client_set_list();
|
||||
|
||||
ob_debug("Managed window 0x%lx (%s)\n", window, self->class);
|
||||
ob_debug("Managed window 0x%lx plate 0x%x (%s)\n",
|
||||
window, self->frame->plate, self->class);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -567,7 +568,8 @@ void client_unmanage(ObClient *self)
|
|||
guint j;
|
||||
GSList *it;
|
||||
|
||||
ob_debug("Unmanaging window: %lx (%s) (%s)\n", self->window,
|
||||
ob_debug("Unmanaging window: 0x%x plate 0x%x (%s) (%s)\n",
|
||||
self->window, self->frame->plate,
|
||||
self->class, self->title ? self->title : "");
|
||||
|
||||
g_assert(self != NULL);
|
||||
|
|
|
@ -315,7 +315,7 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only)
|
|||
It's possible to get a FocusIn event for a client that was managed
|
||||
but has disappeared. Don't even parse those FocusIn events.
|
||||
*/
|
||||
{
|
||||
if (in_client_only) {
|
||||
ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window);
|
||||
if (!w || !WINDOW_IS_CLIENT(w))
|
||||
return FALSE;
|
||||
|
@ -520,6 +520,26 @@ static void event_process(const XEvent *ec, gpointer data)
|
|||
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);
|
||||
}
|
||||
}
|
||||
else if (client != focus_client) {
|
||||
focus_left_screen = FALSE;
|
||||
frame_adjust_focus(client->frame, TRUE);
|
||||
|
|
Loading…
Reference in a new issue