Fix colors in TUI mode in MS-Windows build with ncurses
authorEli Zaretskii <eliz@gnu.org>
Thu, 14 Mar 2019 15:31:38 +0000 (17:31 +0200)
committerEli Zaretskii <eliz@gnu.org>
Thu, 14 Mar 2019 15:31:38 +0000 (17:31 +0200)
The MS-Windows port of ncurses fails to switch to a color pair if
one or both of the colors are the implicit default colors.  This
change records the default colors when TUI is initialized, and
then specifies them explicitly when a color pair uses the default
colors.  This allows color styling in TUI mode on MS-Windows.

gdb/ChangeLog:
2019-03-14  Eli Zaretskii  <eliz@gnu.org>

* tui/tui-io.c [__MINGW32__]: Include windows.h.  Declare
ncurses_norm_attr.
(tui_initialize_io) [__MINGW32__]: Record the default terminal
colors in ncurses_norm_attr.
(apply_ansi_escape) [__MINGW32__]: If a color in a color pair is
"none", replace it with the default color recorded in
ncurses_norm_attr.

gdb/ChangeLog
gdb/tui/tui-io.c

index 50cbd2ed70e4080cb38bbc958d81aaa78e4bb3c7..6390295bfcf73ceac551dbc906905b8f3b42a812 100644 (file)
@@ -1,3 +1,19 @@
+2019-03-14  Eli Zaretskii  <eliz@gnu.org>
+
+       The MS-Windows port of ncurses fails to switch to a color pair if
+       one or both of the colors are the implicit default colors.  This
+       change records the default colors when TUI is initialized, and
+       then specifies them explicitly when a color pair uses the default
+       colors.  This allows color styling in TUI mode on MS-Windows.
+
+       * tui/tui-io.c [__MINGW32__]: Include windows.h.  Declare
+       ncurses_norm_attr.
+       (tui_initialize_io) [__MINGW32__]: Record the default terminal
+       colors in ncurses_norm_attr.
+       (apply_ansi_escape) [__MINGW32__]: If a color in a color pair is
+       "none", replace it with the default color recorded in
+       ncurses_norm_attr.
+
 2019-03-14  Tom Tromey  <tromey@adacore.com>
 
        * source-cache.h (class source_cache) <get_source_lines>: Return
index d006e41cabb050f37bba8c91dc6c46194d0dbe9b..ef1e88507aa58d6dd6322595b001463a067da41a 100644 (file)
@@ -37,6 +37,9 @@
 #include "cli-out.h"
 #include <fcntl.h>
 #include <signal.h>
+#ifdef __MINGW32__
+#include <windows.h>
+#endif
 #include "common/filestuff.h"
 #include "completer.h"
 #include "gdb_curses.h"
    "gdb_curses.h".  */
 #include "readline/readline.h"
 
+#ifdef __MINGW32__
+static SHORT ncurses_norm_attr;
+#endif
+
 static int tui_getc (FILE *fp);
 
 static int
@@ -322,6 +329,16 @@ apply_ansi_escape (WINDOW *w, const char *buf)
       int fgi, bgi;
       if (get_color (fg, &fgi) && get_color (bg, &bgi))
        {
+#ifdef __MINGW32__
+         /* MS-Windows port of ncurses doesn't support implicit
+            default foreground and background colors, so we must
+            specify them explicitly when needed, using the colors we
+            saw at startup.  */
+         if (fgi == -1)
+           fgi = ncurses_norm_attr & 15;
+         if (bgi == -1)
+           bgi = (ncurses_norm_attr >> 4) & 15;
+#endif
          int pair = get_color_pair (fgi, bgi);
          if (last_color_pair != -1)
            wattroff (w, COLOR_PAIR (last_color_pair));
@@ -807,6 +824,19 @@ tui_initialize_io (void)
 #else
   tui_rl_outstream = stdout;
 #endif
+
+#ifdef __MINGW32__
+  /* MS-Windows port of ncurses doesn't support default foreground and
+     background colors, so we must record the default colors at startup.  */
+  HANDLE hstdout = (HANDLE)_get_osfhandle (fileno (stdout));
+  DWORD cmode;
+  CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+  if (hstdout != INVALID_HANDLE_VALUE
+      && GetConsoleMode (hstdout, &cmode) != 0
+      && GetConsoleScreenBufferInfo (hstdout, &csbi))
+    ncurses_norm_attr = csbi.wAttributes;
+#endif
 }
 
 /* Get a character from the command window.  This is called from the
This page took 0.027801 seconds and 4 git commands to generate.