//printf("release: %d\n", type);
}
else if (type == ButtonPress) {
- wm_handle_key(win, x2btn(ev->xbutton.button), mod, ptr);
- XGrabPointer(dpy, ev->xbutton.root, True, PointerMotionMask|ButtonReleaseMask,
- GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
+ if (wm_handle_key(win, x2btn(ev->xbutton.button), mod, ptr))
+ XGrabPointer(dpy, ev->xbutton.root, True, PointerMotionMask|ButtonReleaseMask,
+ GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
+ else {
+ printf("resending event\n");
+ XSendEvent(win->sys->dpy, ev->xbutton.window, True, NoEventMask, ev);
+ XSendEvent(win->sys->dpy, ev->xbutton.window, False, NoEventMask, ev);
+ XSendEvent(win->sys->dpy, ev->xbutton.root, True, NoEventMask, ev);
+ XSendEvent(win->sys->dpy, ev->xbutton.root, False, NoEventMask, ev);
+ XSendEvent(win->sys->dpy, ev->xbutton.subwindow, True, NoEventMask, ev);
+ XSendEvent(win->sys->dpy, ev->xbutton.subwindow, False, NoEventMask, ev);
+ }
}
else if (type == ButtonRelease) {
XUngrabPointer(dpy, CurrentTime);
XGetWindowAttributes(win->sys->dpy, win->sys->xid, &attr);
long mask = attr.your_event_mask;
if (key_mouse0 <= key && key <= key_mouse7)
- XGrabButton(win->sys->dpy, btn2x(key), mod2x(mod), win->sys->xid, True,
+ XGrabButton(win->sys->dpy, btn2x(key), mod2x(mod), win->sys->xid, False,
mod.up ? ButtonReleaseMask : ButtonPressMask,
GrabModeAsync, GrabModeAsync, None, None);
else if (key == key_enter)
mod2x(mod), win->sys->xid, True, GrabModeAsync, GrabModeAsync);
}
+void sys_unwatch(win_t *win, Key_t key, mod_t mod)
+{
+ if (key_mouse0 <= key && key <= key_mouse7)
+ XUngrabButton(win->sys->dpy, btn2x(key), mod2x(mod), win->sys->xid);
+}
+
win_t *sys_init(void)
{
Display *dpy;
{
if (win->wm && win->wm->col)
((col_t*)win->wm->col->data)->focus = win;
+
+ /* - Only grab mouse button on unfocused window,
+ * this prevents stealing all mouse clicks from client windows,
+ * - A better way may be to re-send mouse clicks to client windows
+ * using the return value from wm_handle_key */
+ for (int i = key_mouse1; i < key_mouse7; i++) {
+ if (wm_focus)
+ sys_watch(wm_focus, i, MOD());
+ sys_unwatch(win, i, MOD());
+ }
+
wm_focus = win;
sys_focus(win);
}
return set_move(resize,win,ptr), 1;
/* Focus change */
- if (key == key_enter || (key_mouse0 <= key && key <= key_mouse7))
- set_focus(win);
+ if (key == key_enter)
+ return set_focus(win), 1;
+
+ if (key_mouse0 <= key && key <= key_mouse7)
+ return set_focus(win), 0;
/* Reset focus after after focus change,
* not sure what is causing the focus change in the first place
sys_watch(root, keys_m[i], MOD(.MODKEY=1));
for (int i = 0; i < countof(keys_s); i++)
sys_watch(root, keys_s[i], MOD(.MODKEY=1,.shift=1));
- for (int i = key_mouse1; i < key_mouse7; i++)
- sys_watch(root, i, MOD());
}