terminal/src/types/KeyEvent.cpp
Dustin L. Howett eb2be374fd
Fix SA for Visual Studio 16.8 (#8551)
I added `enum class` to one thing and decided that that was quite enough
before disabling the `enum class` warning.

Looks like 16.8 made more map/vector operations noexcept, so we have to
re-annotate to remain compliant.
2020-12-11 05:04:30 +00:00

184 lines
4.4 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include "precomp.h"
#include "inc/IInputEvent.hpp"
KeyEvent::~KeyEvent()
{
}
INPUT_RECORD KeyEvent::ToInputRecord() const noexcept
{
INPUT_RECORD record{ 0 };
record.EventType = KEY_EVENT;
record.Event.KeyEvent.bKeyDown = !!_keyDown;
record.Event.KeyEvent.wRepeatCount = _repeatCount;
record.Event.KeyEvent.wVirtualKeyCode = _virtualKeyCode;
record.Event.KeyEvent.wVirtualScanCode = _virtualScanCode;
record.Event.KeyEvent.uChar.UnicodeChar = _charData;
record.Event.KeyEvent.dwControlKeyState = GetActiveModifierKeys();
return record;
}
InputEventType KeyEvent::EventType() const noexcept
{
return InputEventType::KeyEvent;
}
void KeyEvent::SetKeyDown(const bool keyDown) noexcept
{
_keyDown = keyDown;
}
void KeyEvent::SetRepeatCount(const WORD repeatCount) noexcept
{
_repeatCount = repeatCount;
}
void KeyEvent::SetVirtualKeyCode(const WORD virtualKeyCode) noexcept
{
_virtualKeyCode = virtualKeyCode;
}
void KeyEvent::SetVirtualScanCode(const WORD virtualScanCode) noexcept
{
_virtualScanCode = virtualScanCode;
}
void KeyEvent::SetCharData(const wchar_t character) noexcept
{
_charData = character;
}
void KeyEvent::SetActiveModifierKeys(const DWORD activeModifierKeys) noexcept
{
_activeModifierKeys = static_cast<KeyEvent::Modifiers>(activeModifierKeys);
}
void KeyEvent::DeactivateModifierKey(const ModifierKeyState modifierKey) noexcept
{
DWORD const bitFlag = ToConsoleControlKeyFlag(modifierKey);
auto keys = GetActiveModifierKeys();
WI_ClearAllFlags(keys, bitFlag);
SetActiveModifierKeys(keys);
}
void KeyEvent::ActivateModifierKey(const ModifierKeyState modifierKey) noexcept
{
DWORD const bitFlag = ToConsoleControlKeyFlag(modifierKey);
auto keys = GetActiveModifierKeys();
WI_SetAllFlags(keys, bitFlag);
SetActiveModifierKeys(keys);
}
bool KeyEvent::DoActiveModifierKeysMatch(const std::unordered_set<ModifierKeyState>& consoleModifiers) const noexcept
{
DWORD consoleBits = 0;
for (const ModifierKeyState& mod : consoleModifiers)
{
WI_SetAllFlags(consoleBits, ToConsoleControlKeyFlag(mod));
}
return consoleBits == GetActiveModifierKeys();
}
// Routine Description:
// - checks if this key event is a special key for line editing
// Arguments:
// - none
// Return Value:
// - true if this key has special relevance to line editing, false otherwise
bool KeyEvent::IsCommandLineEditingKey() const noexcept
{
if (!IsAltPressed() && !IsCtrlPressed())
{
switch (GetVirtualKeyCode())
{
case VK_ESCAPE:
case VK_PRIOR:
case VK_NEXT:
case VK_END:
case VK_HOME:
case VK_LEFT:
case VK_UP:
case VK_RIGHT:
case VK_DOWN:
case VK_INSERT:
case VK_DELETE:
case VK_F1:
case VK_F2:
case VK_F3:
case VK_F4:
case VK_F5:
case VK_F6:
case VK_F7:
case VK_F8:
case VK_F9:
return true;
default:
break;
}
}
if (IsCtrlPressed())
{
switch (GetVirtualKeyCode())
{
case VK_END:
case VK_HOME:
case VK_LEFT:
case VK_RIGHT:
return true;
default:
break;
}
}
if (IsAltPressed())
{
switch (GetVirtualKeyCode())
{
case VK_F7:
case VK_F10:
return true;
default:
break;
}
}
return false;
}
// Routine Description:
// - checks if this key event is a special key for popups
// Arguments:
// - None
// Return Value:
// - true if this key has special relevance to popups, false otherwise
bool KeyEvent::IsPopupKey() const noexcept
{
if (!IsAltPressed() && !IsCtrlPressed())
{
switch (GetVirtualKeyCode())
{
case VK_ESCAPE:
case VK_PRIOR:
case VK_NEXT:
case VK_END:
case VK_HOME:
case VK_LEFT:
case VK_UP:
case VK_RIGHT:
case VK_DOWN:
case VK_F2:
case VK_F4:
case VK_F7:
case VK_F9:
case VK_DELETE:
return true;
default:
break;
}
}
return false;
}