From f54e534f0acf52496538552a46f36367c93c783d Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Thu, 10 Jul 2025 09:40:51 +0300 Subject: [PATCH] Cache only the last string in 'tab-bar-format-align-right' (bug#78953) * lisp/tab-bar.el (tab-bar--align-right-cache): Rename from 'tab-bar--align-right-hash'. (tab-bar-format-align-right): Use it to store the string in the car, and the width in the cdr. (cherry picked from commit 99080d0c04931b5d45026e1ee44526bbbb8dfdef) --- lisp/tab-bar.el | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lisp/tab-bar.el b/lisp/tab-bar.el index 76c7909cd0a..4fcd0f18ae2 100644 --- a/lisp/tab-bar.el +++ b/lisp/tab-bar.el @@ -1194,8 +1194,8 @@ when the tab is current. Return the result as a keymap." `((add-tab menu-item ,tab-bar-new-button tab-bar-new-tab :help "New tab")))) -(defvar tab-bar--align-right-hash nil - "Memoization table for `tab-bar-format-align-right'.") +(defvar tab-bar--align-right-cache nil + "Optimization for `tab-bar-format-align-right'.") (defun tab-bar-format-align-right (&optional rest) "Align the rest of tab bar items to the right. @@ -1203,20 +1203,19 @@ The argument `rest' is used for special handling of this item by `tab-bar-format-list' that collects the rest of formatted items. This prevents calling other non-idempotent items like `tab-bar-format-global' twice." - (unless tab-bar--align-right-hash - (define-hash-table-test 'tab-bar--align-right-hash-test - #'equal-including-properties - #'sxhash-equal-including-properties) - (setq tab-bar--align-right-hash - (make-hash-table :test 'tab-bar--align-right-hash-test))) (let* ((rest (or rest (tab-bar-format-list (cdr (memq 'tab-bar-format-align-right tab-bar-format))))) (rest (mapconcat (lambda (item) (nth 2 item)) rest "")) (hpos (progn (add-face-text-property 0 (length rest) 'tab-bar t rest) - (with-memoization (gethash rest tab-bar--align-right-hash) - (string-pixel-width rest)))) + (or (and tab-bar--align-right-cache + (equal-including-properties + (car tab-bar--align-right-cache) rest) + (cdr tab-bar--align-right-cache)) + (let ((width (string-pixel-width rest))) + (setq tab-bar--align-right-cache (cons rest width)) + width)))) (str (propertize " " 'display ;; The `right' spec doesn't work on TTY frames ;; when windows are split horizontally (bug#59620) -- 2.39.5