From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Adam Porter Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] tab-line-alternate-colors Date: Sun, 13 Dec 2020 05:13:45 -0600 Message-ID: <87pn3et0uu.fsf@alphapapa.net> References: <87360autpy.fsf@alphapapa.net> <87mtyiqfzv.fsf@mail.linkov.net> <87tusqt3yr.fsf@alphapapa.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="18070"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sun Dec 13 12:14:45 2020 Return-path: Envelope-to: ged-emacs-devel@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 1koPKv-0004c5-7N for ged-emacs-devel@m.gmane-mx.org; Sun, 13 Dec 2020 12:14:45 +0100 Original-Received: from localhost ([::1]:39978 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1koPKu-0006ML-Ab for ged-emacs-devel@m.gmane-mx.org; Sun, 13 Dec 2020 06:14:44 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:56280) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1koPK6-0005wq-HH for emacs-devel@gnu.org; Sun, 13 Dec 2020 06:13:54 -0500 Original-Received: from static.214.254.202.116.clients.your-server.de ([116.202.254.214]:48162 helo=ciao.gmane.io) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1koPK4-0007ce-Qk for emacs-devel@gnu.org; Sun, 13 Dec 2020 06:13:54 -0500 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1koPK1-0003dw-U3 for emacs-devel@gnu.org; Sun, 13 Dec 2020 12:13:49 +0100 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=ged-emacs-devel@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -15 X-Spam_score: -1.6 X-Spam_bar: - X-Spam_report: (-1.6 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.25, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:260760 Archived-At: --=-=-= Content-Type: text/plain > Yes, that seems like a good idea. Something like this? I also added > another face for non-file-backed buffers, which helps distinguish > them. The attached patch fixes a bug with an anonymous face in the previous patch. By the way, it seems that, because the face `tab-line' inherits from the face `variable-pitch', an anonymous face that inherits from `tab-line-tab-special' (which defaults to italic slant in this patch) is prevented from having italic slant applied. If I set `tab-line' to not inherit from `variable-pitch', the italic slant is inherited. `variable-pitch' has not been customized, so it has no value for the slant attribute, so it seems like it shouldn't interfere. I don't know if this is a bug in my code, in Emacs 28, or in the native-comp branch that I'm using to develop this patch. Thanks. --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-New-tab-line-options-faces-and-face-function.patch Content-Description: patch >From dc4723fefa5d77eb28a6d2b67afdf5e5b8e696d7 Mon Sep 17 00:00:00 2001 From: Adam Porter Date: Sun, 13 Dec 2020 05:54:28 +0000 Subject: [PATCH] New tab-line options, faces, and face function * lisp/tab-line.el: (tab-line-tab-face-function): New option. (tab-line-alternate-colors): New option. (tab-line-tab-inactive-alternate): New face. (tab-line-tab-special): New face. (tab-line-tab-face-default): New function. (tab-line-format-template): Use them. Thanks to Juri Linkov for his feedback. --- lisp/tab-line.el | 75 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/lisp/tab-line.el b/lisp/tab-line.el index 46bf89f14e..640c568cc5 100644 --- a/lisp/tab-line.el +++ b/lisp/tab-line.el @@ -27,6 +27,7 @@ ;;; Code: +(require 'cl-lib) (require 'seq) ; tab-line.el is not pre-loaded so it's safe to use it here @@ -35,6 +36,22 @@ tab-line :group 'convenience :version "27.1") +(defcustom tab-line-alternate-colors t + "Alternate background colors of inactive tabs. +When non-nil, alternating tabs use the face +`tab-line-tab-inactive-alternate'." + :type 'boolean + :group 'tab-line + :version "28.1") + +(defcustom tab-line-tab-face-function #'tab-line-tab-face-default + "Function called to get a tab's face. +The function is called with two arguments: the tab and a list of +all tabs." + :type 'function + :group 'tab-line + :version "28.1") + (defgroup tab-line-faces '((tab-line custom-face)) ; tab-line is defined in faces.el "Faces used in the tab line." :group 'tab-line @@ -63,6 +80,19 @@ tab-line-tab-inactive :version "27.1" :group 'tab-line-faces) +(defface tab-line-tab-inactive-alternate + (let ((mode-line-bg (face-background 'mode-line nil t))) + `((t (:inherit tab-line-tab-inactive :background ,mode-line-bg)))) + "Alternate face for inactive tab-line tabs. +Used on alternating tabs when `tab-line-alternate-colors' is non-nil." + :version "28.1" + :group 'tab-line-faces) + +(defface tab-line-tab-special '((t (:slant italic))) + "Face for special (i.e. non-file-backed) tabs." + :version "28.1" + :group 'tab-line-faces) + (defface tab-line-tab-current '((default :inherit tab-line-tab) @@ -412,7 +442,9 @@ tab-line-format-template (cdr (assq 'selected tab)))) (name (if buffer-p (funcall tab-line-tab-name-function tab tabs) - (cdr (assq 'name tab))))) + (cdr (assq 'name tab)))) + (face (funcall tab-line-tab-face-function + tab tabs))) (concat separator (apply 'propertize @@ -425,11 +457,7 @@ tab-line-format-template `( tab ,tab ,@(if selected-p '(selected t)) - face ,(if selected-p - (if (eq (selected-window) (old-selected-window)) - 'tab-line-tab-current - 'tab-line-tab) - 'tab-line-tab-inactive) + face ,face mouse-face tab-line-highlight))))) tabs)) (hscroll-data (tab-line-auto-hscroll strings hscroll))) @@ -453,6 +481,41 @@ tab-line-format-template tab-line-new-button) (list tab-line-new-button))))) +(defun tab-line-tab-face-default (tab tabs) + "Return face for TAB in TABS. +If TAB is selected, return `tab-line-tab-current' if the tab's +window is also selected, otherwise `tab-line-tab'. + +Otherwise, if `tab-line-alternate-colors' is non-nil, return +`tab-line-tab-inactive-alternate' for even-numbered tabs and +`tab-line-tab-inactive' for odd-numbered ones. + +Otherwise, return `tab-line-tab-inactive'. + +If the tab's buffer is not file-backed, the returned face also +inherits from `tab-line-tab-special'. + +For use as `tab-line-tab-face-function'." + (let* ((buffer-p (bufferp tab)) + (selected-p (if buffer-p + (eq tab (window-buffer)) + (cdr (assq 'selected tab)))) + (face (cond (selected-p + (if (eq (selected-window) (old-selected-window)) + 'tab-line-tab-current + 'tab-line-tab)) + ((and tab-line-alternate-colors + (cl-evenp (cl-position tab tabs))) + 'tab-line-tab-inactive-alternate) + (t + 'tab-line-tab-inactive)))) + (if (and buffer-p (not (buffer-file-name tab))) + ;; FIXME: The `tab-line' face's inheriting from + ;; `variable-pitch' seems to prevent inheriting from + ;; `tab-line-tab-special' applying italic slant. + `(:inherit (tab-line-tab-special ,face)) + face))) + (defvar tab-line-auto-hscroll) (defun tab-line-format () -- 2.20.1 --=-=-=--