@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.
Files changed (288) hide show
  1. package/LICENSE +69 -0
  2. package/README.md +170 -0
  3. package/binding.gyp +111 -0
  4. package/deps/.editorconfig +2 -0
  5. package/deps/winpty/.drone.yml +17 -0
  6. package/deps/winpty/.gitattributes +19 -0
  7. package/deps/winpty/LICENSE +21 -0
  8. package/deps/winpty/Makefile +166 -0
  9. package/deps/winpty/README.md +151 -0
  10. package/deps/winpty/RELEASES.md +280 -0
  11. package/deps/winpty/VERSION.txt +1 -0
  12. package/deps/winpty/configure +167 -0
  13. package/deps/winpty/misc/BufferResizeTests.cc +90 -0
  14. package/deps/winpty/misc/ChangeScreenBuffer.cc +53 -0
  15. package/deps/winpty/misc/ClearConsole.cc +72 -0
  16. package/deps/winpty/misc/ConinMode.cc +117 -0
  17. package/deps/winpty/misc/ConinMode.ps1 +116 -0
  18. package/deps/winpty/misc/ConoutMode.cc +113 -0
  19. package/deps/winpty/misc/DebugClient.py +42 -0
  20. package/deps/winpty/misc/DebugServer.py +63 -0
  21. package/deps/winpty/misc/DumpLines.py +5 -0
  22. package/deps/winpty/misc/EnableExtendedFlags.txt +46 -0
  23. package/deps/winpty/misc/Font-Report-June2016/CP437-Consolas.txt +528 -0
  24. package/deps/winpty/misc/Font-Report-June2016/CP437-Lucida.txt +633 -0
  25. package/deps/winpty/misc/Font-Report-June2016/CP932.txt +630 -0
  26. package/deps/winpty/misc/Font-Report-June2016/CP936.txt +630 -0
  27. package/deps/winpty/misc/Font-Report-June2016/CP949.txt +630 -0
  28. package/deps/winpty/misc/Font-Report-June2016/CP950.txt +630 -0
  29. package/deps/winpty/misc/Font-Report-June2016/MinimumWindowWidths.txt +16 -0
  30. package/deps/winpty/misc/Font-Report-June2016/Results.txt +4 -0
  31. package/deps/winpty/misc/Font-Report-June2016/Windows10SetFontBugginess.txt +144 -0
  32. package/deps/winpty/misc/FontSurvey.cc +100 -0
  33. package/deps/winpty/misc/FormatChar.h +21 -0
  34. package/deps/winpty/misc/FreezePerfTest.cc +62 -0
  35. package/deps/winpty/misc/GetCh.cc +20 -0
  36. package/deps/winpty/misc/GetConsolePos.cc +41 -0
  37. package/deps/winpty/misc/GetFont.cc +261 -0
  38. package/deps/winpty/misc/IdentifyConsoleWindow.ps1 +51 -0
  39. package/deps/winpty/misc/IsNewConsole.cc +87 -0
  40. package/deps/winpty/misc/MouseInputNotes.txt +90 -0
  41. package/deps/winpty/misc/MoveConsoleWindow.cc +34 -0
  42. package/deps/winpty/misc/Notes.txt +219 -0
  43. package/deps/winpty/misc/OSVersion.cc +27 -0
  44. package/deps/winpty/misc/ScreenBufferFreezeInactive.cc +101 -0
  45. package/deps/winpty/misc/ScreenBufferTest.cc +671 -0
  46. package/deps/winpty/misc/ScreenBufferTest2.cc +151 -0
  47. package/deps/winpty/misc/SelectAllTest.cc +45 -0
  48. package/deps/winpty/misc/SetBufferSize.cc +32 -0
  49. package/deps/winpty/misc/SetCursorPos.cc +10 -0
  50. package/deps/winpty/misc/SetFont.cc +145 -0
  51. package/deps/winpty/misc/SetWindowRect.cc +36 -0
  52. package/deps/winpty/misc/ShowArgv.cc +12 -0
  53. package/deps/winpty/misc/ShowConsoleInput.cc +40 -0
  54. package/deps/winpty/misc/Spew.py +5 -0
  55. package/deps/winpty/misc/TestUtil.cc +172 -0
  56. package/deps/winpty/misc/UnicodeDoubleWidthTest.cc +102 -0
  57. package/deps/winpty/misc/UnicodeWideTest1.cc +246 -0
  58. package/deps/winpty/misc/UnicodeWideTest2.cc +130 -0
  59. package/deps/winpty/misc/UnixEcho.cc +89 -0
  60. package/deps/winpty/misc/Utf16Echo.cc +46 -0
  61. package/deps/winpty/misc/VeryLargeRead.cc +122 -0
  62. package/deps/winpty/misc/VkEscapeTest.cc +56 -0
  63. package/deps/winpty/misc/Win10ResizeWhileFrozen.cc +52 -0
  64. package/deps/winpty/misc/Win10WrapTest1.cc +57 -0
  65. package/deps/winpty/misc/Win10WrapTest2.cc +30 -0
  66. package/deps/winpty/misc/Win32Echo1.cc +26 -0
  67. package/deps/winpty/misc/Win32Echo2.cc +19 -0
  68. package/deps/winpty/misc/Win32Test1.cc +46 -0
  69. package/deps/winpty/misc/Win32Test2.cc +70 -0
  70. package/deps/winpty/misc/Win32Test3.cc +78 -0
  71. package/deps/winpty/misc/Win32Write1.cc +44 -0
  72. package/deps/winpty/misc/WindowsBugCrashReader.cc +27 -0
  73. package/deps/winpty/misc/WriteConsole.cc +106 -0
  74. package/deps/winpty/misc/build32.sh +9 -0
  75. package/deps/winpty/misc/build64.sh +9 -0
  76. package/deps/winpty/misc/color-test.sh +212 -0
  77. package/deps/winpty/misc/font-notes.txt +300 -0
  78. package/deps/winpty/misc/winbug-15048.cc +201 -0
  79. package/deps/winpty/ship/build-pty4j-libpty.bat +36 -0
  80. package/deps/winpty/ship/common_ship.py +53 -0
  81. package/deps/winpty/ship/make_msvc_package.py +165 -0
  82. package/deps/winpty/ship/ship.py +108 -0
  83. package/deps/winpty/src/agent/Agent.cc +613 -0
  84. package/deps/winpty/src/agent/Agent.h +103 -0
  85. package/deps/winpty/src/agent/AgentCreateDesktop.cc +84 -0
  86. package/deps/winpty/src/agent/AgentCreateDesktop.h +28 -0
  87. package/deps/winpty/src/agent/ConsoleFont.cc +632 -0
  88. package/deps/winpty/src/agent/ConsoleFont.h +28 -0
  89. package/deps/winpty/src/agent/ConsoleInput.cc +852 -0
  90. package/deps/winpty/src/agent/ConsoleInput.h +109 -0
  91. package/deps/winpty/src/agent/ConsoleInputReencoding.cc +121 -0
  92. package/deps/winpty/src/agent/ConsoleInputReencoding.h +36 -0
  93. package/deps/winpty/src/agent/ConsoleLine.cc +152 -0
  94. package/deps/winpty/src/agent/ConsoleLine.h +41 -0
  95. package/deps/winpty/src/agent/Coord.h +87 -0
  96. package/deps/winpty/src/agent/DebugShowInput.cc +239 -0
  97. package/deps/winpty/src/agent/DebugShowInput.h +32 -0
  98. package/deps/winpty/src/agent/DefaultInputMap.cc +422 -0
  99. package/deps/winpty/src/agent/DefaultInputMap.h +28 -0
  100. package/deps/winpty/src/agent/DsrSender.h +30 -0
  101. package/deps/winpty/src/agent/EventLoop.cc +99 -0
  102. package/deps/winpty/src/agent/EventLoop.h +47 -0
  103. package/deps/winpty/src/agent/InputMap.cc +246 -0
  104. package/deps/winpty/src/agent/InputMap.h +114 -0
  105. package/deps/winpty/src/agent/LargeConsoleRead.cc +71 -0
  106. package/deps/winpty/src/agent/LargeConsoleRead.h +68 -0
  107. package/deps/winpty/src/agent/NamedPipe.cc +378 -0
  108. package/deps/winpty/src/agent/NamedPipe.h +125 -0
  109. package/deps/winpty/src/agent/Scraper.cc +699 -0
  110. package/deps/winpty/src/agent/Scraper.h +103 -0
  111. package/deps/winpty/src/agent/SimplePool.h +75 -0
  112. package/deps/winpty/src/agent/SmallRect.h +143 -0
  113. package/deps/winpty/src/agent/Terminal.cc +535 -0
  114. package/deps/winpty/src/agent/Terminal.h +69 -0
  115. package/deps/winpty/src/agent/UnicodeEncoding.h +157 -0
  116. package/deps/winpty/src/agent/UnicodeEncodingTest.cc +189 -0
  117. package/deps/winpty/src/agent/Win32Console.cc +107 -0
  118. package/deps/winpty/src/agent/Win32Console.h +67 -0
  119. package/deps/winpty/src/agent/Win32ConsoleBuffer.cc +193 -0
  120. package/deps/winpty/src/agent/Win32ConsoleBuffer.h +99 -0
  121. package/deps/winpty/src/agent/main.cc +114 -0
  122. package/deps/winpty/src/agent/subdir.mk +61 -0
  123. package/deps/winpty/src/configurations.gypi +60 -0
  124. package/deps/winpty/src/debugserver/DebugServer.cc +117 -0
  125. package/deps/winpty/src/debugserver/subdir.mk +41 -0
  126. package/deps/winpty/src/include/winpty.h +242 -0
  127. package/deps/winpty/src/include/winpty_constants.h +131 -0
  128. package/deps/winpty/src/libwinpty/AgentLocation.cc +75 -0
  129. package/deps/winpty/src/libwinpty/AgentLocation.h +28 -0
  130. package/deps/winpty/src/libwinpty/LibWinptyException.h +54 -0
  131. package/deps/winpty/src/libwinpty/WinptyInternal.h +72 -0
  132. package/deps/winpty/src/libwinpty/subdir.mk +46 -0
  133. package/deps/winpty/src/libwinpty/winpty.cc +970 -0
  134. package/deps/winpty/src/shared/AgentMsg.h +38 -0
  135. package/deps/winpty/src/shared/BackgroundDesktop.cc +122 -0
  136. package/deps/winpty/src/shared/BackgroundDesktop.h +73 -0
  137. package/deps/winpty/src/shared/Buffer.cc +103 -0
  138. package/deps/winpty/src/shared/Buffer.h +102 -0
  139. package/deps/winpty/src/shared/DebugClient.cc +187 -0
  140. package/deps/winpty/src/shared/DebugClient.h +38 -0
  141. package/deps/winpty/src/shared/GenRandom.cc +138 -0
  142. package/deps/winpty/src/shared/GenRandom.h +55 -0
  143. package/deps/winpty/src/shared/GetCommitHash.bat +13 -0
  144. package/deps/winpty/src/shared/Mutex.h +54 -0
  145. package/deps/winpty/src/shared/OsModule.h +63 -0
  146. package/deps/winpty/src/shared/OwnedHandle.cc +36 -0
  147. package/deps/winpty/src/shared/OwnedHandle.h +45 -0
  148. package/deps/winpty/src/shared/PrecompiledHeader.h +43 -0
  149. package/deps/winpty/src/shared/StringBuilder.h +227 -0
  150. package/deps/winpty/src/shared/StringBuilderTest.cc +114 -0
  151. package/deps/winpty/src/shared/StringUtil.cc +55 -0
  152. package/deps/winpty/src/shared/StringUtil.h +80 -0
  153. package/deps/winpty/src/shared/TimeMeasurement.h +63 -0
  154. package/deps/winpty/src/shared/UnixCtrlChars.h +45 -0
  155. package/deps/winpty/src/shared/UpdateGenVersion.bat +20 -0
  156. package/deps/winpty/src/shared/WindowsSecurity.cc +460 -0
  157. package/deps/winpty/src/shared/WindowsSecurity.h +104 -0
  158. package/deps/winpty/src/shared/WindowsVersion.cc +252 -0
  159. package/deps/winpty/src/shared/WindowsVersion.h +29 -0
  160. package/deps/winpty/src/shared/WinptyAssert.cc +55 -0
  161. package/deps/winpty/src/shared/WinptyAssert.h +64 -0
  162. package/deps/winpty/src/shared/WinptyException.cc +57 -0
  163. package/deps/winpty/src/shared/WinptyException.h +43 -0
  164. package/deps/winpty/src/shared/WinptyVersion.cc +42 -0
  165. package/deps/winpty/src/shared/WinptyVersion.h +27 -0
  166. package/deps/winpty/src/shared/winpty_snprintf.h +99 -0
  167. package/deps/winpty/src/subdir.mk +5 -0
  168. package/deps/winpty/src/tests/subdir.mk +28 -0
  169. package/deps/winpty/src/tests/trivial_test.cc +158 -0
  170. package/deps/winpty/src/unix-adapter/InputHandler.cc +114 -0
  171. package/deps/winpty/src/unix-adapter/InputHandler.h +56 -0
  172. package/deps/winpty/src/unix-adapter/OutputHandler.cc +80 -0
  173. package/deps/winpty/src/unix-adapter/OutputHandler.h +53 -0
  174. package/deps/winpty/src/unix-adapter/Util.cc +86 -0
  175. package/deps/winpty/src/unix-adapter/Util.h +31 -0
  176. package/deps/winpty/src/unix-adapter/WakeupFd.cc +70 -0
  177. package/deps/winpty/src/unix-adapter/WakeupFd.h +42 -0
  178. package/deps/winpty/src/unix-adapter/main.cc +729 -0
  179. package/deps/winpty/src/unix-adapter/subdir.mk +41 -0
  180. package/deps/winpty/src/winpty.gyp +234 -0
  181. package/deps/winpty/vcbuild.bat +83 -0
  182. package/lib/conpty_console_list_agent.js +16 -0
  183. package/lib/conpty_console_list_agent.js.map +1 -0
  184. package/lib/eventEmitter2.js +47 -0
  185. package/lib/eventEmitter2.js.map +1 -0
  186. package/lib/eventEmitter2.test.js +30 -0
  187. package/lib/eventEmitter2.test.js.map +1 -0
  188. package/lib/index.js +52 -0
  189. package/lib/index.js.map +1 -0
  190. package/lib/interfaces.js +7 -0
  191. package/lib/interfaces.js.map +1 -0
  192. package/lib/shared/conout.js +11 -0
  193. package/lib/shared/conout.js.map +1 -0
  194. package/lib/terminal.js +190 -0
  195. package/lib/terminal.js.map +1 -0
  196. package/lib/terminal.test.js +139 -0
  197. package/lib/terminal.test.js.map +1 -0
  198. package/lib/testUtils.test.js +28 -0
  199. package/lib/testUtils.test.js.map +1 -0
  200. package/lib/types.js +7 -0
  201. package/lib/types.js.map +1 -0
  202. package/lib/unixTerminal.js +346 -0
  203. package/lib/unixTerminal.js.map +1 -0
  204. package/lib/unixTerminal.test.js +351 -0
  205. package/lib/unixTerminal.test.js.map +1 -0
  206. package/lib/utils.js +39 -0
  207. package/lib/utils.js.map +1 -0
  208. package/lib/windowsConoutConnection.js +125 -0
  209. package/lib/windowsConoutConnection.js.map +1 -0
  210. package/lib/windowsPtyAgent.js +320 -0
  211. package/lib/windowsPtyAgent.js.map +1 -0
  212. package/lib/windowsPtyAgent.test.js +90 -0
  213. package/lib/windowsPtyAgent.test.js.map +1 -0
  214. package/lib/windowsTerminal.js +199 -0
  215. package/lib/windowsTerminal.js.map +1 -0
  216. package/lib/windowsTerminal.test.js +219 -0
  217. package/lib/windowsTerminal.test.js.map +1 -0
  218. package/lib/worker/conoutSocketWorker.js +22 -0
  219. package/lib/worker/conoutSocketWorker.js.map +1 -0
  220. package/package.json +68 -0
  221. package/prebuilds/darwin-arm64/pty.node +0 -0
  222. package/prebuilds/darwin-arm64/spawn-helper +0 -0
  223. package/prebuilds/darwin-x64/pty.node +0 -0
  224. package/prebuilds/darwin-x64/spawn-helper +0 -0
  225. package/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  226. package/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  227. package/prebuilds/win32-arm64/conpty.node +0 -0
  228. package/prebuilds/win32-arm64/conpty.pdb +0 -0
  229. package/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  230. package/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
  231. package/prebuilds/win32-arm64/pty.node +0 -0
  232. package/prebuilds/win32-arm64/pty.pdb +0 -0
  233. package/prebuilds/win32-arm64/winpty-agent.exe +0 -0
  234. package/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
  235. package/prebuilds/win32-arm64/winpty.dll +0 -0
  236. package/prebuilds/win32-arm64/winpty.pdb +0 -0
  237. package/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  238. package/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  239. package/prebuilds/win32-x64/conpty.node +0 -0
  240. package/prebuilds/win32-x64/conpty.pdb +0 -0
  241. package/prebuilds/win32-x64/conpty_console_list.node +0 -0
  242. package/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
  243. package/prebuilds/win32-x64/pty.node +0 -0
  244. package/prebuilds/win32-x64/pty.pdb +0 -0
  245. package/prebuilds/win32-x64/winpty-agent.exe +0 -0
  246. package/prebuilds/win32-x64/winpty-agent.pdb +0 -0
  247. package/prebuilds/win32-x64/winpty.dll +0 -0
  248. package/prebuilds/win32-x64/winpty.pdb +0 -0
  249. package/scripts/gen-compile-commands.js +8 -0
  250. package/scripts/increment-version.js +54 -0
  251. package/scripts/post-install.js +99 -0
  252. package/scripts/prebuild.js +39 -0
  253. package/scripts/sync-prebuild.js +31 -0
  254. package/scripts/verify-darwin-fd-leak.js +63 -0
  255. package/src/conpty_console_list_agent.ts +15 -0
  256. package/src/eventEmitter2.test.ts +30 -0
  257. package/src/eventEmitter2.ts +48 -0
  258. package/src/index.ts +52 -0
  259. package/src/interfaces.ts +130 -0
  260. package/src/native.d.ts +54 -0
  261. package/src/shared/conout.ts +15 -0
  262. package/src/terminal.test.ts +119 -0
  263. package/src/terminal.ts +211 -0
  264. package/src/testUtils.test.ts +23 -0
  265. package/src/tsconfig.json +22 -0
  266. package/src/types.ts +15 -0
  267. package/src/unix/pty.cc +808 -0
  268. package/src/unix/spawn-helper.cc +23 -0
  269. package/src/unixTerminal.test.ts +367 -0
  270. package/src/unixTerminal.ts +388 -0
  271. package/src/utils.ts +29 -0
  272. package/src/win/conpty.cc +583 -0
  273. package/src/win/conpty.h +41 -0
  274. package/src/win/conpty_console_list.cc +44 -0
  275. package/src/win/path_util.cc +95 -0
  276. package/src/win/path_util.h +26 -0
  277. package/src/win/winpty.cc +333 -0
  278. package/src/windowsConoutConnection.ts +82 -0
  279. package/src/windowsPtyAgent.test.ts +94 -0
  280. package/src/windowsPtyAgent.ts +321 -0
  281. package/src/windowsTerminal.test.ts +229 -0
  282. package/src/windowsTerminal.ts +203 -0
  283. package/src/worker/conoutSocketWorker.ts +22 -0
  284. package/third_party/conpty/1.23.251008001/win10-arm64/OpenConsole.exe +0 -0
  285. package/third_party/conpty/1.23.251008001/win10-arm64/conpty.dll +0 -0
  286. package/third_party/conpty/1.23.251008001/win10-x64/OpenConsole.exe +0 -0
  287. package/third_party/conpty/1.23.251008001/win10-x64/conpty.dll +0 -0
  288. 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