src/events/SDL_touch.c
changeset 4676 99b4560b7aa1
parent 4674 89d5e2201b00
child 4678 f8431f66613d
equal deleted inserted replaced
4675:641c13b0ce5f 4676:99b4560b7aa1
    40 {
    40 {
    41   return (0);
    41   return (0);
    42 }
    42 }
    43 
    43 
    44 SDL_Touch *
    44 SDL_Touch *
    45 SDL_GetTouch(int id)
    45 SDL_GetTouch(long id)
    46 {
    46 {
    47     int index = SDL_GetTouchIndexId(id);
    47     int index = SDL_GetTouchIndexId(id);
    48     if (index < 0 || index >= SDL_num_touch) {
    48     if (index < 0 || index >= SDL_num_touch) {
    49         return NULL;
    49         return NULL;
    50     }
    50     }
    59     }
    59     }
    60     return SDL_touchPads[index];
    60     return SDL_touchPads[index];
    61 }
    61 }
    62 
    62 
    63 int
    63 int
    64 SDL_GetFingerIndexId(SDL_Touch* touch,int fingerid)
    64 SDL_GetFingerIndexId(SDL_Touch* touch,long fingerid)
    65 {
    65 {
    66     int i;
    66     int i;
    67     for(i = 0;i < touch->num_fingers;i++)
    67     for(i = 0;i < touch->num_fingers;i++)
    68 	if(touch->fingers[i]->id == fingerid)
    68 	if(touch->fingers[i]->id == fingerid)
    69 	    return i;
    69 	    return i;
    70     return -1;
    70     return -1;
    71 }
    71 }
    72 
    72 
    73 
    73 
    74 SDL_Finger *
    74 SDL_Finger *
    75 SDL_GetFinger(SDL_Touch* touch,int id)
    75 SDL_GetFinger(SDL_Touch* touch,long id)
    76 {
    76 {
    77     int index = SDL_GetFingerIndexId(touch,id);
    77     int index = SDL_GetFingerIndexId(touch,id);
    78     if(index < 0 || index >= touch->num_fingers)
    78     if(index < 0 || index >= touch->num_fingers)
    79 	return NULL;
    79 	return NULL;
    80     return touch->fingers[index];
    80     return touch->fingers[index];
    81 }
    81 }
    82 
    82 
    83 
    83 
    84 int
    84 int
    85 SDL_GetTouchIndexId(int id)
    85 SDL_GetTouchIndexId(long id)
    86 {
    86 {
    87     int index;
    87     int index;
    88     SDL_Touch *touch;
    88     SDL_Touch *touch;
    89 
    89 
    90     for (index = 0; index < SDL_num_touch; ++index) {
    90     for (index = 0; index < SDL_num_touch; ++index) {
   144 
   144 
   145     return index;
   145     return index;
   146 }
   146 }
   147 
   147 
   148 void
   148 void
   149 SDL_DelTouch(int id)
   149 SDL_DelTouch(long id)
   150 {
   150 {
   151     int index = SDL_GetTouchIndexId(id);
   151     int index = SDL_GetTouchIndexId(id);
   152     SDL_Touch *touch = SDL_GetTouch(id);
   152     SDL_Touch *touch = SDL_GetTouch(id);
   153 
   153 
   154     if (!touch) {
   154     if (!touch) {
   187 SDL_GetNumTouch(void)
   187 SDL_GetNumTouch(void)
   188 {
   188 {
   189     return SDL_num_touch;
   189     return SDL_num_touch;
   190 }
   190 }
   191 SDL_Window *
   191 SDL_Window *
   192 SDL_GetTouchFocusWindow(int id)
   192 SDL_GetTouchFocusWindow(long id)
   193 {
   193 {
   194     SDL_Touch *touch = SDL_GetTouch(id);
   194     SDL_Touch *touch = SDL_GetTouch(id);
   195 
   195 
   196     if (!touch) {
   196     if (!touch) {
   197         return 0;
   197         return 0;
   198     }
   198     }
   199     return touch->focus;
   199     return touch->focus;
   200 }
   200 }
   201 
   201 
   202 void
   202 void
   203 SDL_SetTouchFocus(int id, SDL_Window * window)
   203 SDL_SetTouchFocus(long id, SDL_Window * window)
   204 {
   204 {
   205     int index = SDL_GetTouchIndexId(id);
   205     int index = SDL_GetTouchIndexId(id);
   206     SDL_Touch *touch = SDL_GetTouch(id);
   206     SDL_Touch *touch = SDL_GetTouch(id);
   207     int i;
   207     int i;
   208     SDL_bool focus;
   208     SDL_bool focus;
   248         }
   248         }
   249     }
   249     }
   250 }
   250 }
   251 
   251 
   252 int 
   252 int 
   253 SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger)
   253 SDL_AddFinger(SDL_Touch* touch,SDL_Finger finger)
   254 {
   254 {
   255     int index;
   255     int index;
   256     SDL_Finger **fingers;
   256     SDL_Finger **fingers;
   257     //printf("Adding Finger...\n");
   257     //printf("Adding Finger...\n");
   258     if (SDL_GetFingerIndexId(touch,finger->id) != -1) {
   258     if (SDL_GetFingerIndexId(touch,finger.id) != -1) {
   259         SDL_SetError("Finger ID already in use");
   259         SDL_SetError("Finger ID already in use");
   260 	}
   260 	}
   261 
   261 
   262     /* Add the touch to the list of touch */
   262     /* Add the touch to the list of touch */
   263     if(touch->num_fingers  >= touch->max_fingers){
   263     if(touch->num_fingers  >= touch->max_fingers){
   280     touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(SDL_Finger));
   280     touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(SDL_Finger));
   281     if (!touch->fingers[index]) {
   281     if (!touch->fingers[index]) {
   282         SDL_OutOfMemory();
   282         SDL_OutOfMemory();
   283         return -1;
   283         return -1;
   284     }
   284     }
   285     *(touch->fingers[index]) = *finger;
   285     *(touch->fingers[index]) = finger;
   286     touch->num_fingers++;
   286     touch->num_fingers++;
   287 
   287 
   288     return index;
   288     return index;
   289 }
   289 }
   290 
   290 
   291 int
   291 int
   292 SDL_DelFinger(SDL_Touch* touch,int fingerid)
   292 SDL_DelFinger(SDL_Touch* touch,long fingerid)
   293 {
   293 {
   294     int index = SDL_GetFingerIndexId(touch,fingerid);
   294     int index = SDL_GetFingerIndexId(touch,fingerid);
   295     SDL_Finger* finger = SDL_GetFinger(touch,fingerid);
   295     SDL_Finger* finger = SDL_GetFinger(touch,fingerid);
   296 
   296 
   297     if (!finger) {
   297     if (!finger) {
   305     return 0;
   305     return 0;
   306 }
   306 }
   307 
   307 
   308 
   308 
   309 int
   309 int
   310 SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressure)
   310 SDL_SendFingerDown(long id, long fingerid, SDL_bool down, float x, float y, float pressure)
   311 {
   311 {
   312     int posted;
   312     int posted;
   313     SDL_Touch* touch = SDL_GetTouch(id);
   313     SDL_Touch* touch = SDL_GetTouch(id);
   314 
   314 
   315     if(!touch) {
   315     if(!touch) {
   328 	    nf.ydelta = 0;
   328 	    nf.ydelta = 0;
   329 	    nf.last_x = x;
   329 	    nf.last_x = x;
   330 	    nf.last_y = y;
   330 	    nf.last_y = y;
   331 	    nf.last_pressure = pressure;
   331 	    nf.last_pressure = pressure;
   332 	    nf.down = SDL_FALSE;
   332 	    nf.down = SDL_FALSE;
   333 	    SDL_AddFinger(touch,&nf);
   333 	    SDL_AddFinger(touch,nf);
   334 	    finger = &nf;
   334 	    finger = &nf;
   335 	}
   335 	}
   336 	else if(finger->down) return 0;
   336 	else if(finger->down) return 0;
   337 	if(x < 0 || y < 0) return 0; //should defer if only a partial input
   337 	if(x < 0 || y < 0) return 0; //should defer if only a partial input
   338 	posted = 0;
   338 	posted = 0;
   339 	if (SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) {
   339 	if (SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) {
   340 	    SDL_Event event;
   340 	    SDL_Event event;
   341 	    event.tfinger.type = SDL_FINGERDOWN;
   341 	    event.tfinger.type = SDL_FINGERDOWN;
   342 	    event.tfinger.touchId = (Uint8) id;
   342 	    event.tfinger.touchId = id;
   343 	    event.tfinger.x = x;
   343 	    event.tfinger.x = x;
   344 	    event.tfinger.y = y;
   344 	    event.tfinger.y = y;
   345 	    event.tfinger.state = touch->buttonstate;
   345 	    event.tfinger.state = touch->buttonstate;
   346 	    event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
   346 	    event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
   347 	    event.tfinger.fingerId = fingerid;
   347 	    event.tfinger.fingerId = fingerid;
   354 	if(SDL_DelFinger(touch,fingerid) < 0) return 0;
   354 	if(SDL_DelFinger(touch,fingerid) < 0) return 0;
   355 	posted = 0;
   355 	posted = 0;
   356 	if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {
   356 	if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) {
   357 	    SDL_Event event;
   357 	    SDL_Event event;
   358 	    event.tfinger.type = SDL_FINGERUP;
   358 	    event.tfinger.type = SDL_FINGERUP;
   359 	    event.tfinger.touchId = (Uint8) id;
   359 	    event.tfinger.touchId =  id;
   360 	    event.tfinger.state = touch->buttonstate;
   360 	    event.tfinger.state = touch->buttonstate;
   361 	    event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
   361 	    event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
   362 	    event.tfinger.fingerId = fingerid;
   362 	    event.tfinger.fingerId = fingerid;
   363 	    posted = (SDL_PushEvent(&event) > 0);
   363 	    posted = (SDL_PushEvent(&event) > 0);
   364 	}
   364 	}
   365 	return posted;
   365 	return posted;
   366     }
   366     }
   367 }
   367 }
   368 
   368 
   369 int
   369 int
   370 SDL_SendTouchMotion(int id, int fingerid, int relative, 
   370 SDL_SendTouchMotion(long id, long fingerid, int relative, 
   371 		    int x, int y, int pressure)
   371 		    float x, float y, float pressure)
   372 {
   372 {
   373     int index = SDL_GetTouchIndexId(id);
   373     int index = SDL_GetTouchIndexId(id);
   374     SDL_Touch *touch = SDL_GetTouch(id);
   374     SDL_Touch *touch = SDL_GetTouch(id);
   375     SDL_Finger *finger = SDL_GetFinger(touch,fingerid);
   375     SDL_Finger *finger = SDL_GetFinger(touch,fingerid);
   376     int posted;
   376     int posted;
   377     int xrel;
   377     float xrel;
   378     int yrel;
   378     float yrel;
   379     int x_max = 0, y_max = 0;
   379     float x_max = 0, y_max = 0;
   380     
   380     
   381     if (!touch) {
   381     if (!touch) {
   382       return SDL_TouchNotFoundError(id);
   382       return SDL_TouchNotFoundError(id);
   383     }
   383     }
   384     if(touch->flush_motion) {
   384     if(touch->flush_motion) {
   442 	/* Post the event, if desired */
   442 	/* Post the event, if desired */
   443 	posted = 0;
   443 	posted = 0;
   444 	if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) {
   444 	if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) {
   445 	    SDL_Event event;
   445 	    SDL_Event event;
   446 	    event.tfinger.type = SDL_FINGERMOTION;
   446 	    event.tfinger.type = SDL_FINGERMOTION;
   447 	    event.tfinger.touchId = (Uint8) id;
   447 	    event.tfinger.touchId = id;
   448 	    event.tfinger.fingerId = (Uint8) fingerid;
   448 	    event.tfinger.fingerId = fingerid;
   449 	    event.tfinger.x = x;
   449 	    event.tfinger.x = x;
   450 	    event.tfinger.y = y;
   450 	    event.tfinger.y = y;
   451 	    event.tfinger.pressure = pressure;
   451 	    event.tfinger.pressure = pressure;
   452 	    event.tfinger.state = touch->buttonstate;
   452 	    event.tfinger.state = touch->buttonstate;
   453 	    event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
   453 	    event.tfinger.windowID = touch->focus ? touch->focus->id : 0;
   458 	finger->last_pressure = finger->pressure;
   458 	finger->last_pressure = finger->pressure;
   459 	return posted;
   459 	return posted;
   460     }
   460     }
   461 }
   461 }
   462 int
   462 int
   463 SDL_SendTouchButton(int id, Uint8 state, Uint8 button)
   463 SDL_SendTouchButton(long id, Uint8 state, Uint8 button)
   464 {
   464 {
   465     SDL_Touch *touch = SDL_GetTouch(id);
   465     SDL_Touch *touch = SDL_GetTouch(id);
   466     int posted;
   466     int posted;
   467     Uint32 type;
   467     Uint32 type;
   468 
   468 
   497     /* Post the event, if desired */
   497     /* Post the event, if desired */
   498     posted = 0;
   498     posted = 0;
   499     if (SDL_GetEventState(type) == SDL_ENABLE) {
   499     if (SDL_GetEventState(type) == SDL_ENABLE) {
   500         SDL_Event event;
   500         SDL_Event event;
   501         event.type = type;
   501         event.type = type;
   502         event.tbutton.touchId = (Uint8) touch->id;
   502         event.tbutton.touchId = touch->id;
   503         event.tbutton.state = state;
   503         event.tbutton.state = state;
   504         event.tbutton.button = button;
   504         event.tbutton.button = button;
   505         event.tbutton.windowID = touch->focus ? touch->focus->id : 0;
   505         event.tbutton.windowID = touch->focus ? touch->focus->id : 0;
   506         posted = (SDL_PushEvent(&event) > 0);
   506         posted = (SDL_PushEvent(&event) > 0);
   507     }
   507     }
   508     return posted;
   508     return posted;
   509 }
   509 }
   510 
   510 
   511 char *
   511 char *
   512 SDL_GetTouchName(int id)
   512 SDL_GetTouchName(long id)
   513 {
   513 {
   514     SDL_Touch *touch = SDL_GetTouch(id);
   514     SDL_Touch *touch = SDL_GetTouch(id);
   515     if (!touch) {
   515     if (!touch) {
   516         return NULL;
   516         return NULL;
   517     }
   517     }
   518     return touch->name;
   518     return touch->name;
   519 }
   519 }
   520 
   520 
   521 int SDL_TouchNotFoundError(int id) {
   521 int SDL_TouchNotFoundError(long id) {
   522   printf("ERROR: Cannot send touch on non-existent device with id: %i make sure SDL_AddTouch has been called\n",id);
   522   printf("ERROR: Cannot send touch on non-existent device with id: %li make sure SDL_AddTouch has been called\n",id);
   523   printf("ERROR: There are %i touches installed with Id's:\n",SDL_num_touch);
   523   printf("ERROR: There are %i touches installed with Id's:\n",SDL_num_touch);
   524   int i;
   524   int i;
   525   for(i=0;i < SDL_num_touch;i++) {
   525   for(i=0;i < SDL_num_touch;i++) {
   526     printf("ERROR: %i\n",SDL_touchPads[i]->id);
   526     printf("ERROR: %li\n",SDL_touchPads[i]->id);
   527   }
   527   }
   528   return 0;
   528   return 0;
   529 }
   529 }
   530 /* vi: set ts=4 sw=4 expandtab: */
   530 /* vi: set ts=4 sw=4 expandtab: */