Skip to content

Commit

Permalink
Fixed bug 3583 - X11 touch device can be permanently lost
Browse files Browse the repository at this point in the history
Volumetric

In X11 the SDL error "Unknown touch device" can occur after which the application stops recognizing touch events. For a kiosk-type application this results in a hang as far as the user is concerned. This is reproducible on HP Z220/Z230/Z240 workstations by swapping USB cables for a while and it also occurs with no physical changes, probably due to USB device power management. A workaround is to make SDL re-enumerate the touch devices like it does at startup. A patch is attached.
  • Loading branch information
slouken committed Feb 11, 2017
1 parent 06ccb71 commit cf31ea1
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/events/SDL_touch.c
Expand Up @@ -25,6 +25,7 @@
#include "SDL_assert.h"
#include "SDL_events.h"
#include "SDL_events_c.h"
#include "../video/SDL_sysvideo.h"


static int SDL_num_touch = 0;
Expand All @@ -48,7 +49,7 @@ SDL_TouchID
SDL_GetTouchDevice(int index)
{
if (index < 0 || index >= SDL_num_touch) {
SDL_SetError("Unknown touch device");
SDL_SetError("Unknown touch device index %d", index);
return 0;
}
return SDL_touchDevices[index]->id;
Expand All @@ -74,7 +75,12 @@ SDL_GetTouch(SDL_TouchID id)
{
int index = SDL_GetTouchIndex(id);
if (index < 0 || index >= SDL_num_touch) {
SDL_SetError("Unknown touch device");
if (SDL_GetVideoDevice()->ResetTouch != NULL) {
SDL_SetError("Unknown touch id %d, resetting", (int) id);
(SDL_GetVideoDevice()->ResetTouch)(SDL_GetVideoDevice());
} else {
SDL_SetError("Unknown touch device id %d, cannot reset", (int) id);
}
return NULL;
}
return SDL_touchDevices[index];
Expand Down
5 changes: 5 additions & 0 deletions src/video/SDL_sysvideo.h
Expand Up @@ -163,6 +163,11 @@ struct SDL_VideoDevice
*/
void (*VideoQuit) (_THIS);

/*
* Reinitialize the touch devices -- called if an unknown touch ID occurs.
*/
void (*ResetTouch) (_THIS);

/* * * */
/*
* Display functions
Expand Down
7 changes: 7 additions & 0 deletions src/video/x11/SDL_x11touch.c
Expand Up @@ -42,6 +42,13 @@ X11_QuitTouch(_THIS)
SDL_TouchQuit();
}

void
X11_ResetTouch(_THIS)
{
X11_QuitTouch(_this);
X11_InitTouch(_this);
}

#endif /* SDL_VIDEO_DRIVER_X11 */

/* vi: set ts=4 sw=4 expandtab: */
1 change: 1 addition & 0 deletions src/video/x11/SDL_x11touch.h
Expand Up @@ -25,6 +25,7 @@

extern void X11_InitTouch(_THIS);
extern void X11_QuitTouch(_THIS);
extern void X11_ResetTouch(_THIS);

#endif /* SDL_x11touch_h_ */

Expand Down
1 change: 1 addition & 0 deletions src/video/x11/SDL_x11video.c
Expand Up @@ -216,6 +216,7 @@ X11_CreateDevice(int devindex)
/* Set the function pointers */
device->VideoInit = X11_VideoInit;
device->VideoQuit = X11_VideoQuit;
device->ResetTouch = X11_ResetTouch;
device->GetDisplayModes = X11_GetDisplayModes;
device->GetDisplayBounds = X11_GetDisplayBounds;
device->GetDisplayUsableBounds = X11_GetDisplayUsableBounds;
Expand Down

0 comments on commit cf31ea1

Please sign in to comment.