diff src/video/x11/SDL_x11mouse.c @ 2710:44e49d3fa6cf

Final merge of Google Summer of Code 2008 work... Many-mouse and tablet support by Szymon Wilczek, mentored by Ryan C. Gordon Everything concerning the project is noted on the wiki: http://wilku.ravenlord.ws/doku.php?id=start
author Sam Lantinga <slouken@libsdl.org>
date Mon, 25 Aug 2008 06:33:00 +0000
parents a344e42bce3b
children 6fc50bdd88c0
line wrap: on
line diff
--- a/src/video/x11/SDL_x11mouse.c	Mon Aug 25 05:30:28 2008 +0000
+++ b/src/video/x11/SDL_x11mouse.c	Mon Aug 25 06:33:00 2008 +0000
@@ -28,11 +28,70 @@
 void
 X11_InitMouse(_THIS)
 {
+    extern XDevice **SDL_XDevices;
+    XDevice **newDevices;
+    int i, j, index = 0, numOfDevices;
+    extern int SDL_NumOfXDevices;
+    XDeviceInfo *DevList;
+    XAnyClassPtr deviceClass;
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
-    SDL_Mouse mouse;
+
+    /* we're getting the list of input devices */
+    DevList = XListInputDevices(data->display, &numOfDevices);
+    SDL_XDevices = (XDevice **) SDL_malloc(sizeof(XDevice));
+
+    /* we're aquiring valuators:mices, tablets, etc. */
+    for (i = 0; i < numOfDevices; ++i) {
+        /* if it's the core pointer or core keyborard we don't want it */
+        if ((DevList[i].use != IsXPointer && DevList[i].use != IsXKeyboard)) {
+            /* we have to check all of the device classes */
+            deviceClass = DevList[i].inputclassinfo;
+            for (j = 0; j < DevList[i].num_classes; ++j) {
+                if (deviceClass->class == ValuatorClass) {      /* bingo ;) */
+                    XValuatorInfo *valInfo;
+                    SDL_Mouse mouse;
 
-    SDL_zero(mouse);
-    data->mouse = SDL_AddMouse(&mouse, -1);
+                    newDevices =
+                        (XDevice **) SDL_realloc(SDL_XDevices,
+                                                 (index +
+                                                  1) * sizeof(*newDevices));
+                    if (!newDevices) {
+                        SDL_OutOfMemory();
+                        return;
+                    }
+                    SDL_XDevices = newDevices;
+                    SDL_XDevices[index] =
+                        XOpenDevice(data->display, DevList[i].id);
+                    SDL_zero(mouse);
+
+                    /* the id of the device differs from its index
+                     * so we're assigning the index of a device to it's id */
+                    SDL_SetMouseIndexId(DevList[i].id, index);
+                    /* lets get the device parameters */
+                    valInfo = (XValuatorInfo *) deviceClass;
+                    /* if the device reports pressure, lets check it parameteres */
+                    if (valInfo->num_axes > 2) {
+                        data->mouse =
+                            SDL_AddMouse(&mouse, index++, DevList[i].name,
+                                         valInfo->axes[2].max_value,
+                                         valInfo->axes[2].min_value, 1);
+                    } else {
+                        data->mouse =
+                            SDL_AddMouse(&mouse, index++, DevList[i].name, 0,
+                                         0, 1);
+                    }
+                    break;
+                }
+                /* if it's not class we're interested in, lets go further */
+                deviceClass =
+                    (XAnyClassPtr) ((char *) deviceClass +
+                                    deviceClass->length);
+            }
+        }
+    }
+    XFreeDeviceList(DevList);
+
+    SDL_NumOfXDevices = index;
 }
 
 void
@@ -40,7 +99,8 @@
 {
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
 
-    SDL_DelMouse(data->mouse);
+    /* let's delete all of the mice */
+    SDL_MouseQuit();
 }
 
 /* vi: set ts=4 sw=4 expandtab: */