Skip to content

Commit

Permalink
PSP2: make touch mouse clicks longer so all games receive them
Browse files Browse the repository at this point in the history
Some games such as Gobliins or Dreamweb did not react to the
simulated touch mouse clicks because the clicks were too short.
This change ensures all games see the simulated clicks by
giving each click a minimum duration of 50 ms instead of being
as fast as possible.
  • Loading branch information
rsn8887 committed Mar 28, 2018
1 parent 2be2339 commit 880081a
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 7 deletions.
48 changes: 41 additions & 7 deletions backends/events/psp2sdl/psp2sdl-events.cpp
Expand Up @@ -44,6 +44,17 @@ PSP2EventSource::PSP2EventSource() {
}
_multiFingerDragging[port] = DRAG_NONE;
}

for (int port = 0; port < SCE_TOUCH_PORT_MAX_NUM; port++) {
for (int i = 0; i < 2; i++) {
_simulatedClickStartTime[port][i] = 0;
}
}
}

bool PSP2EventSource::pollEvent(Common::Event &event) {
finishSimulatedMouseClicks();
return SdlEventSource::pollEvent(event);
}

void PSP2EventSource::preprocessEvents(SDL_Event *event) {
Expand Down Expand Up @@ -148,8 +159,12 @@ void PSP2EventSource::preprocessFingerUp(SDL_Event *event) {
Uint8 simulatedButton = 0;
if (numFingersDown == 2) {
simulatedButton = SDL_BUTTON_RIGHT;
// need to raise the button later
_simulatedClickStartTime[port][1] = event->tfinger.timestamp;
} else if (numFingersDown == 1) {
simulatedButton = SDL_BUTTON_LEFT;
// need to raise the button later
_simulatedClickStartTime[port][0] = event->tfinger.timestamp;
if (port == 0 && !ConfMan.getBool("frontpanel_touchpad_mode")) {
convertTouchXYToGameXY(event->tfinger.x, event->tfinger.y, &x, &y);
}
Expand All @@ -159,13 +174,6 @@ void PSP2EventSource::preprocessFingerUp(SDL_Event *event) {
event->button.button = simulatedButton;
event->button.x = x;
event->button.y = y;

SDL_Event ev;
ev.type = SDL_MOUSEBUTTONUP;
ev.button.button = simulatedButton;
ev.button.x = x;
ev.button.y = y;
SDL_PushEvent(&ev);
}
}
}
Expand Down Expand Up @@ -424,4 +432,30 @@ void PSP2EventSource::convertTouchXYToGameXY(float touchX, float touchY, int *ga
*gameY = _km.y_max;
}
}

void PSP2EventSource::finishSimulatedMouseClicks() {
for (int port = 0; port < SCE_TOUCH_PORT_MAX_NUM; port++) {
for (int i = 0; i < 2; i++) {
if (_simulatedClickStartTime[port][i] != 0) {
Uint32 currentTime = SDL_GetTicks();
if (currentTime - _simulatedClickStartTime[port][i] >= SIMULATED_CLICK_DURATION) {
int simulatedButton;
if (i == 0) {
simulatedButton = SDL_BUTTON_LEFT;
} else {
simulatedButton = SDL_BUTTON_RIGHT;
}
SDL_Event ev;
ev.type = SDL_MOUSEBUTTONUP;
ev.button.button = simulatedButton;
ev.button.x = _km.x / MULTIPLIER;
ev.button.y = _km.y / MULTIPLIER;
SDL_PushEvent(&ev);

_simulatedClickStartTime[port][i] = 0;
}
}
}
}
}
#endif
5 changes: 5 additions & 0 deletions backends/events/psp2sdl/psp2sdl-events.h
Expand Up @@ -32,6 +32,7 @@
class PSP2EventSource : public SdlEventSource {
public:
PSP2EventSource();
bool pollEvent(Common::Event &event) override;
protected:
void preprocessEvents(SDL_Event *event) override;
private:
Expand All @@ -40,6 +41,7 @@ class PSP2EventSource : public SdlEventSource {
MAX_NUM_FINGERS = 3, // number of fingers to track per panel
MAX_TAP_TIME = 250, // taps longer than this will not result in mouse click events
MAX_TAP_MOTION_DISTANCE = 10, // max distance finger motion in Vita screen pixels to be considered a tap
SIMULATED_CLICK_DURATION = 50, // time in ms how long simulated mouse clicks should be
}; // track three fingers per panel

typedef struct {
Expand All @@ -61,10 +63,13 @@ class PSP2EventSource : public SdlEventSource {

DraggingType _multiFingerDragging[SCE_TOUCH_PORT_MAX_NUM]; // keep track whether we are currently drag-and-dropping

unsigned int _simulatedClickStartTime[SCE_TOUCH_PORT_MAX_NUM][2]; // initiation time of last simulated left or right click (zero if no click)

void preprocessFingerDown(SDL_Event *event);
void preprocessFingerUp(SDL_Event *event);
void preprocessFingerMotion(SDL_Event *event);
void convertTouchXYToGameXY(float touchX, float touchY, int *gameX, int *gameY);
void finishSimulatedMouseClicks(void);
};

#endif /* BACKEND_EVENTS_PSP2_H */

0 comments on commit 880081a

Please sign in to comment.