From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Olivier Certner Newsgroups: gmane.emacs.bugs Subject: bug#46775: 27.1; ERC: Track: Modified channels doc and `erc-track-find-face' fixes Date: Fri, 26 Feb 2021 10:03:23 +0100 Message-ID: <1785172.CJpZife00y@ravel> References: <3089116.bT80LyP3VS@ravel> <2003028.4WAli8B44Z@ravel> <87czwnmctu.fsf@gnus.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="nextPart3608439.DPmmpGpFb9" Content-Transfer-Encoding: 7Bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="23229"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 46775@debbugs.gnu.org To: Lars Ingebrigtsen Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Feb 26 10:05:41 2021 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 1lFZ48-0005ry-MH for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 26 Feb 2021 10:05:40 +0100 Original-Received: from localhost ([::1]:36866 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lFZ47-000395-JU for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 26 Feb 2021 04:05:39 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:54324) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lFZ2Y-000277-IR for bug-gnu-emacs@gnu.org; Fri, 26 Feb 2021 04:04:02 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:56975) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lFZ2Y-0003gh-Av for bug-gnu-emacs@gnu.org; Fri, 26 Feb 2021 04:04:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lFZ2Y-00072Z-69 for bug-gnu-emacs@gnu.org; Fri, 26 Feb 2021 04:04:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Olivier Certner Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 26 Feb 2021 09:04:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 46775 X-GNU-PR-Package: emacs Original-Received: via spool by 46775-submit@debbugs.gnu.org id=B46775.161433021127026 (code B ref 46775); Fri, 26 Feb 2021 09:04:02 +0000 Original-Received: (at 46775) by debbugs.gnu.org; 26 Feb 2021 09:03:31 +0000 Original-Received: from localhost ([127.0.0.1]:40288 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lFZ22-00071p-IQ for submit@debbugs.gnu.org; Fri, 26 Feb 2021 04:03:31 -0500 Original-Received: from smtp6-g21.free.fr ([212.27.42.6]:59202) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lFZ20-00071g-4K for 46775@debbugs.gnu.org; Fri, 26 Feb 2021 04:03:29 -0500 Original-Received: from ravel.localnet (unknown [90.118.181.206]) (Authenticated sender: ocert.dev@free.fr) by smtp6-g21.free.fr (Postfix) with ESMTPSA id 91CC9780333; Fri, 26 Feb 2021 10:03:23 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=free.fr; s=smtp-20201208; t=1614330206; bh=9JG2NxPdixnNI0Qz7dk69T+QPDYFZbZqnAn9n2++jok=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G8GqE2x7cMtiLJ1iuJUJzpnsPW3BLwomwAkvsxsNK1GjHXaHMhcEepm6KChW826J0 jWYoGJZglbrCSwxO76+4FBP3hX/gGF9uRk234nBUpjdOIOIb6pkTxzwTlDRqRTRNiV 6jyNcT8lv7XhEG4mKC8QLVgI5S3KQ986ATvTyEc6FOCRs++r/0opc5VYz5zqXxot3z sNP60IJU+o8OehM5l7hxZPti7jMfvOshBjDm47RPp21bXiA2YVMcboCVcrmMEUTZX1 t6h6s1cOmsRs2uUhAL8vJA0V1ueypEB42IBA4MhiZQ0xA/Ps7vDjZ52k+xlCSeA61z Oiqq3p28PUpgw== In-Reply-To: <87czwnmctu.fsf@gnus.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" Xref: news.gmane.io gmane.emacs.bugs:200843 Archived-At: This is a multi-part message in MIME format. --nextPart3608439.DPmmpGpFb9 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="UTF-8" > Can you post the patch here in the bug tracker? Sure. Attached (there are 4 patches, hopefully making it easier to understand the changes). -- Olivier Certner --nextPart3608439.DPmmpGpFb9 Content-Disposition: attachment; filename="0001-ERC-Track-Fix-modified-channels-alist-s-documentatio.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="0001-ERC-Track-Fix-modified-channels-alist-s-documentatio.patch" >From 868b042845211ced41cf751ac842e7d0b82da188 Mon Sep 17 00:00:00 2001 From: Olivier Certner 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 56f66563ad..e53f7fb22d 100644 --- a/lisp/erc/erc-track.el +++ b/lisp/erc/erc-track.el @@ -280,14 +280,17 @@ nil - don't add to mode line." (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 --nextPart3608439.DPmmpGpFb9 Content-Disposition: attachment; filename="0002-ERC-Track-Clarify-documentation-on-tracked-buffers-a.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="0002-ERC-Track-Clarify-documentation-on-tracked-buffers-a.patch" >From c3a0486a19e442d84596ce6b595b111afcd9b9d1 Mon Sep 17 00:00:00 2001 From: Olivier Certner 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 e53f7fb22d..8b9f88ee2a 100644 --- a/lisp/erc/erc-track.el +++ b/lisp/erc/erc-track.el @@ -283,14 +283,19 @@ nil - don't add to mode line." 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." @@ -652,8 +657,14 @@ ARGS are ignored." "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 --nextPart3608439.DPmmpGpFb9 Content-Disposition: attachment; filename="0003-ERC-Track-Rewrite-and-rename-erc-track-find-face.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="0003-ERC-Track-Rewrite-and-rename-erc-track-find-face.patch" >From 548496c384ce115d92554604ab6ecc28e35ac190 Mon Sep 17 00:00:00 2001 From: Olivier Certner 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 8b9f88ee2a..d596685fee 100644 --- a/lisp/erc/erc-track.el +++ b/lisp/erc/erc-track.el @@ -293,7 +293,7 @@ is disconnected, provided `erc-track-remove-disconnected-buffers' 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'.") @@ -760,38 +760,45 @@ Use `erc-make-mode-line-buffer-name' to create buttons." (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 +necessary 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 @@ -831,17 +838,21 @@ is in `erc-mode'." ;; 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 --nextPart3608439.DPmmpGpFb9 Content-Disposition: attachment; filename="0004-ERC-Track-Fix-a-perceived-minor-bug-in-mode-line-fac.patch" Content-Transfer-Encoding: 7Bit Content-Type: text/x-patch; charset="UTF-8"; name="0004-ERC-Track-Fix-a-perceived-minor-bug-in-mode-line-fac.patch" >From e4de7a54136e72ed69c392c71fb57cf6e6a49d60 Mon Sep 17 00:00:00 2001 From: Olivier Certner 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 d596685fee..f0fa1fbed2 100644 --- a/lisp/erc/erc-track.el +++ b/lisp/erc/erc-track.el @@ -838,21 +838,14 @@ is in `erc-mode'." ;; 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 --nextPart3608439.DPmmpGpFb9--