summaryrefslogtreecommitdiffstats
path: root/xinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'xinput.c')
-rw-r--r--xinput.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/xinput.c b/xinput.c
new file mode 100644
index 0000000..66f0e3e
--- /dev/null
+++ b/xinput.c
@@ -0,0 +1,102 @@
+/************************************************************************
+ *
+ * File: xinput.c
+ *
+ * Sample program to access input devices other than the X pointer and
+ * keyboard using the Input Device extension to X.
+ * This program creates a window and selects input from it.
+ * To terminate this program, press button 1 on any device being accessed
+ * through the extension when the X pointer is in the test window.
+ *
+ * To compile this program, use
+ * "cc xinput.c -I/usr/include/X11R5 -L/usr/lib/X11R5
+ * -lXi -lXext -lX11 -o xinput
+ */
+
+#include <X11/Xlib.h>
+#include <X11/extensions/XInput.h>
+#include "stdio.h"
+
+main()
+{
+ int i, j, count, ndevices, devcnt=0, devkeyp, devbutp;
+ Display *display;
+ Window my;
+ XEvent event;
+ XDeviceInfoPtr list, slist;
+ XInputClassInfo *ip;
+ XDeviceButtonEvent *b;
+ XEventClass class[128];
+ XDevice *dev, *opendevs[9];
+ XAnyClassPtr any;
+ XKeyInfoPtr K;
+
+ if ((display = XOpenDisplay ("")) == NULL)
+ {
+ printf ("No connection to server - Terminating.\n");
+ exit(1);
+ }
+ my = XCreateSimpleWindow (display, RootWindow(display,0), 100, 100,
+ 100, 100, 1, BlackPixel(display,0), WhitePixel(display,0));
+ XMapWindow (display, my);
+ XSync(display,0);
+
+ slist=list=(XDeviceInfoPtr) XListInputDevices (display, &ndevices);
+ for (i=0; i<ndevices; i++, list++)
+ {
+ any = (XAnyClassPtr) (list->inputclassinfo);
+ for (j=0; j<list->num_classes; j++)
+ {
+ if (any->class == KeyClass)
+ {
+ K = (XKeyInfoPtr) any;
+ printf ("device %s:\n",list->name);
+ printf ("num_keys=%d min_keycode=%d max_keycode=%d\n\n",
+ K->num_keys,K->min_keycode,K->max_keycode);
+ }
+ else if (any->class == ButtonClass)
+ printf ("device %s num_buttons=%d\n\n",list->name,
+ ((XButtonInfoPtr) any)->num_buttons);
+ /*
+ * Increment 'any' to point to the next item in the linked
+ * list. The length is in bytes, so 'any' must be cast to
+ * a character pointer before being incremented.
+ */
+ any = (XAnyClassPtr) ((char *) any + any->length);
+ }
+ if (1) //list->use != IsXKeyboard &&list->use != IsXPointer)
+ {
+ dev = XOpenDevice (display, list->id);
+ for (ip= dev->classes, j=0; j<dev->num_classes; j++, ip++)
+ if (ip->input_class == KeyClass)
+ {
+ /* This is a macro, the braces are necessary */
+ DeviceKeyPress (dev, devkeyp, class[count++]);
+ }
+ else if (ip->input_class == ButtonClass)
+ {
+ DeviceButtonPress (dev, devbutp,class[count++]);
+ }
+ opendevs[devcnt++]=dev;
+ }
+ }
+ XSelectExtensionEvent (display, my, class, count);
+ for (;;)
+ {
+ XNextEvent (display, &event);
+ if (event.type == devkeyp)
+ printf ("Device key press event device=%d\n",
+ ((XDeviceKeyEvent *) &event)->deviceid);
+ else if (event.type == devbutp)
+ {
+ b = (XDeviceButtonEvent * ) &event;
+ printf ("Device button press event device=%d button=%d\n",
+ b->deviceid, b->button);
+ if (b->button==1)
+ break;
+ }
+ }
+ for (i=0; i<devcnt; i++)
+ XCloseDevice (display, opendevs[i]);
+ XFreeDeviceList (slist);
+}