gdb/tui: Fix build for older ncurses

Older versions of ncurses (including the version that ships inside
macos, and Centos 7) do not include the A_ITALIC macro. This patch
simply hides any use of A_ITALIC behind a preprocessor guard.

The result of this is that italics won't be rendered in the tui
if ncurses isn't supported. We do have other options if we think
it's important - for instance we could show italics as bold if
italics aren't supported. From my understanding, that might be
overthinking it - so I took the simplest approach here, just to
fix the build.

Those versions also define tgetnum as:
  int tgetnum(char *id);
so attempting to compile for c++ results in the error:
  ISO C++ forbids converting a string constant to 'char*' [-Werror=write-strings]

This is just a dated API issue, so a const cast resolves the issue.

Approved-By: Tom Tromey <tom@tromey.com>
This commit is contained in:
Ciaran Woodward
2025-09-11 16:20:00 +00:00
parent 503fc47607
commit 9076d69190
2 changed files with 9 additions and 1 deletions

View File

@@ -319,7 +319,9 @@ tui_apply_style (WINDOW *w, ui_file_style style)
wattron (w, A_NORMAL);
wattroff (w, A_BOLD);
wattroff (w, A_DIM);
#ifdef A_ITALIC
wattroff (w, A_ITALIC);
#endif
wattroff (w, A_UNDERLINE);
wattroff (w, A_REVERSE);
if (last_color_pair != -1)
@@ -368,8 +370,10 @@ tui_apply_style (WINDOW *w, ui_file_style style)
gdb_assert_not_reached ("invalid intensity");
}
#ifdef A_ITALIC
if (style.is_italic ())
wattron (w, A_ITALIC);
#endif
if (style.is_underline ())
wattron (w, A_UNDERLINE);

View File

@@ -594,7 +594,11 @@ colorsupport ()
{
std::vector<color_space> result = {color_space::MONOCHROME};
int colors = tgetnum ("Co");
/* ncurses versions prior to 6.1 (and other curses
implementations) declare the tgetnum argument to be
'char *', so we need the const_cast, since C++ will not
implicitly convert. */
int colors = tgetnum (const_cast<char*> ("Co"));
if (colors >= 8)
result.push_back (color_space::ANSI_8COLOR);
if (colors >= 16)