]> granicus.if.org Git - nethack/commitdiff
bug W343-3 fix (trunk only)
authornethack.allison <nethack.allison>
Sat, 9 Sep 2006 20:36:12 +0000 (20:36 +0000)
committernethack.allison <nethack.allison>
Sat, 9 Sep 2006 20:36:12 +0000 (20:36 +0000)
Incorporate part of <Someone>'s changes to address
the main part of bug W343-3.

One other patch yet to come needs to provide a way
to limit the IBMGraphics symbols to various subsets that are
available on some international versions of Windows. Pat
suggested that we not incorporate that patch as is, so I'll be
working on an overhaul of the {DEC|IBM|MACgraphics mechanism.

    * Checks for the presence of the Unicode
      APIs.  If GetVersion() returns the 31st bit set, NetHack is running on
      a 95-based version of Windows.  The Unicode APIs are not available
     and NetHack will revert to the pre-patch behavior. This fix isn't needed
      on 95-based Windows anyway.
    * Fixes console output for text strings.
      The character is converted according to the user's configured IEM code
      page and passed to the Unicode version of WriteConsoleOutputCharacter.
    * Fixes console output for map symbols.
      The character is converted according to a fixed mapping containing
      code page 437 plus the symbols in the space from 00 to 1F.  A fixed
      table is used so that a player using Lucida Console can get full
      IBMgraphics (original set, i.e. level 3) regardless of the code page.
      A table is used instead of MultiByteToWideChar so that the space from
      00 to 1F will be converted correctly; this is necessary for correct
      display of the Rogue level.

sys/winnt/nttty.c

index afafb6161eac206017c4924d5160d3fbd2d734fe..0d5812a5584bdeb1b2132896d29f3a630d5b3503 100644 (file)
@@ -8,6 +8,7 @@
  * Initial Creation                            M. Allison      1993/01/31 
  * Switch to low level console output routines M. Allison      2003/10/01
  * Restrict cursor movement until input pending        M. Lehotay      2003/10/02
+ * Call Unicode version of output API on NT    R. Chason       2005/10/28
  *
  */
 
@@ -60,6 +61,9 @@ int GUILaunched;
 extern int redirect_stdout;
 static BOOL FDECL(CtrlHandler, (DWORD));
 
+/* Flag for whether unicode is supported */
+static boolean has_unicode;
+
 #ifdef PORT_DEBUG
 static boolean display_cursor_info = FALSE;
 #endif
@@ -193,6 +197,7 @@ setftty()
        if (altered_palette) adjust_palette();
 #endif
        start_screen();
+       has_unicode = ((GetVersion() & 0x80000000) == 0);
 }
 
 void
@@ -460,8 +465,22 @@ char ch;
            default:
                        WriteConsoleOutputAttribute(hConOut,&attr,1,
                                                        cursor,&acount);
-                       WriteConsoleOutputCharacter(hConOut,&ch,1,
-                                                       cursor,&ccount);
+                       if (has_unicode) {
+                               /* Avoid bug in ANSI API on WinNT */
+                               WCHAR c2[2];
+                               int rc;
+                               rc = MultiByteToWideChar(
+                                      GetConsoleOutputCP(),
+                                      0,
+                                      &ch, 1,
+                                      c2, 2);
+                               WriteConsoleOutputCharacterW(hConOut,c2,rc,
+                                               cursor,&ccount);
+                       }
+                       else {
+                               WriteConsoleOutputCharacterA(hConOut,&ch,1,
+                                               cursor,&ccount);
+                       }
                        cursor.X++;
        }
 }
@@ -502,12 +521,51 @@ void
 g_putch(in_ch)
 int in_ch;
 {
-       char ch = (char)in_ch;
+       /* CP437 to Unicode mapping according to the Unicode Consortium */
+       static const WCHAR cp437[] =
+       {
+               0x0020, 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+               0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C,
+               0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8,
+               0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC,
+               0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+               0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+               0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+               0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+               0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+               0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+               0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+               0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+               0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+               0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+               0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+               0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x2302,
+               0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7,
+               0x00ea, 0x00eb, 0x00e8, 0x00ef, 0x00ee, 0x00ec, 0x00c4, 0x00c5,
+               0x00c9, 0x00e6, 0x00c6, 0x00f4, 0x00f6, 0x00f2, 0x00fb, 0x00f9,
+               0x00ff, 0x00d6, 0x00dc, 0x00a2, 0x00a3, 0x00a5, 0x20a7, 0x0192,
+               0x00e1, 0x00ed, 0x00f3, 0x00fa, 0x00f1, 0x00d1, 0x00aa, 0x00ba,
+               0x00bf, 0x2310, 0x00ac, 0x00bd, 0x00bc, 0x00a1, 0x00ab, 0x00bb,
+               0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+               0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510,
+               0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f,
+               0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567,
+               0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b,
+               0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580,
+               0x03b1, 0x00df, 0x0393, 0x03c0, 0x03a3, 0x03c3, 0x00b5, 0x03c4,
+               0x03a6, 0x0398, 0x03a9, 0x03b4, 0x221e, 0x03c6, 0x03b5, 0x2229,
+               0x2261, 0x00b1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00f7, 0x2248,
+               0x00b0, 0x2219, 0x00b7, 0x221a, 0x207f, 0x00b2, 0x25a0, 0x00a0
+       };
+       unsigned char ch = (unsigned char)in_ch;
 
        cursor.X = ttyDisplay->curx;
        cursor.Y = ttyDisplay->cury;
        WriteConsoleOutputAttribute(hConOut,&attr,1,cursor,&acount);
-       WriteConsoleOutputCharacter(hConOut,&ch,1,cursor,&ccount);
+       if (has_unicode)
+           WriteConsoleOutputCharacterW(hConOut,&cp437[ch],1,cursor,&ccount);
+       else
+           WriteConsoleOutputCharacterA(hConOut,&ch,1,cursor,&ccount);
 }
 
 void