Subject: bug#72404: 30.0.60; Customization of options is broken

From: Mauro Aranda <[email-masked]>
Date: Wed, 1 Jan 2025 08:31:14 -0300

Stephen Berman <[email-masked]> writes:

 > On Sun, 04 Aug 2024 10:49:52 +0300 Eli Zaretskii <[email-masked]> wrote:
 >
 >>> From: Stephen Berman <[email-masked]>
 >>> Cc: john muhl <[email-masked]>, [email-masked],  [email-masked],
 >>>   [email-masked]
 >>> Date: Thu, 01 Aug 2024 19:28:04 +0200
 >>>
 >>> On Thu, 01 Aug 2024 12:12:52 +0200 Stephen Berman 
<[email-masked]> wrote:
 >>>
 >>> I did happen to have a bit more time for this problem, and I think I've
 >>> found the cause, a single line in commit 8d354925ddb:
 >>>
 >>> diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
 >>> index 693991a6f3e..aa653549dad 100644
 >>> --- a/lisp/wid-edit.el
 >>> +++ b/lisp/wid-edit.el
 >>> @@ -2549,7 +2549,8 @@ widget-checklist-add-item
 >>>                  (t
 >>>                   (widget-create-child-value
 >>>                    widget type (car (cdr chosen)))
 >>> - (widget-specify-selected child)))))
 >>> +                             ;; (widget-specify-selected child)
 >>> +                             ))))
 >>>             (t
 >>>          (error "Unknown escape `%c'" escape)))))
 >>>       ;; Update properties.
 >>>
 >>> With this line commented out as in the above patch, I get the expected
 >>> value when carrying out Juri's recipe.  Moreover, after making that
 >>> change, I then briefly tested customizing the face widget-unselected
 >>> (which the problematic commit added) to inherit from the default face
 >>> and it shows the labels of unselected check boxes in the default face,
 >>> as it should.  So maybe deleting the commented out line above and
 >>> leaving the rest of the change is a sufficient fix.  But I have to 
admit
 >>> I don't know why that line causes the problem, and I haven't done 
enough
 >>> testing of this change to the widget-unselected face feature, so 
this is
 >>> just a status report.
 >>
 >> Thanks, I installed the above fix.
 >
 > Thanks, this seems at least a plausible stopgap.
 >
 >> It turns out the same problem also caused bug#72156, so I've now
 >> merged them.
 >>
 >> I'm leaving this bug open, in the hope that you or someone else will
 >> find the root cause for the regression and fix it.
 >
 > I will try to debug it further, but I do hope Mauro or someone else more
 > familiar with the widget and custom code than I am will look into it.
 >
 > Steve Berman

Looks to me that it's a matter of order of function calls.  The return
value of widget-create-child-value was used for setting child.

I found this by using widget-browse-at at the checkbox.  I navigated to
the checkbox parent, the set widget, and saw that only the unselected
children were specified as children of the set widget.

The attached patch should fix it.
From 8b1c19540c5ef873062e9389acb156dafc4f875c Mon Sep 17 00:00:00 2001
From: Mauro Aranda <[email-masked]>
Date: Wed, 1 Jan 2025 08:22:45 -0300
Subject: [PATCH] Fix checkbox's child creation

* lisp/wid-edit.el (widget-checklist-add-item): Swap function
calls so that child is actually a widget.  (Bug#72156)
---
 lisp/wid-edit.el | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index bf3a1141baf..3acb77dd7db 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -2549,12 +2549,9 @@ widget-checklist-add-item
 			     (widget-create-child-value
 			      widget type (cdr chosen)))
 			    (t
-			     (widget-create-child-value
-			      widget type (car (cdr chosen)))
-                             ;; This somehow breaks :options and other
-                             ;; Custom features.
-                             ;; (widget-specify-selected child)
-                             ))))
+                             (widget-specify-selected child)
+                             (widget-create-child-value
+                              widget type (car (cdr chosen)))))))
 	       (t
 		(error "Unknown escape `%c'" escape)))))
      ;; Update properties.
-- 
2.34.1