diff options
Diffstat (limited to 'anyscroll.c')
-rw-r--r-- | anyscroll.c | 110 |
1 files changed, 78 insertions, 32 deletions
diff --git a/anyscroll.c b/anyscroll.c index 2dbd8b8..ab24876 100644 --- a/anyscroll.c +++ b/anyscroll.c @@ -4,25 +4,68 @@ #include <X11/Xlib.h> #include <X11/extensions/XTest.h> #include <unistd.h> - +#include <X11/extensions/XInput2.h> +#include <pthread.h> static Display *dpy; static int scr, sw, sh; - +static int sx, sy; static Window root; -static void pressButton(int btn) { - XTestFakeButtonEvent(dpy, btn, True, CurrentTime); - XFlush(dpy); +static void select_events(Display *dpy, Window win) { + XIEventMask evmasks[1]; + unsigned char mask1[(XI_LASTEVENT + 7)/8]; + + memset(mask1, 0, sizeof(mask1)); + + /* select for button and key events from all master devices */ + XISetMask(mask1, XI_RawButtonPress); + XISetMask(mask1, XI_RawButtonRelease); + + evmasks[0].deviceid = XIAllMasterDevices; + evmasks[0].mask_len = sizeof(mask1); + evmasks[0].mask = mask1; + + XISelectEvents(dpy, win, evmasks, 1); + XFlush(dpy); } -static void releaseButton(int btn) { - XTestFakeButtonEvent(dpy, btn, False, CurrentTime); - XFlush(dpy); + +static void getmousepos(int *px, int *py) { + Window r, child; + int rx, ry; + unsigned int mask; + XQueryPointer(dpy, root, &r, &child, px, py, &rx, &ry, &mask); } +static void* loop() { + int px, py, lx, ly, dx, dy; + while (1) { + lx = px, ly = py; + getmousepos(&px, &py); + dx = px - lx; + dy = py - ly; + printf("(%d, %d) from (%d, %d)\n", px, py, sx, sy); + sleep(1); -int main(int argc, const char **argv) { + + } +} + +static void mouse_down(XIRawEvent *xev) { + getmousepos(&sx, &sy); + printf("Button pressed %d @ %d, %d\n", xev->detail, sx, sy); + +} + +static void mouse_up(XIRawEvent *xev) { + sx = -1; + sy = -1; + printf("Button released %d %d\n", xev->detail); +} + +int main(int argc, const char **argv) { + XInitThreads(); for (int i = 1; i < argc; i++) { if (argv[i][1] == 'h') { fprintf(stdout, "there is no help to be given\n"); @@ -37,34 +80,37 @@ int main(int argc, const char **argv) { sh = DisplayHeight(dpy, scr); fprintf(stdout, "waiting for events\n"); - - const long mask = ButtonPressMask|ButtonReleaseMask; -// XGrabPointer(dpy, root, True, mask, GrabModeSync, GrabModeAsync, None, None, CurrentTime); - XGrabButton(dpy, 2, AnyModifier, root, True, mask, GrabModeSync, GrabModeAsync, None, None); - //XSelectInput(dpy, root, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask); XEvent ev; - XButtonEvent *eb; - - int grab = 0; + XIEvent *xi_event; + XIRawEvent *xev; + XGenericEventCookie *cookie = &ev.xcookie; + + select_events(dpy, root); + pthread_t id[2]; + pthread_create(&id[0], NULL, loop, &argv); + for (;;) { - XNextEvent(dpy, &ev); - if (ev.type == ButtonPress) { - eb = &ev.xbutton; - printf("%d button pressed!\n", eb->button); -// XGrabPointer(dpy, root, True, PointerMotionMask|ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime); - - } else if (ev.type == ButtonRelease) { - eb = &ev.xbutton; - printf("%d button released!\n", eb->button); - //releaseButton(2); - // XUngrabPointer(dpy, CurrentTime); - } + if (XCheckTypedEvent(dpy, GenericEvent ,&ev)) { + if (cookie->type != GenericEvent || !XGetEventData(dpy, cookie)) { + continue; + } - XAllowEvents(dpy, ReplayPointer, CurrentTime); - XSync(dpy, 0); -// XFlush(dpy); + + xi_event = (XIEvent *) cookie->data; + xev = (XIRawEvent *) xi_event; + switch (cookie->evtype) { + case XI_RawButtonPress: + if (xev->detail == 2) mouse_down(xev); + break; + case XI_RawButtonRelease: + if (xev->detail == 2) mouse_up(xev); + break; + } + + XFreeEventData(dpy, cookie); + } } XCloseDisplay(dpy); return 0; |