diff options
Diffstat (limited to 'dwm/patch/banish.c')
| -rwxr-xr-x | dwm/patch/banish.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/dwm/patch/banish.c b/dwm/patch/banish.c new file mode 100755 index 0000000..60806ab --- /dev/null +++ b/dwm/patch/banish.c @@ -0,0 +1,71 @@ +static int cursor_hidden = 0; +/* mouse_x and mouse_y are used to store the actual co-ordinates of the mouse cursor when + * hidden. These can be manipulated freely, e.g. when using the warp patch, to set a new + * cursor position for when the cursor is to be revealed again. */ +static int mouse_x = 0; +static int mouse_y = 0; +static int xi_opcode; +static unsigned long long last_button_press = 0; + +void +genericevent(XEvent *e) +{ + if (e->xcookie.extension != xi_opcode) + return; + + if (!XGetEventData(dpy, &e->xcookie)) + return; + + switch (e->xcookie.evtype) { + case XI_RawMotion: + if (cursor_hidden) + showcursor(NULL); + break; + case XI_RawTouchBegin: + case XI_RawTouchEnd: + case XI_RawTouchUpdate: + if (!cursor_hidden) + hidecursor(NULL); + break; + case XI_RawKeyRelease: + if (now() - last_button_press > 2000 && !cursor_hidden) { + hidecursor(NULL); + } + break; + } + + XFreeEventData(dpy, &e->xcookie); +} + +void +hidecursor(const Arg *arg) +{ + if (cursor_hidden) + return; + + XFixesHideCursor(dpy, root); + if (getrootptr(&mouse_x, &mouse_y)) { + XWarpPointer(dpy, None, root, 0, 0, 0, 0, selmon->mx + selmon->mw, selmon->my); + } + + cursor_hidden = 1; +} + +unsigned long long +now(void) { + struct timespec currentTime; + clock_gettime(CLOCK_REALTIME, ¤tTime); + return currentTime.tv_sec * 1000LL + currentTime.tv_nsec / 1000000LL; +} + +void +showcursor(const Arg *arg) +{ + if (!cursor_hidden) + return; + + XWarpPointer(dpy, None, root, 0, 0, 0, 0, mouse_x, mouse_y); + XFixesShowCursor(dpy, root); + + cursor_hidden = 0; +} |
