Skip to content

Commit

Permalink
Improve debugging experience of key events (microsoft#2872)
Browse files Browse the repository at this point in the history
... by adding natvis rules for display and by typifying the flags field so the debugger presents it as flags naturally.
  • Loading branch information
miniksa authored and DHowett committed Sep 24, 2019
1 parent a862f31 commit 60c6a9f
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/types/IInputEventStreams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
14 changes: 9 additions & 5 deletions src/types/KeyEvent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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
Expand All @@ -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:
Expand Down
40 changes: 31 additions & 9 deletions src/types/inc/IInputEvent.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 },
Expand Down Expand Up @@ -166,28 +188,28 @@ class KeyEvent : public IInputEvent

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
Expand All @@ -198,7 +220,7 @@ class KeyEvent : public IInputEvent

constexpr bool IsAltNumpadSet() const noexcept
{
return WI_IsFlagSet(_activeModifierKeys, ALTNUMPAD_BIT);
return WI_IsFlagSet(GetActiveModifierKeys(), ALTNUMPAD_BIT);
}

constexpr bool IsKeyDown() const noexcept
Expand Down Expand Up @@ -233,7 +255,7 @@ class KeyEvent : public IInputEvent

constexpr DWORD GetActiveModifierKeys() const noexcept
{
return _activeModifierKeys;
return static_cast<DWORD>(_activeModifierKeys);
}

void SetKeyDown(const bool keyDown) noexcept;
Expand All @@ -255,7 +277,7 @@ class KeyEvent : public IInputEvent
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
Expand Down
5 changes: 5 additions & 0 deletions tools/ConsoleTypes.natvis
Original file line number Diff line number Diff line change
Expand Up @@ -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>

0 comments on commit 60c6a9f

Please sign in to comment.