From: Stephen Berman via "Bug reports for GNU Emacs, the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org>
To: Mauro Aranda <maurooaranda@gmail.com>
Cc: 69942@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>
Subject: bug#69942: 30.0.50; Fontification of radio-button widget labels
Date: Fri, 26 Apr 2024 14:47:26 +0200 [thread overview]
Message-ID: <87o79wl28x.fsf@gmx.net> (raw)
In-Reply-To: <87y196lctq.fsf@gmx.net> (Stephen Berman's message of "Sun, 21 Apr 2024 21:45:21 +0200")
[-- Attachment #1: Type: text/plain, Size: 5631 bytes --]
On Sun, 21 Apr 2024 21:45:21 +0200 Stephen Berman <stephen.berman@gmx.net> wrote:
> On Thu, 18 Apr 2024 15:37:58 +0200 Stephen Berman <stephen.berman@gmx.net> wrote:
>
>> On Thu, 18 Apr 2024 07:07:43 -0300 Mauro Aranda <maurooaranda@gmail.com> wrote:
>>
>>> Eli Zaretskii <eliz@gnu.org> writes:
>>>
>>>>> Date: Mon, 8 Apr 2024 07:58:44 -0300
>>>>> Cc: 69942@debbugs.gnu.org
>>>>> From: Mauro Aranda <maurooaranda@gmail.com>
>>>>>
>>>>> On 6/4/24 06:02, Eli Zaretskii wrote:
>>>>> >> From: Stephen Berman <stephen.berman@gmx.net>
>>>>> >> Cc: Eli Zaretskii <eliz@gnu.org>, 69942@debbugs.gnu.org
>>>>> >> Date: Mon, 01 Apr 2024 17:21:27 +0200
>>>>> >>
>>>>> >> On Mon, 25 Mar 2024 01:40:36 +0100 Stephen Berman
>>>>> <stephen.berman@gmx.net> wrote:
>>>>> >>
>>>>> >>> Ok, I've gotten further with implementing disinguishing by faces
>>>>> >>> selected (chosen) and unselected radio buttons in radio-button-choice
>>>>> >>> widgets and check boxes in checklist widgets, see the attached patch.
>>>>> >>> Initial tests seem ok, but it definitely needs more testing.
>>>>> >>
>>>>> >> Any comments on this patch for using a widget-unselected face? I have
>>>>> >> been detained from further testing this past week, but can now resume.
>>>>> >
>>>>> > Mauro, any further comments?
>>>>>
>>>>> Hi Eli and Stephen,
>>>>>
>>>>> Please forgive me, for the past 2 weeks I haven't been able to do any
>>>>> computer stuff. If it's OK, please give me until the weekend so I
>>>>> can catch up with this and the other 2 bug reports by Stephen.
>>>>
>>>> Mauro, were you able to find time to look into this and the other 2
>>>> bugs?
>>>
>>> I have, just now. The patch looks good to me. It'll be great if
>>> Stephen can add some documentation to the manual, so it stays updated.
>>> If not, I can do that in a few days.
>>
>> Sure, I'll add documentation and post it here for approval before
>> pushing the changes.
>
> I've encountered some problems with the patch. One is that it breaks
> the display of all face attributes in the customize-face buffer. I've
> determined the part of the patch that triggers this, though I haven't
> yet figured out just why this bit of code breaks the display. Also, it
> appears that the widget-unselected face does not completely replace
> widget-inactive where it's intended to do so, but I need to do more
> testing and debugging here to find out why. Until I've fixed these
> issues the patch is not suitable for installing, so I'm also holding off
> with the accompanying documentation. (But in preparation for the
> documentation I looked more closely at the Widget manual and found
> several typos and other issues, for which I opened bug#70502.)
The breakage in displaying all face attributes in the customize-face
buffer was caused by the invocation of `(widget-specify-selected child)'
in widget-checklist-add-item in the cond-clause satisfying
`(widget-inline-p type t)'. I still don't understand why it has this
effect, and I have to admit that I don't understand what an inline
widget is. But simply omitting the invocation of
`(widget-specify-selected child)' at this point in the patch does avoid
the customize-face breakage and I have not noticed any problems due to
this omission.
As for the problematic interaction between the widget-unselected and
widget-inactive faces, this seems to have been due to my having copied
most of the definition of widget-specify-unselected from that of
widget-specify-inactive, and specifically, copying the overlay priority.
In the attached patch, widget-specify-unselected now uses a lower
overlay priority than the one used in widget-specify-inactive, and in my
tests this yields the desired results: the labels of active checkboxes
and radio-buttons have widget-unselected face but when these widgets are
deactivated, the labels have widget-inactive face.
Another change I've made in the attached patch is to have the default
value of widget-unselected face inherit from widget-inactive instead of
inheriting from shadow face, like widget-inactive does by default. This
way, if a user customizes widget-inactive, that will also apply by
default to widget-unselected, thus retaining the current default widget
UI where the labels of checkboxes and radio-buttons have widget-inactive
face. (Thus, the "desired results" in the preceding paragraph are only
visible when widget-unselected face is customized to differ from
widget-unselected face.)
Finally, regarding documentation of widget-unselected face in the Widget
manual, I think it would be helpful for the documentation to mention the
use case that motivated introducing it (following Mauro's suggestion to
use a face instead of a defcustom), namely, to visually distinguish the
labels of unselected and inactive widgets. Here is what I suggest:
@deffn Face widget-unselected
Face used for unselected widgets. This face is also used on the text
labels of radio-button and checkbox widgets.
The default value inherits @code{widget-inactive} face. If you want to
visually distinguish the labels of unselected active radio-button or
checkbox widgets from the labels of unselected inactive widgets,
customize this face to a non-default value.
@end deffn
Since the recent widget.texi changes that include documenting
widget-inactive face have not yet been merged to master, I haven't
included the propopsed documentaton of widget-unselected in the attached
patch, but if approved, will of course add it after the merge.
Steve Berman
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: widget-unselected patch --]
[-- Type: text/x-patch, Size: 5230 bytes --]
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index dc481d4d0a5..b7673b01c73 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -555,6 +555,29 @@ widget-specify-active
(delete-overlay inactive)
(widget-put widget :inactive nil))))
+(defface widget-unselected
+ '((t :inherit widget-inactive))
+ "Face used for unselected widgets."
+ :group 'widget-faces
+ :version "30.1")
+
+(defun widget-specify-unselected (widget from to)
+ "Fontify WIDGET as unselected (not chosen)."
+ (let ((overlay (make-overlay from to nil t nil)))
+ (overlay-put overlay 'face 'widget-unselected)
+ (overlay-put overlay 'evaporate t)
+ ;; The overlay priority here should be lower than the priority in
+ ;; `widget-specify-active' (bug#69942).
+ (overlay-put overlay 'priority 90)
+ (widget-put widget :unselected overlay)))
+
+(defun widget-specify-selected (widget)
+ "Remove fontification of WIDGET as unselected (not chosen)."
+ (let ((unselected (widget-get widget :unselected)))
+ (when unselected
+ (delete-overlay unselected)
+ (widget-put widget :unselected nil))))
+
;;; Widget Properties.
(defsubst widget-type (widget)
@@ -2439,10 +2462,16 @@ 'checkbox
(defun widget-checkbox-action (widget &optional event)
"Toggle checkbox, notify parent, and set active state of sibling."
(widget-toggle-action widget event)
- (let ((sibling (widget-get-sibling widget)))
+ (let* ((sibling (widget-get-sibling widget))
+ (from (widget-get sibling :from))
+ (to (widget-get sibling :to)))
(when sibling
- (widget-apply sibling
- (if (widget-value widget) :activate :deactivate))
+ (if (widget-value widget)
+ (progn
+ (widget-apply sibling :activate)
+ (widget-specify-selected sibling))
+ :deactivate
+ (widget-specify-unselected sibling from to))
(widget-clear-undo))))
;;; The `checklist' Widget.
@@ -2498,15 +2527,18 @@ widget-checklist-add-item
((eq escape ?v)
(setq child
(cond ((not chosen)
- (let ((child (widget-create-child widget type)))
- (widget-apply child :deactivate)
+ (let* ((child (widget-create-child widget type))
+ (from (widget-get child :from))
+ (to (widget-get child :to)))
+ (widget-specify-unselected child from to)
child))
((widget-inline-p type t)
(widget-create-child-value
widget type (cdr chosen)))
(t
(widget-create-child-value
- widget type (car (cdr chosen)))))))
+ widget type (car (cdr chosen)))
+ (widget-specify-selected child)))))
(t
(error "Unknown escape `%c'" escape)))))
;; Update properties.
@@ -2677,8 +2709,11 @@ widget-radio-add-item
(widget-create-child-value
widget type value)
(widget-create-child widget type)))
- (unless chosen
- (widget-apply child :deactivate)))
+ (if chosen
+ (widget-specify-selected child)
+ (let ((from (widget-get child :from))
+ (to (widget-get child :to)))
+ (widget-specify-unselected child from to))))
(t
(error "Unknown escape `%c'" escape)))))
;; Update properties.
@@ -2728,14 +2763,17 @@ widget-radio-value-set
(dolist (current (widget-get widget :children))
(let* ((button (widget-get current :button))
(match (and (not found)
- (widget-apply current :match value))))
+ (widget-apply current :match value)))
+ (from (widget-get current :from))
+ (to (widget-get current :to)))
(widget-value-set button match)
(if match
- (progn
- (widget-value-set current value)
- (widget-apply current :activate))
- (widget-apply current :deactivate))
- (setq found (or found match))))))
+ (progn
+ (widget-value-set current value)
+ (widget-apply current :activate)
+ (widget-specify-selected current))
+ (widget-specify-unselected current from to))
+ (setq found (or found match))))))
(defun widget-radio-validate (widget)
;; Valid if we have made a valid choice.
@@ -2755,13 +2793,16 @@ widget-radio-action
(let ((buttons (widget-get widget :buttons)))
(when (memq child buttons)
(dolist (current (widget-get widget :children))
- (let* ((button (widget-get current :button)))
+ (let* ((button (widget-get current :button))
+ (from (widget-get current :from))
+ (to (widget-get current :to)))
(cond ((eq child button)
(widget-value-set button t)
- (widget-apply current :activate))
+ (widget-apply current :activate)
+ (widget-specify-selected current))
((widget-value button)
(widget-value-set button nil)
- (widget-apply current :deactivate)))))))
+ (widget-specify-unselected current from to)))))))
;; Pass notification to parent.
(widget-apply widget :notify child event))
next prev parent reply other threads:[~2024-04-26 12:47 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-22 15:04 bug#69942: 30.0.50; Fontification of radio-button widget labels Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-22 15:33 ` Eli Zaretskii
2024-03-23 21:05 ` Mauro Aranda
2024-03-24 18:47 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-25 0:40 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-01 15:21 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-06 9:02 ` Eli Zaretskii
2024-04-08 10:58 ` Mauro Aranda
2024-04-08 11:15 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-08 12:03 ` Eli Zaretskii
2024-04-18 9:23 ` Eli Zaretskii
2024-04-18 10:07 ` Mauro Aranda
2024-04-18 13:37 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-21 19:45 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-04-26 12:47 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors [this message]
2024-05-09 7:22 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87o79wl28x.fsf@gmx.net \
--to=bug-gnu-emacs@gnu.org \
--cc=69942@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=maurooaranda@gmail.com \
--cc=stephen.berman@gmx.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.