Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH 0/5] Add zebra-striping to CLI tables
@ 2026-06-12 14:25 Tom Tromey
  2026-06-12 14:25 ` [PATCH 1/5] Ensure tgetent is called before tgetnum Tom Tromey
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Tom Tromey @ 2026-06-12 14:25 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This series changes gdb to allow zebra-striping of tables in the CLI.
That is, with this patch, the user can set the "background" style of
even and odd lines of a table; this background style will be merged
with the relevant foreground styles of the items being printed.

Signed-off-by: Tom Tromey <tom@tromey.com>
---
Tom Tromey (5):
      Ensure tgetent is called before tgetnum
      Make two ui_out methods 'private'
      Allow "phony" ui-out tables
      Add ui_file_style::merge
      Add zebra-striping to CLI table display

 gdb/NEWS                               | 10 +++++
 gdb/cli-out.c                          | 26 ++++++++---
 gdb/cli-out.h                          | 18 +++++++-
 gdb/cli/cli-style.c                    | 43 +++++++++++++++++-
 gdb/cli/cli-style.h                    |  6 ++-
 gdb/doc/gdb.texinfo                    |  8 ++++
 gdb/mi/mi-out.c                        |  9 ++--
 gdb/mi/mi-out.h                        |  2 +-
 gdb/mingw-hdep.c                       |  6 +--
 gdb/posix-hdep.c                       |  6 +--
 gdb/python/py-uiout.h                  |  5 ++-
 gdb/stack.c                            |  6 +++
 gdb/testsuite/gdb.base/style.exp       | 17 ++++++++
 gdb/testsuite/gdb.base/zebra-style.c   | 32 ++++++++++++++
 gdb/testsuite/gdb.base/zebra-style.exp | 79 ++++++++++++++++++++++++++++++++++
 gdb/testsuite/lib/gdb-utils.exp        | 14 +++---
 gdb/ui-out.c                           | 33 ++++++++++++--
 gdb/ui-out.h                           | 29 +++++++++++--
 gdb/ui-style.c                         | 30 +++++++++++++
 gdb/ui-style.h                         | 18 ++++++++
 gdb/unittests/style-selftests.c        |  8 ++++
 gdb/utils.c                            |  6 +++
 22 files changed, 374 insertions(+), 37 deletions(-)
---
base-commit: 2b675b263dfd5c780b8b77ae6b97543a6fb42d1c
change-id: 20260612-submit-zebra-style-1bd2db26fa62

Best regards,
-- 
Tom Tromey <tom@tromey.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/5] Ensure tgetent is called before tgetnum
  2026-06-12 14:25 [PATCH 0/5] Add zebra-striping to CLI tables Tom Tromey
@ 2026-06-12 14:25 ` Tom Tromey
  2026-06-12 14:25 ` [PATCH 2/5] Make two ui_out methods 'private' Tom Tromey
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Tom Tromey @ 2026-06-12 14:25 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

A patch in this series will cause gdb_get_ncolors to be called earlier
in startup.  I was surprised to find that this function was failing
when gdb was run from the test suite, and eventually I tracked this
down to the fact that gdb_get_ncolors calls tgetnum but does not first
ensure that tgetent is called.

This patch changes the code to ensure tgetent is always called first.
I believe tgetent is idempotent so this is safe to do.

The new test case is distilled from the test that was failing for me.
Note that it does not actually fail without this patch -- the current
gdb passes here.  However by the end of the series this test would
fail without this patch, so it just assures there won't be a failure
here.
---
 gdb/mingw-hdep.c                 |  6 +-----
 gdb/posix-hdep.c                 |  6 +-----
 gdb/testsuite/gdb.base/style.exp | 14 ++++++++++++++
 gdb/ui-style.c                   | 30 ++++++++++++++++++++++++++++++
 gdb/ui-style.h                   |  3 +++
 5 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/gdb/mingw-hdep.c b/gdb/mingw-hdep.c
index 90ebe252f57..d4607b1214f 100644
--- a/gdb/mingw-hdep.c
+++ b/gdb/mingw-hdep.c
@@ -273,11 +273,7 @@ mingw_deinitialize_console ()
 int
 gdb_get_ncolors ()
 {
-  /* 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 nc = tgetnum (const_cast<char*> ("Co"));
+  int nc = basic_gdb_get_ncolors ();
   /* MS-Windows terminal generally doesn't have "Co" in its terminfo,
      but always supports at least 8 colors.  */
   if (nc <= 0)
diff --git a/gdb/posix-hdep.c b/gdb/posix-hdep.c
index b9aff9ede1f..a87d55a3957 100644
--- a/gdb/posix-hdep.c
+++ b/gdb/posix-hdep.c
@@ -46,11 +46,7 @@ gdb_console_fputs (const char *buf, FILE *f)
 int
 gdb_get_ncolors ()
 {
-  /* 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.  */
-  return tgetnum (const_cast<char*> ("Co"));
+  return basic_gdb_get_ncolors ();
 }
 
 /* See inferior.h.  */
diff --git a/gdb/testsuite/gdb.base/style.exp b/gdb/testsuite/gdb.base/style.exp
index 8a49d1c5973..eb1cdf46112 100644
--- a/gdb/testsuite/gdb.base/style.exp
+++ b/gdb/testsuite/gdb.base/style.exp
@@ -1086,6 +1086,18 @@ proc test_logging_styling {} {
 	"No symbol table is loaded\\.  Use the \"[style file command]\" command\\."
 }
 
+# Test that colors "round trip" in ANSI mode.
+proc test_ansi_round_trip {} {
+    with_test_prefix "round-trip" {
+	with_ansi_styling_terminal {
+	    clean_restart
+	    gdb_test_no_output "set style address background red"
+	    gdb_test "show style address background" \
+		"The .*address.* background color is: red"
+	}
+    }
+}
+
 # Check to see if the Python styling of disassembler output is
 # expected or not, this styling requires Python support in GDB, and
 # the Python pygments module to be available.
@@ -1133,3 +1145,5 @@ test_pagination_prompt_styling
 test_pagination_continue_styling
 test_finish_styling
 test_logging_styling
+
+test_ansi_round_trip
diff --git a/gdb/ui-style.c b/gdb/ui-style.c
index ab2b0ad5de4..3dd26fbc79a 100644
--- a/gdb/ui-style.c
+++ b/gdb/ui-style.c
@@ -578,6 +578,36 @@ examine_ansi_escape (const char *buf, int *n_read)
 
 /* See ui-style.h.  */
 
+int
+basic_gdb_get_ncolors ()
+{
+  static std::optional<int> result;
+
+  if (!result.has_value ())
+    {
+      const char *term_name = getenv ("TERM");
+      if (term_name == nullptr)
+	result = -1;
+      else
+	{
+	  char desc[4096];
+	  /* Ignore the result here.  Some versions of termcap are
+	     confused about this.  */
+	  tgetent (desc, term_name);
+
+	  /* 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.  */
+	  result = tgetnum (const_cast<char*> ("Co"));
+	}
+    }
+
+  return *result;
+}
+
+/* See ui-style.h.  */
+
 const std::vector<color_space> &
 colorsupport ()
 {
diff --git a/gdb/ui-style.h b/gdb/ui-style.h
index fc40b93709d..52f5a5a104d 100644
--- a/gdb/ui-style.h
+++ b/gdb/ui-style.h
@@ -51,6 +51,9 @@ extern const char * color_space_name (color_space c);
 /* Cast C to RESULT and return true if it's value is valid; false otherwise.  */
 extern bool color_space_safe_cast (color_space *result, long c);
 
+/* Basic implementation of gdb_get_ncolors that checks tgetent.  */
+extern int basic_gdb_get_ncolors ();
+
 /* Get the number of colors supported by the terminal where GDB is running.  */
 extern int gdb_get_ncolors ();
 

-- 
2.49.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/5] Make two ui_out methods 'private'
  2026-06-12 14:25 [PATCH 0/5] Add zebra-striping to CLI tables Tom Tromey
  2026-06-12 14:25 ` [PATCH 1/5] Ensure tgetent is called before tgetnum Tom Tromey
@ 2026-06-12 14:25 ` Tom Tromey
  2026-06-12 14:25 ` [PATCH 3/5] Allow "phony" ui-out tables Tom Tromey
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Tom Tromey @ 2026-06-12 14:25 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This marks ui_out::table_begin and ui_out::table_end as private.  They
should only be called from ui_out_emit_table.
---
 gdb/ui-out.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/gdb/ui-out.h b/gdb/ui-out.h
index d59e58631e9..a7230846115 100644
--- a/gdb/ui-out.h
+++ b/gdb/ui-out.h
@@ -30,6 +30,7 @@
 
 class ui_out_level;
 class ui_out_table;
+class ui_out_emit_table;
 struct ui_file;
 
 /* the current ui_out */
@@ -173,11 +174,9 @@ class ui_out
      field, ... }, ... ] }''.  If NR_ROWS is negative then there is at
      least one row.  */
 
-  void table_begin (int nr_cols, int nr_rows, const std::string &tblid);
   void table_header (int width, ui_align align, const std::string &col_name,
 		     const std::string &col_hdr);
   void table_body ();
-  void table_end ();
 
   void begin (ui_out_type type, const char *id);
   void end (ui_out_type type);
@@ -393,6 +392,12 @@ class ui_out
   { return false; }
 
  private:
+
+  /* A table can only be started or ended by ui_out_emit_table.  */
+  friend class ui_out_emit_table;
+  void table_begin (int nr_cols, int nr_rows, const std::string &tblid);
+  void table_end ();
+
   /* A helper for vmessage that wraps a call to do_message.  This will
      update CURRENT_STYLE when needed.  */
   void call_do_message (ui_file_style &current_style,

-- 
2.49.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 3/5] Allow "phony" ui-out tables
  2026-06-12 14:25 [PATCH 0/5] Add zebra-striping to CLI tables Tom Tromey
  2026-06-12 14:25 ` [PATCH 1/5] Ensure tgetent is called before tgetnum Tom Tromey
  2026-06-12 14:25 ` [PATCH 2/5] Make two ui_out methods 'private' Tom Tromey
@ 2026-06-12 14:25 ` Tom Tromey
  2026-06-12 14:25 ` [PATCH 4/5] Add ui_file_style::merge Tom Tromey
  2026-06-12 14:25 ` [PATCH 5/5] Add zebra-striping to CLI table display Tom Tromey
  4 siblings, 0 replies; 8+ messages in thread
From: Tom Tromey @ 2026-06-12 14:25 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

In the zebra-striping patch, it's convenient to wrap a stack trace in
a ui-out table.  However, using a real table isn't really desirable,
because that would mean printing headers.  So, this patch adds a hack
specifically for stack traces: a phony table, that does not have field
headers at all.
---
 gdb/cli-out.c         |  2 +-
 gdb/cli-out.h         |  8 +++++++-
 gdb/mi/mi-out.c       |  9 ++++++---
 gdb/mi/mi-out.h       |  2 +-
 gdb/python/py-uiout.h |  5 +++--
 gdb/ui-out.c          | 25 ++++++++++++++++++++++---
 gdb/ui-out.h          | 18 +++++++++++++++++-
 7 files changed, 57 insertions(+), 12 deletions(-)

diff --git a/gdb/cli-out.c b/gdb/cli-out.c
index d8ac13ab827..e1501f5c652 100644
--- a/gdb/cli-out.c
+++ b/gdb/cli-out.c
@@ -59,7 +59,7 @@ cli_ui_out::do_table_body ()
 /* Mark end of a table */
 
 void
-cli_ui_out::do_table_end ()
+cli_ui_out::do_table_end (bool phony)
 {
   m_suppress_output = false;
 }
diff --git a/gdb/cli-out.h b/gdb/cli-out.h
index 74307074a7c..ca138e5ad9a 100644
--- a/gdb/cli-out.h
+++ b/gdb/cli-out.h
@@ -44,8 +44,14 @@ class cli_ui_out : public ui_out
 
   virtual void do_table_begin (int nbrofcols, int nr_rows,
 			       const char *tblid) override;
+
+  /* This overload is used for "phony" tables.  */
+  void do_table_begin () override
+  {
+  }
+
   virtual void do_table_body () override;
-  virtual void do_table_end () override;
+  virtual void do_table_end (bool phony) override;
   virtual void do_table_header (int width, ui_align align,
 				const std::string &col_name,
 				const std::string &col_hdr) override;
diff --git a/gdb/mi/mi-out.c b/gdb/mi/mi-out.c
index 41b0ee8cdbd..0d60c2557e7 100644
--- a/gdb/mi/mi-out.c
+++ b/gdb/mi/mi-out.c
@@ -53,10 +53,13 @@ mi_ui_out::do_table_body ()
 /* Mark end of a table.  */
 
 void
-mi_ui_out::do_table_end ()
+mi_ui_out::do_table_end (bool phony)
 {
-  close (ui_out_type_list); /* body */
-  close (ui_out_type_tuple);
+  if (!phony)
+    {
+      close (ui_out_type_list); /* body */
+      close (ui_out_type_tuple);
+    }
 }
 
 /* Specify table header.  */
diff --git a/gdb/mi/mi-out.h b/gdb/mi/mi-out.h
index d1d26718ac4..6dece4d42b8 100644
--- a/gdb/mi/mi-out.h
+++ b/gdb/mi/mi-out.h
@@ -57,7 +57,7 @@ class mi_ui_out : public ui_out
   virtual void do_table_header (int width, ui_align align,
 			     const std::string &col_name,
 			     const std::string &col_hdr) override;
-  virtual void do_table_end () override;
+  virtual void do_table_end (bool phony) override;
 
   virtual void do_begin (ui_out_type type, const char *id) override;
   virtual void do_end (ui_out_type type) override;
diff --git a/gdb/python/py-uiout.h b/gdb/python/py-uiout.h
index 21c068e9077..2bf0c3a7b46 100644
--- a/gdb/python/py-uiout.h
+++ b/gdb/python/py-uiout.h
@@ -73,9 +73,10 @@ class py_ui_out : public ui_out
   }
   void do_table_body () override
   { }
-  void do_table_end () override
+  void do_table_end (bool phony) override
   {
-    do_end (ui_out_type_list);
+    if (!phony)
+      do_end (ui_out_type_list);
   }
   void do_table_header (int width, ui_align align,
 			const std::string &col_name,
diff --git a/gdb/ui-out.c b/gdb/ui-out.c
index ac792b43905..1c8ceaa90ee 100644
--- a/gdb/ui-out.c
+++ b/gdb/ui-out.c
@@ -184,6 +184,12 @@ class ui_out_table
 
   int entry_level () const;
 
+  /* True if this is a "phony" table.  */
+  bool phony () const
+  {
+    return m_nr_cols == 0;
+  }
+
  private:
 
   state m_state;
@@ -356,9 +362,20 @@ previous table_end."));
 
   m_table_up = std::make_unique<ui_out_table> (level () + 1, nr_cols, tblid);
 
+  gdb_assert (!m_table_up->phony ());
   do_table_begin (nr_cols, nr_rows, tblid.c_str ());
 }
 
+/* See ui-out.h.  */
+
+void
+ui_out::table_begin ()
+{
+  gdb_assert (m_table_up == nullptr);
+  m_table_up = std::make_unique<ui_out_table> (level () + 1, 0, "");
+  do_table_begin ();
+}
+
 void
 ui_out::table_header (int width, ui_align alignment,
 		      const std::string &col_name, const std::string &col_hdr)
@@ -369,7 +386,8 @@ after a table_begin and before a table_body."));
 
   m_table_up->append_header (width, alignment, col_name, col_hdr);
 
-  do_table_header (width, alignment, col_name, col_hdr);
+  if (!m_table_up->phony ())
+    do_table_header (width, alignment, col_name, col_hdr);
 }
 
 void
@@ -381,7 +399,8 @@ ui_out::table_body ()
 
   m_table_up->start_body ();
 
-  do_table_body ();
+  if (!m_table_up->phony ())
+    do_table_body ();
 }
 
 void
@@ -390,7 +409,7 @@ ui_out::table_end ()
   if (m_table_up == nullptr)
     internal_error (_("misplaced table_end or missing table_begin."));
 
-  do_table_end ();
+  do_table_end (m_table_up->phony ());
 
   m_table_up = nullptr;
 }
diff --git a/gdb/ui-out.h b/gdb/ui-out.h
index a7230846115..12da0084332 100644
--- a/gdb/ui-out.h
+++ b/gdb/ui-out.h
@@ -341,8 +341,14 @@ class ui_out
 
   virtual void do_table_begin (int nbrofcols, int nr_rows, const char *tblid)
     = 0;
+
+  /* This is only used for phony tables.  */
+  virtual void do_table_begin ()
+  {
+  }
+
   virtual void do_table_body () = 0;
-  virtual void do_table_end () = 0;
+  virtual void do_table_end (bool phony) = 0;
   virtual void do_table_header (int width, ui_align align,
 				const std::string &col_name,
 				const std::string &col_hdr) = 0;
@@ -396,6 +402,8 @@ class ui_out
   /* A table can only be started or ended by ui_out_emit_table.  */
   friend class ui_out_emit_table;
   void table_begin (int nr_cols, int nr_rows, const std::string &tblid);
+  /* This overload is only used for phony tables.  */
+  void table_begin ();
   void table_end ();
 
   /* A helper for vmessage that wraps a call to do_message.  This will
@@ -460,6 +468,14 @@ class ui_out_emit_table
     m_uiout->table_begin (nr_cols, nr_rows, tblid);
   }
 
+  /* This constructor creates a "phony" table -- this is a hack
+     intended for use just by the stack-generation code.  */
+  explicit ui_out_emit_table (ui_out *uiout)
+    : m_uiout (uiout)
+  {
+    m_uiout->table_begin ();
+  }
+
   ~ui_out_emit_table ()
   {
     m_uiout->table_end ();

-- 
2.49.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 4/5] Add ui_file_style::merge
  2026-06-12 14:25 [PATCH 0/5] Add zebra-striping to CLI tables Tom Tromey
                   ` (2 preceding siblings ...)
  2026-06-12 14:25 ` [PATCH 3/5] Allow "phony" ui-out tables Tom Tromey
@ 2026-06-12 14:25 ` Tom Tromey
  2026-06-12 14:25 ` [PATCH 5/5] Add zebra-striping to CLI table display Tom Tromey
  4 siblings, 0 replies; 8+ messages in thread
From: Tom Tromey @ 2026-06-12 14:25 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This adds ui_file_style::merge, a new method allowing two styles to be
merged together.
---
 gdb/ui-style.h                  | 15 +++++++++++++++
 gdb/unittests/style-selftests.c |  8 ++++++++
 2 files changed, 23 insertions(+)

diff --git a/gdb/ui-style.h b/gdb/ui-style.h
index 52f5a5a104d..53df949bd85 100644
--- a/gdb/ui-style.h
+++ b/gdb/ui-style.h
@@ -419,6 +419,21 @@ struct ui_file_style
     return this;
   }
 
+  /* Combine STYLE with this style, returning a new merged style.  Any
+     non-"empty" attributes of STYLE override the corresponding
+     attributes of this style.  */
+  ui_file_style merge (const ui_file_style &style) const
+  {
+    ui_file_style result = *this;
+    if (!style.m_foreground.is_none ())
+      result.m_foreground = style.m_foreground;
+    if (!style.m_background.is_none ())
+      result.m_background = style.m_background;
+    result.m_intensity = style.m_intensity;
+    result.m_reverse = style.m_reverse;
+    return result;
+  }
+
   /* nullptr-terminated list of names corresponding to enum basic_color.  */
   static const std::vector<const char *> basic_color_enums;
 
diff --git a/gdb/unittests/style-selftests.c b/gdb/unittests/style-selftests.c
index 9035050bd6c..0fa8074f719 100644
--- a/gdb/unittests/style-selftests.c
+++ b/gdb/unittests/style-selftests.c
@@ -119,6 +119,14 @@ run_tests ()
   SELF_CHECK (!style.is_underline ());
   SELF_CHECK (style.is_reverse ());
   SELF_CHECK (style.to_ansi () == "\033[38;2;83;84;85;48;2;0;1;254;2;23;24;7m");
+
+  const ui_file_style redblack_style (ui_file_style::RED, ui_file_style::BLACK);
+  const ui_file_style rednone_style (ui_file_style::RED, ui_file_style::NONE);
+  const ui_file_style noneblack_style (ui_file_style::NONE, ui_file_style::BLACK);
+  SELF_CHECK (ui_file_style ().merge (redblack_style) == redblack_style);
+  SELF_CHECK (redblack_style.merge ({}) == redblack_style);
+  SELF_CHECK (rednone_style.merge (noneblack_style) == redblack_style);
+  SELF_CHECK (noneblack_style.merge (rednone_style) == redblack_style);
 }
 
 } /* namespace style */

-- 
2.49.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 5/5] Add zebra-striping to CLI table display
  2026-06-12 14:25 [PATCH 0/5] Add zebra-striping to CLI tables Tom Tromey
                   ` (3 preceding siblings ...)
  2026-06-12 14:25 ` [PATCH 4/5] Add ui_file_style::merge Tom Tromey
@ 2026-06-12 14:25 ` Tom Tromey
  2026-06-12 15:14   ` Eli Zaretskii
  2026-06-13 14:28   ` Matt Rice
  4 siblings, 2 replies; 8+ messages in thread
From: Tom Tromey @ 2026-06-12 14:25 UTC (permalink / raw)
  To: gdb-patches; +Cc: Tom Tromey

This patch adds two new style settings to gdb.  These can be used to
add "zebra striping" to CLI tables -- that is, change the prevailing
style of alternating lines of a table.

Modifying the CLI ui-out is sufficient for most tables.  However, this
did not work for stack traces, because those aren't ordinary tables.
This patch uses the "phony table" support (added earlier in this
series) to achieve the same effect without otherwise impacting stack
trace display.

By default, styles are only changed if 256 colors are available.  This
way we can choose a relatively innocuous grey background.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32285
---
 gdb/NEWS                               | 10 +++++
 gdb/cli-out.c                          | 24 +++++++++--
 gdb/cli-out.h                          | 10 +++++
 gdb/cli/cli-style.c                    | 43 +++++++++++++++++-
 gdb/cli/cli-style.h                    |  6 ++-
 gdb/doc/gdb.texinfo                    |  8 ++++
 gdb/stack.c                            |  6 +++
 gdb/testsuite/gdb.base/style.exp       |  3 ++
 gdb/testsuite/gdb.base/zebra-style.c   | 32 ++++++++++++++
 gdb/testsuite/gdb.base/zebra-style.exp | 79 ++++++++++++++++++++++++++++++++++
 gdb/testsuite/lib/gdb-utils.exp        | 14 +++---
 gdb/ui-out.c                           |  8 +++-
 gdb/ui-out.h                           |  2 +
 gdb/utils.c                            |  6 +++
 14 files changed, 238 insertions(+), 13 deletions(-)

diff --git a/gdb/NEWS b/gdb/NEWS
index d5214a98a57..99f3eccb11a 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -136,6 +136,16 @@ show progress-bars enabled
   content, to be disabled (the set command), or to see if
   progress-bars are currently enabled or not (the show command).
 
+set style even-lines foreground COLOR
+set style even-lines background COLOR
+set style even-lines intensity VALUE
+set style odd-lines foreground COLOR
+set style odd-lines background COLOR
+set style odd-lines intensity VALUE
+  Control the styling of even and odd lines of tables.  These style
+  settings are merged with any other style that would normally be
+  applied when displaying the table.
+
 info proc environ
   Print the initial environment variables of the specified process.
   Supported on Linux.
diff --git a/gdb/cli-out.c b/gdb/cli-out.c
index e1501f5c652..5f0d4bfe0a5 100644
--- a/gdb/cli-out.c
+++ b/gdb/cli-out.c
@@ -42,6 +42,9 @@ cli_ui_out::do_table_begin (int nbrofcols, int nr_rows, const char *tblid)
     /* Only the table suppresses the output and, fortunately, a table
        is not a recursive data structure.  */
     gdb_assert (!m_suppress_output);
+
+  /* Rows start at 1.  */
+  m_row_number = 1;
 }
 
 /* Mark beginning of a table body */
@@ -62,6 +65,7 @@ void
 cli_ui_out::do_table_end (bool phony)
 {
   m_suppress_output = false;
+  m_style = ui_file_style ();
 }
 
 /* Specify table header */
@@ -78,6 +82,18 @@ cli_ui_out::do_table_header (int width, ui_align alignment,
 		   title_style.style ());
 }
 
+/* See ui-out.h.  */
+
+void
+cli_ui_out::do_start_row ()
+{
+  ui_out::do_start_row ();
+  m_style = ((m_row_number % 2 == 0)
+	     ? even_background_style
+	     : odd_background_style).style ();
+  ++m_row_number;
+}
+
 /* Mark beginning of a list */
 
 void
@@ -175,7 +191,7 @@ cli_ui_out::do_field_string (int fldno, int width, ui_align align,
   if (string)
     {
       ui_file *stream = m_streams.back ();
-      stream->emit_style_escape (style);
+      stream->emit_style_escape (m_style.merge (style));
       stream->puts (string);
       stream->emit_style_escape (ui_file_style ());
     }
@@ -208,7 +224,7 @@ cli_ui_out::do_spaces (int numspaces)
   if (m_suppress_output)
     return;
 
-  print_spaces (numspaces, m_streams.back ());
+  fputs_styled (n_spaces (numspaces), m_style, m_streams.back ());
 }
 
 void
@@ -217,7 +233,7 @@ cli_ui_out::do_text (const char *string)
   if (m_suppress_output)
     return;
 
-  gdb_puts (string, m_streams.back ());
+  fputs_styled (string, m_style, m_streams.back ());
 }
 
 void
@@ -458,7 +474,7 @@ cli_ui_out::do_progress_end ()
 void
 cli_ui_out::field_separator ()
 {
-  gdb_putc (' ', m_streams.back ());
+  fputs_styled (" ", m_style, m_streams.back ());
 }
 
 /* Constructor for cli_ui_out.  */
diff --git a/gdb/cli-out.h b/gdb/cli-out.h
index ca138e5ad9a..facb2fa3931 100644
--- a/gdb/cli-out.h
+++ b/gdb/cli-out.h
@@ -48,6 +48,8 @@ class cli_ui_out : public ui_out
   /* This overload is used for "phony" tables.  */
   void do_table_begin () override
   {
+    /* For a phony table, just set the row.  */
+    m_row_number = 1;
   }
 
   virtual void do_table_body () override;
@@ -90,6 +92,8 @@ class cli_ui_out : public ui_out
 				   double, double) override;
   virtual void do_progress_end () override;
 
+  void do_start_row () override;
+
   bool suppress_output ()
   { return m_suppress_output; }
 
@@ -100,6 +104,12 @@ class cli_ui_out : public ui_out
   std::vector<ui_file *> m_streams;
   bool m_suppress_output;
 
+  /* When displaying a table, the current row.  */
+  int m_row_number = 0;
+
+  /* The prevailing background style, used for zebra-striping a table.  */
+  ui_file_style m_style;
+
   /* The state of a recent progress update.  */
   struct cli_progress_info
   {
diff --git a/gdb/cli/cli-style.c b/gdb/cli/cli-style.c
index 03a887232c7..9f727903e72 100644
--- a/gdb/cli/cli-style.c
+++ b/gdb/cli/cli-style.c
@@ -179,6 +179,32 @@ cli_style_option version_style ("version", ui_file_style::MAGENTA,
 
 /* See cli-style.h.  */
 
+cli_style_option even_background_style ("even-lines", ui_file_style::NONE);
+
+/* Helper function to compute the initial value of the odd background
+   style.  */
+
+static ui_file_style::color
+get_initial_odd_color ()
+{
+  const std::vector<color_space> &colors = colorsupport ();
+  auto iter = std::find (colors.begin (), colors.end (),
+			 color_space::RGB_24BIT);
+  /* If 24-bit color is available, use a light grey; otherwise just do
+     nothing.  */
+  if (iter == colors.end ())
+    return ui_file_style::NONE;
+  return ui_file_style::color (0x33, 0x33, 0x33);
+}
+
+/* See cli-style.h.  */
+
+cli_style_option odd_background_style
+     ("odd-lines", ui_file_style::NONE, ui_file_style::NORMAL,
+      get_initial_odd_color ());
+
+/* See cli-style.h.  */
+
 cli_style_option disasm_mnemonic_style ("mnemonic", ui_file_style::GREEN);
 
 /* See cli-style.h.  */
@@ -202,11 +228,12 @@ cli_style_option line_number_style ("line-number", ui_file_style::DIM);
 
 cli_style_option::cli_style_option (const char *name,
 				    ui_file_style::basic_color fg,
-				    ui_file_style::intensity intensity)
+				    ui_file_style::intensity intensity,
+				    ui_file_style::color bg)
   : changed (name),
     m_name (name),
     m_foreground (fg),
-    m_background (ui_file_style::NONE),
+    m_background (bg),
     m_intensity (cli_intensities[intensity])
 {
 }
@@ -705,6 +732,18 @@ coming from your source code."),
 				       &style_set_list, &style_show_list,
 				       false);
 
+  even_background_style.add_setshow_commands (no_class, _("\
+Display styling for even-numbered lines.\n\
+Configure colors used to display even-numbered lines in tables."),
+				      &style_set_list, &style_show_list,
+				      false);
+
+  odd_background_style.add_setshow_commands (no_class, _("\
+Display styling for odd-numbered lines.\n\
+Configure colors used to display odd-numbered lines in tables."),
+				      &style_set_list, &style_show_list,
+				      false);
+
   /* Setup 'disassembler address' style and 'disassembler symbol' style,
      these are aliases for 'address' and 'function' styles respectively.  */
   add_alias_cmd ("address", address_prefix_cmds.set, no_class, 0,
diff --git a/gdb/cli/cli-style.h b/gdb/cli/cli-style.h
index bd4c007228e..cbe7ed1a173 100644
--- a/gdb/cli/cli-style.h
+++ b/gdb/cli/cli-style.h
@@ -31,7 +31,8 @@ class cli_style_option
 
   /* Construct a CLI style option with a foreground color.  */
   cli_style_option (const char *name, ui_file_style::basic_color fg,
-		    ui_file_style::intensity = ui_file_style::NORMAL);
+		    ui_file_style::intensity = ui_file_style::NORMAL,
+		    ui_file_style::color bg = ui_file_style::NONE);
 
   /* Construct a CLI style option with an intensity.  */
   cli_style_option (const char *name, ui_file_style::intensity i);
@@ -151,6 +152,9 @@ extern cli_style_option version_style;
 /* The style for a line number.  */
 extern cli_style_option line_number_style;
 
+extern cli_style_option even_background_style;
+extern cli_style_option odd_background_style;
+
 /* True if source styling is enabled.  */
 extern bool source_styling;
 
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index a698b2b8451..15dc5253c14 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -28590,6 +28590,14 @@ family of commands.  This style is only used when @value{GDBN} is
 styling using its builtin disassembler library.  By default, this style's
 foreground color is red.
 
+@item even-lines
+@itemx odd-lines
+Control the styling of lines in a table, such as the output of
+@code{info break}.  These styles are used for even- and odd-numbered
+lines, respectively.  Note that, unlike most other styles mentioned
+here, these are merged with any other style that might be applied when
+displaying the table.
+
 @end table
 
 @node Numbers
diff --git a/gdb/stack.c b/gdb/stack.c
index e084976eabf..5667c103616 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1973,6 +1973,12 @@ backtrace_command_1 (const frame_print_options &fp_opts,
       else
 	trailing = get_current_frame ();
 
+      /* Make a phony table -- we don't want a real table, because we
+	 don't want headers.  But using a table is the easiest way to
+	 get zebra stripes, which we do want.  */
+      ui_out_emit_table phony_table (current_uiout);
+      current_uiout->table_body ();
+
       for (fi = trailing; fi && count--; fi = get_prev_frame (fi))
 	{
 	  QUIT;
diff --git a/gdb/testsuite/gdb.base/style.exp b/gdb/testsuite/gdb.base/style.exp
index eb1cdf46112..02cbd23068d 100644
--- a/gdb/testsuite/gdb.base/style.exp
+++ b/gdb/testsuite/gdb.base/style.exp
@@ -116,6 +116,9 @@ proc run_style_tests { } {
 	    [multi_line \
 		 "#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+$arg_expr=$hex.*\\)\\s+at\\s+$file_expr" \
 		 "$line_expr\\s+.*return.* break here .*"]
+
+	# We don't need to test zebra styling here.
+	gdb_test_no_output "set style odd-lines background none"
 	gdb_test "info breakpoints" \
 	    ".*[limited_style What title].*$main_expr at $file_expr.*"
 
diff --git a/gdb/testsuite/gdb.base/zebra-style.c b/gdb/testsuite/gdb.base/zebra-style.c
new file mode 100644
index 00000000000..9fcc72a244f
--- /dev/null
+++ b/gdb/testsuite/gdb.base/zebra-style.c
@@ -0,0 +1,32 @@
+/* Copyright 2026 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+int
+one (int x)
+{
+  return x + 1;
+}
+
+int
+two (int x)
+{
+  return one (x) + 1;
+}
+
+int
+main (int argc, char **argv)
+{
+  return two (-2);
+}
diff --git a/gdb/testsuite/gdb.base/zebra-style.exp b/gdb/testsuite/gdb.base/zebra-style.exp
new file mode 100644
index 00000000000..2b13f065d5c
--- /dev/null
+++ b/gdb/testsuite/gdb.base/zebra-style.exp
@@ -0,0 +1,79 @@
+# Copyright 2026 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test zebra striping.
+
+standard_testfile
+
+# Style a single line of a "bt".  Only some parts of the text are
+# really checked.  Returns a regexp that can be used to match the
+# line.
+proc style_bt_line {num name filename bg} {
+    # The code lamely emits too many escapes.
+    set result [style "#" reset $bg][style $num reset $bg]
+    append result ".*?"
+    append result [style $name function $bg]
+    append result ".*?"
+    append result [style $filename file $bg]
+    append result ".*?\r\n"
+    return $result
+}
+
+# Style a single line of "info break".  Only some parts of the text
+# are really checked.  Returns a regexp that can be used to match the
+# line.
+proc style_info_line {num name filename bg} {
+    set result [style $num reset $bg]
+    append result ".*?"
+    append result [style $name function $bg]
+    append result ".*?"
+    append result [style $filename file $bg]
+    append result ".*?\r\n"
+    return $result
+}
+
+with_ansi_styling_terminal {
+    if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
+	return
+    }
+
+    if {![runto one]} {
+	return
+    }
+
+    gdb_test_no_output "set filename-display basename"
+    gdb_test_no_output "set style odd-lines background red"
+    gdb_test_no_output "set style even-lines background black"
+
+    gdb_test_no_output "set style enabled on"
+
+    gdb_test_sequence backtrace "" \
+	[list \
+	     [style_bt_line 0 one zebra-style.c 41] \
+	     [style_bt_line 1 two zebra-style.c 40] \
+	     [style_bt_line 2 main zebra-style.c 41]]
+
+    gdb_breakpoint two
+    gdb_breakpoint main
+
+    gdb_test_sequence "info break" "" \
+	-prompt "$gdb_prompt.*?" \
+	[list \
+	     ".*?Num.*?Address.*What.*?\r\n" \
+	     [style_info_line 1 one zebra-style.c 41] \
+	     [string cat [style "\tbreakpoint" reset 41] ".*?\r\n"] \
+	     [style_info_line 2 two zebra-style.c 40] \
+	     [style_info_line 3 main zebra-style.c 41]]
+}
diff --git a/gdb/testsuite/lib/gdb-utils.exp b/gdb/testsuite/lib/gdb-utils.exp
index cabeb7aa1ed..01d8a1413d6 100644
--- a/gdb/testsuite/lib/gdb-utils.exp
+++ b/gdb/testsuite/lib/gdb-utils.exp
@@ -64,13 +64,16 @@ proc string_list_to_regexp { args } {
 # style to STYLE, and one to reset the style to the default.  The
 # return value is suitable for use as a regular expression.
 
-# STYLE can either be the payload part of an ANSI terminal sequence,
-# or a shorthand for one of the gdb standard styles: "file",
-# "function", "variable", "address", etc.
+# STYLE is a shorthand for one of the gdb standard styles: "file",
+# "function", "variable", "address", etc.  It can also be "none",
+# where STR is returned verbatim, or "reset", where the default style
+# setting (but including the BG parameter) is used.
 
-proc style {str style} {
+# BG is the background color to use.  This option can be useful when
+# testing zebra-striping.
+
+proc style {str style {bg 49}} {
     set fg 39
-    set bg 49
     set intensity 22
     set italic 23
     set underline 24
@@ -86,6 +89,7 @@ proc style {str style} {
 	metadata { set intensity 2 }
 	version { set fg 35; set intensity 1 }
 	line-number { set intensity 2 }
+	reset { }
 	none { return $str }
     }
     return "\033\\\[${fg};${bg};${intensity};${italic};${underline};${reverse}m${str}\033\\\[m"
diff --git a/gdb/ui-out.c b/gdb/ui-out.c
index 1c8ceaa90ee..4add679e7a9 100644
--- a/gdb/ui-out.c
+++ b/gdb/ui-out.c
@@ -414,6 +414,12 @@ ui_out::table_end ()
   m_table_up = nullptr;
 }
 
+void
+ui_out::do_start_row ()
+{
+  m_table_up->start_row ();
+}
+
 void
 ui_out::begin (ui_out_type type, const char *id)
 {
@@ -439,7 +445,7 @@ ui_out::begin (ui_out_type type, const char *id)
   if (m_table_up != nullptr
       && m_table_up->current_state () == ui_out_table::state::BODY
       && m_table_up->entry_level () == level ())
-    m_table_up->start_row ();
+    do_start_row ();
 
   do_begin (type, id);
 }
diff --git a/gdb/ui-out.h b/gdb/ui-out.h
index 12da0084332..7cc299d2cd0 100644
--- a/gdb/ui-out.h
+++ b/gdb/ui-out.h
@@ -397,6 +397,8 @@ class ui_out
   virtual bool do_is_mi_like_p () const
   { return false; }
 
+  virtual void do_start_row ();
+
  private:
 
   /* A table can only be started or ended by ui_out_emit_table.  */
diff --git a/gdb/utils.c b/gdb/utils.c
index 4f99cdb425b..7bbb4a7c59f 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -1833,7 +1833,13 @@ pager_file::puts (const char *linebuffer)
 	  chars_printed = 0;
 	  wrap_here (0); /* Spit out chars, cancel further wraps.  */
 	  lines_printed++;
+	  const ui_file_style save_style = m_applied_style;
+	  const ui_file_style empty_style;
+	  if (save_style != empty_style)
+	    m_stream->emit_style_escape (ui_file_style ());
 	  m_stream->puts ("\n");
+	  if (save_style != empty_style)
+	    m_stream->emit_style_escape (save_style);
 	  linebuffer++;
 	}
     }

-- 
2.49.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 5/5] Add zebra-striping to CLI table display
  2026-06-12 14:25 ` [PATCH 5/5] Add zebra-striping to CLI table display Tom Tromey
@ 2026-06-12 15:14   ` Eli Zaretskii
  2026-06-13 14:28   ` Matt Rice
  1 sibling, 0 replies; 8+ messages in thread
From: Eli Zaretskii @ 2026-06-12 15:14 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

> From: Tom Tromey <tom@tromey.com>
> Date: Fri, 12 Jun 2026 08:25:25 -0600
> Cc: Tom Tromey <tom@tromey.com>
> 
> This patch adds two new style settings to gdb.  These can be used to
> add "zebra striping" to CLI tables -- that is, change the prevailing
> style of alternating lines of a table.
> 
> Modifying the CLI ui-out is sufficient for most tables.  However, this
> did not work for stack traces, because those aren't ordinary tables.
> This patch uses the "phony table" support (added earlier in this
> series) to achieve the same effect without otherwise impacting stack
> trace display.
> 
> By default, styles are only changed if 256 colors are available.  This
> way we can choose a relatively innocuous grey background.
> 
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32285
> ---
>  gdb/NEWS                               | 10 +++++
>  gdb/cli-out.c                          | 24 +++++++++--
>  gdb/cli-out.h                          | 10 +++++
>  gdb/cli/cli-style.c                    | 43 +++++++++++++++++-
>  gdb/cli/cli-style.h                    |  6 ++-
>  gdb/doc/gdb.texinfo                    |  8 ++++
>  gdb/stack.c                            |  6 +++
>  gdb/testsuite/gdb.base/style.exp       |  3 ++
>  gdb/testsuite/gdb.base/zebra-style.c   | 32 ++++++++++++++
>  gdb/testsuite/gdb.base/zebra-style.exp | 79 ++++++++++++++++++++++++++++++++++
>  gdb/testsuite/lib/gdb-utils.exp        | 14 +++---
>  gdb/ui-out.c                           |  8 +++-
>  gdb/ui-out.h                           |  2 +
>  gdb/utils.c                            |  6 +++
>  14 files changed, 238 insertions(+), 13 deletions(-)

Thanks, the documentation parts are okay.  However, maybe we should
include "table" in the names of these command?  Like "set style table
even" and "set style table odd" or something?  That'd allow us to add
more styles specific to tables in the future.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 5/5] Add zebra-striping to CLI table display
  2026-06-12 14:25 ` [PATCH 5/5] Add zebra-striping to CLI table display Tom Tromey
  2026-06-12 15:14   ` Eli Zaretskii
@ 2026-06-13 14:28   ` Matt Rice
  1 sibling, 0 replies; 8+ messages in thread
From: Matt Rice @ 2026-06-13 14:28 UTC (permalink / raw)
  To: Tom Tromey; +Cc: gdb-patches

On Fri, Jun 12, 2026 at 7:27 AM Tom Tromey <tom@tromey.com> wrote:
>
> This patch adds two new style settings to gdb.  These can be used to
> add "zebra striping" to CLI tables -- that is, change the prevailing
> style of alternating lines of a table.
>
> Modifying the CLI ui-out is sufficient for most tables.  However, this
> did not work for stack traces, because those aren't ordinary tables.
> This patch uses the "phony table" support (added earlier in this
> series) to achieve the same effect without otherwise impacting stack
> trace display.
>
> By default, styles are only changed if 256 colors are available.  This
> way we can choose a relatively innocuous grey background.
>
> Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32285
> ---
>  gdb/NEWS                               | 10 +++++
>  gdb/cli-out.c                          | 24 +++++++++--
>  gdb/cli-out.h                          | 10 +++++
>  gdb/cli/cli-style.c                    | 43 +++++++++++++++++-
>  gdb/cli/cli-style.h                    |  6 ++-
>  gdb/doc/gdb.texinfo                    |  8 ++++
>  gdb/stack.c                            |  6 +++
>  gdb/testsuite/gdb.base/style.exp       |  3 ++
>  gdb/testsuite/gdb.base/zebra-style.c   | 32 ++++++++++++++
>  gdb/testsuite/gdb.base/zebra-style.exp | 79 ++++++++++++++++++++++++++++++++++
>  gdb/testsuite/lib/gdb-utils.exp        | 14 +++---
>  gdb/ui-out.c                           |  8 +++-
>  gdb/ui-out.h                           |  2 +
>  gdb/utils.c                            |  6 +++
>  14 files changed, 238 insertions(+), 13 deletions(-)
>
> diff --git a/gdb/NEWS b/gdb/NEWS
> index d5214a98a57..99f3eccb11a 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -136,6 +136,16 @@ show progress-bars enabled
>    content, to be disabled (the set command), or to see if
>    progress-bars are currently enabled or not (the show command).
>
> +set style even-lines foreground COLOR
> +set style even-lines background COLOR
> +set style even-lines intensity VALUE
> +set style odd-lines foreground COLOR
> +set style odd-lines background COLOR
> +set style odd-lines intensity VALUE
> +  Control the styling of even and odd lines of tables.  These style
> +  settings are merged with any other style that would normally be
> +  applied when displaying the table.
> +
>  info proc environ
>    Print the initial environment variables of the specified process.
>    Supported on Linux.

I'm kind of hesitant to suggest it, (and only do so because it's easy
to just say please feel free to disregard this in its entirety)
One way I've liked to do this sort of thing rather than having
separate UI for even and odd rows, you can have one command
which sets an array of values. Then rather than alternating on
even/odd you just mod by the array length.

So you can set it to a solid color with one value, even/odd with two,
three, and rainbow if it suits your fancy.
I would suggest using python style arrays of dictionaries.
`set style zebra-table = [{"foreground": COLOR, "background", COLOR,
"intensity": VALUE}, ... ]`

I kind of like this because it turns out to be less UI commands, for a
more flexible effect.
alas, It probably requires some overhead in order to be able to have
UI taking python arrays, (or json values or whatever).
I'll leave it up to you whether you feel it's worth the chew or not, I
figure it doesn't hurt considering it...

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-06-13 14:28 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-12 14:25 [PATCH 0/5] Add zebra-striping to CLI tables Tom Tromey
2026-06-12 14:25 ` [PATCH 1/5] Ensure tgetent is called before tgetnum Tom Tromey
2026-06-12 14:25 ` [PATCH 2/5] Make two ui_out methods 'private' Tom Tromey
2026-06-12 14:25 ` [PATCH 3/5] Allow "phony" ui-out tables Tom Tromey
2026-06-12 14:25 ` [PATCH 4/5] Add ui_file_style::merge Tom Tromey
2026-06-12 14:25 ` [PATCH 5/5] Add zebra-striping to CLI table display Tom Tromey
2026-06-12 15:14   ` Eli Zaretskii
2026-06-13 14:28   ` Matt Rice

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox