From a49447ee8b42b6da645a668450e9a23729d8ad99 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Fri, 5 Sep 2025 10:39:14 +0200 Subject: [PATCH 1/3] tweak(options): Simplify the user options for the cursor capture mode --- .../Include/Common/UserPreferences.h | 6 +- .../GameEngine/Include/GameClient/Mouse.h | 22 +++--- .../GUI/GUICallbacks/Menus/OptionsMenu.cpp | 71 +++++++++++++++---- .../Source/GameClient/Input/Mouse.cpp | 68 +++++++++--------- 4 files changed, 106 insertions(+), 61 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h b/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h index 369d16f627..c0542e44af 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h @@ -39,8 +39,8 @@ #include "Common/STLTypedefs.h" class Money; -enum CursorCaptureMode CPP_11(: Int); typedef UnsignedInt ScreenEdgeScrollMode; +typedef UnsignedInt CursorCaptureMode; //----------------------------------------------------------------------------- // PUBLIC TYPES /////////////////////////////////////////////////////////////// @@ -98,6 +98,10 @@ class OptionPreferences : public UserPreferences Real getScrollFactor(void); // convenience function Bool getDrawScrollAnchor(void); Bool getMoveScrollAnchor(void); + Bool getCursorCaptureEnabledInWindowedGame() const; + Bool getCursorCaptureEnabledInWindowedMenu() const; + Bool getCursorCaptureEnabledInFullscreenGame() const; + Bool getCursorCaptureEnabledInFullscreenMenu() const; CursorCaptureMode getCursorCaptureMode() const; Bool getScreenEdgeScrollEnabledInWindowedApp() const; Bool getScreenEdgeScrollEnabledInFullscreenApp() const; diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h b/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h index 0d859a5899..7211ea4f82 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h @@ -141,19 +141,20 @@ class CursorInfo Int numDirections; //number of directions for cursors like scrolling/panning. }; -enum CursorCaptureMode CPP_11(: Int) +typedef UnsignedInt CursorCaptureMode; +enum CursorCaptureMode_ CPP_11(: CursorCaptureMode) { - CursorCaptureMode_None, // Does not capture the cursor - CursorCaptureMode_InGame, // Captures the cursor when playing and observing - CursorCaptureMode_Always, // Captures the cursor always in menus and game - CursorCaptureMode_Auto, // Applies mode "InGame" when Windowed, "Always" when Fullscreen - - CursorCaptureMode_Count, - CursorCaptureMode_Default = CursorCaptureMode_Auto, + CursorCaptureMode_EnabledInWindowedGame = 1<<0, // Captures the cursor when in game while the app is windowed + CursorCaptureMode_EnabledInWindowedMenu = 1<<1, // Captures the cursor when in menu while the app is windowed + CursorCaptureMode_EnabledInFullscreenGame = 1<<2, // Captures the cursor when in game while the app is fullscreen + CursorCaptureMode_EnabledInFullscreenMenu = 1<<3, // Captures the cursor when in menu while the app is fullscreen + + CursorCaptureMode_Default = + CursorCaptureMode_EnabledInWindowedGame | + CursorCaptureMode_EnabledInFullscreenGame | + CursorCaptureMode_EnabledInFullscreenMenu, }; -extern const char* const TheCursorCaptureModeNames[]; - // Mouse ---------------------------------------------------------------------- // Class interface for working with a mouse pointing device // @@ -170,7 +171,6 @@ class Mouse : public SubsystemInterface enum CursorCaptureBlockReason { CursorCaptureBlockReason_NoInit, - CursorCaptureBlockReason_NoGame, CursorCaptureBlockReason_Paused, CursorCaptureBlockReason_Unfocused, diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp index 85952fe57b..956ec52769 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp @@ -404,21 +404,61 @@ Bool OptionPreferences::getMoveScrollAnchor(void) return FALSE; } +Bool OptionPreferences::getCursorCaptureEnabledInWindowedGame() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedGame"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedGame); + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + +Bool OptionPreferences::getCursorCaptureEnabledInWindowedMenu() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedMenu"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedMenu); + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + +Bool OptionPreferences::getCursorCaptureEnabledInFullscreenGame() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenGame"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenGame); + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + +Bool OptionPreferences::getCursorCaptureEnabledInFullscreenMenu() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenMenu"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenMenu); + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + CursorCaptureMode OptionPreferences::getCursorCaptureMode() const { - CursorCaptureMode mode = CursorCaptureMode_Default; - OptionPreferences::const_iterator it = find("CursorCaptureMode"); - if (it != end()) - { - for (Int i = 0; i < CursorCaptureMode_Count; ++i) - { - if (stricmp(it->second.str(), TheCursorCaptureModeNames[i]) == 0) - { - mode = static_cast(i); - break; - } - } - } + CursorCaptureMode mode = 0; + mode |= getCursorCaptureEnabledInWindowedGame() ? CursorCaptureMode_EnabledInWindowedGame : 0; + mode |= getCursorCaptureEnabledInWindowedMenu() ? CursorCaptureMode_EnabledInWindowedMenu : 0; + mode |= getCursorCaptureEnabledInFullscreenGame() ? CursorCaptureMode_EnabledInFullscreenGame : 0; + mode |= getCursorCaptureEnabledInFullscreenMenu() ? CursorCaptureMode_EnabledInFullscreenMenu : 0; return mode; } @@ -1293,7 +1333,10 @@ static void saveOptions( void ) // TheSuperHackers @todo Add combo box ? { CursorCaptureMode mode = pref->getCursorCaptureMode(); - (*pref)["CursorCaptureMode"] = TheCursorCaptureModeNames[mode]; + (*pref)["CursorCaptureEnabledInWindowedGame"] = (mode & CursorCaptureMode_EnabledInWindowedGame) ? "yes" : "no"; + (*pref)["CursorCaptureEnabledInWindowedMenu"] = (mode & CursorCaptureMode_EnabledInWindowedMenu) ? "yes" : "no"; + (*pref)["CursorCaptureEnabledInFullscreenGame"] = (mode & CursorCaptureMode_EnabledInFullscreenGame) ? "yes" : "no"; + (*pref)["CursorCaptureEnabledInFullscreenMenu"] = (mode & CursorCaptureMode_EnabledInFullscreenMenu) ? "yes" : "no"; TheMouse->setCursorCaptureMode(mode); } diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp index 6c88f78929..b2c722ded3 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp @@ -53,14 +53,6 @@ // PUBLIC DATA //////////////////////////////////////////////////////////////////////////////////// Mouse *TheMouse = NULL; -const char* const TheCursorCaptureModeNames[] = { - "None", - "InGame", - "Always", - "Auto", -}; -static_assert(ARRAY_SIZE(TheCursorCaptureModeNames) == CursorCaptureMode_Count, "Incorrect array size"); - const char *const Mouse::RedrawModeName[] = { "Mouse:Windows", "Mouse:W3D", @@ -70,7 +62,6 @@ const char *const Mouse::RedrawModeName[] = { const char *const Mouse::CursorCaptureBlockReasonNames[] = { "CursorCaptureBlockReason_NoInit", - "CursorCaptureBlockReason_NoGame", "CursorCaptureBlockReason_Paused", "CursorCaptureBlockReason_Unfocused", }; @@ -552,8 +543,8 @@ Mouse::Mouse( void ) m_cursorCaptureMode = CursorCaptureMode_Default; - m_captureBlockReasonBits = (1 << CursorCaptureBlockReason_NoInit) | (1 << CursorCaptureBlockReason_NoGame); - DEBUG_LOG(("Mouse::Mouse: m_blockCaptureReason=CursorCaptureBlockReason_NoInit|CursorCaptureBlockReason_NoGame")); + m_captureBlockReasonBits = (1 << CursorCaptureBlockReason_NoInit); + DEBUG_LOG(("Mouse::Mouse: m_blockCaptureReason=CursorCaptureBlockReason_NoInit")); } @@ -653,17 +644,7 @@ void Mouse::mouseNotifyResolutionChange( void ) //------------------------------------------------------------------------------------------------- void Mouse::onGameModeChanged(GameMode prev, GameMode next) { - const Bool wasInteractiveGame = GameLogic::isInInteractiveGame(prev); - const Bool isInteractiveGame = GameLogic::isInInteractiveGame(next); - - if (wasInteractiveGame && !isInteractiveGame) - { - blockCapture(CursorCaptureBlockReason_NoGame); - } - else if (!wasInteractiveGame && isInteractiveGame) - { - unblockCapture(CursorCaptureBlockReason_NoGame); - } + refreshCursorCapture(); } //------------------------------------------------------------------------------------------------- @@ -1072,23 +1053,40 @@ void Mouse::initCapture() // ------------------------------------------------------------------------------------------------ Bool Mouse::canCapture() const { - constexpr const CursorCaptureBlockReasonInt noGameBits = CursorCaptureBlockReason_NoGame | CursorCaptureBlockReason_Paused; + if (m_captureBlockReasonBits != 0) + return false; + + DEBUG_ASSERTCRASH(TheDisplay != NULL, ("The Display is NULL")); + const Bool inInteractiveGame = TheGameLogic && TheGameLogic->isInInteractiveGame(); - switch (m_cursorCaptureMode) + if (TheDisplay->getWindowed()) { - case CursorCaptureMode_None: - return false; - case CursorCaptureMode_InGame: - return (m_captureBlockReasonBits == 0); - case CursorCaptureMode_Always: - return (m_captureBlockReasonBits & ~noGameBits) == 0; - case CursorCaptureMode_Auto: - default: - if (TheDisplay == NULL || TheDisplay->getWindowed()) - return (m_captureBlockReasonBits == 0); + if (inInteractiveGame) + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInWindowedGame) == 0) + return false; + } else - return (m_captureBlockReasonBits & ~noGameBits) == 0; + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInWindowedMenu) == 0) + return false; + } } + else + { + if (inInteractiveGame) + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInFullscreenGame) == 0) + return false; + } + else + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInFullscreenMenu) == 0) + return false; + } + } + + return true; } // ------------------------------------------------------------------------------------------------ From bfbab1edc46815195197a0339704ed29f1609bc8 Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:34:44 +0200 Subject: [PATCH 2/3] Fix bool cast --- .../GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp index 956ec52769..37d674c41b 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp @@ -408,7 +408,7 @@ Bool OptionPreferences::getCursorCaptureEnabledInWindowedGame() const { OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedGame"); if (it == end()) - return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedGame); + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedGame) != 0; if (stricmp(it->second.str(), "yes") == 0) return TRUE; @@ -420,7 +420,7 @@ Bool OptionPreferences::getCursorCaptureEnabledInWindowedMenu() const { OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedMenu"); if (it == end()) - return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedMenu); + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedMenu) != 0; if (stricmp(it->second.str(), "yes") == 0) return TRUE; @@ -432,7 +432,7 @@ Bool OptionPreferences::getCursorCaptureEnabledInFullscreenGame() const { OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenGame"); if (it == end()) - return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenGame); + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenGame) != 0; if (stricmp(it->second.str(), "yes") == 0) return TRUE; @@ -444,7 +444,7 @@ Bool OptionPreferences::getCursorCaptureEnabledInFullscreenMenu() const { OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenMenu"); if (it == end()) - return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenMenu); + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenMenu) != 0; if (stricmp(it->second.str(), "yes") == 0) return TRUE; From 5917093feaf6efd19998d7a59b13f44b59511adc Mon Sep 17 00:00:00 2001 From: xezon <4720891+xezon@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:38:37 +0200 Subject: [PATCH 3/3] Replicate in Generals --- .../Include/Common/UserPreferences.h | 6 +- .../GameEngine/Include/GameClient/Mouse.h | 22 +++--- .../GUI/GUICallbacks/Menus/OptionsMenu.cpp | 71 +++++++++++++++---- .../Source/GameClient/Input/Mouse.cpp | 68 +++++++++--------- .../Include/Common/UserPreferences.h | 2 +- 5 files changed, 107 insertions(+), 62 deletions(-) diff --git a/Generals/Code/GameEngine/Include/Common/UserPreferences.h b/Generals/Code/GameEngine/Include/Common/UserPreferences.h index 5f1b033aed..88f5874651 100644 --- a/Generals/Code/GameEngine/Include/Common/UserPreferences.h +++ b/Generals/Code/GameEngine/Include/Common/UserPreferences.h @@ -38,7 +38,7 @@ //----------------------------------------------------------------------------- #include "Common/STLTypedefs.h" -enum CursorCaptureMode CPP_11(: Int); +typedef UnsignedInt CursorCaptureMode; typedef UnsignedInt ScreenEdgeScrollMode; //----------------------------------------------------------------------------- @@ -95,6 +95,10 @@ class OptionPreferences : public UserPreferences Real getScrollFactor(void); // convenience function Bool getDrawScrollAnchor(void); Bool getMoveScrollAnchor(void); + Bool getCursorCaptureEnabledInWindowedGame() const; + Bool getCursorCaptureEnabledInWindowedMenu() const; + Bool getCursorCaptureEnabledInFullscreenGame() const; + Bool getCursorCaptureEnabledInFullscreenMenu() const; CursorCaptureMode getCursorCaptureMode() const; Bool getScreenEdgeScrollEnabledInWindowedApp() const; Bool getScreenEdgeScrollEnabledInFullscreenApp() const; diff --git a/Generals/Code/GameEngine/Include/GameClient/Mouse.h b/Generals/Code/GameEngine/Include/GameClient/Mouse.h index 1253b7c66c..a8c4090a13 100644 --- a/Generals/Code/GameEngine/Include/GameClient/Mouse.h +++ b/Generals/Code/GameEngine/Include/GameClient/Mouse.h @@ -141,19 +141,20 @@ class CursorInfo Int numDirections; //number of directions for cursors like scrolling/panning. }; -enum CursorCaptureMode CPP_11(: Int) +typedef UnsignedInt CursorCaptureMode; +enum CursorCaptureMode_ CPP_11(: CursorCaptureMode) { - CursorCaptureMode_None, // Does not capture the cursor - CursorCaptureMode_InGame, // Captures the cursor when playing and observing - CursorCaptureMode_Always, // Captures the cursor always in menus and game - CursorCaptureMode_Auto, // Applies mode "InGame" when Windowed, "Always" when Fullscreen - - CursorCaptureMode_Count, - CursorCaptureMode_Default = CursorCaptureMode_Auto, + CursorCaptureMode_EnabledInWindowedGame = 1<<0, // Captures the cursor when in game while the app is windowed + CursorCaptureMode_EnabledInWindowedMenu = 1<<1, // Captures the cursor when in menu while the app is windowed + CursorCaptureMode_EnabledInFullscreenGame = 1<<2, // Captures the cursor when in game while the app is fullscreen + CursorCaptureMode_EnabledInFullscreenMenu = 1<<3, // Captures the cursor when in menu while the app is fullscreen + + CursorCaptureMode_Default = + CursorCaptureMode_EnabledInWindowedGame | + CursorCaptureMode_EnabledInFullscreenGame | + CursorCaptureMode_EnabledInFullscreenMenu, }; -extern const char* const TheCursorCaptureModeNames[]; - // Mouse ---------------------------------------------------------------------- // Class interface for working with a mouse pointing device // @@ -170,7 +171,6 @@ class Mouse : public SubsystemInterface enum CursorCaptureBlockReason { CursorCaptureBlockReason_NoInit, - CursorCaptureBlockReason_NoGame, CursorCaptureBlockReason_Paused, CursorCaptureBlockReason_Unfocused, diff --git a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp index 041dc6850e..e4383dae01 100644 --- a/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp @@ -372,21 +372,61 @@ Bool OptionPreferences::getMoveScrollAnchor(void) return FALSE; } +Bool OptionPreferences::getCursorCaptureEnabledInWindowedGame() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedGame"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedGame) != 0; + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + +Bool OptionPreferences::getCursorCaptureEnabledInWindowedMenu() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedMenu"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedMenu) != 0; + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + +Bool OptionPreferences::getCursorCaptureEnabledInFullscreenGame() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenGame"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenGame) != 0; + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + +Bool OptionPreferences::getCursorCaptureEnabledInFullscreenMenu() const +{ + OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenMenu"); + if (it == end()) + return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenMenu) != 0; + + if (stricmp(it->second.str(), "yes") == 0) + return TRUE; + + return FALSE; +} + CursorCaptureMode OptionPreferences::getCursorCaptureMode() const { - CursorCaptureMode mode = CursorCaptureMode_Default; - OptionPreferences::const_iterator it = find("CursorCaptureMode"); - if (it != end()) - { - for (Int i = 0; i < CursorCaptureMode_Count; ++i) - { - if (stricmp(it->second.str(), TheCursorCaptureModeNames[i]) == 0) - { - mode = static_cast(i); - break; - } - } - } + CursorCaptureMode mode = 0; + mode |= getCursorCaptureEnabledInWindowedGame() ? CursorCaptureMode_EnabledInWindowedGame : 0; + mode |= getCursorCaptureEnabledInWindowedMenu() ? CursorCaptureMode_EnabledInWindowedMenu : 0; + mode |= getCursorCaptureEnabledInFullscreenGame() ? CursorCaptureMode_EnabledInFullscreenGame : 0; + mode |= getCursorCaptureEnabledInFullscreenMenu() ? CursorCaptureMode_EnabledInFullscreenMenu : 0; return mode; } @@ -1233,7 +1273,10 @@ static void saveOptions( void ) // TheSuperHackers @todo Add combo box ? { CursorCaptureMode mode = pref->getCursorCaptureMode(); - (*pref)["CursorCaptureMode"] = TheCursorCaptureModeNames[mode]; + (*pref)["CursorCaptureEnabledInWindowedGame"] = (mode & CursorCaptureMode_EnabledInWindowedGame) ? "yes" : "no"; + (*pref)["CursorCaptureEnabledInWindowedMenu"] = (mode & CursorCaptureMode_EnabledInWindowedMenu) ? "yes" : "no"; + (*pref)["CursorCaptureEnabledInFullscreenGame"] = (mode & CursorCaptureMode_EnabledInFullscreenGame) ? "yes" : "no"; + (*pref)["CursorCaptureEnabledInFullscreenMenu"] = (mode & CursorCaptureMode_EnabledInFullscreenMenu) ? "yes" : "no"; TheMouse->setCursorCaptureMode(mode); } diff --git a/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp b/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp index dbc4489dea..386d12f6d7 100644 --- a/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp +++ b/Generals/Code/GameEngine/Source/GameClient/Input/Mouse.cpp @@ -53,14 +53,6 @@ // PUBLIC DATA //////////////////////////////////////////////////////////////////////////////////// Mouse *TheMouse = NULL; -const char* const TheCursorCaptureModeNames[] = { - "None", - "InGame", - "Always", - "Auto", -}; -static_assert(ARRAY_SIZE(TheCursorCaptureModeNames) == CursorCaptureMode_Count, "Incorrect array size"); - const char *const Mouse::RedrawModeName[] = { "Mouse:Windows", "Mouse:W3D", @@ -70,7 +62,6 @@ const char *const Mouse::RedrawModeName[] = { const char *const Mouse::CursorCaptureBlockReasonNames[] = { "CursorCaptureBlockReason_NoInit", - "CursorCaptureBlockReason_NoGame", "CursorCaptureBlockReason_Paused", "CursorCaptureBlockReason_Unfocused", }; @@ -552,8 +543,8 @@ Mouse::Mouse( void ) m_cursorCaptureMode = CursorCaptureMode_Default; - m_captureBlockReasonBits = (1 << CursorCaptureBlockReason_NoInit) | (1 << CursorCaptureBlockReason_NoGame); - DEBUG_LOG(("Mouse::Mouse: m_blockCaptureReason=CursorCaptureBlockReason_NoInit|CursorCaptureBlockReason_NoGame")); + m_captureBlockReasonBits = (1 << CursorCaptureBlockReason_NoInit); + DEBUG_LOG(("Mouse::Mouse: m_blockCaptureReason=CursorCaptureBlockReason_NoInit")); } @@ -653,17 +644,7 @@ void Mouse::mouseNotifyResolutionChange( void ) //------------------------------------------------------------------------------------------------- void Mouse::onGameModeChanged(GameMode prev, GameMode next) { - const Bool wasInteractiveGame = GameLogic::isInInteractiveGame(prev); - const Bool isInteractiveGame = GameLogic::isInInteractiveGame(next); - - if (wasInteractiveGame && !isInteractiveGame) - { - blockCapture(CursorCaptureBlockReason_NoGame); - } - else if (!wasInteractiveGame && isInteractiveGame) - { - unblockCapture(CursorCaptureBlockReason_NoGame); - } + refreshCursorCapture(); } //------------------------------------------------------------------------------------------------- @@ -1072,23 +1053,40 @@ void Mouse::initCapture() // ------------------------------------------------------------------------------------------------ Bool Mouse::canCapture() const { - constexpr const CursorCaptureBlockReasonInt noGameBits = CursorCaptureBlockReason_NoGame | CursorCaptureBlockReason_Paused; + if (m_captureBlockReasonBits != 0) + return false; + + DEBUG_ASSERTCRASH(TheDisplay != NULL, ("The Display is NULL")); + const Bool inInteractiveGame = TheGameLogic && TheGameLogic->isInInteractiveGame(); - switch (m_cursorCaptureMode) + if (TheDisplay->getWindowed()) { - case CursorCaptureMode_None: - return false; - case CursorCaptureMode_InGame: - return (m_captureBlockReasonBits == 0); - case CursorCaptureMode_Always: - return (m_captureBlockReasonBits & ~noGameBits) == 0; - case CursorCaptureMode_Auto: - default: - if (TheDisplay == NULL || TheDisplay->getWindowed()) - return (m_captureBlockReasonBits == 0); + if (inInteractiveGame) + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInWindowedGame) == 0) + return false; + } else - return (m_captureBlockReasonBits & ~noGameBits) == 0; + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInWindowedMenu) == 0) + return false; + } } + else + { + if (inInteractiveGame) + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInFullscreenGame) == 0) + return false; + } + else + { + if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInFullscreenMenu) == 0) + return false; + } + } + + return true; } // ------------------------------------------------------------------------------------------------ diff --git a/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h b/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h index c0542e44af..27fc796350 100644 --- a/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h +++ b/GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h @@ -39,8 +39,8 @@ #include "Common/STLTypedefs.h" class Money; -typedef UnsignedInt ScreenEdgeScrollMode; typedef UnsignedInt CursorCaptureMode; +typedef UnsignedInt ScreenEdgeScrollMode; //----------------------------------------------------------------------------- // PUBLIC TYPES ///////////////////////////////////////////////////////////////