Mercurial > sdl-ios-xcode
changeset 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 | 064c178558b7 |
children | e0c95ad1ba87 |
files | configure.in include/SDL_events.h include/SDL_keysym.h include/SDL_mouse.h src/events/SDL_mouse.c src/events/SDL_mouse_c.h src/video/x11/SDL_x11dyn.h src/video/x11/SDL_x11events.c src/video/x11/SDL_x11mouse.c src/video/x11/SDL_x11sym.h src/video/x11/SDL_x11video.c src/video/x11/SDL_x11video.h src/video/x11/SDL_x11window.c |
diffstat | 13 files changed, 247 insertions(+), 39 deletions(-) [+] |
line wrap: on
line diff
--- a/configure.in Fri Jun 06 14:50:56 2008 +0000 +++ b/configure.in Fri Jun 06 15:23:29 2008 +0000 @@ -1055,7 +1055,7 @@ AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT, "$x11ext_lib") else enable_x11_shared=no - EXTRA_LDFLAGS="$EXTRA_LDFLAGS $X_LIBS -lX11 -lXext" + EXTRA_LDFLAGS="$EXTRA_LDFLAGS $X_LIBS -lX11 -lXext -lXi" fi have_video=yes
--- a/include/SDL_events.h Fri Jun 06 14:50:56 2008 +0000 +++ b/include/SDL_events.h Fri Jun 06 15:23:29 2008 +0000 @@ -170,6 +170,7 @@ Uint8 state; /**< The current button state */ int x; /**< X coordinate, relative to window */ int y; /**< Y coordinate, relative to window */ + int z; int xrel; /**< The relative motion in the X direction */ int yrel; /**< The relative motion in the Y direction */ SDL_WindowID windowID; /**< The window with mouse focus, if any */
--- a/include/SDL_keysym.h Fri Jun 06 14:50:56 2008 +0000 +++ b/include/SDL_keysym.h Fri Jun 06 15:23:29 2008 +0000 @@ -242,7 +242,7 @@ SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN), SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP), SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT), - SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP), + SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP) }; /**
--- a/include/SDL_mouse.h Fri Jun 06 14:50:56 2008 +0000 +++ b/include/SDL_mouse.h Fri Jun 06 15:23:29 2008 +0000 @@ -203,6 +203,11 @@ Button 2: Middle mouse button Button 3: Right mouse button */ + +extern DECLSPEC int SDLCALL SDL_GetNumOfMice(void); + +extern DECLSPEC char* SDLCALL SDL_GetMouseName(int index); + #define SDL_BUTTON(X) (1 << ((X)-1)) #define SDL_BUTTON_LEFT 1 #define SDL_BUTTON_MIDDLE 2
--- a/src/events/SDL_mouse.c Fri Jun 06 14:50:56 2008 +0000 +++ b/src/events/SDL_mouse.c Fri Jun 06 15:23:29 2008 +0000 @@ -31,6 +31,8 @@ static int SDL_num_mice; static int SDL_current_mouse; static SDL_Mouse **SDL_mice; +int *SDL_IdIndex; +int SDL_highestId; /* Public functions */ @@ -50,11 +52,11 @@ } int -SDL_AddMouse(const SDL_Mouse * mouse, int index) +SDL_AddMouse(const SDL_Mouse * mouse, int index, char* name) { SDL_Mouse **mice; int selected_mouse; - + char* temp_name; /* Add the mouse to the list of mice */ if (index < 0 || index >= SDL_num_mice || SDL_mice[index]) { mice = @@ -74,8 +76,8 @@ return -1; } *SDL_mice[index] = *mouse; - - /* Create the default cursor for the mouse */ + SDL_mice[index]->name=SDL_malloc(strlen(name)*sizeof(char)); + strcpy(SDL_mice[index]->name,name); SDL_mice[index]->cursor_shown = SDL_TRUE; selected_mouse = SDL_SelectMouse(index); SDL_mice[index]->cur_cursor = NULL; @@ -98,6 +100,7 @@ } mouse->def_cursor = NULL; + SDL_free(mouse->name); while (mouse->cursors) { SDL_FreeCursor(mouse->cursors); } @@ -266,8 +269,9 @@ } void -SDL_SetMouseFocus(int index, SDL_WindowID windowID) +SDL_SetMouseFocus(int id, SDL_WindowID windowID) { + int index = SDL_GetIndexById(id); SDL_Mouse *mouse = SDL_GetMouse(index); int i; SDL_bool focus; @@ -315,8 +319,9 @@ } int -SDL_SendMouseMotion(int index, int relative, int x, int y) +SDL_SendMouseMotion(int id, int relative, int x, int y,int z) { + int index=SDL_GetIndexById(id); SDL_Mouse *mouse = SDL_GetMouse(index); int posted; int xrel; @@ -352,6 +357,7 @@ } mouse->xdelta += xrel; mouse->ydelta += yrel; + mouse->z=z; /* Move the mouse cursor, if needed */ if (mouse->cursor_shown && !mouse->relative_mode && @@ -368,6 +374,7 @@ event.motion.state = mouse->buttonstate; event.motion.x = mouse->x; event.motion.y = mouse->y; + event.motion.z = mouse->z; event.motion.xrel = xrel; event.motion.yrel = yrel; event.motion.windowID = mouse->focus; @@ -377,8 +384,9 @@ } int -SDL_SendMouseButton(int index, Uint8 state, Uint8 button) +SDL_SendMouseButton(int id, Uint8 state, Uint8 button) { + int index=SDL_GetIndexById(id); SDL_Mouse *mouse = SDL_GetMouse(index); int posted; Uint8 type; @@ -398,10 +406,10 @@ mouse->buttonstate |= SDL_BUTTON(button); break; case SDL_RELEASED: - if (!(mouse->buttonstate & SDL_BUTTON(button))) { - /* Ignore this event, no state change */ - return 0; - } + //if (!(mouse->buttonstate & SDL_BUTTON(button))) { + // /* Ignore this event, no state change */ + // return 0; + //}*/ type = SDL_MOUSEBUTTONUP; mouse->buttonstate &= ~SDL_BUTTON(button); break; @@ -463,7 +471,7 @@ mouse->WarpMouse(mouse, windowID, x, y); } else { SDL_SetMouseFocus(SDL_current_mouse, windowID); - SDL_SendMouseMotion(SDL_current_mouse, 0, x, y); + SDL_SendMouseMotion(SDL_current_mouse, 0, x, y,0); } } @@ -649,4 +657,54 @@ return shown; } +void SDL_SetIndexId(int id, int index) +{ + if(id>SDL_highestId) + { + int *indexes; + indexes = + (int*) SDL_realloc(SDL_IdIndex, + (id + 1) * sizeof(int)); + if (!indexes) { + SDL_OutOfMemory(); + return -1; + } + SDL_IdIndex=indexes; + SDL_IdIndex[id]=index; + SDL_highestId=id; + } + else + { + SDL_IdIndex[id]=index; + } +} + +int SDL_GetIndexById(int id) +{ + if(id>SDL_highestId) + { + return -1; + } + else + { + return SDL_IdIndex[id]; + } +} + +int SDL_GetNumOfMice(void) +{ + return SDL_num_mice; +} + +char* SDL_GetMouseName(int index) +{ + SDL_Mouse* mouse = SDL_GetMouse(index); + if(!mouse) + { + return NULL; + } + return mouse->name; +} + + /* vi: set ts=4 sw=4 expandtab: */
--- a/src/events/SDL_mouse_c.h Fri Jun 06 14:50:56 2008 +0000 +++ b/src/events/SDL_mouse_c.h Fri Jun 06 15:23:29 2008 +0000 @@ -58,10 +58,13 @@ /* Data common to all mice */ SDL_WindowID focus; + int which; int x; int y; + int z; int xdelta; int ydelta; + char* name; Uint8 buttonstate; SDL_bool relative_mode; SDL_bool flush_motion; @@ -84,7 +87,7 @@ /* Add a mouse, possibly reattaching at a particular index (or -1), returning the index of the mouse, or -1 if there was an error. */ -extern int SDL_AddMouse(const SDL_Mouse * mouse, int index); +extern int SDL_AddMouse(const SDL_Mouse * mouse, int index, char* name); /* Remove a mouse at an index, clearing the slot for later */ extern void SDL_DelMouse(int index); @@ -96,7 +99,7 @@ extern void SDL_SetMouseFocus(int index, SDL_WindowID windowID); /* Send a mouse motion event for a mouse at an index */ -extern int SDL_SendMouseMotion(int index, int relative, int x, int y); +extern int SDL_SendMouseMotion(int index, int relative, int x, int y, int z); /* Send a mouse button event for a mouse at an index */ extern int SDL_SendMouseButton(int index, Uint8 state, Uint8 button); @@ -107,6 +110,16 @@ /* Shutdown the mouse subsystem */ extern void SDL_MouseQuit(void); +extern int SDL_GetIndexById(int id); + +extern void SDL_SetIndexId(int id, int index); + +extern int SDL_GetNumOfMice(void); + +extern char* SDL_GetMouseName(int index); + + + #endif /* _SDL_mouse_c_h */ /* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/x11/SDL_x11dyn.h Fri Jun 06 14:50:56 2008 +0000 +++ b/src/video/x11/SDL_x11dyn.h Fri Jun 06 15:23:29 2008 +0000 @@ -29,7 +29,7 @@ #include <X11/Xatom.h> #include <X11/Xlibint.h> #include <X11/Xproto.h> - +//#include <X11/extensions/XInput.h> #include "../Xext/extensions/Xext.h" #include "../Xext/extensions/extutil.h"
--- a/src/video/x11/SDL_x11events.c Fri Jun 06 14:50:56 2008 +0000 +++ b/src/video/x11/SDL_x11events.c Fri Jun 06 15:23:29 2008 +0000 @@ -29,13 +29,16 @@ #include "SDL_x11video.h" #include "../../events/SDL_events_c.h" +//XEventClass *SDL_XEvents; +//int SDL_numOfEvents; + static void X11_DispatchEvent(_THIS) { SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; SDL_WindowData *data; XEvent xevent; - int i; + int i,z; SDL_zero(xevent); /* valgrind fix. --ryan. */ XNextEvent(videodata->display, &xevent); @@ -91,9 +94,10 @@ #endif if ((xevent.xcrossing.mode != NotifyGrab) && (xevent.xcrossing.mode != NotifyUngrab)) { - SDL_SetMouseFocus(videodata->mouse, data->windowID); - SDL_SendMouseMotion(videodata->mouse, 0, xevent.xcrossing.x, - xevent.xcrossing.y); + XDeviceMotionEvent* move=(XDeviceMotionEvent*)&xevent; + SDL_SetMouseFocus(move->deviceid, data->windowID); + SDL_SendMouseMotion(move->deviceid, 0, move->x, + move->y,move->axis_data[2]); } } break; @@ -111,9 +115,10 @@ if ((xevent.xcrossing.mode != NotifyGrab) && (xevent.xcrossing.mode != NotifyUngrab) && (xevent.xcrossing.detail != NotifyInferior)) { - SDL_SendMouseMotion(videodata->mouse, 0, - xevent.xcrossing.x, xevent.xcrossing.y); - SDL_SetMouseFocus(videodata->mouse, 0); + XDeviceMotionEvent* move=(XDeviceMotionEvent*)&xevent; + SDL_SendMouseMotion(move->deviceid, 0, + move->x, move->y,move->axis_data[2]); + SDL_SetMouseFocus(move->deviceid, 0); } } break; @@ -167,26 +172,30 @@ break; /* Mouse motion? */ - case MotionNotify:{ + case 103:{ //MotionNotify #ifdef DEBUG_MOTION printf("X11 motion: %d,%d\n", xevent.xmotion.x, xevent.xmotion.y); #endif - SDL_SendMouseMotion(videodata->mouse, 0, xevent.xmotion.x, - xevent.xmotion.y); + XDeviceMotionEvent* move=(XDeviceMotionEvent*)&xevent; + SDL_SendMouseMotion(move->deviceid, 0, move->x, + move->y,move->axis_data[2]); } break; + /*case MotionNotify:{ /* Mouse button press? */ - case ButtonPress:{ - SDL_SendMouseButton(videodata->mouse, SDL_PRESSED, - xevent.xbutton.button); + case 101:{//ButtonPress + XDeviceButtonPressedEvent* pressed=(XDeviceButtonPressedEvent*)&xevent; + SDL_SendMouseButton(pressed->deviceid, SDL_PRESSED, + pressed->button); } break; /* Mouse button release? */ - case ButtonRelease:{ - SDL_SendMouseButton(videodata->mouse, SDL_RELEASED, - xevent.xbutton.button); + case 102:{//ButtonRelease + XDeviceButtonReleasedEvent* released=(XDeviceButtonReleasedEvent*)&xevent; + SDL_SendMouseButton(released->deviceid, SDL_RELEASED, + released->button); } break;
--- 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: */
--- a/src/video/x11/SDL_x11sym.h Fri Jun 06 14:50:56 2008 +0000 +++ b/src/video/x11/SDL_x11sym.h Fri Jun 06 15:23:29 2008 +0000 @@ -144,6 +144,11 @@ SDL_X11_SYM(SDL_X11_XESetEventToWireRetType,XESetEventToWire,(Display* a,int b,SDL_X11_XESetEventToWireRetType c),(a,b,c),return) SDL_X11_SYM(XExtensionErrorHandler,XSetExtensionErrorHandler,(XExtensionErrorHandler a),(a),return) +/*SDL_X11_SYM(XDeviceInfo* , XListInputDevices, (Display* a, int* b), (a,b),return) +SDL_X11_SYM(void, XFreeDeviceList, (XDeviceInfo* a), (a),) +SDL_X11_SYM(int, XSelectExtensionEvent,(Display* a, Window b, XEventClass* c, int d),(a,b,c,d),return) +SDL_X11_SYM(XDevice* ,XOpenDevice,(Display* a, XID b), (a,b),return)*/ + #if NeedWidePrototypes SDL_X11_SYM(KeySym,XKeycodeToKeysym,(Display* a,unsigned int b,int c),(a,b,c),return) #else
--- a/src/video/x11/SDL_x11video.c Fri Jun 06 14:50:56 2008 +0000 +++ b/src/video/x11/SDL_x11video.c Fri Jun 06 15:23:29 2008 +0000 @@ -30,6 +30,11 @@ //#include "SDL_d3drender.h" //#include "SDL_gdirender.h" +XDevice **SDL_XDevices; +int SDL_NumOfXDevices; +XEventClass SDL_XEvents[256]; +int SDL_NumOfXEvents; + /* Initialization/Query functions */ static int X11_VideoInit(_THIS); static void X11_VideoQuit(_THIS); @@ -96,8 +101,8 @@ static void X11_DeleteDevice(SDL_VideoDevice * device) { + int i; SDL_VideoData *data = (SDL_VideoData *) device->driverdata; - if (data->display) { XCloseDisplay(data->display); } @@ -212,6 +217,8 @@ int X11_VideoInit(_THIS) { + int i,index=0,c_not_needed; + XEventClass xEvent; SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; /* Get the window class name, usually the name of the application */ @@ -240,6 +247,72 @@ return -1; } X11_InitMouse(_this); + for(i=0;i<SDL_NumOfXDevices;++i) + { + DeviceKeyPress(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceKeyRelease(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + + /* focus events */ + DeviceFocusIn(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceFocusOut(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + + /* button events */ + DeviceButtonPress(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceButtonRelease(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + + /* proximity events */ + ProximityIn(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + ProximityOut(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + + /* motion events */ + DeviceMotionNotify(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + + /* device state */ + DeviceStateNotify(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceMappingNotify(SDL_XDevices[i], + c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + ChangeDeviceNotify(SDL_XDevices[i],c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + +#if 0 + /* this cuts the motion data down - not sure if this is useful */ + DevicePointerMotionHint(SDL_XDevices[i], + c_not_neededINPUTEVENT_DEVICE_POINTER_MOTION_HINT],xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; +#endif + + /* button motion */ + DeviceButtonMotion(SDL_XDevices[i], + c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceButton1Motion(SDL_XDevices[i], + c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceButton2Motion(SDL_XDevices[i], + c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceButton3Motion(SDL_XDevices[i], + c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceButton4Motion(SDL_XDevices[i], + c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + DeviceButton5Motion(SDL_XDevices[i], + c_not_needed,xEvent); + if (xEvent) SDL_XEvents[index++] = xEvent; + } + SDL_NumOfXEvents=index; return 0; } @@ -247,6 +320,8 @@ void X11_VideoQuit(_THIS) { + int i; + SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; if (data->classname) { @@ -263,6 +338,7 @@ X11_QuitModes(_this); X11_QuitKeyboard(_this); X11_QuitMouse(_this); + free(SDL_XDevices); } /* vim: set ts=4 sw=4 expandtab: */
--- a/src/video/x11/SDL_x11video.h Fri Jun 06 14:50:56 2008 +0000 +++ b/src/video/x11/SDL_x11video.h Fri Jun 06 15:23:29 2008 +0000 @@ -29,6 +29,7 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> +#include <X11/extensions/XInput.h> #if SDL_VIDEO_DRIVER_X11_XINERAMA #include "../Xext/extensions/Xinerama.h" @@ -68,7 +69,7 @@ int numwindows; SDL_WindowData **windowlist; int windowlistlength; - int mouse; + int *mouse; int keyboard; Atom WM_DELETE_WINDOW; SDL_scancode key_layout[256];
--- a/src/video/x11/SDL_x11window.c Fri Jun 06 14:50:56 2008 +0000 +++ b/src/video/x11/SDL_x11window.c Fri Jun 06 15:23:29 2008 +0000 @@ -153,6 +153,8 @@ XSizeHints *sizehints; XWMHints *wmhints; XClassHint *classhints; + extern XEventClass SDL_XEvents[]; + extern int SDL_NumOfXEvents; #if SDL_VIDEO_DRIVER_X11_XINERAMA /* FIXME @@ -481,20 +483,24 @@ Uint32 fevent = 0; pXGetICValues(((SDL_WindowData *) window->driverdata)->ic, XNFilterEvents, &fevent, NULL); + XMapWindow(data->display,w); XSelectInput(data->display, w, (FocusChangeMask | EnterWindowMask | LeaveWindowMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask | KeyReleaseMask | PropertyChangeMask | StructureNotifyMask | KeymapStateMask | fevent)); + XSelectExtensionEvent(data->display, w, SDL_XEvents, SDL_NumOfXEvents); } #else + XMapWindow(data->display,w); XSelectInput(data->display, w, (FocusChangeMask | EnterWindowMask | LeaveWindowMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask | KeyReleaseMask | PropertyChangeMask | StructureNotifyMask | KeymapStateMask)); + XSelectExtensionEvent(data->display, w, SDL_XEvents, SDL_NumOfXEvents); #endif return 0;