Auto-detects Wacom touch devices.
authorJim Grandpre <jim.tla@gmail.com>
Mon, 31 May 2010 00:24:37 -0400
changeset 4645 0375d020e7e3
parent 4644 fb500b3e1717
child 4646 eea1bf53effa
Auto-detects Wacom touch devices.
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
--- 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;
+}