From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id tlG2HEKz/WkX1yIAWB0awg (envelope-from ) for ; Fri, 08 May 2026 05:56:18 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; secure) header.d=tum.de header.i=@tum.de header.a=rsa-sha256 header.s=tu-postout21 header.b=O6pmhpjq; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 4C76F1E093; Fri, 08 May 2026 05:56:18 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 7725B1E093 for ; Fri, 08 May 2026 05:56:10 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CBBBD4BA2E2E for ; Fri, 8 May 2026 09:56:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CBBBD4BA2E2E Authentication-Results: sourceware.org; dkim=pass (2048-bit key, secure) header.d=tum.de header.i=@tum.de header.a=rsa-sha256 header.s=tu-postout21 header.b=O6pmhpjq Received: from postout1.mail.lrz.de (postout1.mail.lrz.de [IPv6:2001:4ca0:0:103::81bb:ff89]) by sourceware.org (Postfix) with ESMTPS id CD1A04BA2E0A for ; Fri, 8 May 2026 09:55:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CD1A04BA2E0A Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=tum.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tum.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CD1A04BA2E0A Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2001:4ca0:0:103::81bb:ff89 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1778234137; cv=none; b=mB41dFwEmHuyDZ0qyRMXMRNIcJuA6NeOhkOFtqR9yzpXTUzmxOAoH2g0u+2ltaA7mr7OMM2NBCDte+GrBqK8tRNNBklVrpjJNrsTvZAulmlb3hMwmGTLQ24M+7Cv4qttaxccRw5aKMCiFTYKRXuRXBsgzitFMXXqXpkdX8+9lk0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1778234137; c=relaxed/simple; bh=8aDIAlAMpsBTuuhWmfOaIPHzV/jA0OTrDMIXaryyHjs=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=GRK0ROUjBnnkVViW4hDeE2plmjL0C9QQoH8hN611dzDwHi04huv8DX39J+jGMztlX8Qt5ydgiWbb/MeAQvotHD1kFaeT0U2oBE7i+KPRc5aM+aRlY2rhXMEPZrbOysJFu6JiLcyO5qY3bLm/tfC5lBynhJlEmA0nbkA/exmbf4A= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, secure) header.d=tum.de header.i=@tum.de header.a=rsa-sha256 header.s=tu-postout21 header.b=O6pmhpjq DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CD1A04BA2E0A Received: from lxmhs51.srv.lrz.de (localhost [127.0.0.1]) by postout1.mail.lrz.de (Postfix) with ESMTP id 4gBkyH2sD7zyVr; Fri, 8 May 2026 11:55:35 +0200 (CEST) Authentication-Results: postout.lrz.de (amavis); dkim=pass (2048-bit key) reason="pass (just generated, assumed good)" header.d=tum.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tum.de; h= mime-version:content-type:content-type:content-language :accept-language:in-reply-to:references:message-id:date:date :subject:subject:from:from:received:received:received:received; s=tu-postout21; t=1778234134; bh=4IgrSLK3JXl5CDLJTOhFIpSXPckbh4 rVaiXxLpgkWEk=; b=O6pmhpjqxeEtd9o94feUVbmo+bJaRHoQJseNLUHBq0eTce nETpT6wVw//aAy845wv8qMrtER+697Be2OxPnMLoXiuVGsMB3hwJmCezuUyx2zFh 32o6Mv6v9OJu2jkCq41tnjXfGb9aXZ6FmLXLExuozI6b+cKwv5V4mvUJbIj1OskA ybp2CTbkgwYZ5/2LQiH63T6s7V+L438IBtHscvSFEefy0HVlEuBZlN5PmSXwFToK k/LWNPs1mMhfkZ2WFiFCmYyUbiPCdG2jYbAXwBD84YJ8sLiC2dLIt+Kpy7QkYrXR UGaWxlAeFCik9Vd51nS+GPfXIA8KknQYQ5IMjJDg== X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs51.srv.lrz.de Received: from postout1.mail.lrz.de ([127.0.0.1]) by lxmhs51.srv.lrz.de (lxmhs51.srv.lrz.de [127.0.0.1]) (amavis, port 20024) with LMTP id ylfESG8rrJod; Fri, 8 May 2026 11:55:34 +0200 (CEST) Received: from BADWLRZ-SWEX15B.ads.mwn.de (BADWLRZ-SWEX15B.ads.mwn.de [IPv6:2001:4ca0:0:108::175]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by postout1.mail.lrz.de (Postfix) with ESMTPS id 4gBkyG60MLzyQd; Fri, 8 May 2026 11:55:34 +0200 (CEST) Received: from BADWLRZ-SWEX16A.ads.mwn.de (2001:4ca0:0:108::166) by BADWLRZ-SWEX15B.ads.mwn.de (2001:4ca0:0:108::175) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.37; Fri, 8 May 2026 11:55:34 +0200 Received: from BADWLRZ-SWEX16A.ads.mwn.de ([fe80::8b8f:a1e2:e060:e2e2]) by BADWLRZ-SWEX16A.ads.mwn.de ([fe80::8b8f:a1e2:e060:e2e2%7]) with mapi id 15.02.2562.037; Fri, 8 May 2026 11:55:34 +0200 From: =?utf-8?B?SmFrb2IgU2Now6RmZmVsZXI=?= To: "gdb-patches@sourceware.org" , "aburgess@redhat.com" Subject: Re: [PATCH] gdb/tui: Fix unexpected reuse of color pairs Thread-Topic: [PATCH] gdb/tui: Fix unexpected reuse of color pairs Thread-Index: AQHc3fgELN4fYijOWEKLs2FTsxW/y7YDu1aAgAAI0wA= Date: Fri, 8 May 2026 09:55:34 +0000 Message-ID: <2c089627143c4c9d5f0d7fcb7d6b808734efeb39.camel@tum.de> References: <20260507080327.1690909-1-jakob.schaeffeler@tum.de> <87o6iqdzkg.fsf@redhat.com> In-Reply-To: <87o6iqdzkg.fsf@redhat.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [131.159.85.132] Content-Type: multipart/signed; micalg=sha-256; protocol="application/pkcs7-signature"; boundary="=-lhuR/jhYQbKUVfdt2nwI" MIME-Version: 1.0 X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org --=-lhuR/jhYQbKUVfdt2nwI Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for the quick reply and the feedback! On Fri, 2026-05-08 at 10:23 +0100, Andrew Burgess wrote: >=20 > Thanks for working on this.=C2=A0 This looks like it could be a good > improvement. >=20 > jakob.schaeffeler@tum.de=C2=A0writes: >=20 > > From: Jakob Sch=C3=A4ffeler >=20 > 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. >=20 > >=20 > > 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. >=20 > typo: "Currently, this process uses COLOR_PAIR, which only returns > values ..." >=20 > > 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. >=20 > > 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. >=20 > typo: "...which TAKES int instead of short.".=C2=A0 They both return > 'int'. Thanks for the feedback. I will fix this. >=20 > > This patch was tested with make check-gdb TESTS=3D"gdb.tui/*.exp" >=20 > It would be good if there was a new test added which checks the new > extended colour range.=C2=A0 Is there a reason why this cannot be done? >=20 > I also wonder how widely available this extended colour API is?=C2=A0 Is > this > supported on mingw?=C2=A0 Or FreeBSD?=C2=A0 Or Solaris (is this even > used/supported these days)?=C2=A0 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?=C2=A0=C2=A0 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. >=20 The extended functions were added in 6.1 (Jan 27, 2018). I could try to add checks along with conditional tests based on the ncurses version used.=20 > 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.=C2=A0 Information on this process can be found here: >=20 > https://sourceware.org/gdb/wiki/ContributionChecklist#FSF_copyright_Assig= nment >=20 Okay, I will do that. I thought it is trivial because it is only a few lines. > If you have any questions, feel free to ask and we can help out. >=20 > Thanks, > Andrew >=20 >=20 > >=20 > > Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=3D34134 > > --- > > =C2=A0gdb/tui/tui-io.c | 16 +++------------- > > =C2=A01 file changed, 3 insertions(+), 13 deletions(-) > >=20 > > 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) > > =C2=A0=C2=A0 return true; > > =C2=A0} > > =C2=A0 > > -/* The most recently emitted color pair.=C2=A0 */ > > - > > -static int last_color_pair =3D -1; > > - > > =C2=A0/* The most recently applied style.=C2=A0 */ > > =C2=A0 > > =C2=A0static ui_file_style last_style; > > @@ -299,7 +295,7 @@ get_color_pair (int fg, int bg) > > =C2=A0 back to the default if we've used too many.=C2=A0 */ > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (next >=3D COLOR_PAIRS) > > =C2=A0 return 0; > > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 init_pair (next, fg, bg); > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 init_extended_pair (next, fg, bg); > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 color_pair_map[c] =3D next; > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return next; > > =C2=A0=C2=A0=C2=A0=C2=A0 } > > @@ -320,9 +316,7 @@ tui_apply_style (WINDOW *w, ui_file_style > > style) > > =C2=A0#endif > > =C2=A0=C2=A0 wattroff (w, A_UNDERLINE); > > =C2=A0=C2=A0 wattroff (w, A_REVERSE); > > -=C2=A0 if (last_color_pair !=3D -1) > > -=C2=A0=C2=A0=C2=A0 wattroff (w, COLOR_PAIR (last_color_pair)); > > -=C2=A0 wattron (w, COLOR_PAIR (0)); > > +=C2=A0 wcolor_set (w, 0, nullptr); > > =C2=A0 > > =C2=A0=C2=A0 const ui_file_style::color &fg =3D style.get_foreground ()= ; > > =C2=A0=C2=A0 const ui_file_style::color &bg =3D style.get_background ()= ; > > @@ -342,10 +336,7 @@ tui_apply_style (WINDOW *w, ui_file_style > > style) > > =C2=A0 =C2=A0=C2=A0=C2=A0 bgi =3D (ncurses_norm_attr >> 4) & 15; > > =C2=A0#endif > > =C2=A0 =C2=A0 int pair =3D get_color_pair (fgi, bgi); > > - =C2=A0 if (last_color_pair !=3D -1) > > - =C2=A0=C2=A0=C2=A0 wattroff (w, COLOR_PAIR (last_color_pair)); > > - =C2=A0 wattron (w, COLOR_PAIR (pair)); > > - =C2=A0 last_color_pair =3D pair; > > + =C2=A0 wcolor_set (w, 0, &pair); > > =C2=A0 } > > =C2=A0=C2=A0=C2=A0=C2=A0 } > > =C2=A0 > > @@ -907,7 +898,6 @@ tui_setup_io (int mode) > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 savetty (); > > =C2=A0 > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Clean up color information.=C2= =A0 */ > > -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 last_color_pair =3D -1; > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 last_style =3D ui_file_style (); > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 color_map.clear (); > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 color_pair_map.clear (); > > --=20 > > 2.54.0 --=-lhuR/jhYQbKUVfdt2nwI Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Disposition: attachment; filename="smime.p7s" Content-Transfer-Encoding: base64 MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCCC24w ggUiMIIDiqADAgECAhAPVkK1+ifR72oSUUxBz+ccMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYT AkdSMTcwNQYDVQQKDC5IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z IENBMRswGQYDVQQDDBJHRUFOVCBTL01JTUUgUlNBIDEwHhcNMjUwOTA4MTI0MDEyWhcNMjcwOTA4 MTI0MDEyWjApMScwJQYJKoZIhvcNAQkBFhhqYWtvYi5zY2hhZWZmZWxlckB0dW0uZGUwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDV0tb9RlLvkTk/fD+ZNldYlvp6vjpXXHczwG+NWRJX I0lrjl9Vhgsfh5ek7225EDsR15TWmRMybMhd3U9NIJvL5xC2iU591A/k793P1P0gRKCJrjqAfZbK OXy3GOqSZyMNFFO1o0wAc+iyc8g7IsvIjIru3ZLUcUF9oFka03x+CG6DBwevzKMrpUXKTZ6iPal5 N0ZtYV3eVypBKQ9wRLk+WtwfkiGf6fqLbCBBsguFtqX3chfMyAXBmeHB8JGrAl4buOdXSVxMel0a UdipfSIAeiyH7j+ZnSHEMUKOyae813fPkBoTzf5HWcTTw+4TIJXMdDPkHU7kjqXZ0awd50ARAgMB AAGjggGKMIIBhjAfBgNVHSMEGDAWgBTrsi87/a4CzCpEBl0lzR0SImiwRzBKBggrBgEFBQcBAQQ+ MDwwOgYIKwYBBQUHMAKGLmh0dHA6Ly9jcnQuaGFyaWNhLmdyL0hBUklDQS1HRUFOVC1TTUlNRS1S MS5jZXIwIwYDVR0RBBwwGoEYamFrb2Iuc2NoYWVmZmVsZXJAdHVtLmRlMGMGA1UdIARcMFowCQYH Z4EMAQUBAjAIBgYEAI96AQMwQwYNKwYBBAGBzxEBAQIBAjAyMDAGCCsGAQUFBwIBFiRodHRwczov L3JlcG8uaGFyaWNhLmdyL2RvY3VtZW50cy9DUFMwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF BwMEMD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly9jcmwuaGFyaWNhLmdyL0hBUklDQS1HRUFOVC1T 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 --=-lhuR/jhYQbKUVfdt2nwI--