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

Andrew Burgess aburgess@redhat.com
Mon Jul 18 14:30:36 GMT 2022


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



More information about the Gdb-patches mailing list