static int x11_xinput2_init_internal(void)
{
    const char *ext = "XInputExtension";
    XIDeviceInfo *device_list = NULL;
    int device_count = 0;
    int available = 0;
    int event = 0;
    int error = 0;
    int major = 2;
    int minor = 0;
    int i = 0;

    xinput2_cleanup();  /* just in case... */

    if (getenv("MANYMOUSE_NO_XINPUT2") != NULL)
        return -1;

    if (!find_api_symbols())
        return -1;  /* couldn't find all needed symbols. */

    display = pXOpenDisplay(NULL);
    if (display == NULL)
        return -1;  /* no X server at all */

    Xext_handler = pXSetExtensionErrorHandler(xext_errhandler);
    available = (pXQueryExtension(display, ext, &xi2_opcode, &event, &error) &&
                 (pXIQueryVersion(display, &major, &minor) != BadRequest));
    pXSetExtensionErrorHandler(Xext_handler);
    Xext_handler = NULL;

    if (!available)
        return -1;  /* no XInput2 support. */

    /*
     * Register for events first, to prevent a race where we unplug a
     *  device between when we queried for the list and when we start
     *  listening for changes.
     */
    if (!register_for_events(display))
        return -1;

    device_list = pXIQueryDevice(display, XIAllDevices, &device_count);
    for (i = 0; i < device_count; i++)
    {
        MouseStruct *mouse = &mice[available_mice];
        if (init_mouse(mouse, &device_list[i]))
            available_mice++;
    } /* for */
    pXIFreeDeviceInfo(device_list);

    return available_mice;
} /* x11_xinput2_init_internal */
Exemple #2
0
static int x11_xinput_init_internal(void)
{
    int i;

    xinput_cleanup();  /* just in case... */

    if (getenv("MANYMOUSE_NO_XINPUT") != NULL)
        return(-1);

    if (!find_api_symbols())
        return(-1);  /* couldn't find all needed symbols. */

    display = pXOpenDisplay(NULL);
    if (display == NULL)
        return(-1);  /* no X server at all */

    /* Stop stderr output in case XInput extension is missing... */
    Xext_handler = pXSetExtensionErrorHandler(xext_errhandler);
    extver = pXGetExtensionVersion(display, INAME);
    pXSetExtensionErrorHandler(Xext_handler);
    Xext_handler = NULL;

    if ((extver == NULL) || (extver == (XExtensionVersion *) NoSuchExtension))
        return(-1);  /* no such extension */

    if (extver->present == XI_Absent)
        return(-1);  /* extension not available. */

    device_list = pXListInputDevices(display, &device_count);
    if (device_list == NULL)
        return(-1);

    for (i = 0; i < device_count; i++)
    {
        MouseStruct *mouse = &mice[available_mice];
        if (init_mouse(mouse, &device_list[i]))
            available_mice++;
    } /* for */

    return(available_mice);
} /* x11_xinput_init_internal */