tReturn Unicode from bgetch() in UTF8 locales - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a1765422bbab17983838549b5ef7e909e3fd3247
 (DIR) parent e130417a91a7f36a252fab10e0bcb6a5d784d482
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Sun,  3 Jan 2021 21:16:15 -0800
       
       Return Unicode from bgetch() in UTF8 locales
       
       If we're in a UTF-8 locale, have bgetch() return
       full Unicode characters.
       
       Diffstat:
         M src/cursesport/cursesport.c         |      25 +++++++++++++++++++++----
         M src/cursesport/cursesport.h         |       4 +++-
       
       2 files changed, 24 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/src/cursesport/cursesport.c b/src/cursesport/cursesport.c
       t@@ -26,6 +26,7 @@
        #endif
        
        #include "cursesport.h"
       +#include "dopewars.h"
        #include <glib.h>
        
        #ifdef CYGWIN                   /* Code for native Win32 build under Cygwin */
       t@@ -251,13 +252,13 @@ void mvaddch(int y, int x, int ch)
        /* 
         * Waits for the user to press a key.
         */
       -int bgetch(void)
       +gunichar bgetch(void)
        {
          DWORD NumRead;
       -  char Buffer[10];
       +  WCHAR Buffer[10];
        
          refresh();
       -  ReadConsole(hIn, Buffer, 1, &NumRead, NULL);
       +  ReadConsoleW(hIn, Buffer, 1, &NumRead, NULL);
          return (int)(Buffer[0]);
        }
        
       t@@ -276,7 +277,7 @@ void standend(void)
         * then automatically clears and redraws the screen, otherwise just
         * passes the key back to the calling routine.
         */
       -int bgetch()
       +gunichar bgetch()
        {
          int c;
        
       t@@ -285,6 +286,22 @@ int bgetch()
            wrefresh(curscr);
            c = getch();
          }
       +  /* Ignore special keys (e.g arrow keys) so we don't confuse them with
       +   * Unicode characters */
       +  if (c > 255) {
       +    return 0;
       +  }
       +  /* In UTF-8 locales we may need to read multiple bytes to assemble a
       +     complete Unicode character */
       +  if (LocaleIsUTF8 && (c & 192) == 192) {   /* First UTF-8 byte */
       +    char utf8_str[10];
       +    int i, utf8_width = c & 16 ? 4 : c & 32 ? 3 : 2;
       +    utf8_str[0] = (guchar)c;
       +    for (i = 1; i < utf8_width; ++i) {
       +      utf8_str[i] = (guchar)getch();
       +    }
       +    return g_utf8_get_char(utf8_str);
       +  }
          return c;
        }
        
 (DIR) diff --git a/src/cursesport/cursesport.h b/src/cursesport/cursesport.h
       t@@ -28,6 +28,8 @@
        #include <config.h>
        #endif
        
       +#include <glib.h>
       +
        #ifdef CYGWIN                   /* Definitions for native Win32 build */
        #include <winsock2.h>
        #include <windows.h>
       t@@ -107,6 +109,6 @@ void endwin(void);
        
        #endif /* CYGWIN */
        
       -int bgetch(void);
       +gunichar bgetch(void);
        
        #endif /* __CURSESPORT_H__ */