From d04e0e44bb64845660b777c19fc662ccdd9291d1 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Tue, 31 Dec 2019 06:29:02 +0100 Subject: [PATCH] Implement scroll wheel navigation up/down/left/right = arrow keys ctrl+up/down = zoom automap in/out --- SourceS/sdl_compat.h | 4 ++++ SourceX/DiabloUI/diabloui.cpp | 9 +++++++++ SourceX/miniwin/misc_msg.cpp | 14 ++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/SourceS/sdl_compat.h b/SourceS/sdl_compat.h index 71cc42a9c..fcccebb43 100644 --- a/SourceS/sdl_compat.h +++ b/SourceS/sdl_compat.h @@ -3,6 +3,8 @@ #include #ifndef USE_SDL1 +#define SDLC_KEYSTATE_LEFTCTRL SDL_SCANCODE_LCTRL +#define SDLC_KEYSTATE_RIGHTCTRL SDL_SCANCODE_RCTRL #define SDLC_KEYSTATE_LEFTSHIFT SDL_SCANCODE_LSHIFT #define SDLC_KEYSTATE_RIGHTSHIFT SDL_SCANCODE_RSHIFT #define SDLC_KEYSTATE_MENU SDL_SCANCODE_MENU @@ -11,6 +13,8 @@ #define SDLC_KEYSTATE_LEFT SDL_SCANCODE_LEFT #define SDLC_KEYSTATE_RIGHT SDL_SCANCODE_RIGHT #else +#define SDLC_KEYSTATE_LEFTCTRL SDLK_LCTRL +#define SDLC_KEYSTATE_RIGHTCTRL SDLK_RCTRL #define SDLC_KEYSTATE_LEFTSHIFT SDLK_LSHIFT #define SDLC_KEYSTATE_RIGHTSHIFT SDLK_LSHIFT #define SDLC_KEYSTATE_MENU SDLK_MENU diff --git a/SourceX/DiabloUI/diabloui.cpp b/SourceX/DiabloUI/diabloui.cpp index 9089553cc..cc544b2e0 100644 --- a/SourceX/DiabloUI/diabloui.cpp +++ b/SourceX/DiabloUI/diabloui.cpp @@ -240,6 +240,15 @@ void UiFocusNavigation(SDL_Event *event) break; } + if (event->type == SDL_MOUSEWHEEL) { + if (event->wheel.y > 0) { + UiFocus(SelectedItem - 1, UiItemsWraps); + } else if (event->wheel.y < 0) { + UiFocus(SelectedItem + 1, UiItemsWraps); + } + return; + } + if (SDL_IsTextInputActive()) { switch (event->type) { case SDL_KEYDOWN: { diff --git a/SourceX/miniwin/misc_msg.cpp b/SourceX/miniwin/misc_msg.cpp index 390e75dab..fb2a868f1 100644 --- a/SourceX/miniwin/misc_msg.cpp +++ b/SourceX/miniwin/misc_msg.cpp @@ -549,6 +549,18 @@ WINBOOL PeekMessageA(LPMSG lpMsg) } } break; #ifndef USE_SDL1 + case SDL_MOUSEWHEEL: + lpMsg->message = DVL_WM_KEYDOWN; + if (e.wheel.y > 0) { + lpMsg->wParam = GetAsyncKeyState(DVL_VK_CONTROL) ? DVL_VK_OEM_PLUS : DVL_VK_UP; + } else if (e.wheel.y < 0) { + lpMsg->wParam = GetAsyncKeyState(DVL_VK_CONTROL) ? DVL_VK_OEM_MINUS : DVL_VK_DOWN; + } else if (e.wheel.x > 0) { + lpMsg->wParam = DVL_VK_LEFT; + } else if (e.wheel.x < 0) { + lpMsg->wParam = DVL_VK_RIGHT; + } + break; #if SDL_VERSION_ATLEAST(2, 0, 4) case SDL_AUDIODEVICEADDED: return false_avail("SDL_AUDIODEVICEADDED", e.adevice.which); @@ -696,6 +708,8 @@ SHORT GetAsyncKeyState(int vKey) return SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_RIGHT); const Uint8 *state = SDLC_GetKeyState(); switch (vKey) { + case DVL_VK_CONTROL: + return state[SDLC_KEYSTATE_LEFTCTRL] || state[SDLC_KEYSTATE_RIGHTCTRL] ? 0x8000 : 0; case DVL_VK_SHIFT: return state[SDLC_KEYSTATE_LEFTSHIFT] || state[SDLC_KEYSTATE_RIGHTSHIFT] ? 0x8000 : 0; case DVL_VK_MENU: