Mercurial > sdl-ios-xcode
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: */