From 7ccfcf51e9dfbc2011e51ee6303fcbd778574b70 Mon Sep 17 00:00:00 2001 From: Andrii Danylchenko Date: Sat, 7 Jan 2023 10:15:32 +0200 Subject: [PATCH 1/3] Handle 2 fingers gesture as rclick via SDL --- client/gui/CGuiHandler.cpp | 72 ++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/client/gui/CGuiHandler.cpp b/client/gui/CGuiHandler.cpp index 410e9b8ae..3fcd3d1c0 100644 --- a/client/gui/CGuiHandler.cpp +++ b/client/gui/CGuiHandler.cpp @@ -206,6 +206,24 @@ void CGuiHandler::handleEvents() } } +bool multifinger = false; +int lastFingerCount; + +void convertTouch(SDL_Event * current) +{ + int rLogicalWidth, rLogicalHeight; + + SDL_RenderGetLogicalSize(mainRenderer, &rLogicalWidth, &rLogicalHeight); + + int adjustedMouseY = (int)(current->tfinger.y * rLogicalHeight); + int adjustedMouseX = (int)(current->tfinger.x * rLogicalWidth); + + current->button.x = adjustedMouseX; + current->motion.x = adjustedMouseX; + current->button.y = adjustedMouseY; + current->motion.y = adjustedMouseY; +} + void CGuiHandler::handleCurrentEvent() { if(current->type == SDL_KEYDOWN || current->type == SDL_KEYUP) @@ -338,22 +356,54 @@ void CGuiHandler::handleCurrentEvent() it->textEdited(current->edit); } } - //todo: muiltitouch else if(current->type == SDL_MOUSEBUTTONUP) { - switch(current->button.button) + if(multifinger && lastFingerCount >= 1) { - case SDL_BUTTON_LEFT: - handleMouseButtonClick(lclickable, EIntObjMouseBtnType::LEFT, false); - break; - case SDL_BUTTON_RIGHT: - handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, false); - break; - case SDL_BUTTON_MIDDLE: - handleMouseButtonClick(mclickable, EIntObjMouseBtnType::MIDDLE, false); - break; + multifinger = false; + } + else + { + switch(current->button.button) + { + case SDL_BUTTON_LEFT: + handleMouseButtonClick(lclickable, EIntObjMouseBtnType::LEFT, false); + break; + case SDL_BUTTON_RIGHT: + handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, false); + break; + case SDL_BUTTON_MIDDLE: + handleMouseButtonClick(mclickable, EIntObjMouseBtnType::MIDDLE, false); + break; + } } } + else if(current->type == SDL_FINGERDOWN) + { + lastFingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId); + + multifinger = lastFingerCount > 1; + + if(lastFingerCount == 2) + { + convertTouch(current); + handleMouseMotion(); + handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, true); + } + } + else if(current->type == SDL_FINGERUP) + { + lastFingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId); + + if(multifinger) + { + multifinger = false; + convertTouch(current); + handleMouseMotion(); + handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, false); + } + } + current = nullptr; } //event end From 2b1511df998d1bfa1398259af85028dc3e598217 Mon Sep 17 00:00:00 2001 From: Andrii Danylchenko Date: Mon, 16 Jan 2023 13:39:45 +0200 Subject: [PATCH 2/3] SDL fix 2 finger touch when you remove fingers instantly --- client/gui/CGuiHandler.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/client/gui/CGuiHandler.cpp b/client/gui/CGuiHandler.cpp index 3fcd3d1c0..16e92e2e9 100644 --- a/client/gui/CGuiHandler.cpp +++ b/client/gui/CGuiHandler.cpp @@ -358,11 +358,7 @@ void CGuiHandler::handleCurrentEvent() } else if(current->type == SDL_MOUSEBUTTONUP) { - if(multifinger && lastFingerCount >= 1) - { - multifinger = false; - } - else + if(!multifinger || lastFingerCount < 1) { switch(current->button.button) { From c24b89fe0647e81028b64a374caf9420f7e38bc7 Mon Sep 17 00:00:00 2001 From: Andrii Danylchenko Date: Tue, 17 Jan 2023 12:04:57 +0200 Subject: [PATCH 3/3] 2 finger rclick block adwmap scrolling and disable for iOS --- client/gui/CGuiHandler.cpp | 20 ++++++++++---------- client/gui/CGuiHandler.h | 1 + client/windows/CAdvmapInterface.cpp | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/client/gui/CGuiHandler.cpp b/client/gui/CGuiHandler.cpp index 16e92e2e9..926ee3e6e 100644 --- a/client/gui/CGuiHandler.cpp +++ b/client/gui/CGuiHandler.cpp @@ -206,9 +206,6 @@ void CGuiHandler::handleEvents() } } -bool multifinger = false; -int lastFingerCount; - void convertTouch(SDL_Event * current) { int rLogicalWidth, rLogicalHeight; @@ -358,7 +355,7 @@ void CGuiHandler::handleCurrentEvent() } else if(current->type == SDL_MOUSEBUTTONUP) { - if(!multifinger || lastFingerCount < 1) + if(!multifinger) { switch(current->button.button) { @@ -374,13 +371,14 @@ void CGuiHandler::handleCurrentEvent() } } } +#ifndef VCMI_IOS else if(current->type == SDL_FINGERDOWN) { - lastFingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId); + auto fingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId); - multifinger = lastFingerCount > 1; + multifinger = fingerCount > 1; - if(lastFingerCount == 2) + if(fingerCount == 2) { convertTouch(current); handleMouseMotion(); @@ -389,16 +387,17 @@ void CGuiHandler::handleCurrentEvent() } else if(current->type == SDL_FINGERUP) { - lastFingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId); + auto fingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId); if(multifinger) { - multifinger = false; convertTouch(current); handleMouseMotion(); handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, false); + multifinger = fingerCount != 0; } } +#endif //VCMI_IOS current = nullptr; } //event end @@ -527,7 +526,8 @@ void CGuiHandler::renderFrame() CGuiHandler::CGuiHandler() - : lastClick(-500, -500),lastClickTime(0), defActionsDef(0), captureChildren(false) + : lastClick(-500, -500),lastClickTime(0), defActionsDef(0), captureChildren(false), + multifinger(false) { continueEventHandling = true; curInt = nullptr; diff --git a/client/gui/CGuiHandler.h b/client/gui/CGuiHandler.h index 7f6373dfb..d9aa2068d 100644 --- a/client/gui/CGuiHandler.h +++ b/client/gui/CGuiHandler.h @@ -101,6 +101,7 @@ public: Point lastClick; unsigned lastClickTime; + bool multifinger; ui8 defActionsDef; //default auto actions bool captureChildren; //all newly created objects will get their parents from stack and will be added to parents children list diff --git a/client/windows/CAdvmapInterface.cpp b/client/windows/CAdvmapInterface.cpp index 99e676a36..0af40cc55 100644 --- a/client/windows/CAdvmapInterface.cpp +++ b/client/windows/CAdvmapInterface.cpp @@ -180,7 +180,7 @@ void CTerrainRect::mouseMoved(const SDL_MouseMotionEvent & sEvent) void CTerrainRect::handleSwipeMove(const SDL_MouseMotionEvent & sEvent) { #if defined(VCMI_ANDROID) || defined(VCMI_IOS) - if(sEvent.state == 0) // any "button" is enough on mobile + if(sEvent.state == 0 || GH.multifinger) // any "button" is enough on mobile #else if((sEvent.state & SDL_BUTTON_MMASK) == 0) // swipe only works with middle mouse on other platforms #endif