summaryrefslogtreecommitdiff
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
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?
-rw-r--r--openbox/dock.c2
-rw-r--r--openbox/event.c37
-rw-r--r--openbox/focus.c22
-rw-r--r--tests/showhide.c2
4 files changed, 27 insertions, 36 deletions
diff --git a/openbox/dock.c b/openbox/dock.c
index 0cc42285..697261e2 100644
--- a/openbox/dock.c
+++ b/openbox/dock.c
@@ -28,7 +28,7 @@
#include "render/theme.h"
#define DOCK_EVENT_MASK (ButtonPressMask | ButtonReleaseMask | \
- EnterWindowMask | LeaveWindowMask)
+ EnterWindowMask | LeaveWindowMask | FocusChangeMask)
#define DOCKAPP_EVENT_MASK (StructureNotifyMask)
static ObDock *dock;
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);
diff --git a/openbox/focus.c b/openbox/focus.c
index a756a9b5..72588a30 100644
--- a/openbox/focus.c
+++ b/openbox/focus.c
@@ -280,19 +280,15 @@ ObClient* focus_fallback(gboolean allow_refocus)
old = focus_client;
new = focus_fallback_target(allow_refocus, focus_client);
- /* send focus somewhere if it is moving or if it was NULL before,
- in which case it may not even be on the screen */
- if (!old || new != old) {
- /* unfocus any focused clients.. they can be focused by Pointer events
- and such, and then when we try focus them, we won't get a FocusIn
- event at all for them. */
- focus_nothing();
-
- if (new) {
- client_focus(new);
- /* remember that we tried to send focus here */
- focus_tried = new;
- }
+ /* unfocus any focused clients.. they can be focused by Pointer events
+ and such, and then when we try focus them, we won't get a FocusIn
+ event at all for them. */
+ focus_nothing();
+
+ if (new) {
+ client_focus(new);
+ /* remember that we tried to send focus here */
+ focus_tried = new;
}
return new;
diff --git a/tests/showhide.c b/tests/showhide.c
index bd1078a3..a0b51e7a 100644
--- a/tests/showhide.c
+++ b/tests/showhide.c
@@ -42,7 +42,7 @@ int main () {
XSetWindowBackground(display,win,WhitePixel(display,0));
XMapWindow(display, win);
XFlush(display);
- usleep(10000);
+ usleep(1000);
XDestroyWindow(display, win);
XSync(display, False);