summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-14 01:06:42 +0000
committerDana Jansens <danakj@orodu.net>2007-05-14 01:06:42 +0000
commit9d7608789c81d950e0f8528e24e684daa2d81790 (patch)
tree6da702563d2d94c12b7e5f200769a15220796769
parent53e75c5be435b8af86ba2de3dedb59ad4f74e6d9 (diff)
another little focus cleanup/rearrangement, for focus going to windows that
are no longer there.
-rw-r--r--openbox/client.c6
-rw-r--r--openbox/event.c22
2 files changed, 25 insertions, 3 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 5ac18700..b61787bc 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -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);
diff --git a/openbox/event.c b/openbox/event.c
index c8b7e6dc..99fa1bf9 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -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);