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?
Dana Jansens danakj@orodu.net
4 files changed,
26 insertions(+),
35 deletions(-)
M
openbox/dock.c
→
openbox/dock.c
@@ -28,7 +28,7 @@ #include "openbox.h"
#include "render/theme.h" #define DOCK_EVENT_MASK (ButtonPressMask | ButtonReleaseMask | \ - EnterWindowMask | LeaveWindowMask) + EnterWindowMask | LeaveWindowMask | FocusChangeMask) #define DOCKAPP_EVENT_MASK (StructureNotifyMask) static ObDock *dock;
M
openbox/event.c
→
openbox/event.c
@@ -307,14 +307,25 @@ else
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.. */@@ -356,13 +367,7 @@ }
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 @@ e->xfocus.detail == NotifyDetailNone ||
e->xfocus.detail == NotifyInferior) { XEvent ce; + ob_debug_type(OB_DEBUG_FOCUS, "Focus went to pointer root/none or to our frame " "window\n");@@ -513,17 +519,6 @@
if (!focus_left_screen) 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;
M
openbox/focus.c
→
openbox/focus.c
@@ -280,19 +280,15 @@
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(); + /* 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; - } + if (new) { + client_focus(new); + /* remember that we tried to send focus here */ + focus_tried = new; } return new;
M
tests/showhide.c
→
tests/showhide.c
@@ -42,7 +42,7 @@ CopyFromParent, 0, NULL);
XSetWindowBackground(display,win,WhitePixel(display,0)); XMapWindow(display, win); XFlush(display); - usleep(10000); + usleep(1000); XDestroyWindow(display, win); XSync(display, False);