Skip to content

Commit 5917093

Browse files
committed
Replicate in Generals
1 parent bfbab1e commit 5917093

File tree

5 files changed

+107
-62
lines changed

5 files changed

+107
-62
lines changed

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

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

41-
enum CursorCaptureMode CPP_11(: Int);
41+
typedef UnsignedInt CursorCaptureMode;
4242
typedef UnsignedInt ScreenEdgeScrollMode;
4343

4444
//-----------------------------------------------------------------------------
@@ -95,6 +95,10 @@ class OptionPreferences : public UserPreferences
9595
Real getScrollFactor(void); // convenience function
9696
Bool getDrawScrollAnchor(void);
9797
Bool getMoveScrollAnchor(void);
98+
Bool getCursorCaptureEnabledInWindowedGame() const;
99+
Bool getCursorCaptureEnabledInWindowedMenu() const;
100+
Bool getCursorCaptureEnabledInFullscreenGame() const;
101+
Bool getCursorCaptureEnabledInFullscreenMenu() const;
98102
CursorCaptureMode getCursorCaptureMode() const;
99103
Bool getScreenEdgeScrollEnabledInWindowedApp() const;
100104
Bool getScreenEdgeScrollEnabledInFullscreenApp() const;

Generals/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

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

Lines changed: 57 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -372,21 +372,61 @@ Bool OptionPreferences::getMoveScrollAnchor(void)
372372
return FALSE;
373373
}
374374

375+
Bool OptionPreferences::getCursorCaptureEnabledInWindowedGame() const
376+
{
377+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedGame");
378+
if (it == end())
379+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedGame) != 0;
380+
381+
if (stricmp(it->second.str(), "yes") == 0)
382+
return TRUE;
383+
384+
return FALSE;
385+
}
386+
387+
Bool OptionPreferences::getCursorCaptureEnabledInWindowedMenu() const
388+
{
389+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInWindowedMenu");
390+
if (it == end())
391+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInWindowedMenu) != 0;
392+
393+
if (stricmp(it->second.str(), "yes") == 0)
394+
return TRUE;
395+
396+
return FALSE;
397+
}
398+
399+
Bool OptionPreferences::getCursorCaptureEnabledInFullscreenGame() const
400+
{
401+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenGame");
402+
if (it == end())
403+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenGame) != 0;
404+
405+
if (stricmp(it->second.str(), "yes") == 0)
406+
return TRUE;
407+
408+
return FALSE;
409+
}
410+
411+
Bool OptionPreferences::getCursorCaptureEnabledInFullscreenMenu() const
412+
{
413+
OptionPreferences::const_iterator it = find("CursorCaptureEnabledInFullscreenMenu");
414+
if (it == end())
415+
return (CursorCaptureMode_Default & CursorCaptureMode_EnabledInFullscreenMenu) != 0;
416+
417+
if (stricmp(it->second.str(), "yes") == 0)
418+
return TRUE;
419+
420+
return FALSE;
421+
}
422+
375423
CursorCaptureMode OptionPreferences::getCursorCaptureMode() const
376424
{
377-
CursorCaptureMode mode = CursorCaptureMode_Default;
378-
OptionPreferences::const_iterator it = find("CursorCaptureMode");
379-
if (it != end())
380-
{
381-
for (Int i = 0; i < CursorCaptureMode_Count; ++i)
382-
{
383-
if (stricmp(it->second.str(), TheCursorCaptureModeNames[i]) == 0)
384-
{
385-
mode = static_cast<CursorCaptureMode>(i);
386-
break;
387-
}
388-
}
389-
}
425+
CursorCaptureMode mode = 0;
426+
mode |= getCursorCaptureEnabledInWindowedGame() ? CursorCaptureMode_EnabledInWindowedGame : 0;
427+
mode |= getCursorCaptureEnabledInWindowedMenu() ? CursorCaptureMode_EnabledInWindowedMenu : 0;
428+
mode |= getCursorCaptureEnabledInFullscreenGame() ? CursorCaptureMode_EnabledInFullscreenGame : 0;
429+
mode |= getCursorCaptureEnabledInFullscreenMenu() ? CursorCaptureMode_EnabledInFullscreenMenu : 0;
390430
return mode;
391431
}
392432

@@ -1233,7 +1273,10 @@ static void saveOptions( void )
12331273
// TheSuperHackers @todo Add combo box ?
12341274
{
12351275
CursorCaptureMode mode = pref->getCursorCaptureMode();
1236-
(*pref)["CursorCaptureMode"] = TheCursorCaptureModeNames[mode];
1276+
(*pref)["CursorCaptureEnabledInWindowedGame"] = (mode & CursorCaptureMode_EnabledInWindowedGame) ? "yes" : "no";
1277+
(*pref)["CursorCaptureEnabledInWindowedMenu"] = (mode & CursorCaptureMode_EnabledInWindowedMenu) ? "yes" : "no";
1278+
(*pref)["CursorCaptureEnabledInFullscreenGame"] = (mode & CursorCaptureMode_EnabledInFullscreenGame) ? "yes" : "no";
1279+
(*pref)["CursorCaptureEnabledInFullscreenMenu"] = (mode & CursorCaptureMode_EnabledInFullscreenMenu) ? "yes" : "no";
12371280
TheMouse->setCursorCaptureMode(mode);
12381281
}
12391282

Generals/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
// ------------------------------------------------------------------------------------------------

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

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

4141
class Money;
42-
typedef UnsignedInt ScreenEdgeScrollMode;
4342
typedef UnsignedInt CursorCaptureMode;
43+
typedef UnsignedInt ScreenEdgeScrollMode;
4444

4545
//-----------------------------------------------------------------------------
4646
// PUBLIC TYPES ///////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)