Fixed bugs in input, cleaned up $1
authorJim Grandpre <jim.tla@gmail.com>
Fri, 18 Jun 2010 01:43:02 -0400
changeset 4655 4c94f2023d62
parent 4654 7dbcd71216df
child 4656 b5007b7995c6
Fixed bugs in input, cleaned up $1
include/SDL_touch.h
src/events/SDL_touch.c
src/video/x11/SDL_x11events.c
touchTest/gestureTest.c
--- a/include/SDL_touch.h	Thu Jun 17 03:41:27 2010 -0400
+++ b/include/SDL_touch.h	Fri Jun 18 01:43:02 2010 -0400
@@ -50,6 +50,7 @@
   int xdelta;
   int ydelta;
   int last_x, last_y,last_pressure;  /* the last reported coordinates */
+  SDL_bool down;
   int pressure;
 };
 
--- a/src/events/SDL_touch.c	Thu Jun 17 03:41:27 2010 -0400
+++ b/src/events/SDL_touch.c	Fri Jun 18 01:43:02 2010 -0400
@@ -300,7 +300,7 @@
     SDL_free(finger);
     touch->num_fingers--;
     touch->fingers[index] = touch->fingers[touch->num_fingers];
-	return 0;
+    return 0;
 }
 
 
@@ -311,18 +311,24 @@
     SDL_Touch* touch = SDL_GetTouch(id);
 
     if(down) {
-	SDL_Finger nf;
-	nf.id = fingerid;
-	nf.x = x;
-	nf.y = y;
-	nf.pressure = pressure;
-	nf.xdelta = 0;
-	nf.ydelta = 0;
-	nf.last_x = x;
-	nf.last_y = y;
-	nf.last_pressure = pressure;
-	SDL_AddFinger(touch,&nf);
-	//if(x < 0 || y < 0) return 0; //should defer if only a partial input
+	SDL_Finger *finger = SDL_GetFinger(touch,fingerid);
+	if(finger == NULL) {
+	    SDL_Finger nf;
+	    nf.id = fingerid;
+	    nf.x = x;
+	    nf.y = y;
+	    nf.pressure = pressure;
+	    nf.xdelta = 0;
+	    nf.ydelta = 0;
+	    nf.last_x = x;
+	    nf.last_y = y;
+	    nf.last_pressure = pressure;
+	    nf.down = SDL_FALSE;
+	    SDL_AddFinger(touch,&nf);
+	    finger = &nf;
+	}
+	else if(finger->down) return 0;
+	if(x < 0 || y < 0) return 0; //should defer if only a partial input
 	posted = 0;
 	if (SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) {
 	    SDL_Event event;
@@ -335,10 +341,11 @@
 	    event.tfinger.fingerId = fingerid;
 	    posted = (SDL_PushEvent(&event) > 0);
 	}
+	if(posted) finger->down = SDL_TRUE;
 	return posted;
     }
     else {
-	SDL_DelFinger(touch,fingerid);
+	if(SDL_DelFinger(touch,fingerid) < 0) return 0;
 	posted = 0;
 	if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {
 	    SDL_Event event;
@@ -364,84 +371,84 @@
     int xrel;
     int yrel;
     int x_max = 0, y_max = 0;
-	
+    
     if (!touch || touch->flush_motion) {
-		return 0;
+	return 0;
     }
     
-    if(finger == NULL) {
-		return SDL_SendFingerDown(id,fingerid,SDL_TRUE,x,y,pressure);	
+    if(finger == NULL || !finger->down) {
+	return SDL_SendFingerDown(id,fingerid,SDL_TRUE,x,y,pressure);	
     } else {
-		/* the relative motion is calculated regarding the last position */
-		if (relative) {
-			xrel = x;
-			yrel = y;
-			x = (finger->last_x + x);
-			y = (finger->last_y + y);
-		} else {
-			if(x < 0) x = finger->last_x; /*If movement is only in one axis,*/
-			if(y < 0) y = finger->last_y; /*The other is marked as -1*/
-			if(pressure < 0) pressure = finger->last_pressure;
-			xrel = x - finger->last_x;
-			yrel = y - finger->last_y;
-		}
-		
-		/* Drop events that don't change state */
-		if (!xrel && !yrel) {
+	/* the relative motion is calculated regarding the last position */
+	if (relative) {
+	    xrel = x;
+	    yrel = y;
+	    x = (finger->last_x + x);
+	    y = (finger->last_y + y);
+	} else {
+	    if(x < 0) x = finger->last_x; /*If movement is only in one axis,*/
+	    if(y < 0) y = finger->last_y; /*The other is marked as -1*/
+	    if(pressure < 0) pressure = finger->last_pressure;
+	    xrel = x - finger->last_x;
+	    yrel = y - finger->last_y;
+	}
+	
+	/* Drop events that don't change state */
+	if (!xrel && !yrel) {
 #if 0
-			printf("Touch event didn't change state - dropped!\n");
+	    printf("Touch event didn't change state - dropped!\n");
 #endif
-			return 0;
-		}
-		
-		/* Update internal touch coordinates */
-		
-		finger->x = x;
-		finger->y = y;
-		
-		/*Should scale to window? Normalize? Maintain Aspect?*/
-		//SDL_GetWindowSize(touch->focus, &x_max, &y_max);
-		
-		/* make sure that the pointers find themselves inside the windows */
-		/* only check if touch->xmax is set ! */
-		/*
-		  if (x_max && touch->x > x_max) {
-		  touch->x = x_max;
-		  } else if (touch->x < 0) {
-		  touch->x = 0;
-		  }
-		  
-		  if (y_max && touch->y > y_max) {
-		  touch->y = y_max;
-		  } else if (touch->y < 0) {
-		  touch->y = 0;
-		  }
-		*/
-		finger->xdelta = xrel;
-		finger->ydelta = yrel;
-		finger->pressure = pressure;
-		
-		
-		
-		/* Post the event, if desired */
-		posted = 0;
-		if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) {
-			SDL_Event event;
-			event.tfinger.type = SDL_FINGERMOTION;
-			event.tfinger.touchId = (Uint8) id;
-			event.tfinger.fingerId = (Uint8) fingerid;
-			event.tfinger.x = x;
-			event.tfinger.y = y;
-			event.tfinger.pressure = pressure;
-			event.tfinger.state = touch->buttonstate;
-			event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
-			posted = (SDL_PushEvent(&event) > 0);
-		}
-		finger->last_x = finger->x;
-		finger->last_y = finger->y;
-		finger->last_pressure = finger->pressure;
-		return posted;
+	    return 0;
 	}
+	
+	/* Update internal touch coordinates */
+	
+	finger->x = x;
+	finger->y = y;
+	
+	/*Should scale to window? Normalize? Maintain Aspect?*/
+	//SDL_GetWindowSize(touch->focus, &x_max, &y_max);
+	
+	/* make sure that the pointers find themselves inside the windows */
+	/* only check if touch->xmax is set ! */
+	/*
+	  if (x_max && touch->x > x_max) {
+	  touch->x = x_max;
+	  } else if (touch->x < 0) {
+	  touch->x = 0;
+	  }
+	  
+	  if (y_max && touch->y > y_max) {
+	  touch->y = y_max;
+	  } else if (touch->y < 0) {
+	  touch->y = 0;
+	  }
+	*/
+	finger->xdelta = xrel;
+	finger->ydelta = yrel;
+	finger->pressure = pressure;
+	
+	
+	
+	/* Post the event, if desired */
+	posted = 0;
+	if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) {
+	    SDL_Event event;
+	    event.tfinger.type = SDL_FINGERMOTION;
+	    event.tfinger.touchId = (Uint8) id;
+	    event.tfinger.fingerId = (Uint8) fingerid;
+	    event.tfinger.x = x;
+	    event.tfinger.y = y;
+	    event.tfinger.pressure = pressure;
+	    event.tfinger.state = touch->buttonstate;
+	    event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
+	    posted = (SDL_PushEvent(&event) > 0);
+	}
+	finger->last_x = finger->x;
+	finger->last_y = finger->y;
+	finger->last_pressure = finger->pressure;
+	return posted;
+    }
 }
 int
 SDL_SendTouchButton(int id, Uint8 state, Uint8 button)
--- a/src/video/x11/SDL_x11events.c	Thu Jun 17 03:41:27 2010 -0400
+++ b/src/video/x11/SDL_x11events.c	Fri Jun 18 01:43:02 2010 -0400
@@ -463,14 +463,16 @@
 		    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,
+		  if(data->up) {
+		      SDL_SendFingerDown(touch->id,data->finger,
+			  	       SDL_FALSE,data->x,data->y,
+				       data->pressure);
+		  }
+		  else if(data->x >= 0 || data->y >= 0)
+		      SDL_SendTouchMotion(touch->id,data->finger, 
+					SDL_FALSE,data->x,data->y,
 					    data->pressure);
-		    if(data->up) 
-			SDL_SendFingerDown(touch->id,data->finger,
-					   SDL_FALSE,data->x,data->y,
-					   data->pressure);
+		  
 		    //printf("Synched: %i tx: %i, ty: %i\n",
 		    //	   data->finger,data->x,data->y);
 		    data->x = -1;
--- a/touchTest/gestureTest.c	Thu Jun 17 03:41:27 2010 -0400
+++ b/touchTest/gestureTest.c	Fri Jun 18 01:43:02 2010 -0400
@@ -214,11 +214,12 @@
   int i;
   
   int k;
+  /*
   for(k = 0;k<DOLLARNPOINTS;k++) {
     printf("(%f,%f)\n",points[k].x,
 	   points[k].y);
   }
-
+  */
   drawDollarPath(screen,points,numPoints,-15,0xFF6600);
 
   int bestDiff = 10000;
@@ -367,23 +368,13 @@
 
 	    gestureLine[j].points = 0;
 #endif
-	    //ignore last point - probably invalid
-	    dollarPath[j].numPoints--;
-	    
-	    
-	    float dx = dollarPath[j].p[dollarPath[j].numPoints].x - 
-	      dollarPath[j].p[dollarPath[j].numPoints - 1].x;
-	    float dy = dollarPath[j].p[dollarPath[j].numPoints].y - 
-	      dollarPath[j].p[dollarPath[j].numPoints - 1].y;
-	    dollarPath[j].length -= sqrt(dx*dx+dy*dy);
 
 	    if(!keystat[32]){ //spacebar
 	      int bestTempl;
 	      float error = dollarRecognize(screen,dollarPath[j],&bestTempl);
-	      printf("%i\n",bestTempl);
 	      if(bestTempl >= 0){
 		drawDollarPath(screen,dollarTemplate[bestTempl]
-			       ,DOLLARNPOINTS,-15,0x0066FF);\
+			       ,DOLLARNPOINTS,-15,0x0066FF);
 		
 		printf("ERROR: %f\n",error);
 	      }
@@ -475,8 +466,8 @@
       if(gestureLast[j].id < 0) continue; //Finger up. Or some error...
       int k;
       for(k = 0; k < MAXFINGERS;k++) {
-
 	if(gestureLast[k].id < 0) continue;
+	//printf("k = %i, id: %i\n",k,gestureLast[k].id);
 	//colors have no alpha, so shouldn't overflow
 	unsigned int c = (colors[gestureLast[j].id%7] + 
 			  colors[gestureLast[k].id%7])/2;