From: nethack.allison Date: Sat, 9 Sep 2006 20:36:12 +0000 (+0000) Subject: bug W343-3 fix (trunk only) X-Git-Tag: MOVE2GIT~914 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ea80f61b6fb620ebb8b1031e546e6f8897ba2835;p=nethack bug W343-3 fix (trunk only) Incorporate part of '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. --- diff --git a/sys/winnt/nttty.c b/sys/winnt/nttty.c index afafb6161..0d5812a55 100644 --- a/sys/winnt/nttty.c +++ b/sys/winnt/nttty.c @@ -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