|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef CONSOLEINPUT_H |
|
#define CONSOLEINPUT_H |
|
|
|
#include <windows.h> |
|
#include <stdint.h> |
|
|
|
#include <memory> |
|
#include <string> |
|
#include <vector> |
|
|
|
#include "Coord.h" |
|
#include "InputMap.h" |
|
#include "SmallRect.h" |
|
|
|
class Win32Console; |
|
class DsrSender; |
|
|
|
class ConsoleInput |
|
{ |
|
public: |
|
ConsoleInput(HANDLE conin, int mouseMode, DsrSender &dsrSender, |
|
Win32Console &console); |
|
void writeInput(const std::string &input); |
|
void flushIncompleteEscapeCode(); |
|
void setMouseWindowRect(SmallRect val) { m_mouseWindowRect = val; } |
|
void updateInputFlags(bool forceTrace=false); |
|
bool shouldActivateTerminalMouse(); |
|
|
|
private: |
|
void doWrite(bool isEof); |
|
void flushInputRecords(std::vector<INPUT_RECORD> &records); |
|
int scanInput(std::vector<INPUT_RECORD> &records, |
|
const char *input, |
|
int inputSize, |
|
bool isEof); |
|
int scanMouseInput(std::vector<INPUT_RECORD> &records, |
|
const char *input, |
|
int inputSize); |
|
void appendUtf8Char(std::vector<INPUT_RECORD> &records, |
|
const char *charBuffer, |
|
int charLen, |
|
bool terminalAltEscape); |
|
void appendKeyPress(std::vector<INPUT_RECORD> &records, |
|
uint16_t virtualKey, |
|
uint32_t winCodePointDn, |
|
uint32_t winCodePointUp, |
|
uint16_t winKeyState, |
|
uint32_t vtCodePoint, |
|
uint16_t vtKeyState); |
|
|
|
public: |
|
static void appendCPInputRecords(std::vector<INPUT_RECORD> &records, |
|
BOOL keyDown, |
|
uint16_t virtualKey, |
|
uint32_t codePoint, |
|
uint16_t keyState); |
|
static void appendInputRecord(std::vector<INPUT_RECORD> &records, |
|
BOOL keyDown, |
|
uint16_t virtualKey, |
|
wchar_t utf16Char, |
|
uint16_t keyState); |
|
|
|
private: |
|
DWORD inputConsoleMode(); |
|
|
|
private: |
|
Win32Console &m_console; |
|
HANDLE m_conin = nullptr; |
|
int m_mouseMode = 0; |
|
DsrSender &m_dsrSender; |
|
bool m_dsrSent = false; |
|
std::string m_byteQueue; |
|
InputMap m_inputMap; |
|
DWORD m_lastWriteTick = 0; |
|
DWORD m_mouseButtonState = 0; |
|
struct DoubleClickDetection { |
|
DWORD button = 0; |
|
Coord pos; |
|
DWORD tick = 0; |
|
bool released = false; |
|
} m_doubleClick; |
|
bool m_enableExtendedEnabled = false; |
|
bool m_mouseInputEnabled = false; |
|
bool m_quickEditEnabled = false; |
|
bool m_escapeInputEnabled = false; |
|
SmallRect m_mouseWindowRect; |
|
}; |
|
|
|
#endif |
|
|