Fix for mingw (#1462)

This commit is contained in:
DannyDaemonic 2023-05-20 00:40:02 -07:00 committed by GitHub
parent 503db28849
commit d2c59b8ba4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -578,6 +578,37 @@ void console_set_color(console_state & con_st, console_color_t color) {
} }
char32_t getchar32() { char32_t getchar32() {
#if defined(_WIN32)
HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE);
wchar_t high_surrogate = 0;
while (true) {
INPUT_RECORD record;
DWORD count;
if (!ReadConsoleInputW(hConsole, &record, 1, &count) || count == 0) {
return WEOF;
}
if (record.EventType == KEY_EVENT && record.Event.KeyEvent.bKeyDown) {
wchar_t wc = record.Event.KeyEvent.uChar.UnicodeChar;
if (wc == 0) {
continue;
}
if ((wc >= 0xD800) && (wc <= 0xDBFF)) { // Check if wc is a high surrogate
high_surrogate = wc;
continue;
} else if ((wc >= 0xDC00) && (wc <= 0xDFFF)) { // Check if wc is a low surrogate
if (high_surrogate != 0) { // Check if we have a high surrogate
return ((high_surrogate - 0xD800) << 10) + (wc - 0xDC00) + 0x10000;
}
}
high_surrogate = 0; // Reset the high surrogate
return static_cast<char32_t>(wc);
}
}
#else
wchar_t wc = getwchar(); wchar_t wc = getwchar();
if (static_cast<wint_t>(wc) == WEOF) { if (static_cast<wint_t>(wc) == WEOF) {
return WEOF; return WEOF;
@ -596,6 +627,7 @@ char32_t getchar32() {
#endif #endif
return static_cast<char32_t>(wc); return static_cast<char32_t>(wc);
#endif
} }
void pop_cursor(console_state & con_st) { void pop_cursor(console_state & con_st) {