mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-09-23 06:53:43 +00:00
Add command/meta key support
This commit is contained in:
@@ -1637,6 +1637,14 @@ static bool IdentifyVKey(const SDL_KeyboardEvent *keyEvt, GpKeyIDSubset_t &outSu
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SDLK_LGUI:
|
||||||
|
outSubset = GpKeyIDSubsets::kSpecial;
|
||||||
|
outKey.m_specialKey = GpKeySpecials::kLeftCommand;
|
||||||
|
break;
|
||||||
|
case SDLK_RGUI:
|
||||||
|
outSubset = GpKeyIDSubsets::kSpecial;
|
||||||
|
outKey.m_specialKey = GpKeySpecials::kRightCommand;
|
||||||
|
break;
|
||||||
case SDLK_LCTRL:
|
case SDLK_LCTRL:
|
||||||
outSubset = GpKeyIDSubsets::kSpecial;
|
outSubset = GpKeyIDSubsets::kSpecial;
|
||||||
outKey.m_specialKey = GpKeySpecials::kLeftCtrl;
|
outKey.m_specialKey = GpKeySpecials::kLeftCtrl;
|
||||||
|
@@ -145,7 +145,7 @@ void HandleKeyEvent (const KeyDownStates &keyStates, const GpKeyboardInputEvent
|
|||||||
{
|
{
|
||||||
const intptr_t theChar = PackVOSKeyCode(theEvent);
|
const intptr_t theChar = PackVOSKeyCode(theEvent);
|
||||||
const bool shiftDown = keyStates.IsSet(PL_KEY_EITHER_SPECIAL(kShift));
|
const bool shiftDown = keyStates.IsSet(PL_KEY_EITHER_SPECIAL(kShift));
|
||||||
const bool commandDown = keyStates.IsSet(PL_KEY_EITHER_SPECIAL(kControl));
|
const bool commandDown = keyStates.IsSet(PL_KEY_SHORTCUT);
|
||||||
const bool optionDown = keyStates.IsSet(PL_KEY_EITHER_SPECIAL(kAlt));
|
const bool optionDown = keyStates.IsSet(PL_KEY_EITHER_SPECIAL(kAlt));
|
||||||
|
|
||||||
if ((commandDown) && (!optionDown))
|
if ((commandDown) && (!optionDown))
|
||||||
@@ -413,7 +413,7 @@ void HandleEvent (void)
|
|||||||
bool itHappened = true;
|
bool itHappened = true;
|
||||||
|
|
||||||
const KeyDownStates *eventKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
const KeyDownStates *eventKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
||||||
if ((eventKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl))) &&
|
if ((eventKeys->IsSet(PL_KEY_SHORTCUT)) &&
|
||||||
(eventKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))))
|
(eventKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))))
|
||||||
{
|
{
|
||||||
HiliteAllObjects();
|
HiliteAllObjects();
|
||||||
|
@@ -228,7 +228,7 @@ void DoGameOverStarAnimation (void)
|
|||||||
{
|
{
|
||||||
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
||||||
|
|
||||||
if ((theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl))) || (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))) || (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kShift))))
|
if ((theKeys->IsSet(PL_KEY_SHORTCUT)) || (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))) || (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kShift))))
|
||||||
noInteruption = false;
|
noInteruption = false;
|
||||||
|
|
||||||
if (PortabilityLayer::EventQueue::GetInstance()->Dequeue(&theEvent))
|
if (PortabilityLayer::EventQueue::GetInstance()->Dequeue(&theEvent))
|
||||||
@@ -475,7 +475,7 @@ void DoDiedGameOver (void)
|
|||||||
{
|
{
|
||||||
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
||||||
|
|
||||||
if ((theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))) || (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl))) || (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kShift))))
|
if ((theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))) || (theKeys->IsSet(PL_KEY_SHORTCUT)) || (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kShift))))
|
||||||
{
|
{
|
||||||
pagesStuck = 8;
|
pagesStuck = 8;
|
||||||
userAborted = true;
|
userAborted = true;
|
||||||
|
@@ -403,7 +403,7 @@ void DoPause (void)
|
|||||||
if ((isEscPauseKey && theKeys->IsSet(PL_KEY_SPECIAL(kEscape))) ||
|
if ((isEscPauseKey && theKeys->IsSet(PL_KEY_SPECIAL(kEscape))) ||
|
||||||
(!isEscPauseKey && theKeys->IsSet(PL_KEY_SPECIAL(kTab))))
|
(!isEscPauseKey && theKeys->IsSet(PL_KEY_SPECIAL(kTab))))
|
||||||
paused = false;
|
paused = false;
|
||||||
else if (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl)))
|
else if (theKeys->IsSet(PL_KEY_SHORTCUT))
|
||||||
DoCommandKey();
|
DoCommandKey();
|
||||||
|
|
||||||
Delay(1, nullptr);
|
Delay(1, nullptr);
|
||||||
@@ -513,7 +513,7 @@ void DoHeliumEngaged (gliderPtr thisGlider)
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl)))
|
if (theKeys->IsSet(PL_KEY_SHORTCUT))
|
||||||
DoCommandKey();
|
DoCommandKey();
|
||||||
|
|
||||||
// Cheesy - Use touchscreen menu as quit
|
// Cheesy - Use touchscreen menu as quit
|
||||||
@@ -601,7 +601,7 @@ void GetInput (gliderPtr thisGlider)
|
|||||||
{
|
{
|
||||||
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
||||||
|
|
||||||
if (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl)))
|
if (theKeys->IsSet(PL_KEY_SHORTCUT))
|
||||||
DoCommandKey();
|
DoCommandKey();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2664,7 +2664,7 @@ void HiliteAllObjects (void)
|
|||||||
{
|
{
|
||||||
Delay(1, nullptr);
|
Delay(1, nullptr);
|
||||||
}
|
}
|
||||||
while ((theseKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl))) &&
|
while ((theseKeys->IsSet(PL_KEY_SHORTCUT)) &&
|
||||||
(theseKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))));
|
(theseKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt))));
|
||||||
|
|
||||||
for (i = 0; i < kMaxRoomObs; i++)
|
for (i = 0; i < kMaxRoomObs; i++)
|
||||||
|
@@ -470,7 +470,7 @@ Boolean WaitForInputEvent (short seconds)
|
|||||||
{
|
{
|
||||||
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
||||||
|
|
||||||
if (theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl)) || theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt)) || theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kShift)))
|
if (theKeys->IsSet(PL_KEY_SHORTCUT) || theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kAlt)) || theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kShift)))
|
||||||
waiting = false;
|
waiting = false;
|
||||||
|
|
||||||
if (PortabilityLayer::EventQueue::GetInstance()->Dequeue(&theEvent))
|
if (PortabilityLayer::EventQueue::GetInstance()->Dequeue(&theEvent))
|
||||||
@@ -501,7 +501,7 @@ void WaitCommandQReleased (void)
|
|||||||
{
|
{
|
||||||
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
const KeyDownStates *theKeys = PortabilityLayer::InputManager::GetInstance()->GetKeys();
|
||||||
|
|
||||||
if (!theKeys->IsSet(PL_KEY_EITHER_SPECIAL(kControl)) || !theKeys->IsSet(PL_KEY_ASCII('Q')))
|
if (!theKeys->IsSet(PL_KEY_SHORTCUT) || !theKeys->IsSet(PL_KEY_ASCII('Q')))
|
||||||
waiting = false;
|
waiting = false;
|
||||||
|
|
||||||
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
|
||||||
|
@@ -101,6 +101,8 @@ namespace GpKeySpecials
|
|||||||
kRightCtrl,
|
kRightCtrl,
|
||||||
kLeftAlt,
|
kLeftAlt,
|
||||||
kRightAlt,
|
kRightAlt,
|
||||||
|
kLeftCommand,
|
||||||
|
kRightCommand,
|
||||||
kNumLock,
|
kNumLock,
|
||||||
kLeftArrow,
|
kLeftArrow,
|
||||||
kUpArrow,
|
kUpArrow,
|
||||||
|
@@ -12,6 +12,8 @@ static bool BitTestEitherSpecial(const KeyDownStates &keyMap, int eitherSpecial)
|
|||||||
return keyMap.m_special.Get(GpKeySpecials::kLeftShift) || keyMap.m_special.Get(GpKeySpecials::kRightShift);
|
return keyMap.m_special.Get(GpKeySpecials::kLeftShift) || keyMap.m_special.Get(GpKeySpecials::kRightShift);
|
||||||
case KeyEventEitherSpecialCategories::kControl:
|
case KeyEventEitherSpecialCategories::kControl:
|
||||||
return keyMap.m_special.Get(GpKeySpecials::kLeftCtrl) || keyMap.m_special.Get(GpKeySpecials::kRightCtrl);
|
return keyMap.m_special.Get(GpKeySpecials::kLeftCtrl) || keyMap.m_special.Get(GpKeySpecials::kRightCtrl);
|
||||||
|
case KeyEventEitherSpecialCategories::kCommand:
|
||||||
|
return keyMap.m_special.Get(GpKeySpecials::kLeftCommand) || keyMap.m_special.Get(GpKeySpecials::kRightCommand);
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
return false;
|
return false;
|
||||||
|
@@ -26,6 +26,7 @@ namespace KeyEventEitherSpecialCategories
|
|||||||
kControl,
|
kControl,
|
||||||
kAlt,
|
kAlt,
|
||||||
kShift,
|
kShift,
|
||||||
|
kCommand,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,6 +44,7 @@ namespace KeyEventEitherSpecialCategories
|
|||||||
#define PL_KEY_NUMPAD_SPECIAL_ENCODE(k) ((KeyEventType_NumPadSpecial) | ((k) << PL_INPUT_TYPE_CODE_BITS))
|
#define PL_KEY_NUMPAD_SPECIAL_ENCODE(k) ((KeyEventType_NumPadSpecial) | ((k) << PL_INPUT_TYPE_CODE_BITS))
|
||||||
#define PL_KEY_FKEY(k) ((KeyEventType_FKey) | ((k) << PL_INPUT_TYPE_CODE_BITS))
|
#define PL_KEY_FKEY(k) ((KeyEventType_FKey) | ((k) << PL_INPUT_TYPE_CODE_BITS))
|
||||||
#define PL_KEY_EITHER_SPECIAL(k) ((KeyEventType_EitherSpecial) | ((KeyEventEitherSpecialCategories::k) << PL_INPUT_TYPE_CODE_BITS))
|
#define PL_KEY_EITHER_SPECIAL(k) ((KeyEventType_EitherSpecial) | ((KeyEventEitherSpecialCategories::k) << PL_INPUT_TYPE_CODE_BITS))
|
||||||
|
#define PL_KEY_SHORTCUT (GetShortcutKeySpecial())
|
||||||
#define PL_KEY_GAMEPAD_BUTTON(k, pl) ((KeyEventType_GamepadButton) | (pl << PL_INPUT_TYPE_CODE_BITS) | ((GpGamepadButtons::k) << (PL_INPUT_TYPE_CODE_BITS + PL_INPUT_PLAYER_INDEX_BITS)))
|
#define PL_KEY_GAMEPAD_BUTTON(k, pl) ((KeyEventType_GamepadButton) | (pl << PL_INPUT_TYPE_CODE_BITS) | ((GpGamepadButtons::k) << (PL_INPUT_TYPE_CODE_BITS + PL_INPUT_PLAYER_INDEX_BITS)))
|
||||||
#define PL_KEY_GAMEPAD_BUTTON_ENCODE(k, pl) ((KeyEventType_GamepadButton) | (pl << PL_INPUT_TYPE_CODE_BITS) | ((k) << (PL_INPUT_TYPE_CODE_BITS + PL_INPUT_PLAYER_INDEX_BITS)))
|
#define PL_KEY_GAMEPAD_BUTTON_ENCODE(k, pl) ((KeyEventType_GamepadButton) | (pl << PL_INPUT_TYPE_CODE_BITS) | ((k) << (PL_INPUT_TYPE_CODE_BITS + PL_INPUT_PLAYER_INDEX_BITS)))
|
||||||
|
|
||||||
@@ -50,6 +52,7 @@ namespace KeyEventEitherSpecialCategories
|
|||||||
#define PL_KEY_GET_VALUE(k) ((k) >> PL_INPUT_TYPE_CODE_BITS)
|
#define PL_KEY_GET_VALUE(k) ((k) >> PL_INPUT_TYPE_CODE_BITS)
|
||||||
|
|
||||||
intptr_t PackVOSKeyCode(const GpKeyboardInputEvent &evt);
|
intptr_t PackVOSKeyCode(const GpKeyboardInputEvent &evt);
|
||||||
|
intptr_t GetShortcutKeySpecial();
|
||||||
|
|
||||||
struct KeyDownStates
|
struct KeyDownStates
|
||||||
{
|
{
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
#include "PLCore.h"
|
#include "PLCore.h"
|
||||||
#include "AppEventHandler.h"
|
#include "AppEventHandler.h"
|
||||||
|
#include "PLDrivers.h"
|
||||||
#include "PLEventQueue.h"
|
#include "PLEventQueue.h"
|
||||||
#include "PLKeyEncoding.h"
|
#include "PLKeyEncoding.h"
|
||||||
#include "PLMovies.h"
|
#include "PLMovies.h"
|
||||||
@@ -9,6 +10,7 @@
|
|||||||
#include "GpVOSEvent.h"
|
#include "GpVOSEvent.h"
|
||||||
#include "IGpDisplayDriver.h"
|
#include "IGpDisplayDriver.h"
|
||||||
#include "IGpVOSEventQueue.h"
|
#include "IGpVOSEventQueue.h"
|
||||||
|
#include "IGpSystemServices.h"
|
||||||
#include "InputManager.h"
|
#include "InputManager.h"
|
||||||
#include "HostSuspendCallArgument.h"
|
#include "HostSuspendCallArgument.h"
|
||||||
#include "HostSuspendHook.h"
|
#include "HostSuspendHook.h"
|
||||||
@@ -131,6 +133,15 @@ intptr_t PackVOSKeyCode(const GpKeyboardInputEvent &vosEvent)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
intptr_t GetShortcutKeySpecial()
|
||||||
|
{
|
||||||
|
if (PLDrivers::GetSystemServices()->GetOperatingSystem() == GpOperatingSystems::kMacOS)
|
||||||
|
return PL_KEY_EITHER_SPECIAL(kCommand);
|
||||||
|
else
|
||||||
|
return PL_KEY_EITHER_SPECIAL(kControl);
|
||||||
|
}
|
||||||
|
|
||||||
static void TranslateVOSEvent(const GpVOSEvent *vosEvent, uint32_t timestamp, PortabilityLayer::EventQueue *queue)
|
static void TranslateVOSEvent(const GpVOSEvent *vosEvent, uint32_t timestamp, PortabilityLayer::EventQueue *queue)
|
||||||
{
|
{
|
||||||
switch (vosEvent->m_eventType)
|
switch (vosEvent->m_eventType)
|
||||||
|
Reference in New Issue
Block a user