Skip to content

Commit a49447e

Browse files
committed
tweak(options): Simplify the user options for the cursor capture mode
1 parent 04b968f commit a49447e

File tree

4 files changed

+106
-61
lines changed

4 files changed

+106
-61
lines changed

GeneralsMD/Code/GameEngine/Include/Common/UserPreferences.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
#include "Common/STLTypedefs.h"
4040

4141
class Money;
42-
enum CursorCaptureMode CPP_11(: Int);
4342
typedef UnsignedInt ScreenEdgeScrollMode;
43+
typedef UnsignedInt CursorCaptureMode;
4444

4545
//-----------------------------------------------------------------------------
4646
// PUBLIC TYPES ///////////////////////////////////////////////////////////////
@@ -98,6 +98,10 @@ class OptionPreferences : public UserPreferences
9898
Real getScrollFactor(void); // convenience function
9999
Bool getDrawScrollAnchor(void);
100100
Bool getMoveScrollAnchor(void);
101+
Bool getCursorCaptureEnabledInWindowedGame() const;
102+
Bool getCursorCaptureEnabledInWindowedMenu() const;
103+
Bool getCursorCaptureEnabledInFullscreenGame() const;
104+
Bool getCursorCaptureEnabledInFullscreenMenu() const;
101105
CursorCaptureMode getCursorCaptureMode() const;
102106
Bool getScreenEdgeScrollEnabledInWindowedApp() const;
103107
Bool getScreenEdgeScrollEnabledInFullscreenApp() const;

GeneralsMD/Code/GameEngine/Include/GameClient/Mouse.h

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -141,19 +141,20 @@ class CursorInfo
141141
Int numDirections; //number of directions for cursors like scrolling/panning.
142142
};
143143

144-
enum CursorCaptureMode CPP_11(: Int)
144+
typedef UnsignedInt CursorCaptureMode;
145+
enum CursorCaptureMode_ CPP_11(: CursorCaptureMode)
145146
{
146-
CursorCaptureMode_None, // Does not capture the cursor
147-
CursorCaptureMode_InGame, // Captures the cursor when playing and observing
148-
CursorCaptureMode_Always, // Captures the cursor always in menus and game
149-
CursorCaptureMode_Auto, // Applies mode "InGame" when Windowed, "Always" when Fullscreen
150-
151-
CursorCaptureMode_Count,
152-
CursorCaptureMode_Default = CursorCaptureMode_Auto,
147+
CursorCaptureMode_EnabledInWindowedGame = 1<<0, // Captures the cursor when in game while the app is windowed
148+
CursorCaptureMode_EnabledInWindowedMenu = 1<<1, // Captures the cursor when in menu while the app is windowed
149+
CursorCaptureMode_EnabledInFullscreenGame = 1<<2, // Captures the cursor when in game while the app is fullscreen
150+
CursorCaptureMode_EnabledInFullscreenMenu = 1<<3, // Captures the cursor when in menu while the app is fullscreen
151+
152+
CursorCaptureMode_Default =
153+
CursorCaptureMode_EnabledInWindowedGame |
154+
CursorCaptureMode_EnabledInFullscreenGame |
155+
CursorCaptureMode_EnabledInFullscreenMenu,
153156
};
154157

155-
extern const char* const TheCursorCaptureModeNames[];
156-
157158
// Mouse ----------------------------------------------------------------------
158159
// Class interface for working with a mouse pointing device
159160
//
@@ -170,7 +171,6 @@ class Mouse : public SubsystemInterface
170171
enum CursorCaptureBlockReason
171172
{
172173
CursorCaptureBlockReason_NoInit,
173-
CursorCaptureBlockReason_NoGame,
174174
CursorCaptureBlockReason_Paused,
175175
CursorCaptureBlockReason_Unfocused,
176176

GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -404,21 +404,61 @@ Bool OptionPreferences::getMoveScrollAnchor(void)
404404
return FALSE;
405405
}
406406

407+
Bool OptionPreferences::getCursorCaptureEnabledInWindowedGame() const
408+
{
409+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedGame");
410+
if (it == end())
411+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedGame);
412+
413+
if (stricmp(it->second.str(), "yes") == 0)
414+
return TRUE;
415+
416+
return FALSE;
417+
}
418+
419+
Bool OptionPreferences::getCursorCaptureEnabledInWindowedMenu() const
420+
{
421+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedMenu");
422+
if (it == end())
423+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedMenu);
424+
425+
if (stricmp(it->second.str(), "yes") == 0)
426+
return TRUE;
427+
428+
return FALSE;
429+
}
430+
431+
Bool OptionPreferences::getCursorCaptureEnabledInFullscreenGame() const
432+
{
433+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenGame");
434+
if (it == end())
435+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenGame);
436+
437+
if (stricmp(it->second.str(), "yes") == 0)
438+
return TRUE;
439+
440+
return FALSE;
441+
}
442+
443+
Bool OptionPreferences::getCursorCaptureEnabledInFullscreenMenu() const
444+
{
445+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenMenu");
446+
if (it == end())
447+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenMenu);
448+
449+
if (stricmp(it->second.str(), "yes") == 0)
450+
return TRUE;
451+
452+
return FALSE;
453+
}
454+
407455
CursorCaptureMode OptionPreferences::getCursorCaptureMode() const
408456
{
409-
CursorCaptureMode mode = CursorCaptureMode_Default;
410-
OptionPreferences::const_iterator it = find("CursorCaptureMode");
411-
if (it != end())
412-
{
413-
for (Int i = 0; i < CursorCaptureMode_Count; ++i)
414-
{
415-
if (stricmp(it->second.str(), TheCursorCaptureModeNames[i]) == 0)
416-
{
417-
mode = static_cast<CursorCaptureMode>(i);
418-
break;
419-
}
420-
}
421-
}
457+
CursorCaptureMode mode = 0;
458+
mode |= getCursorCaptureEnabledInWindowedGame() ? CursorCaptureMode_EnabledInWindowedGame : 0;
459+
mode |= getCursorCaptureEnabledInWindowedMenu() ? CursorCaptureMode_EnabledInWindowedMenu : 0;
460+
mode |= getCursorCaptureEnabledInFullscreenGame() ? CursorCaptureMode_EnabledInFullscreenGame : 0;
461+
mode |= getCursorCaptureEnabledInFullscreenMenu() ? CursorCaptureMode_EnabledInFullscreenMenu : 0;
422462
return mode;
423463
}
424464

@@ -1293,7 +1333,10 @@ static void saveOptions( void )
12931333
// TheSuperHackers @todo Add combo box ?
12941334
{
12951335
CursorCaptureMode mode = pref->getCursorCaptureMode();
1296-
(*pref)["CursorCaptureMode"] = TheCursorCaptureModeNames[mode];
1336+
(*pref)["CursorCaptureEnabledInWindowedGame"] = (mode & CursorCaptureMode_EnabledInWindowedGame) ? "yes" : "no";
1337+
(*pref)["CursorCaptureEnabledInWindowedMenu"] = (mode & CursorCaptureMode_EnabledInWindowedMenu) ? "yes" : "no";
1338+
(*pref)["CursorCaptureEnabledInFullscreenGame"] = (mode & CursorCaptureMode_EnabledInFullscreenGame) ? "yes" : "no";
1339+
(*pref)["CursorCaptureEnabledInFullscreenMenu"] = (mode & CursorCaptureMode_EnabledInFullscreenMenu) ? "yes" : "no";
12971340
TheMouse->setCursorCaptureMode(mode);
12981341
}
12991342

GeneralsMD/Code/GameEngine/Source/GameClient/Input/Mouse.cpp

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,6 @@
5353
// PUBLIC DATA ////////////////////////////////////////////////////////////////////////////////////
5454
Mouse *TheMouse = NULL;
5555

56-
const char* const TheCursorCaptureModeNames[] = {
57-
"None",
58-
"InGame",
59-
"Always",
60-
"Auto",
61-
};
62-
static_assert(ARRAY_SIZE(TheCursorCaptureModeNames) == CursorCaptureMode_Count, "Incorrect array size");
63-
6456
const char *const Mouse::RedrawModeName[] = {
6557
"Mouse:Windows",
6658
"Mouse:W3D",
@@ -70,7 +62,6 @@ const char *const Mouse::RedrawModeName[] = {
7062

7163
const char *const Mouse::CursorCaptureBlockReasonNames[] = {
7264
"CursorCaptureBlockReason_NoInit",
73-
"CursorCaptureBlockReason_NoGame",
7465
"CursorCaptureBlockReason_Paused",
7566
"CursorCaptureBlockReason_Unfocused",
7667
};
@@ -552,8 +543,8 @@ Mouse::Mouse( void )
552543

553544
m_cursorCaptureMode = CursorCaptureMode_Default;
554545

555-
m_captureBlockReasonBits = (1 << CursorCaptureBlockReason_NoInit) | (1 << CursorCaptureBlockReason_NoGame);
556-
DEBUG_LOG(("Mouse::Mouse: m_blockCaptureReason=CursorCaptureBlockReason_NoInit|CursorCaptureBlockReason_NoGame"));
546+
m_captureBlockReasonBits = (1 << CursorCaptureBlockReason_NoInit);
547+
DEBUG_LOG(("Mouse::Mouse: m_blockCaptureReason=CursorCaptureBlockReason_NoInit"));
557548

558549
}
559550

@@ -653,17 +644,7 @@ void Mouse::mouseNotifyResolutionChange( void )
653644
//-------------------------------------------------------------------------------------------------
654645
void Mouse::onGameModeChanged(GameMode prev, GameMode next)
655646
{
656-
const Bool wasInteractiveGame = GameLogic::isInInteractiveGame(prev);
657-
const Bool isInteractiveGame = GameLogic::isInInteractiveGame(next);
658-
659-
if (wasInteractiveGame && !isInteractiveGame)
660-
{
661-
blockCapture(CursorCaptureBlockReason_NoGame);
662-
}
663-
else if (!wasInteractiveGame && isInteractiveGame)
664-
{
665-
unblockCapture(CursorCaptureBlockReason_NoGame);
666-
}
647+
refreshCursorCapture();
667648
}
668649

669650
//-------------------------------------------------------------------------------------------------
@@ -1072,23 +1053,40 @@ void Mouse::initCapture()
10721053
// ------------------------------------------------------------------------------------------------
10731054
Bool Mouse::canCapture() const
10741055
{
1075-
constexpr const CursorCaptureBlockReasonInt noGameBits = CursorCaptureBlockReason_NoGame | CursorCaptureBlockReason_Paused;
1056+
if (m_captureBlockReasonBits != 0)
1057+
return false;
1058+
1059+
DEBUG_ASSERTCRASH(TheDisplay != NULL, ("The Display is NULL"));
1060+
const Bool inInteractiveGame = TheGameLogic && TheGameLogic->isInInteractiveGame();
10761061

1077-
switch (m_cursorCaptureMode)
1062+
if (TheDisplay->getWindowed())
10781063
{
1079-
case CursorCaptureMode_None:
1080-
return false;
1081-
case CursorCaptureMode_InGame:
1082-
return (m_captureBlockReasonBits == 0);
1083-
case CursorCaptureMode_Always:
1084-
return (m_captureBlockReasonBits & ~noGameBits) == 0;
1085-
case CursorCaptureMode_Auto:
1086-
default:
1087-
if (TheDisplay == NULL || TheDisplay->getWindowed())
1088-
return (m_captureBlockReasonBits == 0);
1064+
if (inInteractiveGame)
1065+
{
1066+
if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInWindowedGame) == 0)
1067+
return false;
1068+
}
10891069
else
1090-
return (m_captureBlockReasonBits & ~noGameBits) == 0;
1070+
{
1071+
if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInWindowedMenu) == 0)
1072+
return false;
1073+
}
10911074
}
1075+
else
1076+
{
1077+
if (inInteractiveGame)
1078+
{
1079+
if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInFullscreenGame) == 0)
1080+
return false;
1081+
}
1082+
else
1083+
{
1084+
if ((m_cursorCaptureMode & CursorCaptureMode_EnabledInFullscreenMenu) == 0)
1085+
return false;
1086+
}
1087+
}
1088+
1089+
return true;
10921090
}
10931091

10941092
// ------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)