Re: [PATCH v3] Add style tui-current-line command to colorize TUI current line.

Andrew Burgess via Gdb-patches
2022-07-18T14:31:06Z

Andrei Pikas <gdb@mail.api.win> writes:

> Adds the ability to customize the colors of the current line of code in TUI.
> This may be desirable when code highlighting is enabled. Because higlighted
> keywords in dark blue color are indistinguishable from a black background
> (which is the default inverse color for a white terminal).
> Here is a screenshot of old and new behavior
> https://drive.google.com/file/d/1BbgNwpFa0DvKX0K9UAd48dEgtn8aChXP/view
> ---
> gdb/NEWS | 4 ++++
> gdb/cli/cli-style.c | 36 ++++++++++++++++++++++++++++++++++++
> gdb/cli/cli-style.h | 3 +++
> gdb/doc/gdb.texinfo | 3 +++
> gdb/tui/tui-io.c | 44 ++++++++++++++++++++++++++++++++++++++++----
> gdb/tui/tui-win.c | 1 +
> 6 files changed, 87 insertions(+), 4 deletions(-)
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index 1178a37017e..03c8f53738d 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -41,6 +41,10 @@
>
> * New commands
>
> +set style tui-current-line foreground COLOR
> +set style tui-current-line background COLOR
> + Control the styling of the currently executing line of code.
> +
> maintenance set ignore-prologue-end-flag on|off
> maintenance show ignore-prologue-end-flag
> This setting, which is off by default, controls whether GDB ignores the
> diff --git a/gdb/cli/cli-style.c b/gdb/cli/cli-style.c
> index 3fd85f4aa86..64312809385 100644
> --- a/gdb/cli/cli-style.c
> +++ b/gdb/cli/cli-style.c
> @@ -54,6 +54,28 @@ static const char * const cli_colors[] = {
> "magenta",
> "cyan",
> "white",
> + "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
> + "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33",
> + "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46",
> + "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",
> + "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "70", "71", "72",
> + "73", "74", "75", "76", "77", "78", "79", "80", "81", "82", "83", "84", "85",
> + "86", "87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", "98",
> + "99", "100", "101", "102", "103", "104", "105", "106", "107", "108", "109",
> + "110", "111", "112", "113", "114", "115", "116", "117", "118", "119", "120",
> + "121", "122", "123", "124", "125", "126", "127", "128", "129", "130", "131",
> + "132", "133", "134", "135", "136", "137", "138", "139", "140", "141", "142",
> + "143", "144", "145", "146", "147", "148", "149", "150", "151", "152", "153",
> + "154", "155", "156", "157", "158", "159", "160", "161", "162", "163", "164",
> + "165", "166", "167", "168", "169", "170", "171", "172", "173", "174", "175",
> + "176", "177", "178", "179", "180", "181", "182", "183", "184", "185", "186",
> + "187", "188", "189", "190", "191", "192", "193", "194", "195", "196", "197",
> + "198", "199", "200", "201", "202", "203", "204", "205", "206", "207", "208",
> + "209", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219",
> + "220", "221", "222", "223", "224", "225", "226", "227", "228", "229", "230",
> + "231", "232", "233", "234", "235", "236", "237", "238", "239", "240", "241",
> + "242", "243", "244", "245", "246", "247", "248", "249", "250", "251", "252",
> + "253", "254", "255",

As I said in another mail, I think this change needs spinning out into
its own patch.

> nullptr
> };
>
> @@ -101,6 +123,11 @@ cli_style_option tui_active_border_style ("tui-active-border",
>
> /* See cli-style.h. */
>
> +cli_style_option tui_current_line_style ("tui-current-line",
> + ui_file_style::NONE);

Continuation lines like this should be indented initially with TABS, and
the alignment should be like:

cli_style_option tui_current_line_style ("tui-current-line",
ui_file_style::NONE);

See tui_active_border_style for an example.

Thanks,
Andrew

> +
> +/* See cli-style.h. */
> +
> cli_style_option metadata_style ("metadata", ui_file_style::DIM);
>
> /* See cli-style.h. */
> @@ -446,6 +473,15 @@ TUI window that does have the focus."),
> &style_show_list,
> true);
>
> + tui_current_line_style.add_setshow_commands (no_class, _("\
> +TUI current line display styling.\n\
> +Configure TUI current line colors\n\
> +The \"tui-current-line\" style is used when GDB displays the current line of \
> +code."),
> + &style_set_list,
> + &style_show_list,
> + true);
> +
> version_style.add_setshow_commands (no_class, _("\
> Version string display styling.\n\
> Configure colors used to display the GDB version string."),
> diff --git a/gdb/cli/cli-style.h b/gdb/cli/cli-style.h
> index f69df47098c..745e530c6a9 100644
> --- a/gdb/cli/cli-style.h
> +++ b/gdb/cli/cli-style.h
> @@ -122,6 +122,9 @@ extern cli_style_option tui_border_style;
> /* The border style of a TUI window that does have the focus. */
> extern cli_style_option tui_active_border_style;
>
> +/* The style of a reverse mode for current line in TUI window. */
> +extern cli_style_option tui_current_line_style;
> +
> /* The style to use for the GDB version string. */
> extern cli_style_option version_style;
>
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 7a4e337d15b..d3a45087217 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -26642,6 +26642,9 @@ general styling to @value{GDBN}. @xref{TUI Configuration}.
> Control the styling of the active TUI border; that is, the TUI window
> that has the focus.
>
> +@item tui-current-line
> +Control the styling of the currently executing line of code.
> +
> @end table
>
> @node Numbers
> diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
> index 22c234a0dc2..4517cc7124a 100644
> --- a/gdb/tui/tui-io.c
> +++ b/gdb/tui/tui-io.c
> @@ -35,6 +35,7 @@
> #include "tui/tui-out.h"
> #include "ui-out.h"
> #include "cli-out.h"
> +#include "cli/cli-style.h"
> #include <fcntl.h>
> #include <signal.h>
> #ifdef __MINGW32__
> @@ -351,6 +352,22 @@ tui_apply_style (WINDOW *w, ui_file_style style)
> last_style = style;
> }
>
> +/* Reads style which have been set by command "set style tui-current-line" into
> + STYLE and returns true.
> + Returns false and leaves STYLE untouched if tui-current-line style
> + isn't set. */
> +
> +static bool
> +get_custom_current_line_style (ui_file_style *style)
> +{
> + ui_file_style current_line_style = tui_current_line_style.style ();
> + if (current_line_style.is_default ())
> + return false;
> +
> + *style = current_line_style;
> + return true;
> +}
> +
> /* Apply an ANSI escape sequence from BUF to W. BUF must start with
> the ESC character. If BUF does not start with an ANSI escape,
> return 0. Otherwise, apply the sequence if it is recognized, or
> @@ -392,10 +409,12 @@ apply_ansi_escape (WINDOW *w, const char *buf)
> ui_file_style::color fg = style.get_foreground ();
> style.set_fg (bg);
> style.set_bg (fg);
> - }
>
> - /* Enable A_REVERSE. */
> - style.set_reverse (true);
> + /* Enable A_REVERSE. */
> + style.set_reverse (true);
> + }
> + else if (!get_custom_current_line_style (&style))
> + style.set_reverse (true);
> }
>
> tui_apply_style (w, style);
> @@ -410,17 +429,19 @@ tui_set_reverse_mode (WINDOW *w, bool reverse)
> ui_file_style style = last_style;
>
> reverse_mode_p = reverse;
> - style.set_reverse (reverse);
>
> if (reverse)
> {
> reverse_save_bg = style.get_background ();
> reverse_save_fg = style.get_foreground ();
> + if (!get_custom_current_line_style (&style))
> + style.set_reverse (reverse);
> }
> else
> {
> style.set_bg (reverse_save_bg);
> style.set_fg (reverse_save_fg);
> + style.set_reverse (reverse);
> }
>
> tui_apply_style (w, style);
> @@ -448,6 +469,9 @@ tui_puts (const char *string, WINDOW *w)
> if (w == nullptr)
> w = TUI_CMD_WIN->handle.get ();
>
> + attr_t w_attrs = 0;
> + short w_pair = 0;
> +
> while (true)
> {
> const char *next = strpbrk (string, "\n\1\2\033\t");
> @@ -472,6 +496,13 @@ tui_puts (const char *string, WINDOW *w)
> break;
>
> case '\n':
> + if (wattr_get (w, &w_attrs, &w_pair, nullptr) == OK)
> + /* Apply current style till the end of line. */
> + wchgat (w, -1, w_attrs, w_pair, nullptr);
> + do_tui_putc (w, c);
> + ++next;
> + break;
> +
> case '\t':
> do_tui_putc (w, c);
> ++next;
> @@ -497,6 +528,11 @@ tui_puts (const char *string, WINDOW *w)
> string = next;
> }
>
> + if (wattr_get (w, &w_attrs, &w_pair, nullptr) == OK)
> + /* Apply current style till the end of line. */
> + wchgat (w, -1, w_attrs, w_pair, nullptr);
> +
> +
> if (TUI_CMD_WIN != nullptr && w == TUI_CMD_WIN->handle.get ())
> update_cmdwin_start_line ();
> }
> diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
> index 31b6606636a..d03b12984ad 100644
> --- a/gdb/tui/tui-win.c
> +++ b/gdb/tui/tui-win.c
> @@ -1197,4 +1197,5 @@ the line numbers and uses less horizontal space."),
>
> tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
> tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
> + tui_current_line_style.changed.attach (tui_refresh_all_win, "tui-win");
> }
> --
> 2.34.1