Eric Pouech : wineconsole: In curses mode, map some box drawing attributes to ACS characters.

Alexandre Julliard julliard at winehq.org
Tue Nov 16 12:45:45 CST 2010


Module: wine
Branch: master
Commit: 4a1d9c3b55efb1638eb6a6ecb8cd1e38dfd135aa
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4a1d9c3b55efb1638eb6a6ecb8cd1e38dfd135aa

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Mon Nov 15 21:36:14 2010 +0100

wineconsole: In curses mode, map some box drawing attributes to ACS characters.

---

 programs/wineconsole/curses.c |   75 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 71 insertions(+), 4 deletions(-)

diff --git a/programs/wineconsole/curses.c b/programs/wineconsole/curses.c
index 35c5907..172ac47 100644
--- a/programs/wineconsole/curses.c
+++ b/programs/wineconsole/curses.c
@@ -124,6 +124,7 @@ MAKE_FUNCPTR(wgetch)
 MAKE_FUNCPTR(mouseinterval)
 MAKE_FUNCPTR(mousemask)
 #endif
+MAKE_FUNCPTR(acs_map)
 
 #undef MAKE_FUNCPTR
 
@@ -187,6 +188,7 @@ static BOOL WCCURSES_bind_libcurses(void)
     LOAD_FUNCPTR(mouseinterval)
     LOAD_FUNCPTR(mousemask)
 #endif
+    LOAD_FUNCPTR(acs_map)
 
 #undef LOAD_FUNCPTR
 
@@ -235,6 +237,7 @@ sym_not_found:
 #define waddchnstr p_waddchnstr
 #define wmove p_wmove
 #define wgetch p_wgetch
+#define acs_map (*p_acs_map)
 
 /******************************************************************
  *		WCCURSES_ResizeScreenBuffer
@@ -358,16 +361,80 @@ static void WCCURSES_Refresh(const struct inner_data* data, int tp, int bm)
     int         y;
     CHAR_INFO*	cell;
     DWORD       attr;
-    char        ch;
 
     for (y = tp; y <= bm; y++)
     {
 	cell = &data->cells[y * data->curcfg.sb_width];
         for (x = 0; x < data->curcfg.sb_width; x++)
         {
-            WideCharToMultiByte(CP_UNIXCP, 0, &cell[x].Char.UnicodeChar, 1,
-                                &ch, 1, NULL, NULL);
-            attr = ((BYTE)ch < 32) ? 32 : (BYTE)ch;
+            /* check for some mapping to ACS characters (drawing boxes, arrows) */
+            if ((cell[x].Char.UnicodeChar >= 0x2500 && cell[x].Char.UnicodeChar <= 0x257F) ||
+                (cell[x].Char.UnicodeChar >= 0x2190 && cell[x].Char.UnicodeChar <= 0x21FF))
+            {
+                /* FIXME: we're also mapping heavy and lines item to single lines
+                 * (that's ugly, but that's better than crap)
+                 * Moreover, as the ACS_ macros refer to values in array acs_map[], we
+                 * cannot simply build static tables for the mapping (FIXME: this could be done
+                 * at load time)
+                 */
+                switch (cell[x].Char.UnicodeChar)
+                {
+                case 0x2190: case 0x219E: case 0x21A2: case 0x21A4:
+                case 0x21BC: case 0x21BD: case 0x21D0: case 0x21E6: attr = ACS_LARROW;   break;
+                case 0x2191: case 0x219F: case 0x21A3: case 0x21A5:
+                case 0x21BE: case 0x21BF: case 0x21D1: case 0x21E7: attr = ACS_UARROW;   break;
+                case 0x2192: case 0x21A0: case 0x21A6: case 0x21C0:
+                case 0x21C1: case 0x21D2: case 0x21E8:              attr = ACS_RARROW;   break;
+                case 0x2193: case 0x21A1: case 0x21A7: case 0x21C2:
+                case 0x21C3: case 0x21D3: case 0x21E9:              attr = ACS_DARROW;   break;
+
+                case 0x2500: case 0x2501: case 0x257C: case 0x257E: attr = ACS_HLINE;    break;
+                case 0x2502: case 0x2503: case 0x257D: case 0x257F: attr = ACS_VLINE;    break;
+                case 0x250C: case 0x250D: case 0x250E: case 0x250F: attr = ACS_ULCORNER; break;
+                case 0x2510: case 0x2511: case 0x2512: case 0x2513: attr = ACS_URCORNER; break;
+                case 0x2514: case 0x2515: case 0x2516: case 0x2517: attr = ACS_LLCORNER; break;
+                case 0x2518: case 0x2519: case 0x251A: case 0x251B: attr = ACS_LRCORNER; break;
+                case 0x251C: case 0x251D: case 0x251E: case 0x251F:
+                case 0x2520: case 0x2521: case 0x2522: case 0x2523: attr = ACS_LTEE;     break;
+                case 0x2524: case 0x2525: case 0x2526: case 0x2527:
+                case 0x2528: case 0x2529: case 0x252A: case 0x252B: attr = ACS_RTEE;     break;
+
+                case 0x252C: case 0x252D: case 0x252E: case 0x252F:
+                case 0x2530: case 0x2531: case 0x2532: case 0x2533: attr = ACS_TTEE;     break;
+                case 0x2534: case 0x2535: case 0x2536: case 0x2537:
+                case 0x2538: case 0x2539: case 0x253A: case 0x253B: attr = ACS_BTEE;     break;
+
+                case 0x253C: case 0x253D: case 0x253E: case 0x253F:
+                case 0x2540: case 0x2541: case 0x2542: case 0x2543:
+                case 0x2544: case 0x2545: case 0x2546: case 0x2547:
+                case 0x2548: case 0x2549: case 0x254A: case 0x254B: attr = ACS_PLUS;     break;
+
+                case 0x2550:                                        attr = ACS_HLINE;    break;
+                case 0x2551:                                        attr = ACS_VLINE;    break;
+                case 0x2552: case 0x2553: case 0x2554:              attr = ACS_ULCORNER; break;
+                case 0x2555: case 0x2556: case 0x2557:              attr = ACS_URCORNER; break;
+                case 0x2558: case 0x2559: case 0x255A:              attr = ACS_LLCORNER; break;
+                case 0x255B: case 0x255C: case 0x255D:              attr = ACS_LRCORNER; break;
+                case 0x255E: case 0x255F: case 0x2560:              attr = ACS_LTEE;     break;
+                case 0x2561: case 0x2562: case 0x2563:              attr = ACS_RTEE;     break;
+                case 0x2564: case 0x2565: case 0x2566:              attr = ACS_TTEE;     break;
+                case 0x2567: case 0x2568: case 0x2569:              attr = ACS_BTEE;     break;
+                case 0x256A: case 0x256B: case 0x256C:              attr = ACS_PLUS;     break;
+                default:
+                    WINE_FIXME("Unmapped special character (%x)\n", cell[x].Char.UnicodeChar);
+                    attr = ' ';
+                }
+            }
+            else
+            {
+                char     ch[2];
+
+                if (WideCharToMultiByte(CP_UNIXCP, 0, &cell[x].Char.UnicodeChar, 1,
+                                        ch, sizeof(ch), NULL, NULL) == 1)
+                    attr = ((BYTE)ch[0] < 32) ? 32 : (BYTE)ch[0];
+                else
+                    attr = 32;
+            }
 
             if (cell[x].Attributes & FOREGROUND_RED)       attr |= COLOR_PAIR(COLOR_RED);
             if (cell[x].Attributes & FOREGROUND_BLUE)      attr |= COLOR_PAIR(COLOR_BLUE);




More information about the wine-cvs mailing list