DannyDaemonic преди 2 години
родител
ревизия
d2c59b8ba4
променени са 1 файла, в които са добавени 32 реда и са изтрити 0 реда
  1. 32 0
      examples/common.cpp

+ 32 - 0
examples/common.cpp

@@ -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) {