/* Trivial little XINPUT program written to test "raw" access to * XINPUT devices, without gtk wrappers or anything else. * by Philip Brown * Written primarily to test my wacom tablet driver. * http://www.bolthole.com/solaris/drivers/wacom.html * * * Note that it expects hardcoded special XINPUT dev names, * "wacomdev1" and "wacomdev2". * * It will then open those devices, and print out movement info when * you use those devices. * * compile with * cc -o xopen xopen.c -lX11 -lXi -lXext */ #define PENNAME "wacomdev1" #define ERASERNAME "wacomdev2" #include #include #include #include #include int main (int argc, char **argv) { Display *display; int screen, ndev, i; XDeviceInfo *devinfo; XID tabletID = 0, eraserID = 0; XDevice *tabletdev, *erasedev,*seconddev; XEventClass EClist[10]; int meventtype, eeventtype,numtypes=0; XEventClass meventclass; XEvent event_return; if ((display = XOpenDisplay (NULL)) == NULL) { fprintf (stderr, "failed to connect to X server (%s)\n", XDisplayName (NULL)); return 1; } screen = DefaultScreen (display); if ((devinfo = XListInputDevices (display, &ndev)) == NULL) { fprintf (stderr, "Failed to get list of devices\n"); return 1; } printf ("Number of devices is %d\n", ndev); for (i = 0; i < ndev; i++) { printf ("%d. %s(%d)\n", i, devinfo[i].name, devinfo[i].id); if (strcmp (devinfo[i].name, PENNAME) == 0) { tabletID = devinfo[i].id; } if (strcmp (devinfo[i].name, ERASERNAME) == 0) { eraserID = devinfo[i].id; } } XFreeDeviceList (devinfo); if (tabletID == 0) { puts ("no tablet dev"); exit (0); } printf ("tabletid = %d\n", tabletID); tabletdev = XOpenDevice (display, tabletID); printf("tabletdev=%x\n",tabletdev); seconddev = XOpenDevice (display, tabletID); printf("second=%x\n",seconddev); numtypes+=1; if (eraserID != 0) { puts (" (opening eraserID as well)"); erasedev = XOpenDevice (display, eraserID); numtypes+=1; } /* bizzaro macro, to SET arg 2 and 3. Grrr. */ DeviceMotionNotify (tabletdev, meventtype, EClist[0]); if (erasedev != NULL) DeviceMotionNotify (erasedev, eeventtype, EClist[1]); printf ("DEBUG: motioneventtype is supposedly %d\n", meventtype); printf ("DEBUG: eeventtype is supposedly %d\n", eeventtype); XSelectExtensionEvent (display, RootWindow (display, screen), EClist, numtypes); puts ("starting loop"); while (1) { XDeviceMotionEvent *meventptr; XNextEvent (display, &event_return); printf ("Got XEvent of type %d (mevent=%d)\n", event_return.type, meventtype); if (event_return.type == meventtype) { meventptr = (XDeviceMotionEvent *) & event_return; printf ("data is %d,%d,%d (devid %d)\n", meventptr->axis_data[0], meventptr->axis_data[1], meventptr->axis_data[2], meventptr->deviceid); } } XCloseDevice (display, tabletdev); if (erasedev != NULL) XCloseDevice (display, erasedev); }