From b511856ab0727e57d09eee25bebe973095d1f5c8 Mon Sep 17 00:00:00 2001 From: Frank Becker Date: Mon, 23 Sep 2024 15:21:53 -0700 Subject: [PATCH] Don't grab mouse when windowed and in menu so it's possible to move window. --- game/Game.cpp | 1 + game/MenuManager.cpp | 41 ++++++++++++++++++++++++++++++++++------- game/MenuManager.hpp | 1 + game/VideoBase.cpp | 5 ++++- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/game/Game.cpp b/game/Game.cpp index c3fb589..695655a 100644 --- a/game/Game.cpp +++ b/game/Game.cpp @@ -221,6 +221,7 @@ void Game::startNewGame(void) { GameS::instance()->reset(); GameState::context = Context::eInGame; + SDL_SetRelativeMouseMode(SDL_TRUE); InputS::instance()->disableInterceptor(); AudioS::instance()->playSample("sounds/chirp2"); diff --git a/game/MenuManager.cpp b/game/MenuManager.cpp index 4c992ec..f2ed509 100644 --- a/game/MenuManager.cpp +++ b/game/MenuManager.cpp @@ -46,6 +46,11 @@ MenuManager::MenuManager() : XTRACE(); updateSettings(); + + int w = VideoBaseS::instance()->getWidth(); + int h = VideoBaseS::instance()->getHeight(); + _mouseX = w / 2; + _mouseY = h / 2; } MenuManager::~MenuManager() { @@ -286,9 +291,16 @@ bool MenuManager::draw(void) { return true; } -void MenuManager::reload(void) {} +void MenuManager::reload(void) { + int w = VideoBaseS::instance()->getWidth(); + int h = VideoBaseS::instance()->getHeight(); + _mouseX = w / 2; + _mouseY = h / 2; +} void MenuManager::turnMenuOn(void) { + SDL_SetRelativeMouseMode(SDL_FALSE); + AudioS::instance()->playSample("sounds/beep"); _prevContext = GameState::context; GameState::context = Context::eMenu; @@ -309,6 +321,8 @@ void MenuManager::turnMenuOff(void) { return; } + SDL_SetRelativeMouseMode(SDL_TRUE); + AudioS::instance()->playSample("sounds/beep"); GameState::context = _prevContext; @@ -324,6 +338,24 @@ bool MenuManager::canReturnToGame(void) { return (_prevContext == Context::eInGame) || (_prevContext == Context::ePaused); } +void MenuManager::updateMousePosition(const Trigger& trigger) { + if (VideoBaseS::instance()->isFullscreen()) { + _mouseX += trigger.fData1; + _mouseY += trigger.fData2; + } else { + int x; + int y; + SDL_GetMouseState(&x, &y); + float arx = (float)VideoBaseS::instance()->getWidth() / 1000.0; + float ary = (float)VideoBaseS::instance()->getHeight() / 750.0; + _mouseX = x / arx; + _mouseY = 750.0 - (y / ary); + } + VideoBase& video = *VideoBaseS::instance(); + Clamp(_mouseX, 0.0f, 1000.0f); + Clamp(_mouseY, 0.0f, 750.0f); +} + void MenuManager::input(const Trigger& trigger, const bool& isDown) { Trigger t = trigger; if (isDown) { @@ -387,12 +419,7 @@ void MenuManager::input(const Trigger& trigger, const bool& isDown) { Clamp(_mouseX, 0.0f, 1000.0); Clamp(_mouseY, 0.0f, 750.0); #else - - _mouseX += trigger.fData1; - _mouseY += trigger.fData2; - - Clamp(_mouseX, 0.0f, 1000.0f); - Clamp(_mouseY, 0.0f, 750.0f); + updateMousePosition(trigger); #endif activateSelectableUnderMouse(); } break; diff --git a/game/MenuManager.hpp b/game/MenuManager.hpp index 465b9c9..a7c95a3 100644 --- a/game/MenuManager.hpp +++ b/game/MenuManager.hpp @@ -51,6 +51,7 @@ class MenuManager : public InterceptorI { void clearActiveSelectables(void); void updateSettings(void); void activateSelectableUnderMouse(const bool& useFallback = false); + void updateMousePosition(const Trigger& trigger); TiXmlDocument* _menu; diff --git a/game/VideoBase.cpp b/game/VideoBase.cpp index ff435c2..e670d7d 100644 --- a/game/VideoBase.cpp +++ b/game/VideoBase.cpp @@ -228,7 +228,10 @@ bool VideoBase::setVideoMode(void) { InputS::instance()->resetMousePosition(); #if 1 - SDL_SetRelativeMouseMode(SDL_TRUE); + // don't grab mouse when windowed and in menu so it's possible to move the window + bool grabMouse = _isFullscreen || GameState::context != Context::eMenu; + SDL_SetRelativeMouseMode(grabMouse ? SDL_TRUE : SDL_FALSE); + SDL_ShowCursor(SDL_FALSE); #else // SDL_SetRelativeMouseMode used to only work on Mac SDL_ShowCursor(SDL_DISABLE);