@shitiandmw/node-pty 1.1.0-agent.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +69 -0
- package/README.md +170 -0
- package/binding.gyp +111 -0
- package/deps/.editorconfig +2 -0
- package/deps/winpty/.drone.yml +17 -0
- package/deps/winpty/.gitattributes +19 -0
- package/deps/winpty/LICENSE +21 -0
- package/deps/winpty/Makefile +166 -0
- package/deps/winpty/README.md +151 -0
- package/deps/winpty/RELEASES.md +280 -0
- package/deps/winpty/VERSION.txt +1 -0
- package/deps/winpty/configure +167 -0
- package/deps/winpty/misc/BufferResizeTests.cc +90 -0
- package/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
- package/deps/winpty/misc/ClearConsole.cc +72 -0
- package/deps/winpty/misc/ConinMode.cc +117 -0
- package/deps/winpty/misc/ConinMode.ps1 +116 -0
- package/deps/winpty/misc/ConoutMode.cc +113 -0
- package/deps/winpty/misc/DebugClient.py +42 -0
- package/deps/winpty/misc/DebugServer.py +63 -0
- package/deps/winpty/misc/DumpLines.py +5 -0
- package/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
- package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
- package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
- package/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
- package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
- package/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
- package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
- package/deps/winpty/misc/FontSurvey.cc +100 -0
- package/deps/winpty/misc/FormatChar.h +21 -0
- package/deps/winpty/misc/FreezePerfTest.cc +62 -0
- package/deps/winpty/misc/GetCh.cc +20 -0
- package/deps/winpty/misc/GetConsolePos.cc +41 -0
- package/deps/winpty/misc/GetFont.cc +261 -0
- package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
- package/deps/winpty/misc/IsNewConsole.cc +87 -0
- package/deps/winpty/misc/MouseInputNotes.txt +90 -0
- package/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
- package/deps/winpty/misc/Notes.txt +219 -0
- package/deps/winpty/misc/OSVersion.cc +27 -0
- package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
- package/deps/winpty/misc/ScreenBufferTest.cc +671 -0
- package/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
- package/deps/winpty/misc/SelectAllTest.cc +45 -0
- package/deps/winpty/misc/SetBufferSize.cc +32 -0
- package/deps/winpty/misc/SetCursorPos.cc +10 -0
- package/deps/winpty/misc/SetFont.cc +145 -0
- package/deps/winpty/misc/SetWindowRect.cc +36 -0
- package/deps/winpty/misc/ShowArgv.cc +12 -0
- package/deps/winpty/misc/ShowConsoleInput.cc +40 -0
- package/deps/winpty/misc/Spew.py +5 -0
- package/deps/winpty/misc/TestUtil.cc +172 -0
- package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
- package/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
- package/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
- package/deps/winpty/misc/UnixEcho.cc +89 -0
- package/deps/winpty/misc/Utf16Echo.cc +46 -0
- package/deps/winpty/misc/VeryLargeRead.cc +122 -0
- package/deps/winpty/misc/VkEscapeTest.cc +56 -0
- package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
- package/deps/winpty/misc/Win10WrapTest1.cc +57 -0
- package/deps/winpty/misc/Win10WrapTest2.cc +30 -0
- package/deps/winpty/misc/Win32Echo1.cc +26 -0
- package/deps/winpty/misc/Win32Echo2.cc +19 -0
- package/deps/winpty/misc/Win32Test1.cc +46 -0
- package/deps/winpty/misc/Win32Test2.cc +70 -0
- package/deps/winpty/misc/Win32Test3.cc +78 -0
- package/deps/winpty/misc/Win32Write1.cc +44 -0
- package/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
- package/deps/winpty/misc/WriteConsole.cc +106 -0
- package/deps/winpty/misc/build32.sh +9 -0
- package/deps/winpty/misc/build64.sh +9 -0
- package/deps/winpty/misc/color-test.sh +212 -0
- package/deps/winpty/misc/font-notes.txt +300 -0
- package/deps/winpty/misc/winbug-15048.cc +201 -0
- package/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
- package/deps/winpty/ship/common_ship.py +53 -0
- package/deps/winpty/ship/make_msvc_package.py +165 -0
- package/deps/winpty/ship/ship.py +108 -0
- package/deps/winpty/src/agent/Agent.cc +613 -0
- package/deps/winpty/src/agent/Agent.h +103 -0
- package/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
- package/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
- package/deps/winpty/src/agent/ConsoleFont.cc +632 -0
- package/deps/winpty/src/agent/ConsoleFont.h +28 -0
- package/deps/winpty/src/agent/ConsoleInput.cc +852 -0
- package/deps/winpty/src/agent/ConsoleInput.h +109 -0
- package/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
- package/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
- package/deps/winpty/src/agent/ConsoleLine.cc +152 -0
- package/deps/winpty/src/agent/ConsoleLine.h +41 -0
- package/deps/winpty/src/agent/Coord.h +87 -0
- package/deps/winpty/src/agent/DebugShowInput.cc +239 -0
- package/deps/winpty/src/agent/DebugShowInput.h +32 -0
- package/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
- package/deps/winpty/src/agent/DefaultInputMap.h +28 -0
- package/deps/winpty/src/agent/DsrSender.h +30 -0
- package/deps/winpty/src/agent/EventLoop.cc +99 -0
- package/deps/winpty/src/agent/EventLoop.h +47 -0
- package/deps/winpty/src/agent/InputMap.cc +246 -0
- package/deps/winpty/src/agent/InputMap.h +114 -0
- package/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
- package/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
- package/deps/winpty/src/agent/NamedPipe.cc +378 -0
- package/deps/winpty/src/agent/NamedPipe.h +125 -0
- package/deps/winpty/src/agent/Scraper.cc +699 -0
- package/deps/winpty/src/agent/Scraper.h +103 -0
- package/deps/winpty/src/agent/SimplePool.h +75 -0
- package/deps/winpty/src/agent/SmallRect.h +143 -0
- package/deps/winpty/src/agent/Terminal.cc +535 -0
- package/deps/winpty/src/agent/Terminal.h +69 -0
- package/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
- package/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
- package/deps/winpty/src/agent/Win32Console.cc +107 -0
- package/deps/winpty/src/agent/Win32Console.h +67 -0
- package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
- package/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
- package/deps/winpty/src/agent/main.cc +114 -0
- package/deps/winpty/src/agent/subdir.mk +61 -0
- package/deps/winpty/src/configurations.gypi +60 -0
- package/deps/winpty/src/debugserver/DebugServer.cc +117 -0
- package/deps/winpty/src/debugserver/subdir.mk +41 -0
- package/deps/winpty/src/include/winpty.h +242 -0
- package/deps/winpty/src/include/winpty_constants.h +131 -0
- package/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
- package/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
- package/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
- package/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
- package/deps/winpty/src/libwinpty/subdir.mk +46 -0
- package/deps/winpty/src/libwinpty/winpty.cc +970 -0
- package/deps/winpty/src/shared/AgentMsg.h +38 -0
- package/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
- package/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
- package/deps/winpty/src/shared/Buffer.cc +103 -0
- package/deps/winpty/src/shared/Buffer.h +102 -0
- package/deps/winpty/src/shared/DebugClient.cc +187 -0
- package/deps/winpty/src/shared/DebugClient.h +38 -0
- package/deps/winpty/src/shared/GenRandom.cc +138 -0
- package/deps/winpty/src/shared/GenRandom.h +55 -0
- package/deps/winpty/src/shared/GetCommitHash.bat +13 -0
- package/deps/winpty/src/shared/Mutex.h +54 -0
- package/deps/winpty/src/shared/OsModule.h +63 -0
- package/deps/winpty/src/shared/OwnedHandle.cc +36 -0
- package/deps/winpty/src/shared/OwnedHandle.h +45 -0
- package/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
- package/deps/winpty/src/shared/StringBuilder.h +227 -0
- package/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
- package/deps/winpty/src/shared/StringUtil.cc +55 -0
- package/deps/winpty/src/shared/StringUtil.h +80 -0
- package/deps/winpty/src/shared/TimeMeasurement.h +63 -0
- package/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
- package/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
- package/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
- package/deps/winpty/src/shared/WindowsSecurity.h +104 -0
- package/deps/winpty/src/shared/WindowsVersion.cc +252 -0
- package/deps/winpty/src/shared/WindowsVersion.h +29 -0
- package/deps/winpty/src/shared/WinptyAssert.cc +55 -0
- package/deps/winpty/src/shared/WinptyAssert.h +64 -0
- package/deps/winpty/src/shared/WinptyException.cc +57 -0
- package/deps/winpty/src/shared/WinptyException.h +43 -0
- package/deps/winpty/src/shared/WinptyVersion.cc +42 -0
- package/deps/winpty/src/shared/WinptyVersion.h +27 -0
- package/deps/winpty/src/shared/winpty_snprintf.h +99 -0
- package/deps/winpty/src/subdir.mk +5 -0
- package/deps/winpty/src/tests/subdir.mk +28 -0
- package/deps/winpty/src/tests/trivial_test.cc +158 -0
- package/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
- package/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
- package/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
- package/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
- package/deps/winpty/src/unix-adapter/Util.cc +86 -0
- package/deps/winpty/src/unix-adapter/Util.h +31 -0
- package/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
- package/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
- package/deps/winpty/src/unix-adapter/main.cc +729 -0
- package/deps/winpty/src/unix-adapter/subdir.mk +41 -0
- package/deps/winpty/src/winpty.gyp +234 -0
- package/deps/winpty/vcbuild.bat +83 -0
- package/lib/conpty_console_list_agent.js +16 -0
- package/lib/conpty_console_list_agent.js.map +1 -0
- package/lib/eventEmitter2.js +47 -0
- package/lib/eventEmitter2.js.map +1 -0
- package/lib/eventEmitter2.test.js +30 -0
- package/lib/eventEmitter2.test.js.map +1 -0
- package/lib/index.js +52 -0
- package/lib/index.js.map +1 -0
- package/lib/interfaces.js +7 -0
- package/lib/interfaces.js.map +1 -0
- package/lib/shared/conout.js +11 -0
- package/lib/shared/conout.js.map +1 -0
- package/lib/terminal.js +190 -0
- package/lib/terminal.js.map +1 -0
- package/lib/terminal.test.js +139 -0
- package/lib/terminal.test.js.map +1 -0
- package/lib/testUtils.test.js +28 -0
- package/lib/testUtils.test.js.map +1 -0
- package/lib/types.js +7 -0
- package/lib/types.js.map +1 -0
- package/lib/unixTerminal.js +346 -0
- package/lib/unixTerminal.js.map +1 -0
- package/lib/unixTerminal.test.js +351 -0
- package/lib/unixTerminal.test.js.map +1 -0
- package/lib/utils.js +39 -0
- package/lib/utils.js.map +1 -0
- package/lib/windowsConoutConnection.js +125 -0
- package/lib/windowsConoutConnection.js.map +1 -0
- package/lib/windowsPtyAgent.js +320 -0
- package/lib/windowsPtyAgent.js.map +1 -0
- package/lib/windowsPtyAgent.test.js +90 -0
- package/lib/windowsPtyAgent.test.js.map +1 -0
- package/lib/windowsTerminal.js +199 -0
- package/lib/windowsTerminal.js.map +1 -0
- package/lib/windowsTerminal.test.js +219 -0
- package/lib/windowsTerminal.test.js.map +1 -0
- package/lib/worker/conoutSocketWorker.js +22 -0
- package/lib/worker/conoutSocketWorker.js.map +1 -0
- package/package.json +68 -0
- package/prebuilds/darwin-arm64/pty.node +0 -0
- package/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/prebuilds/darwin-x64/pty.node +0 -0
- package/prebuilds/darwin-x64/spawn-helper +0 -0
- package/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/prebuilds/win32-arm64/conpty.node +0 -0
- package/prebuilds/win32-arm64/conpty.pdb +0 -0
- package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
- package/prebuilds/win32-arm64/pty.node +0 -0
- package/prebuilds/win32-arm64/pty.pdb +0 -0
- package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
- package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
- package/prebuilds/win32-arm64/winpty.dll +0 -0
- package/prebuilds/win32-arm64/winpty.pdb +0 -0
- package/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/prebuilds/win32-x64/conpty.node +0 -0
- package/prebuilds/win32-x64/conpty.pdb +0 -0
- package/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
- package/prebuilds/win32-x64/pty.node +0 -0
- package/prebuilds/win32-x64/pty.pdb +0 -0
- package/prebuilds/win32-x64/winpty-agent.exe +0 -0
- package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
- package/prebuilds/win32-x64/winpty.dll +0 -0
- package/prebuilds/win32-x64/winpty.pdb +0 -0
- package/scripts/gen-compile-commands.js +8 -0
- package/scripts/increment-version.js +54 -0
- package/scripts/post-install.js +99 -0
- package/scripts/prebuild.js +39 -0
- package/scripts/sync-prebuild.js +31 -0
- package/scripts/verify-darwin-fd-leak.js +63 -0
- package/src/conpty_console_list_agent.ts +15 -0
- package/src/eventEmitter2.test.ts +30 -0
- package/src/eventEmitter2.ts +48 -0
- package/src/index.ts +52 -0
- package/src/interfaces.ts +130 -0
- package/src/native.d.ts +54 -0
- package/src/shared/conout.ts +15 -0
- package/src/terminal.test.ts +119 -0
- package/src/terminal.ts +211 -0
- package/src/testUtils.test.ts +23 -0
- package/src/tsconfig.json +22 -0
- package/src/types.ts +15 -0
- package/src/unix/pty.cc +808 -0
- package/src/unix/spawn-helper.cc +23 -0
- package/src/unixTerminal.test.ts +367 -0
- package/src/unixTerminal.ts +388 -0
- package/src/utils.ts +29 -0
- package/src/win/conpty.cc +583 -0
- package/src/win/conpty.h +41 -0
- package/src/win/conpty_console_list.cc +44 -0
- package/src/win/path_util.cc +95 -0
- package/src/win/path_util.h +26 -0
- package/src/win/winpty.cc +333 -0
- package/src/windowsConoutConnection.ts +82 -0
- package/src/windowsPtyAgent.test.ts +94 -0
- package/src/windowsPtyAgent.ts +321 -0
- package/src/windowsTerminal.test.ts +229 -0
- package/src/windowsTerminal.ts +203 -0
- package/src/worker/conoutSocketWorker.ts +22 -0
- package/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
- package/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
- package/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
- package/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
- package/typings/node-pty.d.ts +211 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Copyright (c) 2011-2015 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#ifndef CONSOLEINPUT_H
|
|
22
|
+
#define CONSOLEINPUT_H
|
|
23
|
+
|
|
24
|
+
#include <windows.h>
|
|
25
|
+
#include <stdint.h>
|
|
26
|
+
|
|
27
|
+
#include <memory>
|
|
28
|
+
#include <string>
|
|
29
|
+
#include <vector>
|
|
30
|
+
|
|
31
|
+
#include "Coord.h"
|
|
32
|
+
#include "InputMap.h"
|
|
33
|
+
#include "SmallRect.h"
|
|
34
|
+
|
|
35
|
+
class Win32Console;
|
|
36
|
+
class DsrSender;
|
|
37
|
+
|
|
38
|
+
class ConsoleInput
|
|
39
|
+
{
|
|
40
|
+
public:
|
|
41
|
+
ConsoleInput(HANDLE conin, int mouseMode, DsrSender &dsrSender,
|
|
42
|
+
Win32Console &console);
|
|
43
|
+
void writeInput(const std::string &input);
|
|
44
|
+
void flushIncompleteEscapeCode();
|
|
45
|
+
void setMouseWindowRect(SmallRect val) { m_mouseWindowRect = val; }
|
|
46
|
+
void updateInputFlags(bool forceTrace=false);
|
|
47
|
+
bool shouldActivateTerminalMouse();
|
|
48
|
+
|
|
49
|
+
private:
|
|
50
|
+
void doWrite(bool isEof);
|
|
51
|
+
void flushInputRecords(std::vector<INPUT_RECORD> &records);
|
|
52
|
+
int scanInput(std::vector<INPUT_RECORD> &records,
|
|
53
|
+
const char *input,
|
|
54
|
+
int inputSize,
|
|
55
|
+
bool isEof);
|
|
56
|
+
int scanMouseInput(std::vector<INPUT_RECORD> &records,
|
|
57
|
+
const char *input,
|
|
58
|
+
int inputSize);
|
|
59
|
+
void appendUtf8Char(std::vector<INPUT_RECORD> &records,
|
|
60
|
+
const char *charBuffer,
|
|
61
|
+
int charLen,
|
|
62
|
+
bool terminalAltEscape);
|
|
63
|
+
void appendKeyPress(std::vector<INPUT_RECORD> &records,
|
|
64
|
+
uint16_t virtualKey,
|
|
65
|
+
uint32_t winCodePointDn,
|
|
66
|
+
uint32_t winCodePointUp,
|
|
67
|
+
uint16_t winKeyState,
|
|
68
|
+
uint32_t vtCodePoint,
|
|
69
|
+
uint16_t vtKeyState);
|
|
70
|
+
|
|
71
|
+
public:
|
|
72
|
+
static void appendCPInputRecords(std::vector<INPUT_RECORD> &records,
|
|
73
|
+
BOOL keyDown,
|
|
74
|
+
uint16_t virtualKey,
|
|
75
|
+
uint32_t codePoint,
|
|
76
|
+
uint16_t keyState);
|
|
77
|
+
static void appendInputRecord(std::vector<INPUT_RECORD> &records,
|
|
78
|
+
BOOL keyDown,
|
|
79
|
+
uint16_t virtualKey,
|
|
80
|
+
wchar_t utf16Char,
|
|
81
|
+
uint16_t keyState);
|
|
82
|
+
|
|
83
|
+
private:
|
|
84
|
+
DWORD inputConsoleMode();
|
|
85
|
+
|
|
86
|
+
private:
|
|
87
|
+
Win32Console &m_console;
|
|
88
|
+
HANDLE m_conin = nullptr;
|
|
89
|
+
int m_mouseMode = 0;
|
|
90
|
+
DsrSender &m_dsrSender;
|
|
91
|
+
bool m_dsrSent = false;
|
|
92
|
+
std::string m_byteQueue;
|
|
93
|
+
InputMap m_inputMap;
|
|
94
|
+
DWORD m_lastWriteTick = 0;
|
|
95
|
+
DWORD m_mouseButtonState = 0;
|
|
96
|
+
struct DoubleClickDetection {
|
|
97
|
+
DWORD button = 0;
|
|
98
|
+
Coord pos;
|
|
99
|
+
DWORD tick = 0;
|
|
100
|
+
bool released = false;
|
|
101
|
+
} m_doubleClick;
|
|
102
|
+
bool m_enableExtendedEnabled = false;
|
|
103
|
+
bool m_mouseInputEnabled = false;
|
|
104
|
+
bool m_quickEditEnabled = false;
|
|
105
|
+
bool m_escapeInputEnabled = false;
|
|
106
|
+
SmallRect m_mouseWindowRect;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
#endif // CONSOLEINPUT_H
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// Copyright (c) 2016 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#include "ConsoleInputReencoding.h"
|
|
22
|
+
|
|
23
|
+
#include "ConsoleInput.h"
|
|
24
|
+
|
|
25
|
+
namespace {
|
|
26
|
+
|
|
27
|
+
static void outch(std::vector<INPUT_RECORD> &out, wchar_t ch) {
|
|
28
|
+
ConsoleInput::appendInputRecord(out, TRUE, 0, ch, 0);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
} // anonymous namespace
|
|
32
|
+
|
|
33
|
+
void reencodeEscapedKeyPress(
|
|
34
|
+
std::vector<INPUT_RECORD> &out,
|
|
35
|
+
uint16_t virtualKey,
|
|
36
|
+
uint32_t codePoint,
|
|
37
|
+
uint16_t keyState) {
|
|
38
|
+
|
|
39
|
+
struct EscapedKey {
|
|
40
|
+
enum { None, Numeric, Letter } kind;
|
|
41
|
+
wchar_t content[2];
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
EscapedKey escapeCode = {};
|
|
45
|
+
switch (virtualKey) {
|
|
46
|
+
case VK_UP: escapeCode = { EscapedKey::Letter, {'A'} }; break;
|
|
47
|
+
case VK_DOWN: escapeCode = { EscapedKey::Letter, {'B'} }; break;
|
|
48
|
+
case VK_RIGHT: escapeCode = { EscapedKey::Letter, {'C'} }; break;
|
|
49
|
+
case VK_LEFT: escapeCode = { EscapedKey::Letter, {'D'} }; break;
|
|
50
|
+
case VK_CLEAR: escapeCode = { EscapedKey::Letter, {'E'} }; break;
|
|
51
|
+
case VK_F1: escapeCode = { EscapedKey::Numeric, {'1', '1'} }; break;
|
|
52
|
+
case VK_F2: escapeCode = { EscapedKey::Numeric, {'1', '2'} }; break;
|
|
53
|
+
case VK_F3: escapeCode = { EscapedKey::Numeric, {'1', '3'} }; break;
|
|
54
|
+
case VK_F4: escapeCode = { EscapedKey::Numeric, {'1', '4'} }; break;
|
|
55
|
+
case VK_F5: escapeCode = { EscapedKey::Numeric, {'1', '5'} }; break;
|
|
56
|
+
case VK_F6: escapeCode = { EscapedKey::Numeric, {'1', '7'} }; break;
|
|
57
|
+
case VK_F7: escapeCode = { EscapedKey::Numeric, {'1', '8'} }; break;
|
|
58
|
+
case VK_F8: escapeCode = { EscapedKey::Numeric, {'1', '9'} }; break;
|
|
59
|
+
case VK_F9: escapeCode = { EscapedKey::Numeric, {'2', '0'} }; break;
|
|
60
|
+
case VK_F10: escapeCode = { EscapedKey::Numeric, {'2', '1'} }; break;
|
|
61
|
+
case VK_F11: escapeCode = { EscapedKey::Numeric, {'2', '3'} }; break;
|
|
62
|
+
case VK_F12: escapeCode = { EscapedKey::Numeric, {'2', '4'} }; break;
|
|
63
|
+
case VK_HOME: escapeCode = { EscapedKey::Letter, {'H'} }; break;
|
|
64
|
+
case VK_INSERT: escapeCode = { EscapedKey::Numeric, {'2'} }; break;
|
|
65
|
+
case VK_DELETE: escapeCode = { EscapedKey::Numeric, {'3'} }; break;
|
|
66
|
+
case VK_END: escapeCode = { EscapedKey::Letter, {'F'} }; break;
|
|
67
|
+
case VK_PRIOR: escapeCode = { EscapedKey::Numeric, {'5'} }; break;
|
|
68
|
+
case VK_NEXT: escapeCode = { EscapedKey::Numeric, {'6'} }; break;
|
|
69
|
+
}
|
|
70
|
+
if (escapeCode.kind != EscapedKey::None) {
|
|
71
|
+
int flags = 0;
|
|
72
|
+
if (keyState & SHIFT_PRESSED) { flags |= 0x1; }
|
|
73
|
+
if (keyState & LEFT_ALT_PRESSED) { flags |= 0x2; }
|
|
74
|
+
if (keyState & LEFT_CTRL_PRESSED) { flags |= 0x4; }
|
|
75
|
+
outch(out, L'\x1b');
|
|
76
|
+
outch(out, L'[');
|
|
77
|
+
if (escapeCode.kind == EscapedKey::Numeric) {
|
|
78
|
+
for (wchar_t ch : escapeCode.content) {
|
|
79
|
+
if (ch != L'\0') {
|
|
80
|
+
outch(out, ch);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
} else if (flags != 0) {
|
|
84
|
+
outch(out, L'1');
|
|
85
|
+
}
|
|
86
|
+
if (flags != 0) {
|
|
87
|
+
outch(out, L';');
|
|
88
|
+
outch(out, L'1' + flags);
|
|
89
|
+
}
|
|
90
|
+
if (escapeCode.kind == EscapedKey::Numeric) {
|
|
91
|
+
outch(out, L'~');
|
|
92
|
+
} else {
|
|
93
|
+
outch(out, escapeCode.content[0]);
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
switch (virtualKey) {
|
|
99
|
+
case VK_BACK:
|
|
100
|
+
if (keyState & LEFT_ALT_PRESSED) {
|
|
101
|
+
outch(out, L'\x1b');
|
|
102
|
+
}
|
|
103
|
+
outch(out, L'\x7f');
|
|
104
|
+
return;
|
|
105
|
+
case VK_TAB:
|
|
106
|
+
if (keyState & SHIFT_PRESSED) {
|
|
107
|
+
outch(out, L'\x1b');
|
|
108
|
+
outch(out, L'[');
|
|
109
|
+
outch(out, L'Z');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (codePoint != 0) {
|
|
116
|
+
if (keyState & LEFT_ALT_PRESSED) {
|
|
117
|
+
outch(out, L'\x1b');
|
|
118
|
+
}
|
|
119
|
+
ConsoleInput::appendCPInputRecords(out, TRUE, 0, codePoint, 0);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Copyright (c) 2016 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#ifndef AGENT_CONSOLE_INPUT_REENCODING_H
|
|
22
|
+
#define AGENT_CONSOLE_INPUT_REENCODING_H
|
|
23
|
+
|
|
24
|
+
#include <windows.h>
|
|
25
|
+
|
|
26
|
+
#include <stdint.h>
|
|
27
|
+
|
|
28
|
+
#include <vector>
|
|
29
|
+
|
|
30
|
+
void reencodeEscapedKeyPress(
|
|
31
|
+
std::vector<INPUT_RECORD> &records,
|
|
32
|
+
uint16_t virtualKey,
|
|
33
|
+
uint32_t codePoint,
|
|
34
|
+
uint16_t keyState);
|
|
35
|
+
|
|
36
|
+
#endif // AGENT_CONSOLE_INPUT_REENCODING_H
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Copyright (c) 2015 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
//
|
|
22
|
+
// ConsoleLine
|
|
23
|
+
//
|
|
24
|
+
// This data structure keep tracks of the previous CHAR_INFO content of an
|
|
25
|
+
// output line and determines when a line has changed. Detecting line changes
|
|
26
|
+
// is made complicated by terminal resizing.
|
|
27
|
+
//
|
|
28
|
+
|
|
29
|
+
#include "ConsoleLine.h"
|
|
30
|
+
|
|
31
|
+
#include <algorithm>
|
|
32
|
+
|
|
33
|
+
#include "../shared/WinptyAssert.h"
|
|
34
|
+
|
|
35
|
+
static CHAR_INFO blankChar(WORD attributes)
|
|
36
|
+
{
|
|
37
|
+
// N.B.: As long as we write to UnicodeChar rather than AsciiChar, there
|
|
38
|
+
// are no padding bytes that could contain uninitialized bytes. This fact
|
|
39
|
+
// is important for efficient comparison.
|
|
40
|
+
CHAR_INFO ret;
|
|
41
|
+
ret.Attributes = attributes;
|
|
42
|
+
ret.Char.UnicodeChar = L' ';
|
|
43
|
+
return ret;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static bool isLineBlank(const CHAR_INFO *line, int length, WORD attributes)
|
|
47
|
+
{
|
|
48
|
+
for (int col = 0; col < length; ++col) {
|
|
49
|
+
if (line[col].Attributes != attributes ||
|
|
50
|
+
line[col].Char.UnicodeChar != L' ') {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static inline bool areLinesEqual(
|
|
58
|
+
const CHAR_INFO *line1,
|
|
59
|
+
const CHAR_INFO *line2,
|
|
60
|
+
int length)
|
|
61
|
+
{
|
|
62
|
+
return memcmp(line1, line2, sizeof(CHAR_INFO) * length) == 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
ConsoleLine::ConsoleLine() : m_prevLength(0)
|
|
66
|
+
{
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
void ConsoleLine::reset()
|
|
70
|
+
{
|
|
71
|
+
m_prevLength = 0;
|
|
72
|
+
m_prevData.clear();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Determines whether the given line is sufficiently different from the
|
|
76
|
+
// previously seen line as to justify reoutputting the line. The function
|
|
77
|
+
// also sets the `ConsoleLine` to the given line, exactly as if `setLine` had
|
|
78
|
+
// been called.
|
|
79
|
+
bool ConsoleLine::detectChangeAndSetLine(const CHAR_INFO *const line, const int newLength)
|
|
80
|
+
{
|
|
81
|
+
ASSERT(newLength >= 1);
|
|
82
|
+
ASSERT(m_prevLength <= static_cast<int>(m_prevData.size()));
|
|
83
|
+
|
|
84
|
+
if (newLength == m_prevLength) {
|
|
85
|
+
bool equalLines = areLinesEqual(m_prevData.data(), line, newLength);
|
|
86
|
+
if (!equalLines) {
|
|
87
|
+
setLine(line, newLength);
|
|
88
|
+
}
|
|
89
|
+
return !equalLines;
|
|
90
|
+
} else {
|
|
91
|
+
if (m_prevLength == 0) {
|
|
92
|
+
setLine(line, newLength);
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
ASSERT(m_prevLength >= 1);
|
|
97
|
+
const WORD prevBlank = m_prevData[m_prevLength - 1].Attributes;
|
|
98
|
+
const WORD newBlank = line[newLength - 1].Attributes;
|
|
99
|
+
|
|
100
|
+
bool equalLines = false;
|
|
101
|
+
if (newLength < m_prevLength) {
|
|
102
|
+
// The line has become shorter. The lines are equal if the common
|
|
103
|
+
// part is equal, and if the newly truncated characters were blank.
|
|
104
|
+
equalLines =
|
|
105
|
+
areLinesEqual(m_prevData.data(), line, newLength) &&
|
|
106
|
+
isLineBlank(m_prevData.data() + newLength,
|
|
107
|
+
m_prevLength - newLength,
|
|
108
|
+
newBlank);
|
|
109
|
+
} else {
|
|
110
|
+
//
|
|
111
|
+
// The line has become longer. The lines are equal if the common
|
|
112
|
+
// part is equal, and if both the extra characters and any
|
|
113
|
+
// potentially reexposed characters are blank.
|
|
114
|
+
//
|
|
115
|
+
// Two of the most relevant terminals for winpty--mintty and
|
|
116
|
+
// jediterm--don't (currently) erase the obscured content when a
|
|
117
|
+
// line is cleared, so we should anticipate its existence when
|
|
118
|
+
// making a terminal wider and reoutput the line. See:
|
|
119
|
+
//
|
|
120
|
+
// * https://github.com/mintty/mintty/issues/480
|
|
121
|
+
// * https://github.com/JetBrains/jediterm/issues/118
|
|
122
|
+
//
|
|
123
|
+
ASSERT(newLength > m_prevLength);
|
|
124
|
+
equalLines =
|
|
125
|
+
areLinesEqual(m_prevData.data(), line, m_prevLength) &&
|
|
126
|
+
isLineBlank(m_prevData.data() + m_prevLength,
|
|
127
|
+
std::min<int>(m_prevData.size(), newLength) - m_prevLength,
|
|
128
|
+
prevBlank) &&
|
|
129
|
+
isLineBlank(line + m_prevLength,
|
|
130
|
+
newLength - m_prevLength,
|
|
131
|
+
prevBlank);
|
|
132
|
+
}
|
|
133
|
+
setLine(line, newLength);
|
|
134
|
+
return !equalLines;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
void ConsoleLine::setLine(const CHAR_INFO *const line, const int newLength)
|
|
139
|
+
{
|
|
140
|
+
if (static_cast<int>(m_prevData.size()) < newLength) {
|
|
141
|
+
m_prevData.resize(newLength);
|
|
142
|
+
}
|
|
143
|
+
memcpy(m_prevData.data(), line, sizeof(CHAR_INFO) * newLength);
|
|
144
|
+
m_prevLength = newLength;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
void ConsoleLine::blank(WORD attributes)
|
|
148
|
+
{
|
|
149
|
+
m_prevData.resize(1);
|
|
150
|
+
m_prevData[0] = blankChar(attributes);
|
|
151
|
+
m_prevLength = 1;
|
|
152
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Copyright (c) 2015 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#ifndef CONSOLE_LINE_H
|
|
22
|
+
#define CONSOLE_LINE_H
|
|
23
|
+
|
|
24
|
+
#include <windows.h>
|
|
25
|
+
|
|
26
|
+
#include <vector>
|
|
27
|
+
|
|
28
|
+
class ConsoleLine
|
|
29
|
+
{
|
|
30
|
+
public:
|
|
31
|
+
ConsoleLine();
|
|
32
|
+
void reset();
|
|
33
|
+
bool detectChangeAndSetLine(const CHAR_INFO *line, int newLength);
|
|
34
|
+
void setLine(const CHAR_INFO *line, int newLength);
|
|
35
|
+
void blank(WORD attributes);
|
|
36
|
+
private:
|
|
37
|
+
int m_prevLength;
|
|
38
|
+
std::vector<CHAR_INFO> m_prevData;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
#endif // CONSOLE_LINE_H
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Copyright (c) 2011-2012 Ryan Prichard
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to
|
|
5
|
+
// deal in the Software without restriction, including without limitation the
|
|
6
|
+
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
// sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
18
|
+
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
19
|
+
// IN THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
#ifndef COORD_H
|
|
22
|
+
#define COORD_H
|
|
23
|
+
|
|
24
|
+
#include <windows.h>
|
|
25
|
+
|
|
26
|
+
#include <string>
|
|
27
|
+
|
|
28
|
+
#include "../shared/winpty_snprintf.h"
|
|
29
|
+
|
|
30
|
+
struct Coord : COORD {
|
|
31
|
+
Coord()
|
|
32
|
+
{
|
|
33
|
+
X = 0;
|
|
34
|
+
Y = 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
Coord(SHORT x, SHORT y)
|
|
38
|
+
{
|
|
39
|
+
X = x;
|
|
40
|
+
Y = y;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
Coord(COORD other)
|
|
44
|
+
{
|
|
45
|
+
*(COORD*)this = other;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
Coord(const Coord &other)
|
|
49
|
+
{
|
|
50
|
+
*(COORD*)this = *(const COORD*)&other;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
Coord &operator=(const Coord &other)
|
|
54
|
+
{
|
|
55
|
+
*(COORD*)this = *(const COORD*)&other;
|
|
56
|
+
return *this;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
bool operator==(const Coord &other) const
|
|
60
|
+
{
|
|
61
|
+
return X == other.X && Y == other.Y;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
bool operator!=(const Coord &other) const
|
|
65
|
+
{
|
|
66
|
+
return !(*this == other);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
Coord operator+(const Coord &other) const
|
|
70
|
+
{
|
|
71
|
+
return Coord(X + other.X, Y + other.Y);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
bool isEmpty() const
|
|
75
|
+
{
|
|
76
|
+
return X <= 0 || Y <= 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
std::string toString() const
|
|
80
|
+
{
|
|
81
|
+
char ret[32];
|
|
82
|
+
winpty_snprintf(ret, "(%d,%d)", X, Y);
|
|
83
|
+
return std::string(ret);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
#endif // COORD_H
|