From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.bugs Subject: bug#69941: 30.0.50; Faulty fontification of radio button widgets Date: Fri, 22 Mar 2024 17:31:46 +0200 Message-ID: <865xxe1dwd.fsf@gnu.org> References: <87h6gynx49.fsf@rub.de> Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="40406"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 69941@debbugs.gnu.org To: Stephen Berman , Mauro Aranda , Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Mar 22 16:33:51 2024 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rngty-000AGI-Ku for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 22 Mar 2024 16:33:50 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rngtX-0000aF-Sm; Fri, 22 Mar 2024 11:33:23 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rngtV-0000ZK-QH for bug-gnu-emacs@gnu.org; Fri, 22 Mar 2024 11:33:21 -0400 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rngtV-0007HL-GW for bug-gnu-emacs@gnu.org; Fri, 22 Mar 2024 11:33:21 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1rngu9-0003Bl-UB for bug-gnu-emacs@gnu.org; Fri, 22 Mar 2024 11:34:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 22 Mar 2024 15:34:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 69941 X-GNU-PR-Package: emacs Original-Received: via spool by 69941-submit@debbugs.gnu.org id=B69941.171112160312160 (code B ref 69941); Fri, 22 Mar 2024 15:34:01 +0000 Original-Received: (at 69941) by debbugs.gnu.org; 22 Mar 2024 15:33:23 +0000 Original-Received: from localhost ([127.0.0.1]:60775 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rngtW-0003A1-L7 for submit@debbugs.gnu.org; Fri, 22 Mar 2024 11:33:23 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:44454) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rngtS-00039c-R3 for 69941@debbugs.gnu.org; Fri, 22 Mar 2024 11:33:21 -0400 Original-Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rngsh-0006yQ-9S; Fri, 22 Mar 2024 11:32:32 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=CwWyTKOhkdVoX0dYgPG2sqLJgcJdmQkXpXkm2UGOw9U=; b=b7YSS73UIMSW YZ2XRzIPtf1bxpASUhlBRsQXOdZGNuzY+Ms/7KG9cySy1g4HBeN/hLv6Vn48dBbSIBixPBOUiNrMk bGKdsfoiuN59Em/f4R+Oy2XukWencDjaszZ5jvmFIl8xdxYuteb+AnBBSmAvNJYJUb7FNgr0FVL7i /vBpCWzVXbWooiDU7alBM+iJl9abeaQG5duBwlk+uXxbXumJEX/yhIjWA1t3ocaQc+zCGjJEInnTv WGq6X4R8qnekTfSnjfKsnx2VoI6wsTmu3nnF0Ag3q8vz6RfnXtoyaQO+NQ8EUlR2HuI5LBO7jR8ZJ 4fONXp+6WEDxt+oJRjO4Xw==; In-Reply-To: <87h6gynx49.fsf@rub.de> (bug-gnu-emacs@gnu.org) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:281946 Archived-At: > Date: Fri, 22 Mar 2024 15:45:42 +0100 > From: Stephen Berman via "Bug reports for GNU Emacs, > the Swiss army knife of text editors" > > 0. Save the following code (attached here to circumvent line breaks > added by the mail program) as widget-example.el: > > (custom-set-faces '(widget-inactive ((t (:foreground "magenta" > :background "yellow"))))) > > (defvar my-radio-widget) > (defvar my-activate-button) > > (defun my-widget-example () > (interactive) > (switch-to-buffer "*My Widget Example*") > (kill-all-local-variables) > (let ((inhibit-read-only t)) > (erase-buffer)) > (remove-overlays) > (setq my-radio-widget > (widget-create 'radio-button-choice > :notify (lambda (widget &rest _) > (widget-apply widget :deactivate) > (widget-apply my-activate-button :activate)) > '(item "One") '(item "Two"))) > (setq my-activate-button > (widget-create 'push-button > :notify (lambda (widget &rest _) > (widget-value-set my-radio-widget "") > (widget-apply my-radio-widget :activate) > (widget-apply widget :deactivate)) > "Activate")) > (widget-apply my-activate-button :deactivate) > (use-local-map widget-keymap) > (widget-setup)) > > 1. emacs -Q -l widget-example.el > 2. M-x my-widget-example > > In the buffer "*My Widget Example*" it easy to see (due to value of the > widget-inactive face set in widget-example.el) that the push-button > widget "Activate" is inactive and the radio-button widgets labelled > "One" and "Two" are active (the buttons have the default face; that the > labels next to the buttons have the widget-inactive face may seem odd, > but that's not the bug I'm reporting here; I address that issue in a > separate bug report). > > 3. Press TAB (or S-TAB) twice to put point on the radio button "Two", > then press RET. As the fontification shows, now both radio buttons are > inactive (so pressing RET on either raises the error "Attempt to perform > action on inactive widget"), and the "Activate" button is now active. > After tabbing to the "Activate" button and pressing RET, the initial > state is restored, with the two radio buttons active and "Activate" > inactive. > > 4. Now tab up to the radio buttone "One" and press RET. > => While radio button "Two" agains has the widget-inactive face, radio > button "One" (just the button, not its label) has the default face used > for active widgets, though it is in fact inactive (as pressing RET and > getting the corresponding error verifies). > > 5. Tab back to "Activate" and press RET, again restoring the initial > state. Now tab to radio button "Two" and press RET. > => The fontification is the same as in step 4: radio button "Two" has > the widget-inactive face but radio button "One" has the default (active) > face, though it is again inactive. Repeatedly pressing either of the > radio buttons (after activating them), does not change the fontification > of "One" again. > > > The faulty fontification of radio button "One" also obtains if there is > just one radio button instead of two, and if there are more than two > radio buttons, it is only the first one that displays the odd > fontification (admittedly, I've only test up to three radio buttons). > > I've tried to debug this and found that the problem seems to be due to > the sexp (set-marker-insertion-type from t) near the end of > widget-default-create, which advances the marker specified by the > widget's :from property. Changing t to nil fixes the faulty > fontification of the first radio button. > > I investigated the history of this code, and while the value t for the > marker insertion type was used in the initial commit, it was changed to > nil in commit e0f956935, with the message "Insert new text at the :from > marker _after_ the marker, not before it." But 18 days later it was > changed back to t in commit 3bff434b8, that also added "Document need to > put some text before the %v escape in :format string" of editable-field > widgets. (I looked at the bug-gnu-emacs and emacs-devel mailing list > archives but found nothing relevant at the time just prior to these > commits.) > > So evidently the advancing marker insertion type is needed for at least > some widgets, though it seems to be problematic for radio buttons. So I > tried to conditionalize the choice of t or nil on the type of the > widget. I used (not (eq 'radio-button (widget-type widget))), since the > argument `widget' of widget-default-create is, according to Edebug, > indeed radio-button, so negating the eq sexp returns nil, which I had > found to be the value of the marker insertion type that fixes the > fontification (however, I couldn't think of a way of limiting the > conditioning to only the first radio button, but in my testing so far > that lack doesn't appear to make a difference). > > But in fact, using the negation of the value of the eq sexp results in > the same faulty fontification, while omitting the negation (as in the > attached patch), which yields the advancing insertion type t, gives the > correct fontification, just like using nil does. This makes no sense to > me, yet it is reliably reproducible. The only possible explanation that > occurs to me is that the bug is triggered elsewhere in the Emacs code > and somehow using the sexp that evaluates to t as the marker insertion > type affects that code, while using t itself does not (or rather, has > the opposite effect); but how that could be and where the culpable code > is, I don't know (as a guess, perhaps in the C code that adds faces, but > I don't know how to debug that). If anyone knows or has an idea what's > going on here, please communicate it. In the meantime I will continue > to use the widget library with the patch to see whether it has unwanted > consequences. > > diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el > index 172da3db1e0..c2cd48e1551 100644 > --- a/lisp/wid-edit.el > +++ b/lisp/wid-edit.el > @@ -1733,8 +1733,9 @@ widget-default-create > (goto-char value-pos) > (widget-apply widget :value-create))) > (let ((from (point-min-marker)) > - (to (point-max-marker))) > - (set-marker-insertion-type from t) > + (to (point-max-marker)) > + (from-mit (eq 'radio-button (widget-type widget)))) > + (set-marker-insertion-type from from-mit) > (set-marker-insertion-type to nil) > (widget-put widget :from from) > (widget-put widget :to to))) > Mauro and Stefan, any comments or suggestions?