summaryrefslogtreecommitdiff
path: root/openbox/event.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-13 20:35:44 +0000
committerDana Jansens <danakj@orodu.net>2007-05-13 20:35:44 +0000
commit7fddf2abc2b76e511be8fc14e22c1f310efe00ef (patch)
treece6ca7b9cd7ad6779126277a5983f82a99e56279 /openbox/event.c
parent1e5fb0d401e66e8e45340d40e0edd3894505d24a (diff)
some focus fixes. always set the new focus when we fallback or else weird states appear. better handling of focusin's on clients that don't exist?
Diffstat (limited to 'openbox/event.c')
-rw-r--r--openbox/event.c37
1 files changed, 16 insertions, 21 deletions
diff --git a/openbox/event.c b/openbox/event.c
index 9e72408d..e431e8f4 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -307,15 +307,26 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only)
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. Don't even parse those FocusIn events.
+ */
+ {
+ ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window);
+ if (!w || !WINDOW_IS_CLIENT(w))
+ return FALSE;
+ }
+
/* This means focus moved from the root window to a client */
if (detail == NotifyVirtual)
return TRUE;
/* This means focus moved from one client to another */
if (detail == NotifyNonlinearVirtual)
return TRUE;
- /* This means focus moved to the frame window */
- if (detail == NotifyInferior && !in_client_only)
- return TRUE;
/* Otherwise.. */
return FALSE;
@@ -356,13 +367,7 @@ static Bool event_look_for_focusin(Display *d, XEvent *e, XPointer arg)
Bool event_look_for_focusin_client(Display *d, XEvent *e, XPointer arg)
{
- ObWindow *w;
-
- /* It is possible to get FocusIn events or unmanaged windows, meaning
- they won't be for any known client */
- return e->type == FocusIn && wanted_focusevent(e, TRUE) &&
- (w = g_hash_table_lookup(window_map, &e->xfocus.window)) &&
- WINDOW_IS_CLIENT(w);
+ return e->type == FocusIn && wanted_focusevent(e, TRUE);
}
static void print_focusevent(XEvent *e)
@@ -475,6 +480,7 @@ static void event_process(const XEvent *ec, gpointer data)
e->xfocus.detail == NotifyInferior)
{
XEvent ce;
+
ob_debug_type(OB_DEBUG_FOCUS,
"Focus went to pointer root/none or to our frame "
"window\n");
@@ -514,17 +520,6 @@ static void event_process(const XEvent *ec, gpointer data)
focus_fallback(TRUE);
}
}
- else if (!client) {
- /* It is possible to get FocusIn events or unmanaged windows,
- meaning they won't be for any known client
-
- If this happens, set the client to NULL so we know focus
- has wandered off, and we'll get a focus out for it
- shortly.
- */
- ob_debug_type(OB_DEBUG_FOCUS, "Focus went to an invalid target\n");
- focus_set_client(NULL);
- }
else if (client != focus_client) {
focus_left_screen = FALSE;
frame_adjust_focus(client->frame, TRUE);