diff src/video/x11/SDL_x11mouse.c @ 3760:64f346a83ed3 gsoc2008_manymouse

http://wilku.ravenlord.ws/doku.php?id=documentation for information how things work. Currently implemented: detecting many pointing devices and pressure detection. Still a bug. Each program has to be comipled with a flag -lXi
author Szymon Wilczek <kazeuser@gmail.com>
date Fri, 06 Jun 2008 15:23:29 +0000
parents a344e42bce3b
children e0c95ad1ba87
line wrap: on
line diff
--- a/src/video/x11/SDL_x11mouse.c	Fri Jun 06 14:50:56 2008 +0000
+++ b/src/video/x11/SDL_x11mouse.c	Fri Jun 06 15:23:29 2008 +0000
@@ -28,11 +28,45 @@
 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;
+   
+    DevList=XListInputDevices(data->display, &numOfDevices);
 
-    SDL_zero(mouse);
-    data->mouse = SDL_AddMouse(&mouse, -1);
+    for(i=0;i<numOfDevices;++i)
+    {
+        if((DevList[i].use!=IsXPointer && DevList[i].use!=IsXKeyboard))
+        {
+            deviceClass=DevList[i].inputclassinfo;
+            for(j=0;j<DevList[i].num_classes;++j)
+            {
+                if(deviceClass->class==ValuatorClass)
+                {
+                    newDevices= (XDevice**) SDL_realloc(SDL_XDevices, (index+1)*sizeof(*newDevices));
+                    if(!newDevices)
+                    {
+                        SDL_OutOfMemory();
+                        return -1;
+                    }
+                    SDL_XDevices=newDevices;
+                    SDL_XDevices[index]=XOpenDevice(data->display,DevList[i].id);
+                    SDL_Mouse mouse;
+                    SDL_zero(mouse);
+                    SDL_SetIndexId(DevList[i].id,index);
+                    data->mouse = SDL_AddMouse(&mouse, index++,DevList[i].name);
+                    break;
+                }
+                deviceClass=(XAnyClassPtr)((char*)deviceClass + deviceClass->length);
+            }
+        }
+    }
+    XFreeDeviceList(DevList);
+    SDL_NumOfXDevices=index;
 }
 
 void
@@ -40,7 +74,7 @@
 {
     SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
 
-    SDL_DelMouse(data->mouse);
+    SDL_MouseQuit();
 }
 
 /* vi: set ts=4 sw=4 expandtab: */