From e36fc80c35b2e9feb3cc0dcb5b3880deb92d9756 Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Mon, 31 May 2010 00:24:37 -0400 Subject: [PATCH] Auto-detects Wacom touch devices. --- src/events/SDL_touch.c | 27 ++++++--- src/events/SDL_touch_c.h | 1 + src/video/x11/SDL_eventtouch.c | 100 +++++++++++++++++++++++++++++++++ src/video/x11/SDL_eventtouch.h | 4 +- src/video/x11/SDL_x11events.c | 19 ++----- src/video/x11/SDL_x11video.c | 3 + touchTest/makefile | 2 + touchTest/parseDevicesTest.c | 50 +++++++++++++++++ 8 files changed, 182 insertions(+), 24 deletions(-) create mode 100644 src/video/x11/SDL_eventtouch.c create mode 100644 touchTest/parseDevicesTest.c diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index af78ac1ea..0b4957701 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -36,12 +36,7 @@ static SDL_Touch **SDL_touchPads = NULL; 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_AddTouch(const SDL_Touch * touch, char *name) 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 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) } /* 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(); diff --git a/src/events/SDL_touch_c.h b/src/events/SDL_touch_c.h index 6a0ebf62d..eb2a0cbbb 100644 --- a/src/events/SDL_touch_c.h +++ b/src/events/SDL_touch_c.h @@ -61,6 +61,7 @@ struct SDL_Touch SDL_bool flush_motion; int num_fingers; + int max_fingers; SDL_Finger** fingers; void *driverdata; diff --git a/src/video/x11/SDL_eventtouch.c b/src/video/x11/SDL_eventtouch.c new file mode 100644 index 000000000..691169e56 --- /dev/null +++ b/src/video/x11/SDL_eventtouch.c @@ -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 +#include + +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: */ diff --git a/src/video/x11/SDL_eventtouch.h b/src/video/x11/SDL_eventtouch.h index debdb59ae..1cee9ec0a 100644 --- a/src/video/x11/SDL_eventtouch.h +++ b/src/video/x11/SDL_eventtouch.h @@ -35,8 +35,8 @@ typedef struct EventTouchData } 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 */ diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 4e5934a98..8c5ec04c8 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -109,7 +109,6 @@ X11_DispatchEvent(_THIS) #endif } break; - /* Losing mouse coverage? */ case LeaveNotify:{ #ifdef DEBUG_XEVENTS @@ -422,23 +421,16 @@ X11_PumpEvents(_THIS) 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 @@ X11_PumpEvents(_THIS) 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, diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index 2494bce39..4575b634e 100644 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -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_VideoInit(_THIS) } X11_InitMouse(_this); + X11_InitTouch(_this); return 0; } @@ -289,6 +291,7 @@ X11_VideoQuit(_THIS) X11_QuitModes(_this); X11_QuitKeyboard(_this); X11_QuitMouse(_this); + X11_QuitTouch(_this); } SDL_bool diff --git a/touchTest/makefile b/touchTest/makefile index a244a2982..50bce657c 100644 --- a/touchTest/makefile +++ b/touchTest/makefile @@ -2,4 +2,6 @@ SDLTest : touchSimp.c touchPong.c 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 + diff --git a/touchTest/parseDevicesTest.c b/touchTest/parseDevicesTest.c new file mode 100644 index 000000000..85d4ffef3 --- /dev/null +++ b/touchTest/parseDevicesTest.c @@ -0,0 +1,50 @@ +#include +#include +#include + + +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; +}