From dc1db3a1f58b1bd7004153b2f04e85e719489209 Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 13 Apr 2021 00:01:43 +0100 Subject: [PATCH] added second thread --- Makefile | 3 +- anyscroll.c | 110 +++++++++++++++++++++++++++++++++++++--------------- mids | Bin 0 -> 16640 bytes mids.o | Bin 0 -> 3400 bytes window | Bin 0 -> 16504 bytes window.c | 32 +++++++++++++++ 6 files changed, 112 insertions(+), 33 deletions(-) create mode 100755 mids create mode 100644 mids.o create mode 100755 window create mode 100644 window.c diff --git a/Makefile b/Makefile index 3bd1e01..3c0cebe 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ PROG = anyscroll -FLAGS = -lX11 -lXtst +FLAGS = -lX11 -lXtst -lXi -lpthread + ${PROG}: ${PROG}.o diff --git a/anyscroll.c b/anyscroll.c index 2dbd8b8..ab24876 100644 --- a/anyscroll.c +++ b/anyscroll.c @@ -4,25 +4,68 @@ #include #include #include - +#include +#include 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 releaseButton(int btn) { - XTestFakeButtonEvent(dpy, btn, False, 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 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); + + + } +} + +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); + if (XCheckTypedEvent(dpy, GenericEvent ,&ev)) { + if (cookie->type != GenericEvent || !XGetEventData(dpy, cookie)) { + continue; + } - } else if (ev.type == ButtonRelease) { - eb = &ev.xbutton; - printf("%d button released!\n", eb->button); - //releaseButton(2); - // XUngrabPointer(dpy, CurrentTime); + + 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); } - - XAllowEvents(dpy, ReplayPointer, CurrentTime); - XSync(dpy, 0); -// XFlush(dpy); } XCloseDisplay(dpy); return 0; diff --git a/mids b/mids new file mode 100755 index 0000000000000000000000000000000000000000..e1d998341d8bb7ccb61f43b084a0a288b8f0ad01 GIT binary patch literal 16640 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 literal 0 HcmV?d00001 diff --git a/mids.o b/mids.o new file mode 100644 index 0000000000000000000000000000000000000000..8a0fc6b40c0488bb15411819f2070e6822d3c7db GIT binary patch literal 3400 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 AU;qFB literal 0 HcmV?d00001 diff --git a/window.c b/window.c new file mode 100644 index 0000000..0d55011 --- /dev/null +++ b/window.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +int main(int argc, const char **argv) { + Display *d; + XEvent e; + const char *message = "do you see the fun in gcc?"; + + d = XOpenDisplay(NULL); + if (d == NULL) { + fprintf(stderr, "error opening display\n"); + exit(1); + } + + int s = DefaultScreen(d); + Window w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, BlackPixel(d, s), WhitePixel(d, s)); + + XSelectInput(d, w, ExposureMask | KeyPressMask); + XMapWindow(d, w); + + while (1) { + XNextEvent(d, &e); + if (e.type == Expose) { + XDrawString(d, w, DefaultGC(d, s), 10, 50, message, strlen(message)); + } + } + + XCloseDisplay(d); + return 0; +}