Subject: bug#75171: 30.0.50; Checklist widget inside a group does not initialize correctly

From: Al Haji-Ali <[email-masked]>
Date: Sun, 29 Dec 2024 08:33:44 +0000

The following function creates four widgets (two radio button lists and two checklists) inside a group. All lists have an initial value, while the group has a nil value. Strangely, the radio buttons get initialized correctly (selecting the correct button based on their value), but the checkboxes do not (all boxes are unchecked regardless of the value). Removing the group results in correct initialization.

--8<---------------cut here---------------start------------->8---
(defun widget-test ()
  (let ((items '((item :format "%[One%] " :value 1)
                 (item :format "%[Two%] " :value 2)
                 (item :format "%[Three%] " :value 3))))
    (widget-create
     'group
     (append '(radio-button-choice
               :inline t
               :format "Inline radio:\n%v\n"
               :value 2)
             items)
     (append '(radio-button-choice
               :format "Not inline radio:\n%v\n"
               :value 2)
             items)
     (append '(checklist
               :inline t
               :format "Inline checks:\n%v\n"
               :value (1 2))
             items)
     (append '(checklist
               :format "Not inline checks:\n%v\n"
               :value (1 2))
             items)))
  (widget-setup))
--8<---------------cut here---------------end--------------->8---

If this is unintended behaviour, I managed to fix the inline version of the checklists with this advice

--8<---------------cut here---------------start------------->8---
(advice-add 'widget-checklist-match-inline
            :around
            (lambda (old-fn wid val)
              (when val
                (funcall old-fn wid val))))
--8<---------------cut here---------------end--------------->8---

The non-inline version probably requires a fix in `widget-checklist-match`, but I can't make out the logic in this function (it seems to return non-nil when not matching?!).

If it is intended behaviour, how can I correctly set the value of a checklist? and why is there a discrepancy between radio buttons and check lists?

-- Al