From dfdd2555a2816af800c2e999bf45de9d8bd884a8 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 7 Oct 2013 23:21:38 +0300 Subject: emulate right click with SDL2 by multitouch two fingers click. --- src/CMakeLists.txt | 2 + src/Makefile.am | 2 + src/gui/sdlinput.cpp | 16 ++++++++ src/gui/sdlinput.h | 3 ++ src/input/inputmanager.cpp | 10 ++++- src/input/multitouchmanager.cpp | 89 +++++++++++++++++++++++++++++++++++++++++ src/input/multitouchmanager.h | 69 ++++++++++++++++++++++++++++++++ 7 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 src/input/multitouchmanager.cpp create mode 100644 src/input/multitouchmanager.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1d2662d79..a45793802 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -662,6 +662,8 @@ SET(SRCS input/keyevent.h input/keyinput.cpp input/keyinput.h + input/multitouchmanager.cpp + input/multitouchmanager.h localconsts.h being/localplayer.cpp being/localplayer.h diff --git a/src/Makefile.am b/src/Makefile.am index 8f90991ae..f032777d7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -675,6 +675,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ input/keyevent.h \ input/keyinput.cpp \ input/keyinput.h \ + input/multitouchmanager.cpp \ + input/multitouchmanager.h \ localconsts.h \ being/localplayer.cpp \ being/localplayer.h \ diff --git a/src/gui/sdlinput.cpp b/src/gui/sdlinput.cpp index c869cd99b..3dcbd4caa 100644 --- a/src/gui/sdlinput.cpp +++ b/src/gui/sdlinput.cpp @@ -529,3 +529,19 @@ int SDLInput::convertKeyCharacter(const SDL_Event &event) } return value; } + +void SDLInput::simulateMouseClick(const int x, const int y, + const unsigned int button) +{ + MouseInput mouseInput; + mouseInput.setX(x); + mouseInput.setY(y); + mouseInput.setReal(x, y); + mouseInput.setButton(button); + mouseInput.setType(gcn::MouseInput::PRESSED); + mouseInput.setTimeStamp(SDL_GetTicks()); + mMouseInputQueue.push(mouseInput); + mouseInput.setType(gcn::MouseInput::RELEASED); + mouseInput.setTimeStamp(SDL_GetTicks()); + mMouseInputQueue.push(mouseInput); +} diff --git a/src/gui/sdlinput.h b/src/gui/sdlinput.h index 29f24784f..77e8ea8db 100644 --- a/src/gui/sdlinput.h +++ b/src/gui/sdlinput.h @@ -170,6 +170,9 @@ public: MouseInput dequeueMouseInput2() A_WARN_UNUSED; + void simulateMouseClick(const int x, const int y, + const unsigned int button); + protected: /** * Converts a mouse button from SDL to a Guichan mouse button diff --git a/src/input/inputmanager.cpp b/src/input/inputmanager.cpp index af6759b0f..e395aad8e 100644 --- a/src/input/inputmanager.cpp +++ b/src/input/inputmanager.cpp @@ -30,6 +30,7 @@ #include "input/joystick.h" #include "input/keyboardconfig.h" #include "input/keyboarddata.h" +#include "input/multitouchmanager.h" #include "gui/gui.h" #include "gui/sdlinput.h" @@ -565,8 +566,15 @@ bool InputManager::handleEvent(const SDL_Event &event) // joystick.handleDeActicateButton(event); break; } +#ifdef USE_SDL2 + case SDL_FINGERDOWN: + multiTouchManager.handleFingerDown(event); + break; + case SDL_FINGERUP: + multiTouchManager.handleFingerUp(event); + break; +#else #ifdef ANDROID -#ifndef USE_SDL2 case SDL_ACCELEROMETER: { break; diff --git a/src/input/multitouchmanager.cpp b/src/input/multitouchmanager.cpp new file mode 100644 index 000000000..82ccb0b3c --- /dev/null +++ b/src/input/multitouchmanager.cpp @@ -0,0 +1,89 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "input/multitouchmanager.h" + +#ifdef USE_SDL2 +#include "render/graphics.h" + +#include "gui/gui.h" +#include "gui/sdlinput.h" +#endif +#include "debug.h" + +MultiTouchManager multiTouchManager; + + +MultiTouchManager::MultiTouchManager() +{ +} + +MultiTouchManager::~MultiTouchManager() +{ +} + +void MultiTouchManager::init() +{ +} + +#ifdef USE_SDL2 +void MultiTouchManager::updateFinger(const SDL_Event &event, const bool active) +{ + const SDL_TouchFingerEvent &touch = event.tfinger; + MultiTouchEventsMap &device = mEvents[touch.touchId]; + MultiTouchEvent &finger = device[touch.fingerId]; + finger.active = active; + finger.x = touch.x; + finger.y = touch.y; +} + +void MultiTouchManager::handleFingerDown(const SDL_Event &event) +{ + updateFinger(event, true); + const SDL_TouchFingerEvent &touch = event.tfinger; + checkDevice(touch.touchId, touch.fingerId); +} + +void MultiTouchManager::handleFingerUp(const SDL_Event &event) +{ + updateFinger(event, false); +} + +void MultiTouchManager::checkDevice(const int touchId, + const int fingerId) +{ + if (fingerId != 1 || !guiInput) + return; + + MultiTouchEventsMap &device = mEvents[touchId]; + MultiTouchEvent &finger0 = device[0]; + if (finger0.active) + { + MultiTouchEvent &finger1 = device[1]; + if (finger1.active) + { + const int w = mainGraphics->mWidth; + const int h = mainGraphics->mHeight; + guiInput->simulateMouseClick(finger1.x * w, finger1.y * h, + gcn::MouseInput::RIGHT); + } + } +} +#endif diff --git a/src/input/multitouchmanager.h b/src/input/multitouchmanager.h new file mode 100644 index 000000000..ca4328459 --- /dev/null +++ b/src/input/multitouchmanager.h @@ -0,0 +1,69 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef INPUT_MULTITOUCHMANAGER_H +#define INPUT_MULTITOUCHMANAGER_H + +#include + +#include + +#include "localconsts.h" + +struct MultiTouchEvent +{ + bool active; + float x; + float y; +}; + +typedef std::map MultiTouchEventsMap; +typedef std::map MultiTouchDevicesMap; + +class MultiTouchManager final +{ + public: + MultiTouchManager(); + + ~MultiTouchManager(); + + A_DELETE_COPY(MultiTouchManager) + + void init(); + +#ifdef USE_SDL2 + void updateFinger(const SDL_Event &event, const bool active); + + void handleFingerDown(const SDL_Event &event); + + void handleFingerUp(const SDL_Event &event); + + void checkDevice(const int touchId, + const int fingerId); +#endif + + private: + MultiTouchDevicesMap mEvents; +}; + +extern MultiTouchManager multiTouchManager; + +#endif // INPUT_MULTITOUCHMANAGER_H + -- cgit v1.2.3-70-g09d2