Re: [PATCH] gdb/tui: Fix unexpected reuse of color pairs

Jakob Schäffeler <[email protected]>
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
I addressed all your comments in a new version of the patch in
https://sourceware.org/pipermail/gdb-patches/2026-May/227275.html 

However, I needed to figure out who at my company could sign the
copyright assignment so this took a while. But this is now done.

Do you need anything else from my side?

Thanks,
Jakob 


On Fri, 2026-05-08 at 10:23 +0100, Andrew Burgess wrote:
> 
> Thanks for working on this.  This looks like it could be a good
> improvement.
> 
> [email protected] writes:
> 
> > From: Jakob Schäffeler <[email protected]>
> 
> Commit message text should be line wrapped at around 72 characters,
> your
> commit message will need to be reformatted so that it is readable in
> 'git log' output.
> 
> > 
> > TUI translates ANSI styling sequences to curses color pairs.
> > Currently in this process uses COLOR_PAIR which only returns values
> > from 0 to 255 which results in unexpected reuse of color pairs.
> 
> typo: "Currently, this process uses COLOR_PAIR, which only returns
> values ..."
> 
> > This patch avoids calling COLOR_PAIR(pair) to be able to render
> > more than 256 color pairs. For this the wattron call is replaced
> > with wcolor_set.
> > This also results in last_color_pair no longer being needed since
> > we set the color directly with wcolor_set and do not need
> > wattron/off pairs any longer.
> 
> > This results in SHRT_MAX different color pairs to be available. To
> > get
> > all 65535 color pairs init_pair is replaced with
> > init_extended_pair,
> > which returns an int instead of short.
> 
> typo: "...which TAKES int instead of short.".  They both return
> 'int'.
> 
> > This patch was tested with make check-gdb TESTS="gdb.tui/*.exp"
> 
> It would be good if there was a new test added which checks the new
> extended colour range.  Is there a reason why this cannot be done?
> 
> I also wonder how widely available this extended colour API is?  Is
> this
> supported on mingw?  Or FreeBSD?  Or Solaris (is this even
> used/supported these days)?  I wonder if we should be adding
> configure
> checks for this API, or if it's OK to just put a hard requirement in
> place?   At the very least it would be nice to document in the commit
> message if nowhere else, what version/package requirements this is
> now
> placing on us.
> 
> Also, I suspect this patch is probably more than trivial, so we will
> probably need a copyright assignment in agreement before we could
> accept
> it.  Information on this process can be found here:
> 
> https://sourceware.org/gdb/wiki/ContributionChecklist#FSF_copyright_Assignment
> 
> If you have any questions, feel free to ask and we can help out.
> 
> Thanks,
> Andrew
> 
> 
> > 
> > Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=34134
> > ---
> >  gdb/tui/tui-io.c | 16 +++-------------
> >  1 file changed, 3 insertions(+), 13 deletions(-)
> > 
> > diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c
> > index 642b88ead0c..5e239179b5e 100644
> > --- a/gdb/tui/tui-io.c
> > +++ b/gdb/tui/tui-io.c
> > @@ -265,10 +265,6 @@ get_color (const ui_file_style::color &color,
> > int *result)
> >    return true;
> >  }
> >  
> > -/* The most recently emitted color pair.  */
> > -
> > -static int last_color_pair = -1;
> > -
> >  /* The most recently applied style.  */
> >  
> >  static ui_file_style last_style;
> > @@ -299,7 +295,7 @@ get_color_pair (int fg, int bg)
> >  	 back to the default if we've used too many.  */
> >        if (next >= COLOR_PAIRS)
> >  	return 0;
> > -      init_pair (next, fg, bg);
> > +      init_extended_pair (next, fg, bg);
> >        color_pair_map[c] = next;
> >        return next;
> >      }
> > @@ -320,9 +316,7 @@ tui_apply_style (WINDOW *w, ui_file_style
> > style)
> >  #endif
> >    wattroff (w, A_UNDERLINE);
> >    wattroff (w, A_REVERSE);
> > -  if (last_color_pair != -1)
> > -    wattroff (w, COLOR_PAIR (last_color_pair));
> > -  wattron (w, COLOR_PAIR (0));
> > +  wcolor_set (w, 0, nullptr);
> >  
> >    const ui_file_style::color &fg = style.get_foreground ();
> >    const ui_file_style::color &bg = style.get_background ();
> > @@ -342,10 +336,7 @@ tui_apply_style (WINDOW *w, ui_file_style
> > style)
> >  	    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));
> > -	  wattron (w, COLOR_PAIR (pair));
> > -	  last_color_pair = pair;
> > +	  wcolor_set (w, 0, &pair);
> >  	}
> >      }
> >  
> > @@ -907,7 +898,6 @@ tui_setup_io (int mode)
> >        savetty ();
> >  
> >        /* Clean up color information.  */
> > -      last_color_pair = -1;
> >        last_style = ui_file_style ();
> >        color_map.clear ();
> >        color_pair_map.clear ();
> > -- 
> > 2.54.0
smime.p7s (application/pkcs7-signature, 3.4 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.