From 36cee9aff877a098b1c712dd24d7886a8aa6fda9 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Fri, 3 Mar 2023 10:50:54 +0900 Subject: [PATCH] Treat touches outside the viewport as right-clicks The old method to simulate right click (two-finger touch) still works. --- src/sdlmain.cpp | 1 + src/sys/nact_input.cpp | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/sdlmain.cpp b/src/sdlmain.cpp index 1ae4498..052ba15 100644 --- a/src/sdlmain.cpp +++ b/src/sdlmain.cpp @@ -33,6 +33,7 @@ int main(int argc, char *argv[]) } SDL_Init(SDL_INIT_VIDEO); + SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0"); #ifdef __EMSCRIPTEN__ // Stop SDL from calling emscripten_sleep() in functions that are called // indirectly, which does not work with ASYNCIFY_IGNORE_INDIRECT=1. For diff --git a/src/sys/nact_input.cpp b/src/sys/nact_input.cpp index 43e6c9e..92890a9 100644 --- a/src/sys/nact_input.cpp +++ b/src/sys/nact_input.cpp @@ -13,8 +13,15 @@ #include "ags.h" #include "texthook.h" +enum TouchState { + TOUCH_NONE, + TOUCH_LBUTTON, + TOUCH_RBUTTON, +}; + extern SDL_Window* g_window; -static int mousex, mousey, fingers; +static int mousex, mousey; +static TouchState touch_state = TOUCH_NONE; void NACT::pump_events() { @@ -47,7 +54,25 @@ void NACT::pump_events() case SDL_FINGERMOTION: mousex = e.tfinger.x * 640; mousey = e.tfinger.y * ags->screen_height; - fingers = SDL_GetNumTouchFingers(e.tfinger.touchId); + switch (SDL_GetNumTouchFingers(e.tfinger.touchId)) { + case 0: + touch_state = TOUCH_NONE; + break; + case 1: + // A touch outside of the viewport (SDL clamps it to 0.0-1.0) is + // a right-click. + if (e.tfinger.x == 0.0f || e.tfinger.x == 1.0f || + e.tfinger.y == 0.0f || e.tfinger.y == 1.0f) { + touch_state = TOUCH_RBUTTON; + } else { + touch_state = TOUCH_LBUTTON; + } + break; + case 2: + // Two-finger touch is a right-click. + touch_state = TOUCH_RBUTTON; + break; + } break; case SDL_APP_DIDENTERFOREGROUND: @@ -67,19 +92,14 @@ uint8 NACT::get_key() // キーボード&マウス const Uint8* key = SDL_GetKeyboardState(NULL); - Uint32 mouse; - if (fingers) { - mouse = fingers == 1 ? SDL_BUTTON_LMASK : SDL_BUTTON_RMASK; - } else { - mouse = SDL_GetMouseState(NULL, NULL); - } + Uint32 mouse = SDL_GetMouseState(NULL, NULL); if(key[SDL_SCANCODE_UP ] || key[SDL_SCANCODE_KP_8 ] ) val |= 0x01; if(key[SDL_SCANCODE_DOWN ] || key[SDL_SCANCODE_KP_2 ] ) val |= 0x02; if(key[SDL_SCANCODE_LEFT ] || key[SDL_SCANCODE_KP_4 ] ) val |= 0x04; if(key[SDL_SCANCODE_RIGHT ] || key[SDL_SCANCODE_KP_6 ] ) val |= 0x08; - if(key[SDL_SCANCODE_RETURN] || mouse & SDL_BUTTON_LMASK) val |= 0x10; - if(key[SDL_SCANCODE_SPACE ] || mouse & SDL_BUTTON_RMASK) val |= 0x20; + if(key[SDL_SCANCODE_RETURN] || mouse & SDL_BUTTON_LMASK || touch_state == TOUCH_LBUTTON) val |= 0x10; + if(key[SDL_SCANCODE_SPACE ] || mouse & SDL_BUTTON_RMASK || touch_state == TOUCH_RBUTTON) val |= 0x20; if(key[SDL_SCANCODE_ESCAPE] ) val |= 0x40; if(key[SDL_SCANCODE_TAB ] ) val |= 0x80;