Subject: 28.0.50; [PATCH] lisp/tab-line.el: Add face for group-tab

From: Gabriel <[email-masked]>
Date: Fri, 12 Mar 2021 23:35:40 -0300

The problem:
When tab-line mode is enabled and configured to group buffers, a group
tab is added as the first tab. This is not a regular tab that displays a
buffer, but rather a tab to indicate the group. The face used for this
group-tab is the same of an inactive tab, which makes harder to
differentiate betweem a group tab and a regular tab that can be selected
to display a buffer.

How to reproduce:
1. emacs -Q
2. Configure tab groups by project:
(setq-default tab-line-tabs-buffer-group-function
              (lambda (b) (with-current-buffer b (vc-root-dir)))
              tab-line-tabs-function 'tab-line-tabs-buffer-groups)
3. Enable tab-line mode:
(global-tab-line-mode 1)
4. Open file from a project handled by some vc backend (e.g.: git)
5. The tab group will be displayed as the first tab with a common face

The proposed solution:
Add a new face for group tabs that can be configured via
'tab-line-tab-face-functions', similar to how
'tab-line-tab-face-special' works.

How to test:
1. emacs -Q
2. Apply the patch
3. Configure tab groups by project and group face:
(setq-default tab-line-tabs-buffer-group-function
          (lambda (b) (with-current-buffer b (vc-root-dir)))
          tab-line-tabs-function 'tab-line-tabs-buffer-groups
          tab-line-tab-face-functions '(tab-line-tab-face-group))
4. Enable tab-line-mode:
(global-tab-line-mode 1)
5. Open file from a project handled by some vc backend (e.g.: git)
6. The tab group will be displayed with a different face

>From b7244efe39a37e6d634ed81213fee64fcd10e97d Mon Sep 17 00:00:00 2001
From: Gabriel do Nascimento Ribeiro <[email-masked]>
Date: Fri, 12 Mar 2021 23:12:10 -0300
Subject: [PATCH] lisp/tab-line.el: Add face for group-tab

(tab-line-tab-face-functions): Add choice for 'tab-line-tab-face-group'.
(tab-line-tab-group): New face.
(tab-line-tab-current): Set alist key 'group-tab' for group tabs.
(tab-line-tab-face-group): New function to set face for group tabs.
---
 lisp/tab-line.el | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/lisp/tab-line.el b/lisp/tab-line.el
index 903862a3e8..c4b504aaad 100644
--- a/lisp/tab-line.el
+++ b/lisp/tab-line.el
@@ -44,6 +44,7 @@ tab-line-tab-face-functions
   :type '(repeat
           (choice (function-item tab-line-tab-face-special)
                   (function-item tab-line-tab-face-inactive-alternating)
+                  (function-item tab-line-tab-face-group)
                   (function :tag "Custom function")))
   :group 'tab-line
   :version "28.1")
@@ -95,6 +96,16 @@ tab-line-tab-special
   :version "28.1"
   :group 'tab-line-faces)
 
+(defface tab-line-tab-group
+  '((default
+      :inherit tab-line
+      :box nil))
+  "Face for group tabs.
+Applied when option `tab-line-tab-face-functions' includes
+function `tab-line-tab-face-group'."
+  :version "28.1"
+  :group 'tab-line-faces)
+
 (defface tab-line-tab-current
   '((default
       :inherit tab-line-tab)
@@ -385,6 +396,7 @@ tab-line-tabs-buffer-groups
                       (set-window-parameter nil 'tab-line-group nil))))
            (group-tab `(tab
                         (name . ,group)
+                        (group-tab . t)
                         (select . ,(lambda ()
                                      (set-window-parameter nil 'tab-line-groups t)
                                      (set-window-parameter nil 'tab-line-group group)
@@ -520,6 +532,13 @@ tab-line-tab-face-special
     (setf face `(:inherit (tab-line-tab-special ,face))))
   face)
 
+(defun tab-line-tab-face-group (tab _tabs face _buffer-p _selected-p)
+  "Return FACE for TAB according to whether it's a group tab.
+For use in `tab-line-tab-face-functions'."
+  (when (alist-get 'group-tab tab)
+    (setf face `(:inherit (tab-line-tab-group ,face))))
+  face)
+
 (defvar tab-line-auto-hscroll)
 
 (defun tab-line-format ()
-- 
2.27.0

I am not sure what is the appropriate default value for the proposed new
face. Feel free to modify it, if necessary.