@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,151 @@
|
|
|
1
|
+
#include <windows.h>
|
|
2
|
+
|
|
3
|
+
#include "TestUtil.cc"
|
|
4
|
+
|
|
5
|
+
const char *g_prefix = "";
|
|
6
|
+
|
|
7
|
+
static void dumpHandles() {
|
|
8
|
+
trace("%sSTDIN=0x%I64x STDOUT=0x%I64x STDERR=0x%I64x",
|
|
9
|
+
g_prefix,
|
|
10
|
+
(long long)GetStdHandle(STD_INPUT_HANDLE),
|
|
11
|
+
(long long)GetStdHandle(STD_OUTPUT_HANDLE),
|
|
12
|
+
(long long)GetStdHandle(STD_ERROR_HANDLE));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static HANDLE createBuffer() {
|
|
16
|
+
|
|
17
|
+
// If sa isn't provided, the handle defaults to not-inheritable.
|
|
18
|
+
SECURITY_ATTRIBUTES sa = {0};
|
|
19
|
+
sa.nLength = sizeof(sa);
|
|
20
|
+
sa.bInheritHandle = TRUE;
|
|
21
|
+
|
|
22
|
+
trace("%sCreating a new buffer...", g_prefix);
|
|
23
|
+
HANDLE conout = CreateConsoleScreenBuffer(
|
|
24
|
+
GENERIC_READ | GENERIC_WRITE,
|
|
25
|
+
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
26
|
+
&sa,
|
|
27
|
+
CONSOLE_TEXTMODE_BUFFER, NULL);
|
|
28
|
+
|
|
29
|
+
trace("%sCreating a new buffer... 0x%I64x", g_prefix, (long long)conout);
|
|
30
|
+
return conout;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static const char *successOrFail(BOOL ret) {
|
|
34
|
+
return ret ? "ok" : "FAILED";
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static void setConsoleActiveScreenBuffer(HANDLE conout) {
|
|
38
|
+
trace("%sSetConsoleActiveScreenBuffer(0x%I64x) called...",
|
|
39
|
+
g_prefix, (long long)conout);
|
|
40
|
+
trace("%sSetConsoleActiveScreenBuffer(0x%I64x) called... %s",
|
|
41
|
+
g_prefix, (long long)conout,
|
|
42
|
+
successOrFail(SetConsoleActiveScreenBuffer(conout)));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static void writeTest(HANDLE conout, const char *msg) {
|
|
46
|
+
char writeData[256];
|
|
47
|
+
sprintf(writeData, "%s%s\n", g_prefix, msg);
|
|
48
|
+
|
|
49
|
+
trace("%sWriting to 0x%I64x: '%s'...",
|
|
50
|
+
g_prefix, (long long)conout, msg);
|
|
51
|
+
DWORD actual = 0;
|
|
52
|
+
BOOL ret = WriteConsoleA(conout, writeData, strlen(writeData), &actual, NULL);
|
|
53
|
+
trace("%sWriting to 0x%I64x: '%s'... %s",
|
|
54
|
+
g_prefix, (long long)conout, msg,
|
|
55
|
+
successOrFail(ret && actual == strlen(writeData)));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static HANDLE startChildInSameConsole(const wchar_t *args, BOOL
|
|
59
|
+
bInheritHandles=FALSE) {
|
|
60
|
+
wchar_t program[1024];
|
|
61
|
+
wchar_t cmdline[1024];
|
|
62
|
+
GetModuleFileNameW(NULL, program, 1024);
|
|
63
|
+
swprintf(cmdline, L"\"%ls\" %ls", program, args);
|
|
64
|
+
|
|
65
|
+
STARTUPINFOW sui;
|
|
66
|
+
PROCESS_INFORMATION pi;
|
|
67
|
+
memset(&sui, 0, sizeof(sui));
|
|
68
|
+
memset(&pi, 0, sizeof(pi));
|
|
69
|
+
sui.cb = sizeof(sui);
|
|
70
|
+
|
|
71
|
+
CreateProcessW(program, cmdline,
|
|
72
|
+
NULL, NULL,
|
|
73
|
+
/*bInheritHandles=*/bInheritHandles,
|
|
74
|
+
/*dwCreationFlags=*/0,
|
|
75
|
+
NULL, NULL,
|
|
76
|
+
&sui, &pi);
|
|
77
|
+
|
|
78
|
+
return pi.hProcess;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static HANDLE dup(HANDLE h, HANDLE targetProcess) {
|
|
82
|
+
HANDLE h2 = INVALID_HANDLE_VALUE;
|
|
83
|
+
BOOL ret = DuplicateHandle(
|
|
84
|
+
GetCurrentProcess(), h,
|
|
85
|
+
targetProcess, &h2,
|
|
86
|
+
0, TRUE, DUPLICATE_SAME_ACCESS);
|
|
87
|
+
trace("dup(0x%I64x) to process 0x%I64x... %s, 0x%I64x",
|
|
88
|
+
(long long)h,
|
|
89
|
+
(long long)targetProcess,
|
|
90
|
+
successOrFail(ret),
|
|
91
|
+
(long long)h2);
|
|
92
|
+
return h2;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
int main(int argc, char *argv[]) {
|
|
96
|
+
if (argc == 1) {
|
|
97
|
+
startChildProcess(L"parent");
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (!strcmp(argv[1], "parent")) {
|
|
102
|
+
g_prefix = "parent: ";
|
|
103
|
+
dumpHandles();
|
|
104
|
+
HANDLE hChild = startChildInSameConsole(L"child");
|
|
105
|
+
|
|
106
|
+
// Windows 10.
|
|
107
|
+
HANDLE orig1 = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
108
|
+
HANDLE new1 = createBuffer();
|
|
109
|
+
|
|
110
|
+
Sleep(2000);
|
|
111
|
+
setConsoleActiveScreenBuffer(new1);
|
|
112
|
+
|
|
113
|
+
// Handle duplication results to child process in same console:
|
|
114
|
+
// - Windows XP: fails
|
|
115
|
+
// - Windows 7 Ultimate SP1 32-bit: fails
|
|
116
|
+
// - Windows Server 2008 R2 Datacenter SP1 64-bit: fails
|
|
117
|
+
// - Windows 8 Enterprise 32-bit: succeeds
|
|
118
|
+
// - Windows 10: succeeds
|
|
119
|
+
HANDLE orig2 = dup(orig1, GetCurrentProcess());
|
|
120
|
+
HANDLE new2 = dup(new1, GetCurrentProcess());
|
|
121
|
+
|
|
122
|
+
dup(orig1, hChild);
|
|
123
|
+
dup(new1, hChild);
|
|
124
|
+
|
|
125
|
+
// The writes to orig1/orig2 are invisible. The writes to new1/new2
|
|
126
|
+
// are visible.
|
|
127
|
+
writeTest(orig1, "write to orig1");
|
|
128
|
+
writeTest(orig2, "write to orig2");
|
|
129
|
+
writeTest(new1, "write to new1");
|
|
130
|
+
writeTest(new2, "write to new2");
|
|
131
|
+
|
|
132
|
+
Sleep(120000);
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!strcmp(argv[1], "child")) {
|
|
137
|
+
g_prefix = "child: ";
|
|
138
|
+
dumpHandles();
|
|
139
|
+
Sleep(4000);
|
|
140
|
+
for (unsigned int i = 0x1; i <= 0xB0; ++i) {
|
|
141
|
+
char msg[256];
|
|
142
|
+
sprintf(msg, "Write to handle 0x%x", i);
|
|
143
|
+
HANDLE h = reinterpret_cast<HANDLE>(i);
|
|
144
|
+
writeTest(h, msg);
|
|
145
|
+
}
|
|
146
|
+
Sleep(120000);
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#define _WIN32_WINNT 0x0501
|
|
2
|
+
#include <stdio.h>
|
|
3
|
+
#include <windows.h>
|
|
4
|
+
|
|
5
|
+
#include "../src/shared/DebugClient.cc"
|
|
6
|
+
|
|
7
|
+
const int SC_CONSOLE_MARK = 0xFFF2;
|
|
8
|
+
const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
|
|
9
|
+
|
|
10
|
+
CALLBACK DWORD pausingThread(LPVOID dummy)
|
|
11
|
+
{
|
|
12
|
+
HWND hwnd = GetConsoleWindow();
|
|
13
|
+
while (true) {
|
|
14
|
+
SendMessage(hwnd, WM_SYSCOMMAND, SC_CONSOLE_SELECT_ALL, 0);
|
|
15
|
+
Sleep(1000);
|
|
16
|
+
SendMessage(hwnd, WM_CHAR, 27, 0x00010001);
|
|
17
|
+
Sleep(1000);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
int main()
|
|
22
|
+
{
|
|
23
|
+
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
24
|
+
CONSOLE_SCREEN_BUFFER_INFO info;
|
|
25
|
+
|
|
26
|
+
GetConsoleScreenBufferInfo(out, &info);
|
|
27
|
+
COORD initial = info.dwCursorPosition;
|
|
28
|
+
|
|
29
|
+
CreateThread(NULL, 0,
|
|
30
|
+
pausingThread, NULL,
|
|
31
|
+
0, NULL);
|
|
32
|
+
|
|
33
|
+
for (int i = 0; i < 30; ++i) {
|
|
34
|
+
Sleep(100);
|
|
35
|
+
GetConsoleScreenBufferInfo(out, &info);
|
|
36
|
+
if (memcmp(&info.dwCursorPosition, &initial, sizeof(COORD)) != 0) {
|
|
37
|
+
trace("cursor moved to [%d,%d]",
|
|
38
|
+
info.dwCursorPosition.X,
|
|
39
|
+
info.dwCursorPosition.Y);
|
|
40
|
+
} else {
|
|
41
|
+
trace("cursor in expected position");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#include <windows.h>
|
|
2
|
+
|
|
3
|
+
#include <stdio.h>
|
|
4
|
+
#include <stdlib.h>
|
|
5
|
+
|
|
6
|
+
#include "TestUtil.cc"
|
|
7
|
+
|
|
8
|
+
int main(int argc, char *argv[]) {
|
|
9
|
+
if (argc != 3) {
|
|
10
|
+
printf("Usage: %s x y width height\n", argv[0]);
|
|
11
|
+
return 1;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const HANDLE conout = CreateFileW(L"CONOUT$",
|
|
15
|
+
GENERIC_READ | GENERIC_WRITE,
|
|
16
|
+
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
17
|
+
NULL, OPEN_EXISTING, 0, NULL);
|
|
18
|
+
ASSERT(conout != INVALID_HANDLE_VALUE);
|
|
19
|
+
|
|
20
|
+
COORD size = {
|
|
21
|
+
(short)atoi(argv[1]),
|
|
22
|
+
(short)atoi(argv[2]),
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
BOOL ret = SetConsoleScreenBufferSize(conout, size);
|
|
26
|
+
const unsigned lastError = GetLastError();
|
|
27
|
+
const char *const retStr = ret ? "OK" : "failed";
|
|
28
|
+
trace("SetConsoleScreenBufferSize ret: %s (LastError=0x%x)", retStr, lastError);
|
|
29
|
+
printf("SetConsoleScreenBufferSize ret: %s (LastError=0x%x)\n", retStr, lastError);
|
|
30
|
+
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#include <windows.h>
|
|
2
|
+
#include <locale.h>
|
|
3
|
+
#include <stdio.h>
|
|
4
|
+
#include <stdlib.h>
|
|
5
|
+
#include <string>
|
|
6
|
+
|
|
7
|
+
#include "TestUtil.cc"
|
|
8
|
+
|
|
9
|
+
#define COUNT_OF(array) (sizeof(array) / sizeof((array)[0]))
|
|
10
|
+
|
|
11
|
+
// See https://en.wikipedia.org/wiki/List_of_CJK_fonts
|
|
12
|
+
const wchar_t kMSGothic[] = { 0xff2d, 0xff33, 0x0020, 0x30b4, 0x30b7, 0x30c3, 0x30af, 0 }; // Japanese
|
|
13
|
+
const wchar_t kNSimSun[] = { 0x65b0, 0x5b8b, 0x4f53, 0 }; // Simplified Chinese
|
|
14
|
+
const wchar_t kMingLight[] = { 0x7d30, 0x660e, 0x9ad4, 0 }; // Traditional Chinese
|
|
15
|
+
const wchar_t kGulimChe[] = { 0xad74, 0xb9bc, 0xccb4, 0 }; // Korean
|
|
16
|
+
|
|
17
|
+
int main() {
|
|
18
|
+
setlocale(LC_ALL, "");
|
|
19
|
+
wchar_t *cmdline = GetCommandLineW();
|
|
20
|
+
int argc = 0;
|
|
21
|
+
wchar_t **argv = CommandLineToArgvW(cmdline, &argc);
|
|
22
|
+
const HANDLE conout = openConout();
|
|
23
|
+
|
|
24
|
+
if (argc == 1) {
|
|
25
|
+
cprintf(L"Usage:\n");
|
|
26
|
+
cprintf(L" SetFont <index>\n");
|
|
27
|
+
cprintf(L" SetFont options\n");
|
|
28
|
+
cprintf(L"\n");
|
|
29
|
+
cprintf(L"Options for SetCurrentConsoleFontEx:\n");
|
|
30
|
+
cprintf(L" -idx INDEX\n");
|
|
31
|
+
cprintf(L" -w WIDTH\n");
|
|
32
|
+
cprintf(L" -h HEIGHT\n");
|
|
33
|
+
cprintf(L" -family (0xNN|NN)\n");
|
|
34
|
+
cprintf(L" -weight (normal|bold|NNN)\n");
|
|
35
|
+
cprintf(L" -face FACENAME\n");
|
|
36
|
+
cprintf(L" -face-{gothic|simsun|minglight|gulimche) [JP,CN-sim,CN-tra,KR]\n");
|
|
37
|
+
cprintf(L" -tt\n");
|
|
38
|
+
cprintf(L" -vec\n");
|
|
39
|
+
cprintf(L" -vp\n");
|
|
40
|
+
cprintf(L" -dev\n");
|
|
41
|
+
cprintf(L" -roman\n");
|
|
42
|
+
cprintf(L" -swiss\n");
|
|
43
|
+
cprintf(L" -modern\n");
|
|
44
|
+
cprintf(L" -script\n");
|
|
45
|
+
cprintf(L" -decorative\n");
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (isdigit(argv[1][0])) {
|
|
50
|
+
int index = _wtoi(argv[1]);
|
|
51
|
+
HMODULE kernel32 = LoadLibraryW(L"kernel32.dll");
|
|
52
|
+
FARPROC proc = GetProcAddress(kernel32, "SetConsoleFont");
|
|
53
|
+
if (proc == NULL) {
|
|
54
|
+
cprintf(L"Couldn't get address of SetConsoleFont\n");
|
|
55
|
+
} else {
|
|
56
|
+
BOOL ret = reinterpret_cast<BOOL WINAPI(*)(HANDLE, DWORD)>(proc)(
|
|
57
|
+
conout, index);
|
|
58
|
+
cprintf(L"SetFont returned %d\n", ret);
|
|
59
|
+
}
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
CONSOLE_FONT_INFOEX fontex = {0};
|
|
64
|
+
fontex.cbSize = sizeof(fontex);
|
|
65
|
+
|
|
66
|
+
for (int i = 1; i < argc; ++i) {
|
|
67
|
+
std::wstring arg = argv[i];
|
|
68
|
+
if (i + 1 < argc) {
|
|
69
|
+
std::wstring next = argv[i + 1];
|
|
70
|
+
if (arg == L"-idx") {
|
|
71
|
+
fontex.nFont = _wtoi(next.c_str());
|
|
72
|
+
++i; continue;
|
|
73
|
+
} else if (arg == L"-w") {
|
|
74
|
+
fontex.dwFontSize.X = _wtoi(next.c_str());
|
|
75
|
+
++i; continue;
|
|
76
|
+
} else if (arg == L"-h") {
|
|
77
|
+
fontex.dwFontSize.Y = _wtoi(next.c_str());
|
|
78
|
+
++i; continue;
|
|
79
|
+
} else if (arg == L"-weight") {
|
|
80
|
+
if (next == L"normal") {
|
|
81
|
+
fontex.FontWeight = 400;
|
|
82
|
+
} else if (next == L"bold") {
|
|
83
|
+
fontex.FontWeight = 700;
|
|
84
|
+
} else {
|
|
85
|
+
fontex.FontWeight = _wtoi(next.c_str());
|
|
86
|
+
}
|
|
87
|
+
++i; continue;
|
|
88
|
+
} else if (arg == L"-face") {
|
|
89
|
+
wcsncpy(fontex.FaceName, next.c_str(), COUNT_OF(fontex.FaceName));
|
|
90
|
+
++i; continue;
|
|
91
|
+
} else if (arg == L"-family") {
|
|
92
|
+
fontex.FontFamily = strtol(narrowString(next).c_str(), nullptr, 0);
|
|
93
|
+
++i; continue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (arg == L"-tt") {
|
|
97
|
+
fontex.FontFamily |= TMPF_TRUETYPE;
|
|
98
|
+
} else if (arg == L"-vec") {
|
|
99
|
+
fontex.FontFamily |= TMPF_VECTOR;
|
|
100
|
+
} else if (arg == L"-vp") {
|
|
101
|
+
// Setting the TMPF_FIXED_PITCH bit actually indicates variable
|
|
102
|
+
// pitch.
|
|
103
|
+
fontex.FontFamily |= TMPF_FIXED_PITCH;
|
|
104
|
+
} else if (arg == L"-dev") {
|
|
105
|
+
fontex.FontFamily |= TMPF_DEVICE;
|
|
106
|
+
} else if (arg == L"-roman") {
|
|
107
|
+
fontex.FontFamily = (fontex.FontFamily & ~0xF0) | FF_ROMAN;
|
|
108
|
+
} else if (arg == L"-swiss") {
|
|
109
|
+
fontex.FontFamily = (fontex.FontFamily & ~0xF0) | FF_SWISS;
|
|
110
|
+
} else if (arg == L"-modern") {
|
|
111
|
+
fontex.FontFamily = (fontex.FontFamily & ~0xF0) | FF_MODERN;
|
|
112
|
+
} else if (arg == L"-script") {
|
|
113
|
+
fontex.FontFamily = (fontex.FontFamily & ~0xF0) | FF_SCRIPT;
|
|
114
|
+
} else if (arg == L"-decorative") {
|
|
115
|
+
fontex.FontFamily = (fontex.FontFamily & ~0xF0) | FF_DECORATIVE;
|
|
116
|
+
} else if (arg == L"-face-gothic") {
|
|
117
|
+
wcsncpy(fontex.FaceName, kMSGothic, COUNT_OF(fontex.FaceName));
|
|
118
|
+
} else if (arg == L"-face-simsun") {
|
|
119
|
+
wcsncpy(fontex.FaceName, kNSimSun, COUNT_OF(fontex.FaceName));
|
|
120
|
+
} else if (arg == L"-face-minglight") {
|
|
121
|
+
wcsncpy(fontex.FaceName, kMingLight, COUNT_OF(fontex.FaceName));
|
|
122
|
+
} else if (arg == L"-face-gulimche") {
|
|
123
|
+
wcsncpy(fontex.FaceName, kGulimChe, COUNT_OF(fontex.FaceName));
|
|
124
|
+
} else {
|
|
125
|
+
cprintf(L"Unrecognized argument: %ls\n", arg.c_str());
|
|
126
|
+
exit(1);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
cprintf(L"Setting to: nFont=%u dwFontSize=(%d,%d) "
|
|
131
|
+
L"FontFamily=0x%x FontWeight=%u "
|
|
132
|
+
L"FaceName=\"%ls\"\n",
|
|
133
|
+
static_cast<unsigned>(fontex.nFont),
|
|
134
|
+
fontex.dwFontSize.X, fontex.dwFontSize.Y,
|
|
135
|
+
fontex.FontFamily, fontex.FontWeight,
|
|
136
|
+
fontex.FaceName);
|
|
137
|
+
|
|
138
|
+
BOOL ret = SetCurrentConsoleFontEx(
|
|
139
|
+
conout,
|
|
140
|
+
FALSE,
|
|
141
|
+
&fontex);
|
|
142
|
+
cprintf(L"SetCurrentConsoleFontEx returned %d\n", ret);
|
|
143
|
+
|
|
144
|
+
return 0;
|
|
145
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#include <windows.h>
|
|
2
|
+
|
|
3
|
+
#include <stdio.h>
|
|
4
|
+
#include <stdlib.h>
|
|
5
|
+
|
|
6
|
+
#include "TestUtil.cc"
|
|
7
|
+
|
|
8
|
+
int main(int argc, char *argv[]) {
|
|
9
|
+
if (argc != 5) {
|
|
10
|
+
printf("Usage: %s x y width height\n", argv[0]);
|
|
11
|
+
return 1;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const HANDLE conout = CreateFileW(L"CONOUT$",
|
|
15
|
+
GENERIC_READ | GENERIC_WRITE,
|
|
16
|
+
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
17
|
+
NULL, OPEN_EXISTING, 0, NULL);
|
|
18
|
+
ASSERT(conout != INVALID_HANDLE_VALUE);
|
|
19
|
+
|
|
20
|
+
SMALL_RECT sr = {
|
|
21
|
+
(short)atoi(argv[1]),
|
|
22
|
+
(short)atoi(argv[2]),
|
|
23
|
+
(short)(atoi(argv[1]) + atoi(argv[3]) - 1),
|
|
24
|
+
(short)(atoi(argv[2]) + atoi(argv[4]) - 1),
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
trace("Calling SetConsoleWindowInfo with {L=%d,T=%d,R=%d,B=%d}",
|
|
28
|
+
sr.Left, sr.Top, sr.Right, sr.Bottom);
|
|
29
|
+
BOOL ret = SetConsoleWindowInfo(conout, TRUE, &sr);
|
|
30
|
+
const unsigned lastError = GetLastError();
|
|
31
|
+
const char *const retStr = ret ? "OK" : "failed";
|
|
32
|
+
trace("SetConsoleWindowInfo ret: %s (LastError=0x%x)", retStr, lastError);
|
|
33
|
+
printf("SetConsoleWindowInfo ret: %s (LastError=0x%x)\n", retStr, lastError);
|
|
34
|
+
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// This test program is useful for studying commandline<->argv conversion.
|
|
2
|
+
|
|
3
|
+
#include <stdio.h>
|
|
4
|
+
#include <windows.h>
|
|
5
|
+
|
|
6
|
+
int main(int argc, char **argv)
|
|
7
|
+
{
|
|
8
|
+
printf("cmdline = [%s]\n", GetCommandLine());
|
|
9
|
+
for (int i = 0; i < argc; ++i)
|
|
10
|
+
printf("[%s]\n", argv[i]);
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#include <windows.h>
|
|
2
|
+
#include <stdio.h>
|
|
3
|
+
#include <ctype.h>
|
|
4
|
+
|
|
5
|
+
int main(int argc, char *argv[])
|
|
6
|
+
{
|
|
7
|
+
static int escCount = 0;
|
|
8
|
+
|
|
9
|
+
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
|
|
10
|
+
while (true) {
|
|
11
|
+
DWORD count;
|
|
12
|
+
INPUT_RECORD ir;
|
|
13
|
+
if (!ReadConsoleInput(hStdin, &ir, 1, &count)) {
|
|
14
|
+
printf("ReadConsoleInput failed\n");
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (true) {
|
|
19
|
+
DWORD mode;
|
|
20
|
+
GetConsoleMode(hStdin, &mode);
|
|
21
|
+
SetConsoleMode(hStdin, mode & ~ENABLE_PROCESSED_INPUT);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (ir.EventType == KEY_EVENT) {
|
|
25
|
+
const KEY_EVENT_RECORD &ker = ir.Event.KeyEvent;
|
|
26
|
+
printf("%s", ker.bKeyDown ? "dn" : "up");
|
|
27
|
+
printf(" ch=");
|
|
28
|
+
if (isprint(ker.uChar.AsciiChar))
|
|
29
|
+
printf("'%c'", ker.uChar.AsciiChar);
|
|
30
|
+
printf("%d", ker.uChar.AsciiChar);
|
|
31
|
+
printf(" vk=%#x", ker.wVirtualKeyCode);
|
|
32
|
+
printf(" scan=%#x", ker.wVirtualScanCode);
|
|
33
|
+
printf(" state=%#x", (int)ker.dwControlKeyState);
|
|
34
|
+
printf(" repeat=%d", ker.wRepeatCount);
|
|
35
|
+
printf("\n");
|
|
36
|
+
if (ker.uChar.AsciiChar == 27 && ++escCount == 6)
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// This file is included into test programs using #include
|
|
2
|
+
|
|
3
|
+
#include <windows.h>
|
|
4
|
+
#include <assert.h>
|
|
5
|
+
#include <stdio.h>
|
|
6
|
+
#include <string.h>
|
|
7
|
+
#include <wchar.h>
|
|
8
|
+
#include <vector>
|
|
9
|
+
#include <string>
|
|
10
|
+
|
|
11
|
+
#include "../src/shared/DebugClient.h"
|
|
12
|
+
#include "../src/shared/TimeMeasurement.h"
|
|
13
|
+
|
|
14
|
+
#include "../src/shared/DebugClient.cc"
|
|
15
|
+
#include "../src/shared/WinptyAssert.cc"
|
|
16
|
+
#include "../src/shared/WinptyException.cc"
|
|
17
|
+
|
|
18
|
+
// Launch this test program again, in a new console that we will destroy.
|
|
19
|
+
static void startChildProcess(const wchar_t *args) {
|
|
20
|
+
wchar_t program[1024];
|
|
21
|
+
wchar_t cmdline[1024];
|
|
22
|
+
GetModuleFileNameW(NULL, program, 1024);
|
|
23
|
+
swprintf(cmdline, L"\"%ls\" %ls", program, args);
|
|
24
|
+
|
|
25
|
+
STARTUPINFOW sui;
|
|
26
|
+
PROCESS_INFORMATION pi;
|
|
27
|
+
memset(&sui, 0, sizeof(sui));
|
|
28
|
+
memset(&pi, 0, sizeof(pi));
|
|
29
|
+
sui.cb = sizeof(sui);
|
|
30
|
+
|
|
31
|
+
CreateProcessW(program, cmdline,
|
|
32
|
+
NULL, NULL,
|
|
33
|
+
/*bInheritHandles=*/FALSE,
|
|
34
|
+
/*dwCreationFlags=*/CREATE_NEW_CONSOLE,
|
|
35
|
+
NULL, NULL,
|
|
36
|
+
&sui, &pi);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static void setBufferSize(HANDLE conout, int x, int y) {
|
|
40
|
+
COORD size = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
|
|
41
|
+
BOOL success = SetConsoleScreenBufferSize(conout, size);
|
|
42
|
+
trace("setBufferSize: (%d,%d), result=%d", x, y, success);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static void setWindowPos(HANDLE conout, int x, int y, int w, int h) {
|
|
46
|
+
SMALL_RECT r = {
|
|
47
|
+
static_cast<SHORT>(x), static_cast<SHORT>(y),
|
|
48
|
+
static_cast<SHORT>(x + w - 1),
|
|
49
|
+
static_cast<SHORT>(y + h - 1)
|
|
50
|
+
};
|
|
51
|
+
BOOL success = SetConsoleWindowInfo(conout, /*bAbsolute=*/TRUE, &r);
|
|
52
|
+
trace("setWindowPos: (%d,%d,%d,%d), result=%d", x, y, w, h, success);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static void setCursorPos(HANDLE conout, int x, int y) {
|
|
56
|
+
COORD coord = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
|
|
57
|
+
SetConsoleCursorPosition(conout, coord);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static void setBufferSize(int x, int y) {
|
|
61
|
+
setBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), x, y);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static void setWindowPos(int x, int y, int w, int h) {
|
|
65
|
+
setWindowPos(GetStdHandle(STD_OUTPUT_HANDLE), x, y, w, h);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static void setCursorPos(int x, int y) {
|
|
69
|
+
setCursorPos(GetStdHandle(STD_OUTPUT_HANDLE), x, y);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
static void countDown(int sec) {
|
|
73
|
+
for (int i = sec; i > 0; --i) {
|
|
74
|
+
printf("%d.. ", i);
|
|
75
|
+
fflush(stdout);
|
|
76
|
+
Sleep(1000);
|
|
77
|
+
}
|
|
78
|
+
printf("\n");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static void writeBox(int x, int y, int w, int h, char ch, int attributes=7) {
|
|
82
|
+
CHAR_INFO info = { 0 };
|
|
83
|
+
info.Char.AsciiChar = ch;
|
|
84
|
+
info.Attributes = attributes;
|
|
85
|
+
std::vector<CHAR_INFO> buf(w * h, info);
|
|
86
|
+
HANDLE conout = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
87
|
+
COORD bufSize = { static_cast<SHORT>(w), static_cast<SHORT>(h) };
|
|
88
|
+
COORD bufCoord = { 0, 0 };
|
|
89
|
+
SMALL_RECT writeRegion = {
|
|
90
|
+
static_cast<SHORT>(x),
|
|
91
|
+
static_cast<SHORT>(y),
|
|
92
|
+
static_cast<SHORT>(x + w - 1),
|
|
93
|
+
static_cast<SHORT>(y + h - 1)
|
|
94
|
+
};
|
|
95
|
+
WriteConsoleOutputA(conout, buf.data(), bufSize, bufCoord, &writeRegion);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static void setChar(int x, int y, char ch, int attributes=7) {
|
|
99
|
+
writeBox(x, y, 1, 1, ch, attributes);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
static void fillChar(int x, int y, int repeat, char ch) {
|
|
103
|
+
COORD coord = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
|
|
104
|
+
DWORD actual = 0;
|
|
105
|
+
FillConsoleOutputCharacterA(
|
|
106
|
+
GetStdHandle(STD_OUTPUT_HANDLE),
|
|
107
|
+
ch, repeat, coord, &actual);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
static void repeatChar(int count, char ch) {
|
|
111
|
+
for (int i = 0; i < count; ++i) {
|
|
112
|
+
putchar(ch);
|
|
113
|
+
}
|
|
114
|
+
fflush(stdout);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// I don't know why, but wprintf fails to print this face name,
|
|
118
|
+
// "MS ゴシック" (aka MS Gothic). It helps to use wprintf instead of printf, and
|
|
119
|
+
// it helps to call `setlocale(LC_ALL, "")`, but the Japanese symbols are
|
|
120
|
+
// ultimately converted to `?` symbols, even though MS Gothic is able to
|
|
121
|
+
// display its own name, and the current code page is 932 (Shift-JIS).
|
|
122
|
+
static void cvfprintf(HANDLE conout, const wchar_t *fmt, va_list ap) {
|
|
123
|
+
wchar_t buffer[256];
|
|
124
|
+
vswprintf(buffer, 256 - 1, fmt, ap);
|
|
125
|
+
buffer[255] = L'\0';
|
|
126
|
+
DWORD actual = 0;
|
|
127
|
+
if (!WriteConsoleW(conout, buffer, wcslen(buffer), &actual, NULL)) {
|
|
128
|
+
wprintf(L"WriteConsoleW call failed!\n");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
static void cfprintf(HANDLE conout, const wchar_t *fmt, ...) {
|
|
133
|
+
va_list ap;
|
|
134
|
+
va_start(ap, fmt);
|
|
135
|
+
cvfprintf(conout, fmt, ap);
|
|
136
|
+
va_end(ap);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static void cprintf(const wchar_t *fmt, ...) {
|
|
140
|
+
va_list ap;
|
|
141
|
+
va_start(ap, fmt);
|
|
142
|
+
cvfprintf(GetStdHandle(STD_OUTPUT_HANDLE), fmt, ap);
|
|
143
|
+
va_end(ap);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
static std::string narrowString(const std::wstring &input)
|
|
147
|
+
{
|
|
148
|
+
int mblen = WideCharToMultiByte(
|
|
149
|
+
CP_UTF8, 0,
|
|
150
|
+
input.data(), input.size(),
|
|
151
|
+
NULL, 0, NULL, NULL);
|
|
152
|
+
if (mblen <= 0) {
|
|
153
|
+
return std::string();
|
|
154
|
+
}
|
|
155
|
+
std::vector<char> tmp(mblen);
|
|
156
|
+
int mblen2 = WideCharToMultiByte(
|
|
157
|
+
CP_UTF8, 0,
|
|
158
|
+
input.data(), input.size(),
|
|
159
|
+
tmp.data(), tmp.size(),
|
|
160
|
+
NULL, NULL);
|
|
161
|
+
assert(mblen2 == mblen);
|
|
162
|
+
return std::string(tmp.data(), tmp.size());
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
HANDLE openConout() {
|
|
166
|
+
const HANDLE conout = CreateFileW(L"CONOUT$",
|
|
167
|
+
GENERIC_READ | GENERIC_WRITE,
|
|
168
|
+
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
|
169
|
+
NULL, OPEN_EXISTING, 0, NULL);
|
|
170
|
+
ASSERT(conout != INVALID_HANDLE_VALUE);
|
|
171
|
+
return conout;
|
|
172
|
+
}
|