Improve debugging experience of key events (#2872)
... by adding natvis rules for display and by typifying the flags field so the debugger presents it as flags naturally.
This commit is contained in:
parent
a862f3196f
commit
60c6a9fb8f
|
@ -57,7 +57,7 @@ std::wostream& operator<<(std::wostream& stream, const KeyEvent* const pKeyEvent
|
|||
L"keyCode: " << pKeyEvent->_virtualKeyCode << L", " <<
|
||||
L"scanCode: " << pKeyEvent->_virtualScanCode << L", " <<
|
||||
L"char: " << charData << L", " <<
|
||||
L"mods: " << pKeyEvent->_activeModifierKeys << L")";
|
||||
L"mods: " << pKeyEvent->GetActiveModifierKeys() << L")";
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ INPUT_RECORD KeyEvent::ToInputRecord() const noexcept
|
|||
record.Event.KeyEvent.wVirtualKeyCode = _virtualKeyCode;
|
||||
record.Event.KeyEvent.wVirtualScanCode = _virtualScanCode;
|
||||
record.Event.KeyEvent.uChar.UnicodeChar = _charData;
|
||||
record.Event.KeyEvent.dwControlKeyState = _activeModifierKeys;
|
||||
record.Event.KeyEvent.dwControlKeyState = GetActiveModifierKeys();
|
||||
return record;
|
||||
}
|
||||
|
||||
|
@ -53,19 +53,23 @@ void KeyEvent::SetCharData(const wchar_t character) noexcept
|
|||
|
||||
void KeyEvent::SetActiveModifierKeys(const DWORD activeModifierKeys) noexcept
|
||||
{
|
||||
_activeModifierKeys = activeModifierKeys;
|
||||
_activeModifierKeys = static_cast<KeyEvent::Modifiers>(activeModifierKeys);
|
||||
}
|
||||
|
||||
void KeyEvent::DeactivateModifierKey(const ModifierKeyState modifierKey) noexcept
|
||||
{
|
||||
DWORD const bitFlag = ToConsoleControlKeyFlag(modifierKey);
|
||||
WI_ClearAllFlags(_activeModifierKeys, bitFlag);
|
||||
auto keys = GetActiveModifierKeys();
|
||||
WI_ClearAllFlags(keys, bitFlag);
|
||||
SetActiveModifierKeys(keys);
|
||||
}
|
||||
|
||||
void KeyEvent::ActivateModifierKey(const ModifierKeyState modifierKey) noexcept
|
||||
{
|
||||
DWORD const bitFlag = ToConsoleControlKeyFlag(modifierKey);
|
||||
WI_SetAllFlags(_activeModifierKeys, bitFlag);
|
||||
auto keys = GetActiveModifierKeys();
|
||||
WI_SetAllFlags(keys, bitFlag);
|
||||
SetActiveModifierKeys(keys);
|
||||
}
|
||||
|
||||
bool KeyEvent::DoActiveModifierKeysMatch(const std::unordered_set<ModifierKeyState>& consoleModifiers) const
|
||||
|
@ -75,7 +79,7 @@ bool KeyEvent::DoActiveModifierKeysMatch(const std::unordered_set<ModifierKeySta
|
|||
{
|
||||
WI_SetAllFlags(consoleBits, ToConsoleControlKeyFlag(mod));
|
||||
}
|
||||
return consoleBits == _activeModifierKeys;
|
||||
return consoleBits == GetActiveModifierKeys();
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
|
|
|
@ -120,6 +120,28 @@ DWORD ToConsoleControlKeyFlag(const ModifierKeyState modifierKey) noexcept;
|
|||
class KeyEvent : public IInputEvent
|
||||
{
|
||||
public:
|
||||
enum class Modifiers : DWORD
|
||||
{
|
||||
None = 0,
|
||||
RightAlt = RIGHT_ALT_PRESSED,
|
||||
LeftAlt = LEFT_ALT_PRESSED,
|
||||
RightCtrl = RIGHT_CTRL_PRESSED,
|
||||
LeftCtrl = LEFT_CTRL_PRESSED,
|
||||
Shift = SHIFT_PRESSED,
|
||||
NumLock = NUMLOCK_ON,
|
||||
ScrollLock = SCROLLLOCK_ON,
|
||||
CapsLock = CAPSLOCK_ON,
|
||||
EnhancedKey = ENHANCED_KEY,
|
||||
DbcsChar = NLS_DBCSCHAR,
|
||||
Alphanumeric = NLS_ALPHANUMERIC,
|
||||
Katakana = NLS_KATAKANA,
|
||||
Hiragana = NLS_HIRAGANA,
|
||||
Roman = NLS_ROMAN,
|
||||
ImeConvert = NLS_IME_CONVERSION,
|
||||
AltNumpad = ALTNUMPAD_BIT,
|
||||
ImeDisable = NLS_IME_DISABLE
|
||||
};
|
||||
|
||||
constexpr KeyEvent(const KEY_EVENT_RECORD& record) :
|
||||
_keyDown{ !!record.bKeyDown },
|
||||
_repeatCount{ record.wRepeatCount },
|
||||
|
@ -166,28 +188,28 @@ public:
|
|||
|
||||
constexpr bool IsShiftPressed() const noexcept
|
||||
{
|
||||
return WI_IsFlagSet(_activeModifierKeys, SHIFT_PRESSED);
|
||||
return WI_IsFlagSet(GetActiveModifierKeys(), SHIFT_PRESSED);
|
||||
}
|
||||
|
||||
constexpr bool IsAltPressed() const noexcept
|
||||
{
|
||||
return WI_IsAnyFlagSet(_activeModifierKeys, ALT_PRESSED);
|
||||
return WI_IsAnyFlagSet(GetActiveModifierKeys(), ALT_PRESSED);
|
||||
}
|
||||
|
||||
constexpr bool IsCtrlPressed() const noexcept
|
||||
{
|
||||
return WI_IsAnyFlagSet(_activeModifierKeys, CTRL_PRESSED);
|
||||
return WI_IsAnyFlagSet(GetActiveModifierKeys(), CTRL_PRESSED);
|
||||
}
|
||||
|
||||
constexpr bool IsAltGrPressed() const noexcept
|
||||
{
|
||||
return WI_IsFlagSet(_activeModifierKeys, LEFT_CTRL_PRESSED) &&
|
||||
WI_IsFlagSet(_activeModifierKeys, RIGHT_ALT_PRESSED);
|
||||
return WI_IsFlagSet(GetActiveModifierKeys(), LEFT_CTRL_PRESSED) &&
|
||||
WI_IsFlagSet(GetActiveModifierKeys(), RIGHT_ALT_PRESSED);
|
||||
}
|
||||
|
||||
constexpr bool IsModifierPressed() const noexcept
|
||||
{
|
||||
return WI_IsAnyFlagSet(_activeModifierKeys, MOD_PRESSED);
|
||||
return WI_IsAnyFlagSet(GetActiveModifierKeys(), MOD_PRESSED);
|
||||
}
|
||||
|
||||
constexpr bool IsCursorKey() const noexcept
|
||||
|
@ -198,7 +220,7 @@ public:
|
|||
|
||||
constexpr bool IsAltNumpadSet() const noexcept
|
||||
{
|
||||
return WI_IsFlagSet(_activeModifierKeys, ALTNUMPAD_BIT);
|
||||
return WI_IsFlagSet(GetActiveModifierKeys(), ALTNUMPAD_BIT);
|
||||
}
|
||||
|
||||
constexpr bool IsKeyDown() const noexcept
|
||||
|
@ -233,7 +255,7 @@ public:
|
|||
|
||||
constexpr DWORD GetActiveModifierKeys() const noexcept
|
||||
{
|
||||
return _activeModifierKeys;
|
||||
return static_cast<DWORD>(_activeModifierKeys);
|
||||
}
|
||||
|
||||
void SetKeyDown(const bool keyDown) noexcept;
|
||||
|
@ -255,7 +277,7 @@ private:
|
|||
WORD _virtualKeyCode;
|
||||
WORD _virtualScanCode;
|
||||
wchar_t _charData;
|
||||
DWORD _activeModifierKeys;
|
||||
Modifiers _activeModifierKeys;
|
||||
|
||||
friend constexpr bool operator==(const KeyEvent& a, const KeyEvent& b) noexcept;
|
||||
#ifdef UNIT_TESTING
|
||||
|
|
|
@ -72,4 +72,9 @@
|
|||
<ExpandedItem>_Mypair._Myval2</ExpandedItem>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="KeyEvent">
|
||||
<DisplayString Condition="_keyDown">{{↓ wch:{_charData} mod:{_activeModifierKeys} repeat:{_repeatCount} vk:{_virtualKeyCode} vsc:{_virtualScanCode}}</DisplayString>
|
||||
<DisplayString Condition="!_keyDown">{{↑ wch:{_charData} mod:{_activeModifierKeys} repeat:{_repeatCount} vk:{_virtualKeyCode} vsc:{_virtualScanCode}}</DisplayString>
|
||||
</Type>
|
||||
</AutoVisualizer>
|
||||
|
|
Loading…
Reference in a new issue