#include #include #include #include #include #include static int stop; void sighandler(int sig) { printf("Terminating\n"); stop = 1; } int main (void) { Display *dpy; int err, event; XDGAMode *modes; int nmodes; Window root, child; int rx, ry, wx, wy; unsigned int mask; dpy = XOpenDisplay(NULL); if (!XF86DGAQueryExtension(dpy, &err, &event)) goto error; int major = 2, minor = 0; XF86DGAQueryVersion(dpy, &major, &minor); XGrabButton(dpy, AnyButton, AnyModifier, DefaultRootWindow(dpy), False, ButtonPressMask | ButtonReleaseMask, GrabModeSync, GrabModeAsync, None, None); modes = XDGAQueryModes(dpy, DefaultScreen(dpy), &nmodes); if (nmodes == 0) goto error; signal(SIGINT, sighandler); XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child, &rx, &ry, &wx, &wy, &mask); printf("Current button mask: %#x\n", mask & ~255); printf("Waiting for button press + release\n"); while (!stop) { if (!XPending(dpy)) { usleep(30000); continue; } XEvent ev; XNextEvent(dpy, &ev); printf ("event %d\n", ev.xany.type); if (ev.xany.type == ButtonPress) { printf("Button press received\n"); XDGASetMode(dpy, DefaultScreen(dpy), modes[0].num); XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectMouse | XF86DGADirectKeyb); XDGASelectInput(dpy, DefaultScreen(dpy), ButtonPressMask | ButtonReleaseMask | PointerMotionMask); XAllowEvents(dpy, AsyncBoth, CurrentTime); XFlush(dpy); } XQueryPointer(dpy, DefaultRootWindow(dpy), &root, &child, &rx, &ry, &wx, &wy, &mask); printf("Button mask: %#x\n", mask & ~255); } XFree(modes); XDGASetMode(dpy, 0, 0); XCloseDisplay(dpy); return 0; error: printf ("error occured.\n"); return 1; }