--- 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;