From 4c4a3d58294bc849390f4403a5387293856e33cf Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Fri, 18 Jun 2010 01:43:02 -0400 Subject: [PATCH] Fixed bugs in input, cleaned up $1 --- include/SDL_touch.h | 1 + src/events/SDL_touch.c | 177 ++++++++++++++++++---------------- src/video/x11/SDL_x11events.c | 16 +-- touchTest/gestureTest.c | 17 +--- 4 files changed, 106 insertions(+), 105 deletions(-) diff --git a/include/SDL_touch.h b/include/SDL_touch.h index a8bff29a7..ce50b4221 100644 --- a/include/SDL_touch.h +++ b/include/SDL_touch.h @@ -50,6 +50,7 @@ struct SDL_Finger { int xdelta; int ydelta; int last_x, last_y,last_pressure; /* the last reported coordinates */ + SDL_bool down; int pressure; }; diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 6d6204a2f..1511861d1 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -300,7 +300,7 @@ SDL_DelFinger(SDL_Touch* touch,int fingerid) SDL_free(finger); touch->num_fingers--; touch->fingers[index] = touch->fingers[touch->num_fingers]; - return 0; + return 0; } @@ -311,18 +311,24 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu 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 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu 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 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, 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) diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 85db7725f..ade0c6165 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -463,14 +463,16 @@ X11_PumpEvents(_THIS) 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; diff --git a/touchTest/gestureTest.c b/touchTest/gestureTest.c index 4fa66506a..5fb739a60 100644 --- a/touchTest/gestureTest.c +++ b/touchTest/gestureTest.c @@ -214,11 +214,12 @@ float dollarRecognize(SDL_Surface* screen, DollarPath path,int *bestTempl) { int i; int k; + /* for(k = 0;k= 0){ drawDollarPath(screen,dollarTemplate[bestTempl] - ,DOLLARNPOINTS,-15,0x0066FF);\ + ,DOLLARNPOINTS,-15,0x0066FF); printf("ERROR: %f\n",error); } @@ -475,8 +466,8 @@ void DrawScreen(SDL_Surface* screen, int h) 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;