Subject: bug#41852: 27.0.50; text-scale commands don't scale header of tabulated-list-mode

From: Stefan Kangas <[email-masked]>
Date: Sun, 18 Oct 2020 16:34:23 -0700

tags 41852 + patch
thanks

Thomas Hisch <[email-masked]> writes:

>> So you are actually asking for a new feature of the
>> tabulated-list-mode, whereby it defines "C-x +" etc. to produce effect
>> specific to that mode.
>
> Yes it would be nice if text-scale-increase would properly rescale the
> header-line, especially since (setq tabulated-list-use-header-line t) is
> the default.

How about the attached patch?
diff --git a/etc/NEWS b/etc/NEWS
index 64758d455a..6687999155 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1313,6 +1313,15 @@ never be narrower than 19 characters.
 When the bookmark.el library is loaded, a customize choice is added
 to 'tab-bar-new-tab-choice' for new tabs to show the bookmark list.
 
+** text-scale-mode
+
+---
+*** text-scale-mode can adjust text height of header line face.
+When the new buffer local variable 'text-scale-mode-header-line' is
+non-nil, 'text-scale-adjust' (bound to 'C-x C-+' and 'C-x C--' by
+default) will also change the text height of the header line face.
+This feature is intended for use by Emacs Lisp package authors.
+
 ** xwidget-webkit mode
 
 *** New xwidget commands.
diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el
index b13f609f88..2f7899ec51 100644
--- a/lisp/emacs-lisp/tabulated-list.el
+++ b/lisp/emacs-lisp/tabulated-list.el
@@ -761,6 +761,7 @@ tabulated-list-mode
   (setq-local revert-buffer-function #'tabulated-list-revert)
   (setq-local glyphless-char-display
               (tabulated-list-make-glyphless-char-display-table))
+  (setq-local text-scale-mode-header-line t)
   ;; Avoid messing up the entries' display just because the first
   ;; column of the first entry happens to begin with a R2L letter.
   (setq bidi-paragraph-direction 'left-to-right)
diff --git a/lisp/face-remap.el b/lisp/face-remap.el
index 028269a4b0..1faf575f82 100644
--- a/lisp/face-remap.el
+++ b/lisp/face-remap.el
@@ -219,7 +219,10 @@ text-scale-mode-step
 
 ;; current remapping cookie for text-scale-mode
 (defvar text-scale-mode-remapping nil)
-(make-variable-buffer-local 'text-scale-mode-remapping)
+(make-obsolete-variable 'text-scale-mode-remapping "no longer used." "28.1")
+
+(defvar text-scale-mode--remappings nil
+  "List of current remapping cookies for `text-scale-mode'.")
 
 ;; Lighter displayed for text-scale-mode in mode-line minor-mode list
 (defvar text-scale-mode-lighter "+0")
@@ -229,6 +232,22 @@ text-scale-mode-lighter
 (defvar text-scale-mode-amount 0)
 (make-variable-buffer-local 'text-scale-mode-amount)
 
+(defvar text-scale-mode-header-line nil
+  "If non-nil, also change text height of the header line.")
+(make-variable-buffer-local 'text-scale-header-line)
+
+(defun face-remap--clear-remappings ()
+  (dolist (remapping text-scale-mode--remappings)
+    (face-remap-remove-relative remapping))
+  (setq text-scale-mode--remappings nil))
+
+(defun face-remap--remap-face (sym)
+  (push (face-remap-add-relative sym
+                       :height
+                       (expt text-scale-mode-step
+                             text-scale-mode-amount))
+        text-scale-mode--remappings))
+
 (define-minor-mode text-scale-mode
   "Minor mode for displaying buffer text in a larger/smaller font.
 
@@ -240,19 +259,19 @@ text-scale-mode
 The `text-scale-increase', `text-scale-decrease', and
 `text-scale-set' functions may be used to interactively modify
 the variable `text-scale-mode-amount' (they also enable or
-disable `text-scale-mode' as necessary)."
+disable `text-scale-mode' as necessary).
+
+If `text-scale-mode-header-line' is non-nil, also change text
+height of the header line face."
   :lighter (" " text-scale-mode-lighter)
-  (when text-scale-mode-remapping
-    (face-remap-remove-relative text-scale-mode-remapping))
+  (face-remap--clear-remappings)
   (setq text-scale-mode-lighter
 	(format (if (>= text-scale-mode-amount 0) "+%d" "%d")
 		text-scale-mode-amount))
-  (setq text-scale-mode-remapping
-	(and text-scale-mode
-	     (face-remap-add-relative 'default
-					  :height
-					  (expt text-scale-mode-step
-						text-scale-mode-amount))))
+  (when text-scale-mode
+    (face-remap--remap-face 'default)
+    (when text-scale-mode-header-line
+      (face-remap--remap-face 'header-line)))
   (force-window-update (current-buffer)))
 
 (defun text-scale-min-amount ()