From 342f30069f43b97373a36a802a8016f12f253e0d Mon Sep 17 00:00:00 2001 From: Struma Date: Sun, 3 Jul 2022 11:53:40 -0400 Subject: [PATCH] Add Mouse4, Mouse5 and scroll wheel bindings --- binding/input-binding.cpp | 12 +++++++++++- src/eventthread.cpp | 5 +++++ src/eventthread.h | 2 ++ src/input/input.cpp | 21 ++++++++++++++++++--- src/input/input.h | 4 +++- 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/binding/input-binding.cpp b/binding/input-binding.cpp index f60d8d28..33838a55 100644 --- a/binding/input-binding.cpp +++ b/binding/input-binding.cpp @@ -269,6 +269,12 @@ RB_METHOD(inputMouseY) { return rb_fix_new(shState->input().mouseY()); } +RB_METHOD(inputScrollV) { + RB_UNUSED_PARAM; + + return rb_fix_new(shState->input().scrollV()); +} + #define M_SYMBOL(x) ID2SYM(rb_intern(x)) #define POWERCASE(v, c) \ case SDL_JOYSTICK_POWER_##c: \ @@ -386,7 +392,10 @@ struct { {"MOUSELEFT", Input::MouseLeft}, {"MOUSEMIDDLE", Input::MouseMiddle}, - {"MOUSERIGHT", Input::MouseRight}}; + {"MOUSERIGHT", Input::MouseRight}, + {"MOUSEX1", Input::MouseX1}, + {"MOUSEX2", Input::MouseX2} +}; static elementsN(buttonCodes); @@ -412,6 +421,7 @@ void inputBindingInit() { _rb_define_module_function(module, "mouse_x", inputMouseX); _rb_define_module_function(module, "mouse_y", inputMouseY); + _rb_define_module_function(module, "scroll_v", inputScrollV); _rb_define_module_function(module, "joystick", inputJoystickInfo); diff --git a/src/eventthread.cpp b/src/eventthread.cpp index b9e19fdf..791d7a5d 100644 --- a/src/eventthread.cpp +++ b/src/eventthread.cpp @@ -86,6 +86,7 @@ uint8_t EventThread::keyStates[]; EventThread::JoyState EventThread::joyState; EventThread::MouseState EventThread::mouseState; EventThread::TouchState EventThread::touchState; +SDL_atomic_t EventThread::verticalScrollDistance; /* User event codes */ enum @@ -428,6 +429,10 @@ void EventThread::process(RGSSThreadData &rtData) updateCursorState(cursorInWindow, gameScreen); break; + case SDL_MOUSEWHEEL : + /* Only consider vertical scrolling for now */ + SDL_AtomicAdd(&verticalScrollDistance, event.wheel.y); + case SDL_FINGERDOWN : i = event.tfinger.fingerId; touchState.fingers[i].down = true; diff --git a/src/eventthread.h b/src/eventthread.h index 9bbb911f..251f455c 100644 --- a/src/eventthread.h +++ b/src/eventthread.h @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -75,6 +76,7 @@ public: static JoyState joyState; static MouseState mouseState; static TouchState touchState; + static SDL_atomic_t verticalScrollDistance; std::string textInputBuffer; void lockText(bool lock); diff --git a/src/input/input.cpp b/src/input/input.cpp index d12366db..ef9c8ef3 100644 --- a/src/input/input.cpp +++ b/src/input/input.cpp @@ -38,7 +38,7 @@ #include #include -#define BUTTON_CODE_COUNT 24 +#define BUTTON_CODE_COUNT 26 #define m(vk,sc) { vk, SDL_SCANCODE_##sc } std::unordered_map vKeyToScancode{ @@ -626,7 +626,7 @@ static const int mapToIndex[] = 0, 16, 17, 18, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, - 21, 22, 23 + 21, 22, 23, 24, 25 }; static elementsN(mapToIndex); @@ -691,6 +691,8 @@ struct InputPrivate unsigned int repeatDelay; unsigned long long last_update; + + int vScrollDistance; struct { @@ -746,6 +748,8 @@ struct InputPrivate dir4Data.previous = Input::None; dir8Data.active = 0; + + vScrollDistance = 0; } inline ButtonState &getStateCheck(int code) @@ -942,12 +946,14 @@ struct InputPrivate void initMsBindings() { - msBindings.resize(3); + msBindings.resize(5); size_t i = 0; msBindings[i++] = MsBinding(SDL_BUTTON_LEFT, Input::MouseLeft); msBindings[i++] = MsBinding(SDL_BUTTON_MIDDLE, Input::MouseMiddle); msBindings[i++] = MsBinding(SDL_BUTTON_RIGHT, Input::MouseRight); + msBindings[i++] = MsBinding(SDL_BUTTON_X1, Input::MouseX1); + msBindings[i++] = MsBinding(SDL_BUTTON_X2, Input::MouseX2); } void pollBindings(Input::ButtonCode &repeatCand) @@ -1173,6 +1179,10 @@ void Input::update() } p->repeating = None; + + /* Fetch new cumulative scroll distance and reset counter */ + p->vScrollDistance = SDL_AtomicSet(&EventThread::verticalScrollDistance, 0); + p->last_update = shState->runTime(); } @@ -1307,6 +1317,11 @@ int Input::mouseY() return (EventThread::mouseState.y - rtData.screenOffset.y) * rtData.sizeResoRatio.y; } +int Input::scrollV() + { + return p->vScrollDistance; + } + bool Input::getJoystickConnected() { return shState->eThread().getJoystickConnected(); diff --git a/src/input/input.h b/src/input/input.h index 2d78e804..ec549784 100644 --- a/src/input/input.h +++ b/src/input/input.h @@ -50,7 +50,8 @@ public: F5 = 25, F6 = 26, F7 = 27, F8 = 28, F9 = 29, /* Non-standard extensions */ - MouseLeft = 38, MouseMiddle = 39, MouseRight = 40 + MouseLeft = 38, MouseMiddle = 39, MouseRight = 40, + MouseX1 = 41, MouseX2 = 42 }; void recalcRepeat(unsigned int fps); @@ -79,6 +80,7 @@ public: /* Non-standard extensions */ int mouseX(); int mouseY(); + int scrollV(); bool getJoystickConnected(); const char *getJoystickName();