diff --git a/event.c b/event.c index ea648f8..b6ddf6b 100644 --- a/event.c +++ b/event.c @@ -169,13 +169,13 @@ void button_press(XEvent *ev) int i, j; Monitor *m; XButtonEvent *e = &ev->xbutton; latest_action = e->time; - Client *c = window_build_client(e->subwindow); - if (c && c->manage) + Client *c = window_build_client(e->window); + if (c && c->manage && c->window != current) client_activate(c); else - if (settings.title) + if (settings.title && !c) for_monitors(i, m) for_spots(j) - if (m->bars[i] && m->bars[j]->window == e->subwindow) + if (m->bars[j] && m->bars[j]->window == e->window) spot_focus_top_window(j, i, None); client_free(c); XAllowEvents(display, ReplayPointer, latest_action); diff --git a/setup.c b/setup.c index 0e904c2..2226234 100644 --- a/setup.c +++ b/setup.c @@ -192,9 +192,7 @@ void setup() XGrabKey(display, XKeysymToKeycode(display, settings.bindings[i].key), settings.bindings[i].mod|LockMask|NumlockMask, root, True, GrabModeAsync, GrabModeAsync); } - // we grab buttons to do click-to-focus. all clicks get passed through to apps. - XGrabButton(display, Button1, AnyModifier, root, True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); - XGrabButton(display, Button3, AnyModifier, root, True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); + // Button grabs are now done per-client in window_listen() to avoid LeaveNotify issues // create title bars if (settings.title) diff --git a/window.c b/window.c index 863fa84..d8399e3 100644 --- a/window.c +++ b/window.c @@ -103,6 +103,8 @@ int window_send_clientmessage(Window target, Window subject, Atom atom, unsigned void window_listen(Window win) { XSelectInput(display, win, EnterWindowMask | LeaveWindowMask | FocusChangeMask | PropertyChangeMask); + XGrabButton(display, Button1, AnyModifier, win, True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); + XGrabButton(display, Button3, AnyModifier, win, True, ButtonPressMask, GrabModeSync, GrabModeSync, None, None); } // build windows cache