1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

SDL: Send events for X1 and X2 mouse buttons (#16025)

This commit is contained in:
y5nw 2025-04-20 20:20:33 +02:00 committed by GitHub
parent bf15036831
commit c1d2124102
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -766,12 +766,7 @@ bool CIrrDeviceSDL::run()
SDL_Keymod keymod = SDL_GetModState(); SDL_Keymod keymod = SDL_GetModState();
irrevent.EventType = irr::EET_MOUSE_INPUT_EVENT; irrevent.EventType = irr::EET_MOUSE_INPUT_EVENT;
irrevent.MouseInput.X = static_cast<s32>(SDL_event.button.x * ScaleX); irrevent.MouseInput.Event = irr::EMIE_MOUSE_MOVED; // value to be ignored
irrevent.MouseInput.Y = static_cast<s32>(SDL_event.button.y * ScaleY);
irrevent.MouseInput.Shift = (keymod & KMOD_SHIFT) != 0;
irrevent.MouseInput.Control = (keymod & KMOD_CTRL) != 0;
irrevent.MouseInput.Event = irr::EMIE_MOUSE_MOVED;
#ifdef _IRR_EMSCRIPTEN_PLATFORM_ #ifdef _IRR_EMSCRIPTEN_PLATFORM_
// Handle mouselocking in emscripten in Windowed mode. // Handle mouselocking in emscripten in Windowed mode.
@ -834,11 +829,29 @@ bool CIrrDeviceSDL::run()
MouseButtonStates &= ~irr::EMBSM_MIDDLE; MouseButtonStates &= ~irr::EMBSM_MIDDLE;
} }
break; break;
// Since Irrlicht does not have event types for X1/X2 buttons, we simply pass
// those as keycodes instead. This is relatively hacky but avoids the effort of
// adding more mouse events that will be discarded anyway once we switch to SDL
case SDL_BUTTON_X1:
irrevent.EventType = irr::EET_KEY_INPUT_EVENT;
irrevent.KeyInput.Key = irr::KEY_XBUTTON1;
break;
case SDL_BUTTON_X2:
irrevent.EventType = irr::EET_KEY_INPUT_EVENT;
irrevent.KeyInput.Key = irr::KEY_XBUTTON2;
break;
} }
bool shift = (keymod & KMOD_SHIFT) != 0;
bool control = (keymod & KMOD_CTRL) != 0;
if (irrevent.EventType == irr::EET_MOUSE_INPUT_EVENT && irrevent.MouseInput.Event != irr::EMIE_MOUSE_MOVED) {
irrevent.MouseInput.ButtonStates = MouseButtonStates; irrevent.MouseInput.ButtonStates = MouseButtonStates;
irrevent.MouseInput.X = static_cast<s32>(SDL_event.button.x * ScaleX);
if (irrevent.MouseInput.Event != irr::EMIE_MOUSE_MOVED) { irrevent.MouseInput.Y = static_cast<s32>(SDL_event.button.y * ScaleY);
irrevent.MouseInput.Shift = shift;
irrevent.MouseInput.Control = control;
postEventFromUser(irrevent); postEventFromUser(irrevent);
if (irrevent.MouseInput.Event >= EMIE_LMOUSE_PRESSED_DOWN && irrevent.MouseInput.Event <= EMIE_MMOUSE_PRESSED_DOWN) { if (irrevent.MouseInput.Event >= EMIE_LMOUSE_PRESSED_DOWN && irrevent.MouseInput.Event <= EMIE_MMOUSE_PRESSED_DOWN) {
@ -851,6 +864,12 @@ bool CIrrDeviceSDL::run()
postEventFromUser(irrevent); postEventFromUser(irrevent);
} }
} }
} else if (irrevent.EventType == irr::EET_KEY_INPUT_EVENT) {
irrevent.KeyInput.Char = 0;
irrevent.KeyInput.PressedDown = SDL_event.type == SDL_MOUSEBUTTONDOWN;
irrevent.KeyInput.Shift = shift;
irrevent.KeyInput.Control = control;
postEventFromUser(irrevent);
} }
break; break;
} }