http://wearables.unisa.edu.au/mpx/?q=xi2_sample

Submitted by peter on Thursday, June 5, 2008 - 10:33


/* gcc -o xi2_sample xi2_sample.c `pkg-config --cflags --libs xi` */

#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/XInput.h>


int main (int argc, char** argv) {
    Display     *dpy;
    Window       win;
    XDeviceInfo *info;
    int          ndevices,
                 i;
    XDevice     *pointer1 = NULL,
                *pointer2 = NULL;
    XEvent       ev;
    int          type_bpress;
    XEventClass  cls[2];

    dpy = XOpenDisplay(NULL);
    XQueryInputVersion(dpy, XI_2_Major, XI_2_Minor);

    /* Create and map window */
    win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 400, 400,
                              0, 0, BlackPixel(dpy, DefaultScreen(dpy)));

    XMapWindow(dpy, win);
    XFlush(dpy);

    info = XListInputDevices(dpy, &ndevices);

    for (i = 0; i < ndevices; i++) {
        XDeviceInfo* current = &info[i];
        printf("Found device: %s (%d)\n", current->name, current->id);
        switch(current->use) {
            case IsXExtensionPointer:
            case IsXExtensionKeyboard:
            case IsXExtensionDevice:
                printf(" .. is slave device (ignoring)\n");
                break;
            case IsXPointer:
                if (!pointer1)
                    pointer1 = XOpenDevice(dpy, current->id);
                else if (!pointer2)
                    pointer2 = XOpenDevice(dpy, current->id);
                printf(" .. is master pointer\n");
                break;
            case IsXKeyboard:
                printf(" .. is master keyboard\n");
                break;
        }
    }

    XFreeDeviceList(info);

    if (!pointer2) { /* there is always at least one pointer */
        printf("Only found one master pointer.\n");
        printf("Try xinput --create-master \"name\"\n");
        return 1;
    }

    DeviceButtonPress(pointer1, type_bpress, cls[0]);
    DeviceButtonPress(pointer2, type_bpress, cls[1]);
    XSelectExtensionEvent(dpy, win, cls, 2);

    /* Main event loop */
    while(1) {
        XNextEvent(dpy, &ev);
        printf("Event type %d received\n", ev.type);

        if (ev.type == type_bpress) {
            XDeviceButtonEvent* bev = (XDeviceButtonEvent*)&ev;
            printf("Press received by device %d\n", bev->deviceid);
        }
    }

    XCloseDevice(dpy, pointer1);
    XCloseDevice(dpy, pointer2);
    XCloseDisplay(dpy);
    return 0;
}


Reply via email to