changeset 4688:494f71f57a80

Fixed bugs related to keyboard handling in gestureSDLTest. Fixed gesture code (dynamic memory allocation). Cleaned up gesture and test code.
author Jim Grandpre <jim.tla@gmail.com>
date Fri, 13 Aug 2010 23:08:32 -0400
parents 257bdf117af8
children f9ab8df6d45a
files src/events/SDL_gesture.c touchTest/gestureSDLTest.c
diffstat 2 files changed, 186 insertions(+), 334 deletions(-) [+]
line wrap: on
line diff
--- a/src/events/SDL_gesture.c	Fri Aug 13 17:05:06 2010 -0700
+++ b/src/events/SDL_gesture.c	Fri Aug 13 23:08:32 2010 -0400
@@ -27,11 +27,12 @@
 #include "SDL_gesture_c.h"
 
 //TODO: Replace with malloc
-#define MAXFINGERS 5
-#define MAXTOUCHES 2
-#define MAXTEMPLATES 4
+
 #define MAXPATHSIZE 1024
 
+ 
+
+
 #define DOLLARNPOINTS 64
 #define DOLLARSIZE 256
 
@@ -42,55 +43,38 @@
 
 typedef struct {
   float x,y;
-} Point;
-
-
-typedef struct {
-  Point p;
-  float pressure;
-  SDL_FingerID id;
-} Finger;
-
+} SDL_FloatPoint;
 
 typedef struct {
   float length;
   
   int numPoints;
-  Point p[MAXPATHSIZE];
-} DollarPath;
+  SDL_FloatPoint p[MAXPATHSIZE];
+} SDL_DollarPath;
 
-/*
 typedef struct {
-  Finger f;
-  Point cv;
-  float dtheta,dDist;
-  DollarPath dollarPath;
-} TouchPoint;
-*/
-typedef struct {
-  Point path[DOLLARNPOINTS];
+  SDL_FloatPoint path[DOLLARNPOINTS];
   unsigned long hash;
-} DollarTemplate;
+} SDL_DollarTemplate;
 
 typedef struct {
   SDL_GestureID id;
-  Point res;
-  Point centroid;
-  //TouchPoint gestureLast[MAXFINGERS];
-  DollarPath dollarPath;
+  SDL_FloatPoint res;
+  SDL_FloatPoint centroid;
+  SDL_DollarPath dollarPath;
   Uint16 numDownFingers;
 
   int numDollarTemplates;
-  DollarTemplate dollarTemplate[MAXTEMPLATES];
+  SDL_DollarTemplate *dollarTemplate;
 
   SDL_bool recording;
-} GestureTouch;
+} SDL_GestureTouch;
 
-GestureTouch gestureTouch[MAXTOUCHES];
-int numGestureTouches = 0;
+SDL_GestureTouch *SDL_gestureTouch;
+int SDL_numGestureTouches = 0;
 SDL_bool recordAll;
 
-void SDL_PrintPath(Point *path) {
+void SDL_PrintPath(SDL_FloatPoint *path) {
   int i;
   printf("Path:");
   for(i=0;i<DOLLARNPOINTS;i++) {
@@ -102,9 +86,9 @@
 int SDL_RecordGesture(SDL_TouchID touchId) {
   int i;
   if(touchId < 0) recordAll = SDL_TRUE;
-  for(i = 0;i < numGestureTouches; i++) {
-    if((touchId < 0) || (gestureTouch[i].id == touchId)) {
-      gestureTouch[i].recording = SDL_TRUE;
+  for(i = 0;i < SDL_numGestureTouches; i++) {
+    if((touchId < 0) || (SDL_gestureTouch[i].id == touchId)) {
+      SDL_gestureTouch[i].recording = SDL_TRUE;
       if(touchId >= 0)
 	return 1;
     }      
@@ -112,7 +96,7 @@
   return (touchId < 0);
 }
 
-unsigned long SDL_HashDollar(Point* points) {
+unsigned long SDL_HashDollar(SDL_FloatPoint* points) {
   unsigned long hash = 5381;
   int i;
   for(i = 0;i < DOLLARNPOINTS; i++) { 
@@ -123,14 +107,14 @@
 }
 
 
-static int SaveTemplate(DollarTemplate *templ, SDL_RWops * src) {
+static int SaveTemplate(SDL_DollarTemplate *templ, SDL_RWops * src) {
   if(src == NULL) return 0;
 
   int i;
   
   //No Longer storing the Hash, rehash on load
   //if(SDL_RWops.write(src,&(templ->hash),sizeof(templ->hash),1) != 1) return 0;
-
+  
   if(SDL_RWwrite(src,templ->path,
 		 sizeof(templ->path[0]),DOLLARNPOINTS) != DOLLARNPOINTS) 
     return 0;
@@ -141,8 +125,8 @@
 
 int SDL_SaveAllDollarTemplates(SDL_RWops *src) {  
   int i,j,rtrn = 0;
-  for(i = 0; i < numGestureTouches; i++) {
-    GestureTouch* touch = &gestureTouch[i];
+  for(i = 0; i < SDL_numGestureTouches; i++) {
+    SDL_GestureTouch* touch = &SDL_gestureTouch[i];
     for(j = 0;j < touch->numDollarTemplates; j++) {
 	rtrn += SaveTemplate(&touch->dollarTemplate[i],src);
     }
@@ -152,8 +136,8 @@
 
 int SDL_SaveDollarTemplate(SDL_GestureID gestureId, SDL_RWops *src) {
   int i,j;
-  for(i = 0; i < numGestureTouches; i++) {
-    GestureTouch* touch = &gestureTouch[i];
+  for(i = 0; i < SDL_numGestureTouches; i++) {
+    SDL_GestureTouch* touch = &SDL_gestureTouch[i];
     for(j = 0;j < touch->numDollarTemplates; j++) {
       if(touch->dollarTemplate[i].hash == gestureId) {
 	return SaveTemplate(&touch->dollarTemplate[i],src);
@@ -166,25 +150,46 @@
 
 //path is an already sampled set of points
 //Returns the index of the gesture on success, or -1
-static int SDL_AddDollarGesture(GestureTouch* inTouch,Point* path) {
+static int SDL_AddDollarGesture(SDL_GestureTouch* inTouch,SDL_FloatPoint* path) {
   if(inTouch == NULL) {
-    if(numGestureTouches == 0) return -1;
+    if(SDL_numGestureTouches == 0) return -1;
     int i = 0;
-    for(i = 0;i < numGestureTouches; i++) {
-      inTouch = &gestureTouch[i];
-      if(inTouch->numDollarTemplates < MAXTEMPLATES) {
-	DollarTemplate *templ = 
-	  &inTouch->dollarTemplate[inTouch->numDollarTemplates];
-	memcpy(templ->path,path,DOLLARNPOINTS*sizeof(Point));
-	templ->hash = SDL_HashDollar(templ->path);
-	inTouch->numDollarTemplates++;
+    for(i = 0;i < SDL_numGestureTouches; i++) {
+      inTouch = &SDL_gestureTouch[i];
+
+      SDL_DollarTemplate* dollarTemplate = 
+	SDL_realloc(inTouch->dollarTemplate,
+		    (inTouch->numDollarTemplates + 1) * 
+		    sizeof(SDL_DollarTemplate));
+      if(!dollarTemplate) {
+	SDL_OutOfMemory();
+	return -1;
       }
+	
+      inTouch->dollarTemplate = dollarTemplate;
+
+      SDL_DollarTemplate *templ = 
+	&inTouch->dollarTemplate[inTouch->numDollarTemplates];
+      memcpy(templ->path,path,DOLLARNPOINTS*sizeof(SDL_FloatPoint));
+      templ->hash = SDL_HashDollar(templ->path);
+      inTouch->numDollarTemplates++;    
     }
     return inTouch->numDollarTemplates - 1;
-  }else if(inTouch->numDollarTemplates < MAXTEMPLATES) {
-    DollarTemplate *templ = 
+  } else {
+    SDL_DollarTemplate* dollarTemplate = 
+      SDL_realloc(inTouch->dollarTemplate,
+		  (inTouch->numDollarTemplates + 1) * 
+		  sizeof(SDL_DollarTemplate));
+    if(!dollarTemplate) {
+      SDL_OutOfMemory();
+      return -1;
+    }
+    
+    inTouch->dollarTemplate = dollarTemplate;
+
+    SDL_DollarTemplate *templ = 
       &inTouch->dollarTemplate[inTouch->numDollarTemplates];
-    memcpy(templ->path,path,DOLLARNPOINTS*sizeof(Point));
+    memcpy(templ->path,path,DOLLARNPOINTS*sizeof(SDL_FloatPoint));
     templ->hash = SDL_HashDollar(templ->path);
     inTouch->numDollarTemplates++;
     return inTouch->numDollarTemplates - 1;
@@ -195,36 +200,28 @@
 int SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src) {
   if(src == NULL) return 0;
   int i,loaded = 0;
-  GestureTouch *touch = NULL;
+  SDL_GestureTouch *touch = NULL;
   if(touchId >= 0) {
-    for(i = 0;i < numGestureTouches; i++)
-      if(gestureTouch[i].id == touchId)
-	touch = &gestureTouch[i];
+    for(i = 0;i < SDL_numGestureTouches; i++)
+      if(SDL_gestureTouch[i].id == touchId)
+	touch = &SDL_gestureTouch[i];
     if(touch == NULL) return -1;
   }
 
   while(1) {
-    DollarTemplate templ;
-    //fscanf(fp,"%lu ",&templ.hash);
-    /*
-    for(i = 0;i < DOLLARNPOINTS; i++) {		
-      int x,y;
-      if(fscanf(fp,"%i %i ",&x,&y) != 2) break;
-      templ.path[i].x = x;
-      templ.path[i].y = y;
-    }
-    fscanf(fp,"\n");
-    */
-    if(SDL_RWread(src,templ.path,sizeof(templ.path[0]),DOLLARNPOINTS) < DOLLARNPOINTS) break;
+    SDL_DollarTemplate templ;
+
+    if(SDL_RWread(src,templ.path,sizeof(templ.path[0]),DOLLARNPOINTS) < 
+       DOLLARNPOINTS) break;
 
     if(touchId >= 0) {
       printf("Adding loaded gesture to 1 touch\n");
       if(SDL_AddDollarGesture(touch,templ.path)) loaded++;
     }
     else {
-      printf("Adding to: %i touches\n",numGestureTouches);
-      for(i = 0;i < numGestureTouches; i++) {
-	touch = &gestureTouch[i];
+      printf("Adding to: %i touches\n",SDL_numGestureTouches);
+      for(i = 0;i < SDL_numGestureTouches; i++) {
+	touch = &SDL_gestureTouch[i];
 	printf("Adding loaded gesture to + touches\n");
 	//TODO: What if this fails?
 	SDL_AddDollarGesture(touch,templ.path);	
@@ -237,10 +234,10 @@
 }
 
 
-float dollarDifference(Point* points,Point* templ,float ang) {
-  //  Point p[DOLLARNPOINTS];
+float dollarDifference(SDL_FloatPoint* points,SDL_FloatPoint* templ,float ang) {
+  //  SDL_FloatPoint p[DOLLARNPOINTS];
   float dist = 0;
-  Point p;
+  SDL_FloatPoint p;
   int i;
   for(i = 0; i < DOLLARNPOINTS; i++) {
     p.x = points[i].x * cos(ang) - points[i].y * sin(ang);
@@ -252,7 +249,7 @@
   
 }
 
-float bestDollarDifference(Point* points,Point* templ) {
+float bestDollarDifference(SDL_FloatPoint* points,SDL_FloatPoint* templ) {
   //------------BEGIN DOLLAR BLACKBOX----------------//
   //-TRANSLATED DIRECTLY FROM PSUDEO-CODE AVAILABLE AT-//
   //-"http://depts.washington.edu/aimgroup/proj/dollar/"-//
@@ -289,10 +286,9 @@
 }
 
 //DollarPath contains raw points, plus (possibly) the calculated length
-int dollarNormalize(DollarPath path,Point *points) {
+int dollarNormalize(SDL_DollarPath path,SDL_FloatPoint *points) {
   int i;
   //Calculate length if it hasn't already been done
-  printf("length: %f\n",path.length);
   if(path.length <= 0) {
     for(i=1;i<path.numPoints;i++) {
       float dx = path.p[i  ].x - 
@@ -302,14 +298,13 @@
       path.length += sqrt(dx*dx+dy*dy);
     }
   }
-  printf("New length: %f\n",path.length);
 
   //Resample
   float interval = path.length/(DOLLARNPOINTS - 1);
   float dist = interval;
 
   int numPoints = 0;
-  Point centroid; 
+  SDL_FloatPoint centroid; 
   centroid.x = 0;centroid.y = 0;
   
   //printf("(%f,%f)\n",path.p[path.numPoints-1].x,path.p[path.numPoints-1].y);
@@ -378,9 +373,9 @@
   return numPoints;
 }
 
-float dollarRecognize(DollarPath path,int *bestTempl,GestureTouch* touch) {
+float dollarRecognize(SDL_DollarPath path,int *bestTempl,SDL_GestureTouch* touch) {
 	
-	Point points[DOLLARNPOINTS];
+	SDL_FloatPoint points[DOLLARNPOINTS];
 	int numPoints = dollarNormalize(path,points);
 	//SDL_PrintPath(points);
 	int i;
@@ -394,34 +389,56 @@
 	return bestDiff;
 }
 
-int SDL_GestureAddTouch(SDL_Touch* touch) { 
-  if(numGestureTouches >= MAXTOUCHES) return -1;
-  
-  gestureTouch[numGestureTouches].res.x = touch->xres;
-  gestureTouch[numGestureTouches].res.y = touch->yres;
-  gestureTouch[numGestureTouches].numDownFingers = 0;
+int SDL_GestureAddTouch(SDL_Touch* touch) {  
+  SDL_GestureTouch *gestureTouch = SDL_realloc(SDL_gestureTouch,
+					       (SDL_numGestureTouches + 1) *
+					       sizeof(SDL_GestureTouch));
+
+  if(!gestureTouch) {
+    SDL_OutOfMemory();
+    return -1;
+  }
+
+  SDL_gestureTouch = gestureTouch;
 
-  gestureTouch[numGestureTouches].res.x = touch->xres;
-  gestureTouch[numGestureTouches].id = touch->id;
+  SDL_gestureTouch[SDL_numGestureTouches].res.x = touch->xres;
+  SDL_gestureTouch[SDL_numGestureTouches].res.y = touch->yres;
+  SDL_gestureTouch[SDL_numGestureTouches].numDownFingers = 0;
 
-  gestureTouch[numGestureTouches].numDollarTemplates = 0;
+  SDL_gestureTouch[SDL_numGestureTouches].res.x = touch->xres;
+  SDL_gestureTouch[SDL_numGestureTouches].id = touch->id;
 
-  gestureTouch[numGestureTouches].recording = SDL_FALSE;
+  SDL_gestureTouch[SDL_numGestureTouches].numDollarTemplates = 0;
 
-  numGestureTouches++;
+  SDL_gestureTouch[SDL_numGestureTouches].recording = SDL_FALSE;
+
+  SDL_numGestureTouches++;
   return 0;
 }
 
-GestureTouch * SDL_GetGestureTouch(SDL_TouchID id) {
+int SDL_GestureRemoveTouch(SDL_TouchID id) {
   int i;
-  for(i = 0;i < numGestureTouches; i++) {
-    //printf("%i ?= %i\n",gestureTouch[i].id,id);
-    if(gestureTouch[i].id == id) return &gestureTouch[i];
+  for(i = 0;i < SDL_numGestureTouches; i++) {
+    if(SDL_gestureTouch[i].id == id) {
+      SDL_numGestureTouches--;
+      SDL_gestureTouch[i] = SDL_gestureTouch[SDL_numGestureTouches];
+      return 1;
+    }
+  }
+  return -1;
+}
+
+
+SDL_GestureTouch * SDL_GetGestureTouch(SDL_TouchID id) {
+  int i;
+  for(i = 0;i < SDL_numGestureTouches; i++) {
+    //printf("%i ?= %i\n",SDL_gestureTouch[i].id,id);
+    if(SDL_gestureTouch[i].id == id) return &SDL_gestureTouch[i];
   }
   return NULL;
 }
 
-int SDL_SendGestureMulti(GestureTouch* touch,float dTheta,float dDist) {
+int SDL_SendGestureMulti(SDL_GestureTouch* touch,float dTheta,float dDist) {
   SDL_Event event;
   event.mgesture.type = SDL_MULTIGESTURE;
   event.mgesture.touchId = touch->id;
@@ -433,7 +450,7 @@
   return SDL_PushEvent(&event) > 0;
 }
 
-int SDL_SendGestureDollar(GestureTouch* touch,
+int SDL_SendGestureDollar(SDL_GestureTouch* touch,
 			  SDL_GestureID gestureId,float error) {
   SDL_Event event;
   event.dgesture.type = SDL_DOLLARGESTURE;
@@ -449,7 +466,7 @@
 }
 
 
-int SDL_SendDollarRecord(GestureTouch* touch,SDL_GestureID gestureId) {
+int SDL_SendDollarRecord(SDL_GestureTouch* touch,SDL_GestureID gestureId) {
   SDL_Event event;
   event.dgesture.type = SDL_DOLLARRECORD;
   event.dgesture.touchId = touch->id;
@@ -464,7 +481,7 @@
   if(event->type == SDL_FINGERMOTION || 
      event->type == SDL_FINGERDOWN ||
      event->type == SDL_FINGERUP) {
-    GestureTouch* inTouch = SDL_GetGestureTouch(event->tfinger.touchId);
+    SDL_GestureTouch* inTouch = SDL_GetGestureTouch(event->tfinger.touchId);
     
     //Shouldn't be possible
     if(inTouch == NULL) return;
@@ -485,15 +502,15 @@
 #ifdef ENABLE_DOLLAR
       if(inTouch->recording) {
 	inTouch->recording = SDL_FALSE;
-	Point path[DOLLARNPOINTS];
+	SDL_FloatPoint path[DOLLARNPOINTS];
 	dollarNormalize(inTouch->dollarPath,path);
 	//SDL_PrintPath(path);
 	int index;
 	if(recordAll) {
 	  index = SDL_AddDollarGesture(NULL,path);
 	  int i;
-	  for(i = 0;i < numGestureTouches; i++)
-	    gestureTouch[i].recording = SDL_FALSE;
+	  for(i = 0;i < SDL_numGestureTouches; i++)
+	    SDL_gestureTouch[i].recording = SDL_FALSE;
 	}
 	else {
 	  index = SDL_AddDollarGesture(inTouch,path);
@@ -532,7 +549,7 @@
       float dy = ((float)event->tfinger.dy)/(float)inTouch->res.y;
       //printf("dx,dy: (%f,%f)\n",dx,dy); 
 #ifdef ENABLE_DOLLAR
-      DollarPath* path = &inTouch->dollarPath;
+      SDL_DollarPath* path = &inTouch->dollarPath;
       if(path->numPoints < MAXPATHSIZE) {
 	path->p[path->numPoints].x = inTouch->centroid.x;
 	path->p[path->numPoints].y = inTouch->centroid.y;
@@ -544,18 +561,18 @@
 	path->numPoints++;
       }
 #endif
-      Point lastP;
+      SDL_FloatPoint lastP;
       lastP.x = x - dx;
       lastP.y = y - dy;
-      Point lastCentroid;
+      SDL_FloatPoint lastCentroid;
       lastCentroid = inTouch->centroid;
       
       inTouch->centroid.x += dx/inTouch->numDownFingers;
       inTouch->centroid.y += dy/inTouch->numDownFingers;
       //printf("Centrid : (%f,%f)\n",inTouch->centroid.x,inTouch->centroid.y);
       if(inTouch->numDownFingers > 1) {
-	Point lv; //Vector from centroid to last x,y position
-	Point v; //Vector from centroid to current x,y position
+	SDL_FloatPoint lv; //Vector from centroid to last x,y position
+	SDL_FloatPoint v; //Vector from centroid to current x,y position
 	//lv = inTouch->gestureLast[j].cv;
 	lv.x = lastP.x - lastCentroid.x;
 	lv.y = lastP.y - lastCentroid.y;
@@ -608,15 +625,9 @@
 			     x)/inTouch->numDownFingers;
       inTouch->centroid.y = (inTouch->centroid.y*(inTouch->numDownFingers - 1)+
 			     y)/inTouch->numDownFingers;
-      printf("Finger Down: (%f,%f). Centroid: (%f,%f\n",x,y,
-	     inTouch->centroid.x,inTouch->centroid.y);
-      /*
-	inTouch->gestureLast[j].f.id = event->tfinger.fingerId;
-	inTouch->gestureLast[j].f.p.x  = x;
-	inTouch->gestureLast[j].f.p.y  = y;	
-	inTouch->gestureLast[j].cv.x = 0;
-	inTouch->gestureLast[j].cv.y = 0;
-      */
+      //printf("Finger Down: (%f,%f). Centroid: (%f,%f\n",x,y,
+      //     inTouch->centroid.x,inTouch->centroid.y);
+
 #ifdef ENABLE_DOLLAR
       inTouch->dollarPath.length = 0;
       inTouch->dollarPath.p[0].x = x;
--- a/touchTest/gestureSDLTest.c	Fri Aug 13 17:05:06 2010 -0700
+++ b/touchTest/gestureSDLTest.c	Fri Aug 13 23:08:32 2010 -0400
@@ -26,83 +26,33 @@
 #endif
 #endif
 
-#define PI 3.1415926535897
-#define PHI ((sqrt(5)-1)/2)
 #define WIDTH 640
 #define HEIGHT 480
 #define BPP 4
 #define DEPTH 32
 
-#define MAXFINGERS 5
-
-#define DOLLARNPOINTS 64
-#define DOLLARSIZE 256
-
 //MUST BE A POWER OF 2!
 #define EVENT_BUF_SIZE 256
 
+
+#define VERBOSE SDL_FALSE
+
 SDL_Event events[EVENT_BUF_SIZE];
 int eventWrite;
 
-int mousx,mousy;
-int keystat[512];
-int bstatus;
-
 int colors[7] = {0xFF,0xFF00,0xFF0000,0xFFFF00,0x00FFFF,0xFF00FF,0xFFFFFF};
 
-SDL_FingerID index2fingerid[MAXFINGERS];
-int fingersDown;
-
 typedef struct {
   float x,y;
 } Point;
 
 typedef struct {
-  Point p;
-  float pressure;
-  SDL_FingerID id;
-} Finger;
-
-typedef struct {
-  Finger f;
-  Point cv;
-  float dtheta,dDist;
-} TouchPoint;
-
- 
-typedef struct { //dt + s
-  Point d,s; //direction, start
-  int points;
-} Line;
-
-
-typedef struct {
-  float length;
-  
-  int numPoints;
-  Point p[EVENT_BUF_SIZE]; //To be safe
-} DollarPath;
-
-typedef struct {
   float ang,r;
   Point p;
 } Knob;
 
 Knob knob;
 
-Finger finger[MAXFINGERS];
-
-
-DollarPath dollarPath[MAXFINGERS];
-
-#define MAXTEMPLATES 4
-
-Point dollarTemplate[MAXTEMPLATES][DOLLARNPOINTS];
-int numDollarTemplates = 0;
-#ifdef DRAW_VECTOR_EST
-Line gestureLine[MAXFINGERS];
-#endif
-
 void handler (int sig)
 {
   printf ("\exiting...(%d)\n", sig);
@@ -115,7 +65,6 @@
   handler (9);
 }
 
-
 void setpix(SDL_Surface *screen, int x, int y, unsigned int col)
 {
   Uint32 *pixmem32;
@@ -150,13 +99,10 @@
   for(t=0;t<1;t+=1.f/SDL_max(abs(x0-x1),abs(y0-y1)))
     setpix(screen,x1+t*(x0-x1),y1+t*(y0-y1),col);
 }
+
 void drawCircle(SDL_Surface* screen,int x,int y,int r,unsigned int c)
 {
-
-  float a;
-  int tx;
-  
-  int ty;
+  int tx,ty;
   float xr;
   for(ty = -abs(r);ty <= abs(r);ty++) {
     xr = sqrt(r*r - ty*ty);
@@ -173,50 +119,24 @@
 }
 
 void drawKnob(SDL_Surface* screen,Knob k) {
-  //printf("Knob: x = %f, y = %f, r = %f, a = %f\n",k.p.x,k.p.y,k.r,k.ang);
- 
-  drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF);
-  
+  drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF);  
   drawCircle(screen,(k.p.x+k.r/2*cos(k.ang))*screen->w,
   	            (k.p.y+k.r/2*sin(k.ang))*screen->h,k.r/4*screen->w,0);
-  
 }
 
-void DrawScreen(SDL_Surface* screen, int h)
+void DrawScreen(SDL_Surface* screen)
 {
-  int x, y, xm,ym,c;
+  int x, y;
   if(SDL_MUSTLOCK(screen))
     {                                              
       if(SDL_LockSurface(screen) < 0) return;
     }
-  for(y = 0; y < screen->h; y++ )
-    {
-      for( x = 0; x < screen->w; x++ )
-        {
-	  //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h);
-	  //xm = (x+h)%screen->w;
-	  //ym = (y+h)%screen->w;
-	  //c = sin(h/256*2*PI)*x*y/screen->w/screen->h;
-	  //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c);
-	  setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255);
-	  //setpix(screen,x,y,0); //Inefficient, but that's okay...
-        }
-    }
-  drawCircle(screen,mousx,mousy,-30,0xFFFFFF);
-  drawLine(screen,0,0,screen->w,screen->h,0xFFFFFF);
+  for(y = 0;y < screen->h;y++)
+    for(x = 0;x < screen->w;x++)
+	setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255);
 
   int i;
-//draw Touch History
-  TouchPoint gestureLast[MAXFINGERS];
-  //printf("------------------Start History------------------\n");
-  for(i = 0;i < MAXFINGERS;i++) {
-    gestureLast[i].f.id = -1;
-  }
-  int numDownFingers = 0;
-  Point centroid;
-  float gdtheta,gdDist;
-
-
+  //draw Touch History
   for(i = SDL_max(0,eventWrite - EVENT_BUF_SIZE);i < eventWrite;i++) {
     SDL_Event event = events[i&(EVENT_BUF_SIZE-1)];
     int age = eventWrite - i - 1;
@@ -224,13 +144,12 @@
        event.type == SDL_FINGERDOWN ||
        event.type == SDL_FINGERUP) {
       SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId);
-      //SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId);
-	    
+      if(inTouch == NULL) continue;
+
       float x = ((float)event.tfinger.x)/inTouch->xres;
       float y = ((float)event.tfinger.y)/inTouch->yres;      
       
-      //draw the touch:
-      
+      //draw the touch:      
       unsigned int c = colors[event.tfinger.touchId%7]; 
       unsigned int col = 
 	((unsigned int)(c*(.1+.85))) |
@@ -243,25 +162,10 @@
     }
   }
   
-  /*
-  for(i=0;i<MAXFINGERS;i++)
-    if(finger[i].p.x >= 0 && finger[i].p.y >= 0)
-      if(finger[i].pressure > 0)
-	drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h
-		   ,20,0xFF*finger[i].pressure);
-      else
-	drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h
-		   ,20,0xFF);
-  */
-
-  
-  keystat[32] = 0;
-  
   if(knob.p.x > 0)
     drawKnob(screen,knob);
   
   if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen);
-  
   SDL_Flip(screen);
 }
 
@@ -275,21 +179,15 @@
 {  
   SDL_Surface *screen;
   SDL_Event event;
-  
-  int keypress = 0;
-  int h=0,s=1,i,j;
 
   //gesture variables
-  int numDownFingers = 0;
-  float gdtheta = 0,gdDist = 0;
-  Point centroid;
   knob.r = .1;
   knob.ang = 0;
-  TouchPoint gestureLast[MAXFINGERS];
-  
 
+  
+  SDL_bool quitting = SDL_FALSE;
+  SDL_RWops *src;
 
-  memset(keystat,0,512*sizeof(keystat[0]));
   if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1;
   
   if (!(screen = initScreen(WIDTH,HEIGHT)))
@@ -298,8 +196,7 @@
       return 1;
     }
 
-  while(!keystat[27]) {
-    //Poll SDL
+  while(!quitting) {
     while(SDL_PollEvent(&event)) 
       {
 	//Record _all_ events
@@ -309,38 +206,28 @@
 	switch (event.type) 
 	  {
 	  case SDL_QUIT:
-	    keystat[27] = 1;
+	    quitting = SDL_TRUE;
 	    break;
 	  case SDL_KEYDOWN:
-	    //printf("%i\n",event.key.keysym.sym);
-	    keystat[event.key.keysym.sym] = 1;
-	    if(event.key.keysym.sym == 32) {
-	      SDL_RecordGesture(-1);
-	    }
-	    else if(event.key.keysym.sym == 115) {
-	      SDL_RWops *src;
-	      //fp = fopen("gestureSave","w");
-	      src = SDL_RWFromFile("gestureSave","w");
-	      
-	      printf("Wrote %i templates\n",SDL_SaveAllDollarTemplates(src));
-	      //fclose(fp);
-	      SDL_RWclose(src);
+	    switch (event.key.keysym.sym)
+	      {
+	      case SDLK_SPACE:
+		SDL_RecordGesture(-1);
+		break;
+	      case SDLK_s:
+		src = SDL_RWFromFile("gestureSave","w");
+		printf("Wrote %i templates\n",SDL_SaveAllDollarTemplates(src));
+		SDL_RWclose(src);
+		break;
+	      case SDLK_l:
+		src = SDL_RWFromFile("gestureSave","r");
+		printf("Loaded: %i\n",SDL_LoadDollarTemplates(-1,src));
+		SDL_RWclose(src);
+		break;
+	      case SDLK_ESCAPE:
+		quitting = SDL_TRUE;
+		break;
 	    }
-	    else if(event.key.keysym.sym == 108) {
-	      SDL_RWops *src;
-	      //fp = fopen("gestureSave","r");
-	      src = SDL_RWFromFile("gestureSave","r");
-	      printf("Loaded: %i\n",SDL_LoadDollarTemplates(-1,src));
-	      //fclose(fp);
-	      SDL_RWclose(src);
-	    }
-	    
-	    //keypress = 1;
-	    break;
-	  case SDL_KEYUP:
-	      //printf("%i\n",event.key.keysym.sym);
-	    keystat[event.key.keysym.sym] = 0;
-	    //keypress = 1;
 	    break;
 	  case SDL_VIDEORESIZE:
 	    if (!(screen = initScreen(event.resize.w,
@@ -350,78 +237,36 @@
 		return 1;
 	      }
 	    break;
-	  case SDL_MOUSEMOTION:
-	    mousx = event.motion.x;
-	    mousy = event.motion.y; 
-	    break;
-	  case SDL_MOUSEBUTTONDOWN:
-	    bstatus |=  (1<<(event.button.button-1));
-	    break;
-	  case SDL_MOUSEBUTTONUP:
-	    bstatus &= ~(1<<(event.button.button-1));
-	    break;
 	  case SDL_FINGERMOTION:    
 	    ;
-	    //printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId,
-	    //	   event.tfinger.x,event.tfinger.y);
+#if VERBOSE
+	    printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId,
+	    	   event.tfinger.x,event.tfinger.y);
+#endif
 	    SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId);
 	    SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId);
-	    /*
-	    for(i = 0;i<MAXFINGERS;i++) 
-	      if(index2fingerid[i] == event.tfinger.fingerId) 	      
-		break;
-	    if(i == MAXFINGERS) break;  
-	    if(inTouch > 0) {
-	      finger[i].p.x = ((float)event.tfinger.x)/
-		inTouch->xres;
-	      finger[i].p.y = ((float)event.tfinger.y)/
-		inTouch->yres;
-	      
-	      finger[i].pressure = 
-		((float)event.tfinger.pressure)/inTouch->pressureres;
-	    */
-	      /*
-	      printf("Finger: %i, Pressure: %f Pressureres: %i\n",
-		     event.tfinger.fingerId,
-		     finger[i].pressure,
-		     inTouch->pressureres);
-	      */
-	      //printf("Finger: %i, pressure: %f\n",event.tfinger.fingerId,
-	      //   finger[event.tfinger.fingerId].pressure);
-	    //}
-	    
 	    break;	    
 	  case SDL_FINGERDOWN:
-	    //printf("Finger: %"PRIs64" down - x: %i, y: %i\n",event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
-	    /*
-	    for(i = 0;i<MAXFINGERS;i++) 
-	      if(index2fingerid[i] == -1) {
-		index2fingerid[i] = event.tfinger.fingerId;
-		break;
-	      }
-	    finger[i].p.x = event.tfinger.x;
-	    finger[i].p.y = event.tfinger.y;
+#if VERBOSE
+	    printf("Finger: %"PRIs64" down - x: %i, y: %i\n",
+		   event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
+#endif
 	    break;
 	  case SDL_FINGERUP:
-	    //printf("Finger: %"PRIs64" up - x: %i, y: %i\n",event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
-	    for(i = 0;i<MAXFINGERS;i++) 
-	      if(index2fingerid[i] == event.tfinger.fingerId) {
-		index2fingerid[i] = -1;
-		break;
-	      }
-	    finger[i].p.x = -1;
-	    finger[i].p.y = -1;
-	    */
+#if VERBOSE
+	    printf("Finger: %"PRIs64" up - x: %i, y: %i\n",
+	    	   event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
+#endif
 	    break;
 	  case SDL_MULTIGESTURE:
-	    /*
+#if VERBOSE	    
 	    printf("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f\n",
 		   event.mgesture.x,
 		   event.mgesture.y,
 		   event.mgesture.dTheta,
 		   event.mgesture.dDist);
 	    printf("MG: numDownTouch = %i\n",event.mgesture.numFingers);
-	    */
+#endif
 	    knob.p.x = event.mgesture.x;
 	    knob.p.y = event.mgesture.y;
 	    knob.ang += event.mgesture.dTheta;
@@ -437,13 +282,9 @@
 	    break;
 	  }
       }
-    DrawScreen(screen,h);    
-    //for(i = 0; i < 256; i++) 
-    //  if(keystat[i]) 
-    //  printf("Key %i down\n",i);
+    DrawScreen(screen);
   }  
-  SDL_Quit();
-  
+  SDL_Quit();  
   return 0;
 }