From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 25jaN18EXmrBPhoAWB0awg (envelope-from ) for ; Mon, 20 Jul 2026 07:19:59 -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=blci0kh8; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id C6D6F1E09E; Mon, 20 Jul 2026 07:19:59 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.1 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_INVALID,DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::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 753CE1E099 for ; Mon, 20 Jul 2026 07:19:53 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 462C54BA79BE for ; Mon, 20 Jul 2026 11:19:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 462C54BA79BE 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=blci0kh8 Received: from postout1.mail.lrz.de (postout1.mail.lrz.de [IPv6:2001:4ca0:0:103::81bb:ff89]) by sourceware.org (Postfix) with ESMTPS id C613D4BA23EE for ; Mon, 20 Jul 2026 11:19:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C613D4BA23EE 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 C613D4BA23EE 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=1784546361; cv=none; b=Gl25MjbJYXYvpJo+7cLNl2AgOnvdL6Bp2GWICWGn772+Fci0nS3swJNz8102yzRF0H6MtpZ0psqb79X5MfmEg5v5dqbyUmWoa5aEhLcVPOM/UPbJPkVIDqVQ0BnSj45BigGYFsAW+XBV5OUYPuPE0+UMkq/RnUEWoikqAD3yie8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1784546361; c=relaxed/simple; bh=X5I/4/8+nz1i8JFEnljUpLVHXQsvN6jbpMxhWMHT21Y=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=xm37EqE3+af+JOXsRX1TLfUUvye/Etc3Xc0APvC6VfLm47weO5+m1MKeuIdIw/rcutovNWzKy7XOEqUUkjIcnJT6NQeN1+Mxhr4VFB/y+yoR9mNSEE12GZcK6vR9G3fVbPvnHeYNfmrP2u8nW11mmPyNwvy9/fRzS+xiSCNVzIs= 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=blci0kh8 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C613D4BA23EE Received: from lxmhs51.srv.lrz.de (localhost [127.0.0.1]) by postout1.mail.lrz.de (Postfix) with ESMTP id 4h3dMB2s99zyVW; Mon, 20 Jul 2026 13:19:18 +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=1784546357; bh=8oROiqWQAKWnBzTbOUo1Y7YdyL6uVi TrpqDQCNeNzhE=; b=blci0kh8jLnPpuH+LQ7Pija9kg3AiRLy7fgzYUQwknX/k8 wVPFHmwuFS9G0e+KAbZKNWB2vE8wlxNV/MnbV+mixDKK/ECP9RfHxM/n2x8b7sMp SNU/1burK+ozaumVzJ76hY6OueLZP0LlY4YYi0xy+x71FkWoim1UVCEYNJSmW3IQ sbGNhc8fcCsirpe16nq/V7WNBJQ0OLUDlxbG0G88CDRwHbovOwt43f3VKxhirUhC ng53I40c9hhSEcXYQdQ3+iHNxgc04bIn4KbarGlJUsoVn8IOHkHMKuTfsKqB4DCe UBuQWgn6adC30gwrFg6BgKlZPwo1ZVj2QwkwFYyA== 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 E6tN151_rzhv; Mon, 20 Jul 2026 13:19:17 +0200 (CEST) Received: from BADWLRZ-SWEX16A.ads.mwn.de (BADWLRZ-SWEX16A.ads.mwn.de [IPv6:2001:4ca0:0:108::166]) (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 4h3dM953bPzyVS; Mon, 20 Jul 2026 13:19:17 +0200 (CEST) Received: from BADWLRZ-SWEX16A.ads.mwn.de (2001:4ca0:0:108::166) by BADWLRZ-SWEX16A.ads.mwn.de (2001:4ca0:0:108::166) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.45; Mon, 20 Jul 2026 13:19:17 +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.045; Mon, 20 Jul 2026 13:19:17 +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/y7YDu1aAgHLaZIA= Date: Mon, 20 Jul 2026 11:19:17 +0000 Message-ID: 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="=-KruUUUXYMGqjovSk9XmS" 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 --=-KruUUUXYMGqjovSk9XmS Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I addressed all your comments in a new version of the patch in https://sourceware.org/pipermail/gdb-patches/2026-May/227275.html=20 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=20 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'. >=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 > 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 > 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 --=-KruUUUXYMGqjovSk9XmS 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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 --=-KruUUUXYMGqjovSk9XmS--