if (wm_handle_event(win, xb2ev(xe->xbutton.button), mod, ptr))
XGrabPointer(dpy, xe->xbutton.root, True, PointerMotionMask|ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
- else {
- printf("resending event\n");
- XSendEvent(win->sys->dpy, xe->xbutton.window, True, NoEventMask, xe);
- XSendEvent(win->sys->dpy, xe->xbutton.window, False, NoEventMask, xe);
- XSendEvent(win->sys->dpy, xe->xbutton.root, True, NoEventMask, xe);
- XSendEvent(win->sys->dpy, xe->xbutton.root, False, NoEventMask, xe);
- XSendEvent(win->sys->dpy, xe->xbutton.subwindow, True, NoEventMask, xe);
- XSendEvent(win->sys->dpy, xe->xbutton.subwindow, False, NoEventMask, xe);
- }
+ else
+ XAllowEvents(win->sys->dpy, ReplayPointer, CurrentTime);
}
else if (type == ButtonRelease) {
XUngrabPointer(dpy, CurrentTime);
wm_handle_ptr(win, ptr);
}
else if (type == EnterNotify || type == LeaveNotify) {
- printf("enter: %d\n", type);
+ printf("%s: %d\n", type==EnterNotify?"enter":"leave", type);
event_t ev = EnterNotify ? EV_ENTER : EV_LEAVE;
if ((win = win_find(dpy,xe->xcrossing.window,0)))
wm_handle_event(win, ev, MOD(), PTR());
if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7)
XGrabButton(win->sys->dpy, ev2xb(ev), mod2x(mod), win->sys->xid, False,
mod.up ? ButtonReleaseMask : ButtonPressMask,
- GrabModeAsync, GrabModeAsync, None, None);
+ GrabModeSync, GrabModeAsync, None, None);
else if (ev == EV_ENTER)
XSelectInput(win->sys->dpy, win->sys->xid, EnterWindowMask|mask);
else if (ev == EV_LEAVE)
return;
}
- /* - 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 = EV_MOUSE1; i < EV_MOUSE7; i++) {
- if (wm_focus)
- sys_watch(wm_focus, i, MOD());
- sys_unwatch(win, i, MOD());
- }
-
dpy_t *dpy; col_t *col; row_t *row; flt_t *flt;
switch (search(wm_tag, win, &dpy, &col, &row, &flt)) {
case TILING:
// mod.shift ? 's' : '-',
// mod.win ? 'w' : '-');
- /* Mouse movement */
- if (ev == EV_MOUSE1)
- raise_float(win);
+ /* Mouse events */
if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7) {
+ if (ev == EV_MOUSE1 && !mod.MODKEY && !mod.up)
+ return raise_float(win), 0;
if (ev == EV_MOUSE1 && mod.MODKEY && !mod.up)
return set_move(win,ptr,MOVE), 1;
if (ev == EV_MOUSE3 && mod.MODKEY && !mod.up)
if (ev == EV_ENTER && win->state != ST_SHADE)
return set_focus(win), 1;
- if (EV_MOUSE0 <= ev && ev <= EV_MOUSE7)
- return set_focus(win), 0;
-
/* Reset focus after after focus change,
* not sure what is causing the focus change in the first place
* but preventing that would be a better solution */
wm->tag = tag_new(wm->screens, 1);
wm->tags = list_insert(NULL, wm->tag);
- event_t ev_e[] = {EV_ENTER, EV_FOCUS};
+ event_t ev_e[] = {EV_ENTER, EV_FOCUS, EV_MOUSE1};
event_t ev_s[] = {'h', 'j', 'k', 'l', 'c', 'q', ' ',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
event_t ev_m[] = {'h', 'j', 'k', 'l', 'd', 's', 'm', 't', ' ',