Implement basic canonical mode for Windows

The `cat` command now works properly, when run by itself on the bash
command prompt. It's working beautifully so far, and is only missing
a few keystrokes for clearing words and lines. Definitely works more
well than the one that ships with WIN32 :-)
This commit is contained in:
Justine Tunney 2023-10-03 22:34:45 -07:00
parent 4825737509
commit f26a280cda
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
36 changed files with 320 additions and 231 deletions

View file

@ -38,6 +38,7 @@
#include "libc/nexgen32e/kcpuids.h"
#include "libc/nexgen32e/x86feature.h"
#include "libc/nexgen32e/x86info.h"
#include "libc/nt/console.h"
#include "libc/nt/enum/startf.h"
#include "libc/nt/runtime.h"
#include "libc/nt/startupinfo.h"
@ -651,13 +652,20 @@ textstartup void __printargs(const char *prologue) {
PRINT(" ☼ %s = %ld", "hStdError", startinfo.hStdError);
PRINT("");
uint32_t cm;
PRINT("STANDARD HANDLES");
PRINT(" ☼ %s = %ld", "GetStdHandle(kNtStdInputHandle)",
GetStdHandle(kNtStdInputHandle));
if (GetConsoleMode(GetStdHandle(kNtStdInputHandle), &cm))
PRINT(" %s", DescribeNtConsoleInFlags(cm));
PRINT(" ☼ %s = %ld", "GetStdHandle(kNtStdOutputHandle)",
GetStdHandle(kNtStdOutputHandle));
if (GetConsoleMode(GetStdHandle(kNtStdOutputHandle), &cm))
PRINT(" %s", DescribeNtConsoleOutFlags(cm));
PRINT(" ☼ %s = %ld", "GetStdHandle(kNtStdErrorHandle)",
GetStdHandle(kNtStdErrorHandle));
if (GetConsoleMode(GetStdHandle(kNtStdErrorHandle), &cm))
PRINT(" %s", DescribeNtConsoleOutFlags(cm));
PRINT("");
PRINT("TEB");

View file

@ -20,6 +20,7 @@
#include "libc/calls/internal.h"
#include "libc/calls/syscall_support-nt.internal.h"
#include "libc/intrin/bits.h"
#include "libc/intrin/nomultics.internal.h"
#include "libc/intrin/weaken.h"
#include "libc/limits.h"
#include "libc/log/libfatal.internal.h"
@ -136,13 +137,14 @@ static abi wontreturn void WinInit(const char16_t *cmdline) {
for (int i = 0; i <= 2; ++i) {
uint32_t m;
intptr_t h = __imp_GetStdHandle(kNtStdio[i]);
__imp_GetConsoleMode(h, &m);
if (!i) {
m |= kNtEnableMouseInput | kNtEnableWindowInput;
} else {
m |= kNtEnableVirtualTerminalProcessing;
if (__imp_GetConsoleMode(h, &m)) {
if (!i) {
m |= kNtEnableMouseInput | kNtEnableWindowInput;
} else {
m |= kNtEnableVirtualTerminalProcessing;
}
__imp_SetConsoleMode(h, m);
}
__imp_SetConsoleMode(h, m);
}
}