diff --git a/backends/events/switchsdl/switchsdl-events.cpp b/backends/events/switchsdl/switchsdl-events.cpp index d75031f5816e5..7ecd72a435f1b 100644 --- a/backends/events/switchsdl/switchsdl-events.cpp +++ b/backends/events/switchsdl/switchsdl-events.cpp @@ -36,22 +36,19 @@ #include "common/config-manager.h" SwitchEventSource::SwitchEventSource() { - for (int port = 0; port < SCE_TOUCH_PORT_MAX_NUM; port++) { - for (int i = 0; i < MAX_NUM_FINGERS; i++) { - _finger[port][i].id = -1; - _finger[port][i].timeLastDown = 0; - _finger[port][i].lastX = 0; - _finger[port][i].lastY = 0; - _finger[port][i].lastDownX = 0; - _finger[port][i].lastDownY = 0; - } - _multiFingerDragging[port] = DRAG_NONE; + for (int i = 0; i < MAX_NUM_FINGERS; i++) { + _finger[i].id = -1; + _finger[i].timeLastDown = 0; + _finger[i].lastX = 0; + _finger[i].lastY = 0; + _finger[i].lastDownX = 0; + _finger[i].lastDownY = 0; + } + _multiFingerDragging = DRAG_NONE; } - for (int port = 0; port < SCE_TOUCH_PORT_MAX_NUM; port++) { - for (int i = 0; i < 2; i++) { - _simulatedClickStartTime[port][i] = 0; - } + for (int i = 0; i < 2; i++) { + _simulatedClickStartTime[i] = 0; } } @@ -68,50 +65,41 @@ void SwitchEventSource::preprocessEvents(SDL_Event *event) { // right mouse click: second finger short tap while first finger is still down // pointer motion: single finger drag if (event->type == SDL_FINGERDOWN || event->type == SDL_FINGERUP || event->type == SDL_FINGERMOTION) { - // front (0) or back (1) panel - SDL_TouchID port = event->tfinger.touchId; - //debug(0, "touch: %li\n", port); - if (port < SCE_TOUCH_PORT_MAX_NUM && port >= 0) { - // touchpad_mouse_mode off: use only front panel for direct touch control of pointer - // touchpad_mouse_mode on: also enable rear touch with indirect touch control - // where the finger can be somewhere else than the pointer and still move it - if (port == 0 || ConfMan.getBool("touchpad_mouse_mode")) { - switch (event->type) { - case SDL_FINGERDOWN: - //debug(0, "down[%li]: %i %i", event->tfinger.fingerId, (int) event->tfinger.x, (int) event->tfinger.y); - preprocessFingerDown(event); - break; - case SDL_FINGERUP: - //debug(0, "up[%li]: %i %i", event->tfinger.fingerId, (int) event->tfinger.x, (int) event->tfinger.y); - preprocessFingerUp(event); - break; - case SDL_FINGERMOTION: - //debug(0, "mov[%li]: %i %i", event->tfinger.fingerId, (int) event->tfinger.x, (int) event->tfinger.y); - preprocessFingerMotion(event); - break; - } - } + // touchpad_mouse_mode off: use direct touch control of pointer + // touchpad_mouse_mode on: use indirect touch control + // where the finger can be somewhere else than the pointer and still move it + switch (event->type) { + case SDL_FINGERDOWN: + //debug(0, "down[%li]: %i %i", event->tfinger.fingerId, (int) event->tfinger.x, (int) event->tfinger.y); + preprocessFingerDown(event); + break; + case SDL_FINGERUP: + //debug(0, "up[%li]: %i %i", event->tfinger.fingerId, (int) event->tfinger.x, (int) event->tfinger.y); + preprocessFingerUp(event); + break; + case SDL_FINGERMOTION: + //debug(0, "mov[%li]: %i %i", event->tfinger.fingerId, (int) event->tfinger.x, (int) event->tfinger.y); + preprocessFingerMotion(event); + break; } } } void SwitchEventSource::preprocessFingerDown(SDL_Event *event) { - // front (0) or back (1) panel - SDL_TouchID port = event->tfinger.touchId; // id (for multitouch) SDL_FingerID id = event->tfinger.fingerId; int x = _mouseX; int y = _mouseY; - if (port == 0 && !ConfMan.getBool("touchpad_mouse_mode")) { + if (!ConfMan.getBool("touchpad_mouse_mode")) { convertTouchXYToGameXY(event->tfinger.x, event->tfinger.y, &x, &y); } // make sure each finger is not reported down multiple times for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id == id) { - _finger[port][i].id = -1; + if (_finger[i].id == id) { + _finger[i].id = -1; } } @@ -119,28 +107,26 @@ void SwitchEventSource::preprocessFingerDown(SDL_Event *event) { // or a long tap (drag) // we also need the last coordinates for each finger to keep track of dragging for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id == -1) { - _finger[port][i].id = id; - _finger[port][i].timeLastDown = event->tfinger.timestamp; - _finger[port][i].lastDownX = event->tfinger.x; - _finger[port][i].lastDownY = event->tfinger.y; - _finger[port][i].lastX = x; - _finger[port][i].lastY = y; + if (_finger[i].id == -1) { + _finger[i].id = id; + _finger[i].timeLastDown = event->tfinger.timestamp; + _finger[i].lastDownX = event->tfinger.x; + _finger[i].lastDownY = event->tfinger.y; + _finger[i].lastX = x; + _finger[i].lastY = y; break; } } } void SwitchEventSource::preprocessFingerUp(SDL_Event *event) { - // front (0) or back (1) panel - SDL_TouchID port = event->tfinger.touchId; // id (for multitouch) SDL_FingerID id = event->tfinger.fingerId; // find out how many fingers were down before this event int numFingersDown = 0; for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id >= 0) { + if (_finger[i].id >= 0) { numFingersDown++; } } @@ -149,14 +135,14 @@ void SwitchEventSource::preprocessFingerUp(SDL_Event *event) { int y = _mouseY; for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id == id) { - _finger[port][i].id = -1; - if (!_multiFingerDragging[port]) { - if ((event->tfinger.timestamp - _finger[port][i].timeLastDown) <= MAX_TAP_TIME) { + if (_finger[i].id == id) { + _finger[i].id = -1; + if (!_multiFingerDragging) { + if ((event->tfinger.timestamp - _finger[i].timeLastDown) <= MAX_TAP_TIME) { // short (tfinger.x * (float) TOUCHSCREEN_WIDTH) - (_finger[port][i].lastDownX * (float) TOUCHSCREEN_WIDTH)); - float yrel = ((event->tfinger.y * (float) TOUCHSCREEN_HEIGHT) - (_finger[port][i].lastDownY * (float) TOUCHSCREEN_HEIGHT)); + float xrel = ((event->tfinger.x * (float) TOUCHSCREEN_WIDTH) - (_finger[i].lastDownX * (float) TOUCHSCREEN_WIDTH)); + float yrel = ((event->tfinger.y * (float) TOUCHSCREEN_HEIGHT) - (_finger[i].lastDownY * (float) TOUCHSCREEN_HEIGHT)); float maxRSquared = (float) (MAX_TAP_MOTION_DISTANCE * MAX_TAP_MOTION_DISTANCE); if ((xrel * xrel + yrel * yrel) < maxRSquared) { if (numFingersDown == 2 || numFingersDown == 1) { @@ -164,12 +150,12 @@ void SwitchEventSource::preprocessFingerUp(SDL_Event *event) { if (numFingersDown == 2) { simulatedButton = SDL_BUTTON_RIGHT; // need to raise the button later - _simulatedClickStartTime[port][1] = event->tfinger.timestamp; + _simulatedClickStartTime[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("touchpad_mouse_mode")) { + _simulatedClickStartTime[0] = event->tfinger.timestamp; + if (!ConfMan.getBool("touchpad_mouse_mode")) { convertTouchXYToGameXY(event->tfinger.x, event->tfinger.y, &x, &y); } } @@ -183,11 +169,11 @@ void SwitchEventSource::preprocessFingerUp(SDL_Event *event) { } } else if (numFingersDown == 1) { // when dragging, and the last finger is lifted, the drag is over - if (port == 0 && !ConfMan.getBool("touchpad_mouse_mode")) { + if (!ConfMan.getBool("touchpad_mouse_mode")) { convertTouchXYToGameXY(event->tfinger.x, event->tfinger.y, &x, &y); } uint8 simulatedButton = 0; - if (_multiFingerDragging[port] == DRAG_THREE_FINGER) + if (_multiFingerDragging == DRAG_THREE_FINGER) simulatedButton = SDL_BUTTON_RIGHT; else { simulatedButton = SDL_BUTTON_LEFT; @@ -196,22 +182,20 @@ void SwitchEventSource::preprocessFingerUp(SDL_Event *event) { event->button.button = simulatedButton; event->button.x = x; event->button.y = y; - _multiFingerDragging[port] = DRAG_NONE; + _multiFingerDragging = DRAG_NONE; } } } } void SwitchEventSource::preprocessFingerMotion(SDL_Event *event) { - // front (0) or back (1) panel - SDL_TouchID port = event->tfinger.touchId; // id (for multitouch) SDL_FingerID id = event->tfinger.fingerId; // find out how many fingers were down before this event int numFingersDown = 0; for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id >= 0) { + if (_finger[i].id >= 0) { numFingersDown++; } } @@ -222,7 +206,7 @@ void SwitchEventSource::preprocessFingerMotion(SDL_Event *event) { int xMax = _graphicsManager->getWindowWidth() - 1; int yMax = _graphicsManager->getWindowHeight() - 1; - if (port == 0 && !ConfMan.getBool("touchpad_mouse_mode")) { + if (!ConfMan.getBool("touchpad_mouse_mode")) { convertTouchXYToGameXY(event->tfinger.x, event->tfinger.y, &x, &y); } else { // for relative mode, use the pointer speed setting @@ -270,39 +254,39 @@ void SwitchEventSource::preprocessFingerMotion(SDL_Event *event) { // update the current finger's coordinates so we can track it later for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id == id) { - _finger[port][i].lastX = x; - _finger[port][i].lastY = y; + if (_finger[i].id == id) { + _finger[i].lastX = x; + _finger[i].lastY = y; } } // If we are starting a multi-finger drag, start holding down the mouse button if (numFingersDown >= 2) { - if (!_multiFingerDragging[port]) { + if (!_multiFingerDragging) { // only start a multi-finger drag if at least two fingers have been down long enough int numFingersDownLong = 0; for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id >= 0) { - if (event->tfinger.timestamp - _finger[port][i].timeLastDown > MAX_TAP_TIME) { + if (_finger[i].id >= 0) { + if (event->tfinger.timestamp - _finger[i].timeLastDown > MAX_TAP_TIME) { numFingersDownLong++; } } } if (numFingersDownLong >= 2) { - // starting drag, so push mouse down at current location (back) - // or location of "oldest" finger (front) + // starting drag, so push mouse down at current location + // or location of "oldest" finger depending on mode int mouseDownX = _mouseX; int mouseDownY = _mouseY; - if (port == 0 && !ConfMan.getBool("touchpad_mouse_mode")) { + if (!ConfMan.getBool("touchpad_mouse_mode")) { for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id == id) { - uint32 earliestTime = _finger[port][i].timeLastDown; + if (_finger[i].id == id) { + uint32 earliestTime = _finger[i].timeLastDown; for (int j = 0; j < MAX_NUM_FINGERS; j++) { - if (_finger[port][j].id >= 0 && (i != j) ) { - if (_finger[port][j].timeLastDown < earliestTime) { - mouseDownX = _finger[port][j].lastX; - mouseDownY = _finger[port][j].lastY; - earliestTime = _finger[port][j].timeLastDown; + if (_finger[j].id >= 0 && (i != j) ) { + if (_finger[j].timeLastDown < earliestTime) { + mouseDownX = _finger[j].lastX; + mouseDownY = _finger[j].lastY; + earliestTime = _finger[j].timeLastDown; } } } @@ -313,10 +297,10 @@ void SwitchEventSource::preprocessFingerMotion(SDL_Event *event) { uint8 simulatedButton = 0; if (numFingersDownLong == 2) { simulatedButton = SDL_BUTTON_LEFT; - _multiFingerDragging[port] = DRAG_TWO_FINGER; + _multiFingerDragging = DRAG_TWO_FINGER; } else { simulatedButton = SDL_BUTTON_RIGHT; - _multiFingerDragging[port] = DRAG_THREE_FINGER; + _multiFingerDragging = DRAG_THREE_FINGER; } SDL_Event ev; ev.type = SDL_MOUSEBUTTONDOWN; @@ -332,10 +316,10 @@ void SwitchEventSource::preprocessFingerMotion(SDL_Event *event) { bool updatePointer = true; if (numFingersDown > 1) { for (int i = 0; i < MAX_NUM_FINGERS; i++) { - if (_finger[port][i].id == id) { + if (_finger[i].id == id) { for (int j = 0; j < MAX_NUM_FINGERS; j++) { - if (_finger[port][j].id >= 0 && (i != j) ) { - if (_finger[port][j].timeLastDown < _finger[port][i].timeLastDown) { + if (_finger[j].id >= 0 && (i != j) ) { + if (_finger[j].timeLastDown < _finger[i].timeLastDown) { updatePointer = false; } } @@ -380,26 +364,24 @@ void SwitchEventSource::convertTouchXYToGameXY(float touchX, float touchY, int * } void SwitchEventSource::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 = _mouseX; - ev.button.y = _mouseY; - SDL_PushEvent(&ev); - - _simulatedClickStartTime[port][i] = 0; + for (int i = 0; i < 2; i++) { + if (_simulatedClickStartTime[i] != 0) { + uint32 currentTime = SDL_GetTicks(); + if (currentTime - _simulatedClickStartTime[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 = _mouseX; + ev.button.y = _mouseY; + SDL_PushEvent(&ev); + + _simulatedClickStartTime[i] = 0; } } } diff --git a/backends/events/switchsdl/switchsdl-events.h b/backends/events/switchsdl/switchsdl-events.h index b6b82149ea0b7..9f3f77bf24f4f 100644 --- a/backends/events/switchsdl/switchsdl-events.h +++ b/backends/events/switchsdl/switchsdl-events.h @@ -24,7 +24,6 @@ #include "backends/events/sdl/sdl-events.h" -#define SCE_TOUCH_PORT_MAX_NUM 1 #define TOUCHSCREEN_WIDTH 1280 #define TOUCHSCREEN_HEIGHT 720 @@ -56,7 +55,7 @@ class SwitchEventSource : public SdlEventSource { float lastDownY; // SDL touch coordinates when last pressed down } Touch; - Touch _finger[SCE_TOUCH_PORT_MAX_NUM][MAX_NUM_FINGERS]; // keep track of finger status + Touch _finger[MAX_NUM_FINGERS]; // keep track of finger status typedef enum DraggingType { DRAG_NONE = 0, @@ -64,9 +63,9 @@ class SwitchEventSource : public SdlEventSource { DRAG_THREE_FINGER, } DraggingType; - DraggingType _multiFingerDragging[SCE_TOUCH_PORT_MAX_NUM]; // keep track whether we are currently drag-and-dropping + DraggingType _multiFingerDragging; // 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) + unsigned int _simulatedClickStartTime[2]; // initiation time of last simulated left or right click (zero if no click) void preprocessFingerDown(SDL_Event *event); void preprocessFingerUp(SDL_Event *event);