2019-05-03 00:29:04 +02:00
|
|
|
/*++
|
|
|
|
Copyright (c) Microsoft Corporation
|
|
|
|
Licensed under the MIT license.
|
|
|
|
|
|
|
|
Module Name:
|
|
|
|
- terminalInput.hpp
|
|
|
|
|
|
|
|
Abstract:
|
|
|
|
- This serves as an adapter between virtual key input from a user and the virtual terminal sequences that are
|
|
|
|
typically emitted by an xterm-compatible console.
|
|
|
|
|
|
|
|
Author(s):
|
|
|
|
- Michael Niksa (MiNiksa) 30-Oct-2015
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#include <functional>
|
|
|
|
#include "../../types/inc/IInputEvent.hpp"
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
namespace Microsoft::Console::VirtualTerminal
|
|
|
|
{
|
|
|
|
class TerminalInput final
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
TerminalInput(_In_ std::function<void(std::deque<std::unique_ptr<IInputEvent>>&)> pfn);
|
2019-05-30 20:15:37 +02:00
|
|
|
|
|
|
|
TerminalInput() = delete;
|
|
|
|
TerminalInput(const TerminalInput& old) = default;
|
|
|
|
TerminalInput(TerminalInput&& moved) = default;
|
|
|
|
|
|
|
|
TerminalInput& operator=(const TerminalInput& old) = default;
|
|
|
|
TerminalInput& operator=(TerminalInput&& moved) = default;
|
|
|
|
|
|
|
|
~TerminalInput() = default;
|
2019-05-03 00:29:04 +02:00
|
|
|
|
2020-04-07 21:09:28 +02:00
|
|
|
bool HandleKey(const IInputEvent* const pInEvent);
|
2019-05-03 00:29:04 +02:00
|
|
|
|
2021-10-26 23:12:22 +02:00
|
|
|
enum class Mode : size_t
|
|
|
|
{
|
|
|
|
Ansi,
|
|
|
|
Keypad,
|
|
|
|
CursorKey,
|
|
|
|
Win32,
|
|
|
|
|
|
|
|
Utf8MouseEncoding,
|
|
|
|
SgrMouseEncoding,
|
|
|
|
|
|
|
|
DefaultMouseTracking,
|
|
|
|
ButtonEventMouseTracking,
|
|
|
|
AnyEventMouseTracking,
|
|
|
|
|
|
|
|
AlternateScroll
|
|
|
|
};
|
|
|
|
|
2021-11-23 19:44:58 +01:00
|
|
|
void SetInputMode(const Mode mode, const bool enabled) noexcept;
|
|
|
|
bool GetInputMode(const Mode mode) const noexcept;
|
2020-06-09 00:31:28 +02:00
|
|
|
void ForceDisableWin32InputMode(const bool win32InputMode) noexcept;
|
|
|
|
|
2020-03-12 23:25:43 +01:00
|
|
|
#pragma region MouseInput
|
|
|
|
// These methods are defined in mouseInput.cpp
|
2020-08-08 01:21:09 +02:00
|
|
|
|
|
|
|
struct MouseButtonState
|
|
|
|
{
|
|
|
|
bool isLeftButtonDown;
|
|
|
|
bool isMiddleButtonDown;
|
|
|
|
bool isRightButtonDown;
|
|
|
|
};
|
|
|
|
|
2020-03-12 23:25:43 +01:00
|
|
|
bool HandleMouse(const COORD position,
|
|
|
|
const unsigned int button,
|
|
|
|
const short modifierKeyState,
|
2020-08-08 01:21:09 +02:00
|
|
|
const short delta,
|
|
|
|
const MouseButtonState state);
|
2020-03-13 01:44:28 +01:00
|
|
|
|
|
|
|
bool IsTrackingMouseInput() const noexcept;
|
2020-03-12 23:25:43 +01:00
|
|
|
#pragma endregion
|
|
|
|
|
|
|
|
#pragma region MouseInputState Management
|
|
|
|
// These methods are defined in mouseInputState.cpp
|
|
|
|
void UseAlternateScreenBuffer() noexcept;
|
|
|
|
void UseMainScreenBuffer() noexcept;
|
|
|
|
#pragma endregion
|
|
|
|
|
2019-05-03 00:29:04 +02:00
|
|
|
private:
|
|
|
|
std::function<void(std::deque<std::unique_ptr<IInputEvent>>&)> _pfnWriteEvents;
|
2019-10-11 23:02:09 +02:00
|
|
|
|
|
|
|
// storage location for the leading surrogate of a utf-16 surrogate pair
|
|
|
|
std::optional<wchar_t> _leadingSurrogate;
|
|
|
|
|
2021-10-26 23:12:22 +02:00
|
|
|
til::enumset<Mode> _inputMode{ Mode::Ansi };
|
2020-06-09 00:31:28 +02:00
|
|
|
bool _forceDisableWin32InputMode{ false };
|
2019-05-03 00:29:04 +02:00
|
|
|
|
2020-04-07 21:09:28 +02:00
|
|
|
void _SendChar(const wchar_t ch);
|
2019-05-03 00:29:04 +02:00
|
|
|
void _SendNullInputSequence(const DWORD dwControlKeyState) const;
|
2020-03-12 23:25:43 +01:00
|
|
|
void _SendInputSequence(const std::wstring_view sequence) const noexcept;
|
2019-05-03 00:29:04 +02:00
|
|
|
void _SendEscapedInputSequence(const wchar_t wch) const;
|
2020-06-09 00:31:28 +02:00
|
|
|
static std::wstring _GenerateWin32KeySequence(const KeyEvent& key);
|
2020-03-12 23:25:43 +01:00
|
|
|
|
|
|
|
#pragma region MouseInputState Management
|
|
|
|
// These methods are defined in mouseInputState.cpp
|
|
|
|
struct MouseInputState
|
|
|
|
{
|
|
|
|
bool inAlternateBuffer{ false };
|
|
|
|
COORD lastPos{ -1, -1 };
|
|
|
|
unsigned int lastButton{ 0 };
|
2020-07-10 01:24:17 +02:00
|
|
|
int accumulatedDelta{ 0 };
|
2020-03-12 23:25:43 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
MouseInputState _mouseInputState;
|
|
|
|
#pragma endregion
|
|
|
|
|
|
|
|
#pragma region MouseInput
|
|
|
|
static std::wstring _GenerateDefaultSequence(const COORD position,
|
|
|
|
const unsigned int button,
|
|
|
|
const bool isHover,
|
|
|
|
const short modifierKeyState,
|
|
|
|
const short delta);
|
|
|
|
static std::wstring _GenerateUtf8Sequence(const COORD position,
|
|
|
|
const unsigned int button,
|
|
|
|
const bool isHover,
|
|
|
|
const short modifierKeyState,
|
|
|
|
const short delta);
|
|
|
|
static std::wstring _GenerateSGRSequence(const COORD position,
|
|
|
|
const unsigned int button,
|
|
|
|
const bool isDown,
|
|
|
|
const bool isHover,
|
|
|
|
const short modifierKeyState,
|
|
|
|
const short delta);
|
|
|
|
|
2021-11-23 19:44:58 +01:00
|
|
|
bool _ShouldSendAlternateScroll(const unsigned int button, const short delta) const noexcept;
|
|
|
|
bool _SendAlternateScroll(const short delta) const noexcept;
|
2020-03-12 23:25:43 +01:00
|
|
|
|
2020-08-08 01:21:09 +02:00
|
|
|
static constexpr unsigned int s_GetPressedButton(const MouseButtonState state) noexcept;
|
2020-03-12 23:25:43 +01:00
|
|
|
#pragma endregion
|
2019-05-03 00:29:04 +02:00
|
|
|
};
|
|
|
|
}
|