From: Olivier Certner <olce.emacs@certner.fr>
To: 46775@debbugs.gnu.org
Subject: bug#46775: Updated patches
Date: Tue, 06 Jul 2021 16:23:14 +0200 [thread overview]
Message-ID: <1862194.JH98yGZDhS@ravel> (raw)
In-Reply-To: <3089116.bT80LyP3VS@ravel>
[-- Attachment #1: Type: text/plain, Size: 161 bytes --]
Patches slightly edited (commit message, doc text) and rebased on top of a
recent 'master'. Ready to apply. Easy to backport to 27 as well.
--
Olivier Certner
[-- Attachment #2: 0001-ERC-Track-Fix-modified-channels-alist-s-documentatio.patch --]
[-- Type: text/x-patch, Size: 1849 bytes --]
From ef79b97fedc46c5317dbb7104163f54335efa30f Mon Sep 17 00:00:00 2001
From: Olivier Certner <olce.emacs@certner.fr>
Date: Wed, 13 Jan 2021 17:39:54 +0100
Subject: [PATCH 1/4] ERC: Track: Fix modified channels alist's documentation
about its structure
* lisp/erc/erc-track.el (erc-modified-channels-alist): Fix the
docstring, which reports a proper list structure whereas it is a
dotted list, where the last cdr is sometimes a proper list, making it
sometimes a proper list.
---
lisp/erc/erc-track.el | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index 2364d45d6f..bfaa3e5e72 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -262,14 +262,17 @@ erc-modified-channels-object
(defvar erc-modified-channels-alist nil
"An ALIST used for tracking channel modification activity.
-Each element looks like (BUFFER COUNT FACE) where BUFFER is a buffer
-object of the channel the entry corresponds to, COUNT is a number
-indicating how often activity was noticed, and FACE is the face to use
-when displaying the buffer's name. See `erc-track-faces-priority-list',
-and `erc-track-showcount'.
+Each element is a list with form (BUFFER COUNT . FACE) where
+BUFFER is a buffer object of the channel the entry corresponds
+to, COUNT is a number indicating how often activity was noticed,
+and FACE is a face (or a list of faces) to use when displaying the
+buffer's name.
Entries in this list should only happen for buffers where activity occurred
-while the buffer was not visible.")
+while the buffer was not visible.
+
+See also `erc-track-faces-priority-list',
+`erc-track-faces-normal-list' and `erc-track-showcount'.")
(defcustom erc-track-showcount nil
"If non-nil, count of unseen messages will be shown for each channel."
--
2.30.0
[-- Attachment #3: 0002-ERC-Track-Clarify-documentation-on-tracked-buffers-a.patch --]
[-- Type: text/x-patch, Size: 3046 bytes --]
From d51960947135ddbf479653c7e10845daa6f81162 Mon Sep 17 00:00:00 2001
From: Olivier Certner <olce.emacs@certner.fr>
Date: Thu, 14 Jan 2021 18:20:26 +0100
Subject: [PATCH 2/4] ERC: Track: Clarify documentation on tracked buffers and
add references
* lisp/erc/erc-track.el (erc-modified-channels-alist): Clarify what
the list contains. Add references to variables and functions involved
in displaying tracked buffers from this list.
* lisp/erc/erc-track.el (erc-make-mode-line-buffer-name): Describe
exactly the algorithm, and reference custom variables that influence
it.
---
lisp/erc/erc-track.el | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index bfaa3e5e72..3e4e557d78 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -265,14 +265,19 @@ erc-modified-channels-alist
Each element is a list with form (BUFFER COUNT . FACE) where
BUFFER is a buffer object of the channel the entry corresponds
to, COUNT is a number indicating how often activity was noticed,
-and FACE is a face (or a list of faces) to use when displaying the
-buffer's name.
+and FACE is a face (or a list of faces, combined as usual) to use
+when displaying the buffer's name in the mode line.
-Entries in this list should only happen for buffers where activity occurred
-while the buffer was not visible.
+Entries in this list are only added/updated for buffers that were
+not visible when activity occurred in them, and are removed for
+each buffer as soon as it becomes visible again (or if the server
+is disconnected, provided `erc-track-remove-disconnected-buffers'
+is true).
-See also `erc-track-faces-priority-list',
-`erc-track-faces-normal-list' and `erc-track-showcount'.")
+For how the face is chosen for a buffer, see
+`erc-track-find-face' and `erc-track-priority-faces-only'. For
+how buffers are then displayed in the mode line, see
+`erc-modified-channels-display'.")
(defcustom erc-track-showcount nil
"If non-nil, count of unseen messages will be shown for each channel."
@@ -625,8 +630,14 @@ erc-track-mouse-face
"The face to use when mouse is over channel names in the mode line.")
(defun erc-make-mode-line-buffer-name (string buffer &optional faces count)
- "Return STRING as a button that switches to BUFFER when clicked.
-If FACES are provided, color STRING with them."
+ "Returns a button that switches to BUFFER when clicked.
+STRING is the string in the button. It is possibly suffixed with
+the number of unread messages, according to variables
+`erc-track-showcount' and `erc-track-showcount-string'.
+
+If `erc-track-use-faces' is true and FACES are provided, format
+STRING with them. When the mouse hovers above the button, STRING
+is displayed according to `erc-track-mouse-face'."
;; We define a new sparse keymap every time, because 1. this data
;; structure is very small, the alternative would require us to
;; defvar a keymap, 2. the user is not interested in customizing it
--
2.30.0
[-- Attachment #4: 0003-ERC-Track-Rewrite-and-rename-erc-track-find-face.patch --]
[-- Type: text/x-patch, Size: 6203 bytes --]
From 10a98ca9505960b3bc21b6f965cb3184111f5e25 Mon Sep 17 00:00:00 2001
From: Olivier Certner <olce.emacs@certner.fr>
Date: Thu, 14 Jan 2021 18:26:38 +0100
Subject: [PATCH 3/4] ERC: Track: Rewrite and rename `erc-track-find-face'
For clarification purposes. No functional changes.
* lisp/erc/erc-track.el (erc-track-find-face): Rename it to
`erc-track-select-face'. Rewrite it so that it is very clear what is
the current algorithm, changing the parameters it takes. No
functional changes. Performance improvements. Clarify the
documentation and remove the part on some faces being lists, which
clearly doesn't apply.
* lisp/erc/erc-track.el (erc-track-modified-channels): Replace calls
to `erc-track-find-face' by calls to `erc-track-select-face',
preserving the existing behavior.
* lisp/erc/erc-track.el (erc-modified-channels-alist): Change the
reference to `erc-track-select-face' in the documentation following
the rename.
---
lisp/erc/erc-track.el | 81 ++++++++++++++++++++++++-------------------
1 file changed, 46 insertions(+), 35 deletions(-)
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index 3e4e557d78..d63028cfeb 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -275,7 +275,7 @@ erc-modified-channels-alist
is true).
For how the face is chosen for a buffer, see
-`erc-track-find-face' and `erc-track-priority-faces-only'. For
+`erc-track-select-face' and `erc-track-priority-faces-only'. For
how buffers are then displayed in the mode line, see
`erc-modified-channels-display'.")
@@ -733,38 +733,45 @@ erc-modified-channels-remove-buffer
(when (called-interactively-p 'interactive)
(erc-modified-channels-display)))
-(defun erc-track-find-face (faces)
- "Return the face to use in the mode line from the faces in FACES.
-If `erc-track-faces-priority-list' is set, the one from FACES who
-is first in that list will be used. If nothing matches or if
-`erc-track-faces-priority-list' is not set, the default mode-line
-faces will be used.
+(defun erc-track-select-face (cur-face new-faces)
+ "Return the face to use in the mode line.
-If `erc-track-faces-normal-list' is non-nil, use it to produce a
-blinking effect that indicates channel activity when the first
-element in FACES and the highest-ranking face among the rest of
-FACES are both members of `erc-track-faces-normal-list'.
+CUR-FACE is the face currently used in the mode line (for the
+current buffer). NEW-FACES is the list of new faces that have
+just been seen (in the current buffer).
-If one of the faces is a list, then it will be ranked according
-to its highest-tanking face member. A list of faces including
-that member will take priority over just the single member
-element."
+Initially, the selected face is the one with highest priority in
+`erc-track-faces-priority-list' (i.e., the one closest to the
+head of the list) among CUR-FACE and NEW-FACES. If nothing
+matches (including if `erc-track-faces-priority-list' is not
+set), the default mode-line faces will be used (NIL is returned).
+
+If the selected face is still CUR-FACE (highest priority), and
+the highest priority face in NEW-FACES alone is different (which
+necessarily means it has lower priority than CUR-FACE), and both
+are in `erc-track-faces-normal-list', then the latter is selected
+instead. This has the effect of allowing the current mode line
+face, if a member of `erc-track-faces-normal-list', to be
+replaced by another with lower priority from the new faces, if
+that with highest priority in the new ones is also a member of
+`erc-track-faces-normal-list'."
(let ((choice (catch 'face
- (dolist (candidate erc-track-faces-priority-list)
- (when (member candidate faces)
- (throw 'face candidate)))))
- (no-first (and erc-track-faces-normal-list
- (catch 'face
- (dolist (candidate erc-track-faces-priority-list)
- (when (member candidate (cdr faces))
- (throw 'face candidate)))))))
- (cond ((null choice)
- nil)
- ((and (member choice erc-track-faces-normal-list)
- (member no-first erc-track-faces-normal-list))
- no-first)
- (t
- choice))))
+ (dolist (candidate erc-track-faces-priority-list)
+ (when (or (equal candidate cur-face)
+ (member candidate new-faces))
+ (throw 'face candidate))))))
+ (when choice
+ (if (and (equal choice cur-face)
+ (member choice erc-track-faces-normal-list))
+ (let ((only-in-new
+ (catch 'face
+ (dolist (candidate erc-track-faces-priority-list)
+ (when (member candidate new-faces)
+ (throw 'face candidate))))))
+ (if (member only-in-new erc-track-faces-normal-list)
+ only-in-new
+ choice))
+ choice))))
(defun erc-track-modified-channels ()
"Hook function for `erc-insert-post-hook' to check if the current
@@ -804,17 +811,21 @@ erc-track-modified-channels
;; Add buffer, faces and counts
(setq erc-modified-channels-alist
(cons (cons (current-buffer)
- (cons 1 (erc-track-find-face faces)))
+ (cons 1 (erc-track-select-mode-line-face
+ (car faces)
+ (cdr faces))))
erc-modified-channels-alist))
;; Else modify the face for the buffer, if necessary.
(when faces
(let* ((cell (assq (current-buffer)
erc-modified-channels-alist))
(old-face (cddr cell))
- (new-face (erc-track-find-face
- (if old-face
- (cons old-face faces)
- faces))))
+ (new-face (if old-face
+ (erc-track-select-mode-line-face old-face
+ faces)
+ (erc-track-select-mode-line-face
+ (car faces)
+ (cdr faces)))))
(setcdr cell (cons (1+ (cadr cell)) new-face)))))
;; And display it
(erc-modified-channels-display)))
--
2.30.0
[-- Attachment #5: 0004-ERC-Track-Fix-a-perceived-minor-bug-in-mode-line-fac.patch --]
[-- Type: text/x-patch, Size: 2020 bytes --]
From 1d4abfa935b1a5f5eb0c6ff7b3c82ebb46747653 Mon Sep 17 00:00:00 2001
From: Olivier Certner <olce.emacs@certner.fr>
Date: Thu, 14 Jan 2021 18:36:08 +0100
Subject: [PATCH 4/4] ERC: Track: Fix a perceived minor bug in mode line face
selection
* lisp/erc/erc-track.el (erc-track-modified-channels): Fix what is a
probable bug when a new insert event happens for a buffer that was not
tracked or for which no mode line face was selected: In this case,
stop treating the latest buffer's face (first in list) as the previous
one, which could be overriden with an older one (in FACES' rest), as
if it had happened after.
---
lisp/erc/erc-track.el | 11 ++---------
1 file changed, 2 insertions(+), 9 deletions(-)
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index d63028cfeb..e9bc77dea0 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -811,21 +811,14 @@ erc-track-modified-channels
;; Add buffer, faces and counts
(setq erc-modified-channels-alist
(cons (cons (current-buffer)
- (cons 1 (erc-track-select-mode-line-face
- (car faces)
- (cdr faces))))
+ (cons 1 (erc-track-select-face nil faces)))
erc-modified-channels-alist))
;; Else modify the face for the buffer, if necessary.
(when faces
(let* ((cell (assq (current-buffer)
erc-modified-channels-alist))
(old-face (cddr cell))
- (new-face (if old-face
- (erc-track-select-mode-line-face old-face
- faces)
- (erc-track-select-mode-line-face
- (car faces)
- (cdr faces)))))
+ (new-face (erc-track-select-face old-face faces)))
(setcdr cell (cons (1+ (cadr cell)) new-face)))))
;; And display it
(erc-modified-channels-display)))
--
2.30.0
next prev parent reply other threads:[~2021-07-06 14:23 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-25 17:14 bug#46775: 27.1; ERC: Track: Modified channels doc and `erc-track-find-face' fixes Olivier Certner
2021-02-25 17:24 ` Olivier Certner
2021-02-26 8:51 ` Lars Ingebrigtsen
2021-02-26 9:03 ` Olivier Certner
2021-06-09 13:07 ` J.P.
2021-07-06 14:23 ` Olivier Certner [this message]
2021-09-12 5:25 ` Amin Bandali
[not found] ` <877dj3xk3e.fsf@neverwas.me>
2021-07-06 16:34 ` Olivier Certner
[not found] ` <2016416.4WAli8B44Z@ravel>
2021-07-07 12:30 ` J.P.
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1862194.JH98yGZDhS@ravel \
--to=olce.emacs@certner.fr \
--cc=46775@debbugs.gnu.org \
/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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).