Mercurial > sdl-ios-xcode
changeset 4645:0375d020e7e3
Auto-detects Wacom touch devices.
author | Jim Grandpre <jim.tla@gmail.com> |
---|---|
date | Mon, 31 May 2010 00:24:37 -0400 |
parents | fb500b3e1717 |
children | eea1bf53effa |
files | src/events/SDL_touch.c src/events/SDL_touch_c.h src/video/x11/SDL_eventtouch.c src/video/x11/SDL_eventtouch.h src/video/x11/SDL_x11events.c src/video/x11/SDL_x11video.c touchTest/makefile touchTest/parseDevicesTest.c |
diffstat | 8 files changed, 182 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/events/SDL_touch.c Sat May 29 02:09:16 2010 -0400 +++ b/src/events/SDL_touch.c Mon May 31 00:24:37 2010 -0400 @@ -36,12 +36,7 @@ int SDL_TouchInit(void) { - SDL_Touch touch; - touch.pressure_max = 0; - touch.pressure_min = 0; - touch.id = 0; //Should be function? - SDL_AddTouch(&touch, "Touch1"); return (0); } @@ -138,6 +133,9 @@ SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1); SDL_touchPads[index]->num_fingers = 0; + SDL_touchPads[index]->max_fingers = 0; + SDL_touchPads[index]->fingers = NULL; + SDL_touchPads[index]->buttonstate = 0; SDL_touchPads[index]->relative_mode = SDL_FALSE; SDL_touchPads[index]->flush_motion = SDL_FALSE; @@ -261,16 +259,27 @@ } /* Add the touch to the list of touch */ - fingers = (SDL_Finger **) SDL_realloc(touch->fingers, - (touch->num_fingers + 1) * sizeof(*touch)); + if(touch->num_fingers >= touch->max_fingers){ + if(fingers == NULL) { + touch->max_fingers = 1; + fingers = (SDL_Finger **) SDL_malloc(sizeof(finger)); + } + else { + fingers = (SDL_Finger **) SDL_realloc(touch->fingers, + (touch->num_fingers + 1) * sizeof(finger)); + touch->max_fingers = touch->num_fingers+1; + } + + } + if (!fingers) { SDL_OutOfMemory(); return -1; } touch->fingers = fingers; - index = touch->num_fingers++; - + index = touch->num_fingers; + touch->num_fingers++; touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index]))); if (!touch->fingers[index]) { SDL_OutOfMemory();
--- a/src/events/SDL_touch_c.h Sat May 29 02:09:16 2010 -0400 +++ b/src/events/SDL_touch_c.h Mon May 31 00:24:37 2010 -0400 @@ -61,6 +61,7 @@ SDL_bool flush_motion; int num_fingers; + int max_fingers; SDL_Finger** fingers; void *driverdata;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/video/x11/SDL_eventtouch.c Mon May 31 00:24:37 2010 -0400 @@ -0,0 +1,100 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2010 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ +#include "SDL_config.h" +#include "SDL_x11video.h" +#include "SDL_eventtouch.h" +#include "../../events/SDL_touch_c.h" + +#include <linux/input.h> +#include <fcntl.h> + +void +X11_InitTouch(_THIS) +{ + printf("Initializing touch...\n"); + + FILE *fd; + fd = fopen("/proc/bus/input/devices","r"); + + char c; + int i = 0; + char line[256]; + char tstr[256]; + int vendor = -1,product = -1,event = -1; + while(!feof(fd)) { + if(fgets(line,256,fd) <=0) continue; + //printf("%s",line); + if(line[0] == '\n') { + if(vendor == 1386){ + printf("Wacom... Assuming it is a touch device\n"); + sprintf(tstr,"/dev/input/event%i",event); + printf("At location: %s\n",tstr); + + SDL_Touch touch; + touch.pressure_max = 0; + touch.pressure_min = 0; + touch.id = event; + + + + touch.driverdata = SDL_malloc(sizeof(EventTouchData)); + EventTouchData* data = (EventTouchData*)(touch.driverdata); + printf("Opening device...\n"); + //printf("New Touch - DataPtr: %i\n",data); + data->eventStream = open(tstr, + O_RDONLY | O_NONBLOCK); + ioctl (data->eventStream, EVIOCGNAME (sizeof (tstr)), tstr); + printf ("Reading From : %s\n", tstr); + SDL_AddTouch(&touch, tstr); + + } + vendor = -1; + product = -1; + event = -1; + } + else if(line[0] == 'I') { + i = 1; + while(line[i]) { + sscanf(&line[i],"Vendor=%x",&vendor); + sscanf(&line[i],"Product=%x",&product); + i++; + } + } + else if(line[0] == 'H') { + i = 1; + while(line[i]) { + sscanf(&line[i],"event%d",&event); + i++; + } + } + } + + close(fd); +} + +void +X11_QuitTouch(_THIS) +{ + SDL_TouchQuit(); +} + +/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/x11/SDL_eventtouch.h Sat May 29 02:09:16 2010 -0400 +++ b/src/video/x11/SDL_eventtouch.h Mon May 31 00:24:37 2010 -0400 @@ -35,8 +35,8 @@ } EventTouchData; #endif -//extern void X11_InitMouse(_THIS); -//extern void X11_QuitMouse(_THIS); +extern void X11_InitTouch(_THIS); +extern void X11_QuitTouch(_THIS); #endif /* _SDL_eventtouch_h */
--- a/src/video/x11/SDL_x11events.c Sat May 29 02:09:16 2010 -0400 +++ b/src/video/x11/SDL_x11events.c Mon May 31 00:24:37 2010 -0400 @@ -109,7 +109,6 @@ #endif } break; - /* Losing mouse coverage? */ case LeaveNotify:{ #ifdef DEBUG_XEVENTS @@ -422,23 +421,16 @@ char name[256]; struct input_event ev[64]; int size = sizeof (struct input_event); - static int initd = 0; //TODO - HACK! + for(i = 0;i < SDL_GetNumTouch();++i) { SDL_Touch* touch = SDL_GetTouchIndex(i); if(!touch) printf("Touch %i/%i DNE\n",i,SDL_GetNumTouch()); EventTouchData* data; - if(!initd){//data->eventStream <= 0) { - touch->driverdata = SDL_malloc(sizeof(EventTouchData)); - data = (EventTouchData*)(touch->driverdata); - printf("Openning device...\n"); - data->eventStream = open("/dev/input/wacom", - O_RDONLY | O_NONBLOCK); - ioctl (data->eventStream, EVIOCGNAME (sizeof (name)), name); - printf ("Reading From : %s\n", name); - initd = 1; + data = (EventTouchData*)(touch->driverdata); + if(data == NULL) { + printf("No driver data\n"); + continue; } - else - data = (EventTouchData*)(touch->driverdata); if(data->eventStream <= 0) printf("Error: Couldn't open stream\n"); rd = read(data->eventStream, ev, size * 64); @@ -469,6 +461,7 @@ data->finger = ev[i].value; break; case EV_SYN: + printf("Id: %i\n",touch->id); if(data->x >= 0 || data->y >= 0) SDL_SendTouchMotion(touch->id,data->finger, SDL_FALSE,data->x,data->y,
--- a/src/video/x11/SDL_x11video.c Sat May 29 02:09:16 2010 -0400 +++ b/src/video/x11/SDL_x11video.c Mon May 31 00:24:37 2010 -0400 @@ -23,6 +23,7 @@ #include "SDL_video.h" #include "SDL_mouse.h" +#include "SDL_eventtouch.h" #include "../SDL_sysvideo.h" #include "../SDL_pixels_c.h" @@ -269,6 +270,7 @@ } X11_InitMouse(_this); + X11_InitTouch(_this); return 0; } @@ -289,6 +291,7 @@ X11_QuitModes(_this); X11_QuitKeyboard(_this); X11_QuitMouse(_this); + X11_QuitTouch(_this); } SDL_bool
--- a/touchTest/makefile Sat May 29 02:09:16 2010 -0400 +++ b/touchTest/makefile Mon May 31 00:24:37 2010 -0400 @@ -2,4 +2,6 @@ gcc touchTest.c -o touchTest `sdl-config --cflags --libs` -g gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -g gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g + gcc parseDevicesTest.c -o parseDevicesTest -g +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/touchTest/parseDevicesTest.c Mon May 31 00:24:37 2010 -0400 @@ -0,0 +1,50 @@ +#include <stdio.h> +#include <stdlib.h> +#include <linux/input.h> + + +int main(int agrc,char **argv) +{ + FILE *fd; + fd = fopen("/proc/bus/input/devices","r"); + + char c; + int i = 0; + char line[256]; + char tstr[256]; + int vendor = -1,product = -1,event = -1; + while(!feof(fd)) { + fgets(line,256,fd); + //printf("%s",line); + if(line[0] == '\n') { + if(vendor == 1386){ + printf("Wacom... Assuming it is a touch device\n"); + sprintf(tstr,"/dev/input/event%i",event); + printf("At location: %s\n",tstr); + + + } + vendor = -1; + product = -1; + event = -1; + } + else if(line[0] == 'I') { + i = 1; + while(line[i]) { + sscanf(&line[i],"Vendor=%x",&vendor); + sscanf(&line[i],"Product=%x",&product); + i++; + } + } + else if(line[0] == 'H') { + i = 1; + while(line[i]) { + sscanf(&line[i],"event%d",&event); + i++; + } + } + } + + close(fd); + return 0; +}