From unknown Sat Aug 16 18:20:21 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#79141 <79141@debbugs.gnu.org> To: bug#79141 <79141@debbugs.gnu.org> Subject: Status: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account Reply-To: bug#79141 <79141@debbugs.gnu.org> Date: Sun, 17 Aug 2025 01:20:21 +0000 retitle 79141 31.0.50; The tab-bar-format-align-right cache doesn't take fa= ce changes and per-frame faces into account reassign 79141 emacs submitter 79141 Steven Allen severity 79141 normal thanks From debbugs-submit-bounces@debbugs.gnu.org Fri Aug 01 16:57:25 2025 Received: (at submit) by debbugs.gnu.org; 1 Aug 2025 20:57:26 +0000 Received: from localhost ([127.0.0.1]:58108 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uhwof-0005tV-Q1 for submit@debbugs.gnu.org; Fri, 01 Aug 2025 16:57:25 -0400 Received: from lists.gnu.org ([2001:470:142::17]:44228) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uhwoe-0005sO-Aq for submit@debbugs.gnu.org; Fri, 01 Aug 2025 16:57:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uhwoO-0004Ax-I4 for bug-gnu-emacs@gnu.org; Fri, 01 Aug 2025 16:57:08 -0400 Received: from fout-b6-smtp.messagingengine.com ([202.12.124.149]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1uhwoJ-0001no-Rc for bug-gnu-emacs@gnu.org; Fri, 01 Aug 2025 16:57:08 -0400 Received: from phl-compute-12.internal (phl-compute-12.phl.internal [10.202.2.52]) by mailfout.stl.internal (Postfix) with ESMTP id 61A2E1D008D5 for ; Fri, 1 Aug 2025 16:57:00 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-12.internal (MEProxy); Fri, 01 Aug 2025 16:57:00 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stebalien.com; h=cc:content-type:content-type:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:subject:subject:to:to; s=fm2; t=1754081820; x=1754168220; bh=aLxBoQLV+kItCeeNNAppXvWn/ipxVpR5 GLCzIRZ47aA=; b=iFJzrSQa13Vk+sJlgqdj2VAfkLqh8C0ldFWB/5aWFm2s3ILF K2m5Fp4RL932a1iHuwl++8UPo0YWjUGtI4cCr5Hz0wi6FDVmWf2thJ6b3rXREDQj COGc+qaJIMPs2Wjb5HAXoFKZxCnpWcdQl1vNyYMND079zy3UFN9dR4gnb6L44Xrd f6BUaDykHG8EnX2Sx3wFTcncQyRDsBGZ3QwozmJhB1wOtdu//d7P+i/WXDiyJw2i evHp4/jr1VyE0HWf3QkFw+vE46KC9EySkFpfch/Vx/BWTew5i5/3+5/kDnvgkzVz Wxx4bcJdyCt8zWs1+lZy84uSrL3X6awc8F684A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1754081820; x= 1754168220; bh=aLxBoQLV+kItCeeNNAppXvWn/ipxVpR5GLCzIRZ47aA=; b=d Khwj6JzGwSkhPGW7/ZhvVKR7VANtRHd4Q9Jyrug5bGBYcr8MgDsZsrLXclBoECAY ibM9iyP5XCsqO0njNkKe1PqmC8AVy7ov42jFYaGF8cBPUJedNcq1BSVmgbcqFJi2 8GuOGbuwa6q3vIBvkz3BdN/x29BFcAm4W+rhbXiOK40d+Hvvt2zojveL/0ILf2ed u4zTpCDFYtBvUZ96RDWhk0pfitFyLQhk+KMRBIqsWv80Z+LxHTSK1wzolTdtSKZc nftVsmCWEbinU47Z8dvPt5ACFNe4y/6DZ1oplOvD5kVqUfF1lLlL5m3Z9UnqEaon ehkE0OQJrcAB5louEX8AA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgddutdegjeduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefhvffufffkgggtsehmtderredttddtne cuhfhrohhmpefuthgvvhgvnhcutehllhgvnhcuoehsthgvvhgvnhesshhtvggsrghlihgv nhdrtghomheqnecuggftrfgrthhtvghrnhepkefffffgveethedtieffleffgeekvdeiie egheeftdetjeekfefhvedttdekfeffnecuvehluhhsthgvrhfuihiivgeptdenucfrrghr rghmpehmrghilhhfrhhomhepshhtvghvvghnsehsthgvsggrlhhivghnrdgtohhmpdhnsg gprhgtphhtthhopedupdhmohguvgepshhmthhpohhuthdprhgtphhtthhopegsuhhgqdhg nhhuqdgvmhgrtghssehgnhhurdhorhhg X-ME-Proxy: Feedback-ID: ie8a146a7:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA for ; Fri, 1 Aug 2025 16:56:58 -0400 (EDT) From: Steven Allen To: bug-gnu-emacs@gnu.org Subject: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account X-Debbugs-Cc: Juri Linkov Date: Fri, 01 Aug 2025 13:47:32 -0700 Message-ID: <87bjoywyzf.fsf@stebalien.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=202.12.124.149; envelope-from=steven@stebalien.com; helo=fout-b6-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Debbugs-Envelope-To: submit X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" --=-=-= Content-Type: text/plain The the `tab-bar-format-align-right' width cache isn't updated when faces change and doesn't take into account the fact that faces can have different attributes on different frames. To reproduce, launch "emacs -Q" then yank the following into the scratch buffer: (setq global-mode-string (list "" "GNU Emacs is a version of Emacs...") tab-bar-format '(tab-bar-format-align-right tab-bar-format-global)) (tab-bar-mode 1) And evaluate the buffer (M-x eval-buffer RET). Finally, increase the font size with `global-text-scale-adjust': C-x C-M-0 +++++ The tab-bar text will get pushed off the right side on Emacs master but not in the latest release. See the attached screenshots. Furthermore, different frames can have different text sizes. Personally, I use this to scale each of my frames' text based on the monitor's DPI. To reproduce, launch "emacs -Q", yank the following into the scratch buffer, and evaluate it: (setq global-mode-string (list "" "GNU Emacs is a version of Emacs...") tab-bar-format '(tab-bar-format-align-right tab-bar-format-global)) (tab-bar-mode 1) (set-face-attribute 'default (selected-frame) :height (* 2 (face-attribute 'default :height))) (make-frame) The tab-bar text will be correctly aligned in the new frame but not in the original frame. The per-frame issue can be fixed by making the cache per-frame but reacting to face changes is harder. Given that this is simply a cache, I'd recommend reverting the change and living with the slight performance hit. In GNU Emacs 31.0.50 (build 1, x86_64-pc-linux-gnu, cairo version 1.18.4) of 2025-07-31 built on Laptop Repository revision: 58a3fcbfaf3eee92aec2cce069c0c87475d9d060 Repository branch: makepkg Windowing system distributor 'The X.Org Foundation', version 11.0.12101018 System Description: Arch Linux Configured using: 'configure 'CPPFLAGS=-I/run/user/1000/build/emacs-git/src/mps-git/build/include ' 'LDFLAGS=-L/run/user/1000/build/emacs-git/src/mps-git/build/lib -Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,pack-relative-relocs -flto=auto' --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games --with-modules --without-m17n-flt --without-selinux --without-pop --without-gconf --disable-gc-mark-trace --with-mps=yes --enable-link-time-optimization --with-native-compilation=yes --with-xinput2 --with-x-toolkit=no --without-toolkit-scroll-bars --without-xaw3d --without-gsettings --with-cairo-xcb --without-xft --with-sound=no --with-tree-sitter --without-gpm --without-compress-install '--program-transform-name=s/\([ec]tags\)/\1.emacs/' 'CFLAGS=-march=native -mtune=native -O3 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -fomit-frame-pointer -fno-math-errno -fno-trapping-math -fno-math-errno -fno-trapping-math -flto=auto'' Configured features: ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS HARFBUZZ JPEG LCMS2 LIBOTF LIBSYSTEMD LIBXML2 MODULES MPS NATIVE_COMP NOTIFY INOTIFY OLDXMENU PDUMPER PNG RSVG SECCOMP SQLITE3 THREADS TIFF TREE_SITTER WEBP X11 XDBE XIM XINERAMA XINPUT2 XPM XRANDR ZLIB Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Elisp/l Minor modes in effect: rainbow-mode: t windmove-mode: t rainbow-delimiters-mode: t global-atomic-chrome-edit-mode: t iwd-agent-mode: t i3bar-mode: t ednc-mode: t exwm-xsettings-mode: t exwm-background-mode: t exwm-systemtray-mode: t exwm-randr-mode: t exwm-wm-mode: t spacious-padding-mode: t ligature-mode: t stripspace-local-mode: t flymake-mode: t simple-auto-compile-mode: t save-place-mode: t savehist-mode: t global-org-modern-mode: t notmuch-bookmarks-mode: t goto-address-prog-mode: t eat-eshell-mode: t bug-reference-prog-mode: t magit-todos-mode: t nerd-icons-grep-mode: t global-git-commit-mode: t magit-auto-revert-mode: t server-mode: t llama-fontify-mode: t global-diff-hl-mode: t diff-hl-mode: t dired-async-mode: t yas-global-mode: t yas-minor-mode: t ultra-scroll-mode: t pixel-scroll-precision-mode: t global-hl-todo-mode: t hl-todo-mode: t marginalia-mode: t nerd-icons-completion-mode: t global-jinx-mode: t jinx-mode: t visual-replace-global-mode: t vertico-multiform-mode: t vertico-mode: t corfu-popupinfo-mode: t global-corfu-mode: t corfu-mode: t isearch-mb-mode: t global-evil-surround-mode: t evil-surround-mode: t evil-goggles-mode: t recentf-mode: t editorconfig-mode: t page-break-mode: t global-auto-revert-mode: t minibuffer-depth-indicate-mode: t minibuffer-electric-default-mode: t evil-mode: t evil-local-mode: t desktop-environment-mode: t elpaca-use-package-mode: t override-global-mode: t global-eldoc-mode: t eldoc-mode: t show-paren-mode: t electric-indent-mode: t mouse-wheel-mode: t prettify-symbols-mode: t tab-bar-history-mode: t tab-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t minibuffer-regexp-mode: t column-number-mode: t line-number-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: /home/steb/.config/emacs/elpaca/builds/package-lint-flymake/package-lint-flymake hides /home/steb/.config/emacs/elpaca/builds/package-lint/package-lint-flymake /home/steb/.config/emacs/elpaca/builds/transient/transient hides /usr/share/emacs/31.0.50/lisp/transient /home/steb/.config/emacs/elpaca/builds/org/ox hides /usr/share/emacs/31.0.50/lisp/org/ox /home/steb/.config/emacs/elpaca/builds/org/ox-texinfo hides /usr/share/emacs/31.0.50/lisp/org/ox-texinfo /home/steb/.config/emacs/elpaca/builds/org/ox-publish hides /usr/share/emacs/31.0.50/lisp/org/ox-publish /home/steb/.config/emacs/elpaca/builds/org/ox-org hides /usr/share/emacs/31.0.50/lisp/org/ox-org /home/steb/.config/emacs/elpaca/builds/org/ox-odt hides /usr/share/emacs/31.0.50/lisp/org/ox-odt /home/steb/.config/emacs/elpaca/builds/org/ox-md hides /usr/share/emacs/31.0.50/lisp/org/ox-md /home/steb/.config/emacs/elpaca/builds/org/ox-man hides /usr/share/emacs/31.0.50/lisp/org/ox-man /home/steb/.config/emacs/elpaca/builds/org/ox-latex hides /usr/share/emacs/31.0.50/lisp/org/ox-latex /home/steb/.config/emacs/elpaca/builds/org/ox-koma-letter hides /usr/share/emacs/31.0.50/lisp/org/ox-koma-letter /home/steb/.config/emacs/elpaca/builds/org/ox-icalendar hides /usr/share/emacs/31.0.50/lisp/org/ox-icalendar /home/steb/.config/emacs/elpaca/builds/org/ox-html hides /usr/share/emacs/31.0.50/lisp/org/ox-html /home/steb/.config/emacs/elpaca/builds/org/ox-beamer hides /usr/share/emacs/31.0.50/lisp/org/ox-beamer /home/steb/.config/emacs/elpaca/builds/org/ox-ascii hides /usr/share/emacs/31.0.50/lisp/org/ox-ascii /home/steb/.config/emacs/elpaca/builds/org/org hides /usr/share/emacs/31.0.50/lisp/org/org /home/steb/.config/emacs/elpaca/builds/org/org-version hides /usr/share/emacs/31.0.50/lisp/org/org-version /home/steb/.config/emacs/elpaca/builds/org/org-timer hides /usr/share/emacs/31.0.50/lisp/org/org-timer /home/steb/.config/emacs/elpaca/builds/org/org-tempo hides /usr/share/emacs/31.0.50/lisp/org/org-tempo /home/steb/.config/emacs/elpaca/builds/org/org-table hides /usr/share/emacs/31.0.50/lisp/org/org-table /home/steb/.config/emacs/elpaca/builds/org/org-src hides /usr/share/emacs/31.0.50/lisp/org/org-src /home/steb/.config/emacs/elpaca/builds/org/org-refile hides /usr/share/emacs/31.0.50/lisp/org/org-refile /home/steb/.config/emacs/elpaca/builds/org/org-protocol hides /usr/share/emacs/31.0.50/lisp/org/org-protocol /home/steb/.config/emacs/elpaca/builds/org/org-plot hides /usr/share/emacs/31.0.50/lisp/org/org-plot /home/steb/.config/emacs/elpaca/builds/org/org-persist hides /usr/share/emacs/31.0.50/lisp/org/org-persist /home/steb/.config/emacs/elpaca/builds/org/org-pcomplete hides /usr/share/emacs/31.0.50/lisp/org/org-pcomplete /home/steb/.config/emacs/elpaca/builds/org/org-num hides /usr/share/emacs/31.0.50/lisp/org/org-num /home/steb/.config/emacs/elpaca/builds/org/org-mouse hides /usr/share/emacs/31.0.50/lisp/org/org-mouse /home/steb/.config/emacs/elpaca/builds/org/org-mobile hides /usr/share/emacs/31.0.50/lisp/org/org-mobile /home/steb/.config/emacs/elpaca/builds/org/org-macs hides /usr/share/emacs/31.0.50/lisp/org/org-macs /home/steb/.config/emacs/elpaca/builds/org/org-macro hides /usr/share/emacs/31.0.50/lisp/org/org-macro /home/steb/.config/emacs/elpaca/builds/org/org-loaddefs hides /usr/share/emacs/31.0.50/lisp/org/org-loaddefs /home/steb/.config/emacs/elpaca/builds/org/org-list hides /usr/share/emacs/31.0.50/lisp/org/org-list /home/steb/.config/emacs/elpaca/builds/org/org-lint hides /usr/share/emacs/31.0.50/lisp/org/org-lint /home/steb/.config/emacs/elpaca/builds/org/org-keys hides /usr/share/emacs/31.0.50/lisp/org/org-keys /home/steb/.config/emacs/elpaca/builds/org/org-inlinetask hides /usr/share/emacs/31.0.50/lisp/org/org-inlinetask /home/steb/.config/emacs/elpaca/builds/org/org-indent hides /usr/share/emacs/31.0.50/lisp/org/org-indent /home/steb/.config/emacs/elpaca/builds/org/org-id hides /usr/share/emacs/31.0.50/lisp/org/org-id /home/steb/.config/emacs/elpaca/builds/org/org-habit hides /usr/share/emacs/31.0.50/lisp/org/org-habit /home/steb/.config/emacs/elpaca/builds/org/org-goto hides /usr/share/emacs/31.0.50/lisp/org/org-goto /home/steb/.config/emacs/elpaca/builds/org/org-footnote hides /usr/share/emacs/31.0.50/lisp/org/org-footnote /home/steb/.config/emacs/elpaca/builds/org/org-fold hides /usr/share/emacs/31.0.50/lisp/org/org-fold /home/steb/.config/emacs/elpaca/builds/org/org-fold-core hides /usr/share/emacs/31.0.50/lisp/org/org-fold-core /home/steb/.config/emacs/elpaca/builds/org/org-feed hides /usr/share/emacs/31.0.50/lisp/org/org-feed /home/steb/.config/emacs/elpaca/builds/org/org-faces hides /usr/share/emacs/31.0.50/lisp/org/org-faces /home/steb/.config/emacs/elpaca/builds/org/org-entities hides /usr/share/emacs/31.0.50/lisp/org/org-entities /home/steb/.config/emacs/elpaca/builds/org/org-element hides /usr/share/emacs/31.0.50/lisp/org/org-element /home/steb/.config/emacs/elpaca/builds/org/org-element-ast hides /usr/share/emacs/31.0.50/lisp/org/org-element-ast /home/steb/.config/emacs/elpaca/builds/org/org-duration hides /usr/share/emacs/31.0.50/lisp/org/org-duration /home/steb/.config/emacs/elpaca/builds/org/org-datetree hides /usr/share/emacs/31.0.50/lisp/org/org-datetree /home/steb/.config/emacs/elpaca/builds/org/org-cycle hides /usr/share/emacs/31.0.50/lisp/org/org-cycle /home/steb/.config/emacs/elpaca/builds/org/org-ctags hides /usr/share/emacs/31.0.50/lisp/org/org-ctags /home/steb/.config/emacs/elpaca/builds/org/org-crypt hides /usr/share/emacs/31.0.50/lisp/org/org-crypt /home/steb/.config/emacs/elpaca/builds/org/org-compat hides /usr/share/emacs/31.0.50/lisp/org/org-compat /home/steb/.config/emacs/elpaca/builds/org/org-colview hides /usr/share/emacs/31.0.50/lisp/org/org-colview /home/steb/.config/emacs/elpaca/builds/org/org-clock hides /usr/share/emacs/31.0.50/lisp/org/org-clock /home/steb/.config/emacs/elpaca/builds/org/org-capture hides /usr/share/emacs/31.0.50/lisp/org/org-capture /home/steb/.config/emacs/elpaca/builds/org/org-attach hides /usr/share/emacs/31.0.50/lisp/org/org-attach /home/steb/.config/emacs/elpaca/builds/org/org-attach-git hides /usr/share/emacs/31.0.50/lisp/org/org-attach-git /home/steb/.config/emacs/elpaca/builds/org/org-archive hides /usr/share/emacs/31.0.50/lisp/org/org-archive /home/steb/.config/emacs/elpaca/builds/org/org-agenda hides /usr/share/emacs/31.0.50/lisp/org/org-agenda /home/steb/.config/emacs/elpaca/builds/org/ol hides /usr/share/emacs/31.0.50/lisp/org/ol /home/steb/.config/emacs/elpaca/builds/org/ol-w3m hides /usr/share/emacs/31.0.50/lisp/org/ol-w3m /home/steb/.config/emacs/elpaca/builds/org/ol-rmail hides /usr/share/emacs/31.0.50/lisp/org/ol-rmail /home/steb/.config/emacs/elpaca/builds/org/ol-mhe hides /usr/share/emacs/31.0.50/lisp/org/ol-mhe /home/steb/.config/emacs/elpaca/builds/org/ol-man hides /usr/share/emacs/31.0.50/lisp/org/ol-man /home/steb/.config/emacs/elpaca/builds/org/ol-irc hides /usr/share/emacs/31.0.50/lisp/org/ol-irc /home/steb/.config/emacs/elpaca/builds/org/ol-info hides /usr/share/emacs/31.0.50/lisp/org/ol-info /home/steb/.config/emacs/elpaca/builds/org/ol-gnus hides /usr/share/emacs/31.0.50/lisp/org/ol-gnus /home/steb/.config/emacs/elpaca/builds/org/ol-eww hides /usr/share/emacs/31.0.50/lisp/org/ol-eww /home/steb/.config/emacs/elpaca/builds/org/ol-eshell hides /usr/share/emacs/31.0.50/lisp/org/ol-eshell /home/steb/.config/emacs/elpaca/builds/org/ol-doi hides /usr/share/emacs/31.0.50/lisp/org/ol-doi /home/steb/.config/emacs/elpaca/builds/org/ol-docview hides /usr/share/emacs/31.0.50/lisp/org/ol-docview /home/steb/.config/emacs/elpaca/builds/org/ol-bibtex hides /usr/share/emacs/31.0.50/lisp/org/ol-bibtex /home/steb/.config/emacs/elpaca/builds/org/ol-bbdb hides /usr/share/emacs/31.0.50/lisp/org/ol-bbdb /home/steb/.config/emacs/elpaca/builds/org/oc hides /usr/share/emacs/31.0.50/lisp/org/oc /home/steb/.config/emacs/elpaca/builds/org/oc-natbib hides /usr/share/emacs/31.0.50/lisp/org/oc-natbib /home/steb/.config/emacs/elpaca/builds/org/oc-csl hides /usr/share/emacs/31.0.50/lisp/org/oc-csl /home/steb/.config/emacs/elpaca/builds/org/oc-bibtex hides /usr/share/emacs/31.0.50/lisp/org/oc-bibtex /home/steb/.config/emacs/elpaca/builds/org/oc-biblatex hides /usr/share/emacs/31.0.50/lisp/org/oc-biblatex /home/steb/.config/emacs/elpaca/builds/org/oc-basic hides /usr/share/emacs/31.0.50/lisp/org/oc-basic /home/steb/.config/emacs/elpaca/builds/org/ob hides /usr/share/emacs/31.0.50/lisp/org/ob /home/steb/.config/emacs/elpaca/builds/org/ob-tangle hides /usr/share/emacs/31.0.50/lisp/org/ob-tangle /home/steb/.config/emacs/elpaca/builds/org/ob-table hides /usr/share/emacs/31.0.50/lisp/org/ob-table /home/steb/.config/emacs/elpaca/builds/org/ob-sqlite hides /usr/share/emacs/31.0.50/lisp/org/ob-sqlite /home/steb/.config/emacs/elpaca/builds/org/ob-sql hides /usr/share/emacs/31.0.50/lisp/org/ob-sql /home/steb/.config/emacs/elpaca/builds/org/ob-shell hides /usr/share/emacs/31.0.50/lisp/org/ob-shell /home/steb/.config/emacs/elpaca/builds/org/ob-sed hides /usr/share/emacs/31.0.50/lisp/org/ob-sed /home/steb/.config/emacs/elpaca/builds/org/ob-screen hides /usr/share/emacs/31.0.50/lisp/org/ob-screen /home/steb/.config/emacs/elpaca/builds/org/ob-scheme hides /usr/share/emacs/31.0.50/lisp/org/ob-scheme /home/steb/.config/emacs/elpaca/builds/org/ob-sass hides /usr/share/emacs/31.0.50/lisp/org/ob-sass /home/steb/.config/emacs/elpaca/builds/org/ob-ruby hides /usr/share/emacs/31.0.50/lisp/org/ob-ruby /home/steb/.config/emacs/elpaca/builds/org/ob-ref hides /usr/share/emacs/31.0.50/lisp/org/ob-ref /home/steb/.config/emacs/elpaca/builds/org/ob-python hides /usr/share/emacs/31.0.50/lisp/org/ob-python /home/steb/.config/emacs/elpaca/builds/org/ob-processing hides /usr/share/emacs/31.0.50/lisp/org/ob-processing /home/steb/.config/emacs/elpaca/builds/org/ob-plantuml hides /usr/share/emacs/31.0.50/lisp/org/ob-plantuml /home/steb/.config/emacs/elpaca/builds/org/ob-perl hides /usr/share/emacs/31.0.50/lisp/org/ob-perl /home/steb/.config/emacs/elpaca/builds/org/ob-org hides /usr/share/emacs/31.0.50/lisp/org/ob-org /home/steb/.config/emacs/elpaca/builds/org/ob-octave hides /usr/share/emacs/31.0.50/lisp/org/ob-octave /home/steb/.config/emacs/elpaca/builds/org/ob-ocaml hides /usr/share/emacs/31.0.50/lisp/org/ob-ocaml /home/steb/.config/emacs/elpaca/builds/org/ob-maxima hides /usr/share/emacs/31.0.50/lisp/org/ob-maxima /home/steb/.config/emacs/elpaca/builds/org/ob-matlab hides /usr/share/emacs/31.0.50/lisp/org/ob-matlab /home/steb/.config/emacs/elpaca/builds/org/ob-makefile hides /usr/share/emacs/31.0.50/lisp/org/ob-makefile /home/steb/.config/emacs/elpaca/builds/org/ob-lua hides /usr/share/emacs/31.0.50/lisp/org/ob-lua /home/steb/.config/emacs/elpaca/builds/org/ob-lob hides /usr/share/emacs/31.0.50/lisp/org/ob-lob /home/steb/.config/emacs/elpaca/builds/org/ob-lisp hides /usr/share/emacs/31.0.50/lisp/org/ob-lisp /home/steb/.config/emacs/elpaca/builds/org/ob-lilypond hides /usr/share/emacs/31.0.50/lisp/org/ob-lilypond /home/steb/.config/emacs/elpaca/builds/org/ob-latex hides /usr/share/emacs/31.0.50/lisp/org/ob-latex /home/steb/.config/emacs/elpaca/builds/org/ob-julia hides /usr/share/emacs/31.0.50/lisp/org/ob-julia /home/steb/.config/emacs/elpaca/builds/org/ob-js hides /usr/share/emacs/31.0.50/lisp/org/ob-js /home/steb/.config/emacs/elpaca/builds/org/ob-java hides /usr/share/emacs/31.0.50/lisp/org/ob-java /home/steb/.config/emacs/elpaca/builds/org/ob-haskell hides /usr/share/emacs/31.0.50/lisp/org/ob-haskell /home/steb/.config/emacs/elpaca/builds/org/ob-groovy hides /usr/share/emacs/31.0.50/lisp/org/ob-groovy /home/steb/.config/emacs/elpaca/builds/org/ob-gnuplot hides /usr/share/emacs/31.0.50/lisp/org/ob-gnuplot /home/steb/.config/emacs/elpaca/builds/org/ob-fortran hides /usr/share/emacs/31.0.50/lisp/org/ob-fortran /home/steb/.config/emacs/elpaca/builds/org/ob-forth hides /usr/share/emacs/31.0.50/lisp/org/ob-forth /home/steb/.config/emacs/elpaca/builds/org/ob-exp hides /usr/share/emacs/31.0.50/lisp/org/ob-exp /home/steb/.config/emacs/elpaca/builds/org/ob-eval hides /usr/share/emacs/31.0.50/lisp/org/ob-eval /home/steb/.config/emacs/elpaca/builds/org/ob-eshell hides /usr/share/emacs/31.0.50/lisp/org/ob-eshell /home/steb/.config/emacs/elpaca/builds/org/ob-emacs-lisp hides /usr/share/emacs/31.0.50/lisp/org/ob-emacs-lisp /home/steb/.config/emacs/elpaca/builds/org/ob-dot hides /usr/share/emacs/31.0.50/lisp/org/ob-dot /home/steb/.config/emacs/elpaca/builds/org/ob-ditaa hides /usr/share/emacs/31.0.50/lisp/org/ob-ditaa /home/steb/.config/emacs/elpaca/builds/org/ob-css hides /usr/share/emacs/31.0.50/lisp/org/ob-css /home/steb/.config/emacs/elpaca/builds/org/ob-core hides /usr/share/emacs/31.0.50/lisp/org/ob-core /home/steb/.config/emacs/elpaca/builds/org/ob-comint hides /usr/share/emacs/31.0.50/lisp/org/ob-comint /home/steb/.config/emacs/elpaca/builds/org/ob-clojure hides /usr/share/emacs/31.0.50/lisp/org/ob-clojure /home/steb/.config/emacs/elpaca/builds/org/ob-calc hides /usr/share/emacs/31.0.50/lisp/org/ob-calc /home/steb/.config/emacs/elpaca/builds/org/ob-awk hides /usr/share/emacs/31.0.50/lisp/org/ob-awk /home/steb/.config/emacs/elpaca/builds/org/ob-R hides /usr/share/emacs/31.0.50/lisp/org/ob-R /home/steb/.config/emacs/elpaca/builds/org/ob-C hides /usr/share/emacs/31.0.50/lisp/org/ob-C Features: (shadow emacsbug checkdoc package-lint-flymake package-lint evil-collection-finder finder finder-inf lisp-mnt elpaca-info evil-collection-man man conf-mode consult-org info-colors dabbrev hippie-exp evil-collection-helpful helpful cc-langs cc-vars cc-defs trace evil-collection-edebug edebug info-look evil-collection-info info evil-collection-elisp-refs elisp-refs display-line-numbers bluetooth-battery evil-collection-bluetooth bluetooth bluetooth-plugin bluetooth-uuid bluetooth-pa bluetooth-device bluetooth-lib app-launcher rainbow-mode systemctl sgml-mode facemenu evil-collection-dictionary dictionary dictionary-connection go-ts-mode shr-tag-pre-highlight language-detection network-stream url-cache sort cape mail-extr visual-wrap textsec uni-scripts idna-mapping ucs-normalize uni-confusable textsec-check journalctl bash-completion capf-autosuggest eshell-syntax-highlighting em-elecslash em-ls em-glob em-extpipe em-dirs em-basic em-alias display-fill-column-indicator emacsql-sqlite-builtin help-fns radix-tree tramp-cmds vc-hg vc-bzr vc-src vc-sccs vc-svn vc-cvs vc-rcs consult-xref misearch multi-isearch windmove evil-collection-eglot eglot external-completion jsonrpc evil-collection-ert ert evil-collection-debug debug backtrace evil-collection-vc-git vc-git rainbow-delimiters rust-ts-mode c-ts-common tramp-archive tramp-gvfs evil-collection-xref xref find-dired vertico-sort vertico-repeat evil-collection-consult consult filechooser pinentry evil-collection-atomic-chrome atomic-chrome websocket bindat iwd hex-util i3bar ednc exwm-xsettings xcb-xsettings exwm-background exwm-systemtray xcb-systemtray xcb-xembed exwm-randr xcb-randr exwm exwm-input xcb-keysyms xcb-xkb exwm-manage exwm-floating xcb-cursor xcb-render exwm-layout exwm-workspace exwm-core xcb-ewmh xcb-icccm xcb xcb-xproto xcb-types xcb-debug spacious-padding visual-fill-column org-contacts org-capture evil-org-agenda org-agenda gnus-art mm-uu mml2015 gnus-sum gnus-group gnus-undo gnus-start gnus-dbus gnus-cloud nnimap nnmail mail-source utf7 nnoo gnus-spec gnus-int gnus-range gnus-win ligature org-appear valign stripspace flymake-languagetool evil-collection-flymake flymake oc-basic bibtex ol-man ol-info ol-docview evil-collection-doc-view doc-view jka-compr evil-collection-image image-mode exif tramp-cache time-stamp simple-auto-compile saveplace savehist show-font org-protocol org-bookmark-heading evil-org org-modern ob-dot ob-latex ob-python evil-collection-python python ob-gnuplot ob-calc calc-store calc-trail calc-ext evil-collection-calc calc calc-loaddefs calc-macs ob-shell edraw-org edraw-util edraw-msg cl-print org-element org-persist org-id org-refile avl-tree evil-collection-org org-crypt org org-macro ob-plantuml ob ob-tangle ob-ref ob-lob ob-table ob-exp org-src evil-collection-sh-script sh-script smie treesit executable ob-comint org-element-ast inline org-pcomplete org-list org-footnote org-faces org-entities ob-emacs-lisp ob-core ob-eval org-cycle org-table org-keys oc notmuch-addr notmuch-bookmarks evil-collection-notmuch notmuch notmuch-tree notmuch-jump notmuch-hello notmuch-show notmuch-print notmuch-crypto notmuch-mua notmuch-message notmuch-draft notmuch-maildir-fcc notmuch-address notmuch-company notmuch-parser notmuch-wash coolj goto-addr icalendar diary-lib diary-loaddefs evil-collection-calendar cal-menu calendar cal-loaddefs notmuch-tag notmuch-lib notmuch-compat mm-view mml-smime smime dig evil-collection-eat eat term/xterm xterm tramp-sh tramp trampver tramp-integration tramp-message tramp-compat tramp-loaddefs evil-collection-term term ehelp evil-collection-forge forge-repos forge-tablist hl-line forge-topics forge-commands forge-semi forge-bitbucket forge-gogs forge-gitea forge-gitlab forge-github forge-client forge-forgejo forge-notify forge-revnote forge-pullreq forge-issue forge-discussion forge-topic yaml parse-time iso8601 eieio-custom bug-reference magit-bookmark evil-collection-bookmark bookmark forge-post evil-collection-markdown-mode markdown-mode edit-indirect evil-collection-outline noutline outline forge-repo forge forge-core ghub-legacy ghub-graphql treepy gsexp ghub url-http url-gw nsm url-auth let-alist gnutls forge-db closql emacsql-sqlite emacsql emacsql-compiler eieio-base evil-collection-magit-todos magit-todos pcre2el rxt advice re-builder f s dash nerd-icons-grep evil-collection-grep grep evil-collection-compile compile evil-collection-magit magit-submodule magit-blame magit-stash magit-reflog magit-bisect magit-push magit-pull magit-fetch magit-clone magit-remote gptel-commit gptel-gh secrets dbus posframe evil-collection-gptel gptel gptel-openai magit-commit magit-sequence magit-notes magit-worktree magit-tag magit-merge magit-branch magit-reset magit-files magit-refs magit-status magit evil-collection-package-menu package url-handlers evil-collection-magit-repos magit-repos magit-apply magit-wip magit-log which-func evil-collection-imenu imenu magit-diff evil-collection-smerge-mode smerge-mode diff git-commit magit-core magit-autorevert magit-margin magit-transient magit-process evil-collection-with-editor with-editor shell server magit-mode transient evil-collection-eww ol-eww ol org-fold org-fold-core org-compat org-version org-macs eww vtable mule-util url-queue shr pixel-fill kinsoku url-file svg xml dom mm-url evil-collection-gnus gnus nnheader range browse-url benchmark magit-git magit-base evil-collection-magit-section magit-section format-spec cursor-sensor crm llama evil-collection-diff-hl diff-hl evil-collection-log-view log-view evil-collection-log-edit log-edit message sendmail yank-media puny dired-async async dired-aux evil-collection-dired dired dired-loaddefs rfc822 mml mml-sec evil-collection-epa epa epg rfc6068 epg-config gnus-util time-date mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr mailabbrev mail-utils gmm-utils mailheader add-log pcvs-util evil-collection-vc-dir vc-dir ewoc vc vc-dispatcher diff-mode track-changes yasnippet evil-collection-ultra-scroll ultra-scroll pixel-scroll cua-base hl-todo marginalia nerd-icons-corfu nerd-icons-completion nerd-icons nerd-icons-faces nerd-icons-data nerd-icons-data-mdicon nerd-icons-data-flicon nerd-icons-data-codicon nerd-icons-data-devicon nerd-icons-data-sucicon nerd-icons-data-wicon nerd-icons-data-faicon nerd-icons-data-powerline nerd-icons-data-octicon nerd-icons-data-pomicon nerd-icons-data-ipsicon jinx visual-replace evil-collection-which-key which-key vertico-multiform vertico corfu-popupinfo evil-collection-corfu corfu orderless isearch-mb evil-surround evil-goggles pulse face-remap color evil-collection-tabulated-list evil-collection-tab-bar evil-collection-simple evil-collection-replace evil-collection-process-menu evil-collection-kmacro evil-collection-indent evil-collection-help evil-collection-elisp-mode evil-collection-eldoc evil-collection-elpaca evil-collection-custom evil-collection-comint evil-collection-buff-menu evil-collection annalist evil-args ednc-autoloads i3bar-autoloads discomfort-autoloads debase-autoloads iwd-autoloads bluetooth-autoloads app-launcher-autoloads atomic-chrome-autoloads websocket-autoloads pinentry-autoloads playerctl-autoloads exwm-autoloads xelb-autoloads ol-notmuch-autoloads microdata-autoloads notmuch-addr-autoloads eshell-syntax-highlighting-autoloads eat-autoloads git-link-autoloads pr-review-autoloads igist-autoloads magit-todos-autoloads diff-hl-autoloads wgrep-autoloads watch-autoloads tmr-autoloads syncthing-autoloads pcre2el-autoloads qrencode-autoloads password-store-menu-autoloads password-store-autoloads named-pipe-autoloads elpher-autoloads dwim-shell-command-autoloads info-colors-autoloads helpful-autoloads elisp-refs-autoloads devdocs-autoloads whisper-autoloads gptel-commit-autoloads gptel-autoloads journalctl-autoloads systemctl-autoloads proced-narrow-autoloads show-font-autoloads dbus-explore-autoloads disk-usage-autoloads dired-filter-autoloads dired-hacks-utils-autoloads f-autoloads s-autoloads diredfl-autoloads org-bookmark-heading-autoloads notmuch-bookmarks-autoloads pdf-tools-autoloads tablist-autoloads nov-autoloads esxml-autoloads calibre-autoloads vcard-autoloads org-contacts-autoloads calfw-autoloads valign-autoloads orgit-forge-autoloads forge-autoloads closql-autoloads emacsql-autoloads ghub-autoloads treepy-autoloads yaml-autoloads orgit-autoloads magit-autoloads magit-section-autoloads with-editor-autoloads evil-org-autoloads org-download-autoloads async-autoloads org-appear-autoloads org-modern-autoloads org-loaddefs edit-indirect-autoloads markdown-mode-autoloads web-mode-autoloads wat-ts-mode-autoloads comint-mime-autoloads mathjax-autoloads flymake-ruff-autoloads package-lint-flymake-autoloads package-lint-autoloads eff-autoloads pkgbuild-mode-autoloads gnuplot-autoloads graphviz-dot-mode-autoloads edraw-autoloads plantuml-mode-autoloads deflate-autoloads dash-autoloads csv-mode-autoloads udev-mode-autoloads systemd-autoloads ssh-config-mode-autoloads nftables-mode-autoloads git-modes-autoloads rmsbolt-autoloads rust-playground-autoloads flymake-languagetool-autoloads consult-eglot-autoloads dape-autoloads casual-autoloads notmuch-transient-autoloads transient-autoloads bash-completion-autoloads cape-autoloads yasnippet-autoloads iwindow-autoloads consult-project-extra-autoloads spacious-padding-autoloads ultra-scroll-autoloads ligature-autoloads hl-todo-autoloads rainbow-mode-autoloads marginalia-autoloads posframe-autoloads shr-tag-pre-highlight-autoloads language-detection-autoloads rainbow-delimiters-autoloads visual-fill-column-autoloads nerd-icons-grep-autoloads nerd-icons-corfu-autoloads nerd-icons-ibuffer-autoloads nerd-icons-completion-autoloads nerd-icons-dired-autoloads nerd-icons-autoloads link-hint-autoloads avy-autoloads snapshot-timemachine-autoloads stripspace-autoloads vundo-autoloads jinx-autoloads visual-replace-autoloads capf-autosuggest-autoloads vertico-autoloads corfu-autoloads orderless-autoloads isearch-mb-autoloads embark-consult-autoloads consult-autoloads embark-autoloads evil-surround-autoloads evil-goggles-autoloads evil-nerd-commenter-autoloads evil-collection-autoloads annalist-autoloads evil-args-autoloads filechooser-autoloads em-prompt text-property-search em-hist em-unix em-pred esh-mode esh-var eshell esh-cmd generator esh-ext esh-proc esh-opt esh-io esh-arg pcomplete comint ansi-osc ansi-color esh-module esh-module-loaddefs esh-util help-at-pt files-x recentf tree-widget editorconfig editorconfig-core editorconfig-core-handle editorconfig-fnmatch project disp-table modus-operandi-theme modus-themes derived pcase autorevert filenotify mb-depth minibuf-eldef evil evil-integration evil-maps evil-commands reveal evil-jumps evil-command-window evil-types evil-search evil-ex evil-macros evil-repeat evil-states evil-core comp-run evil-common thingatpt rect evil-vars ring edmacro kmacro evil-autoloads goto-chg-autoloads general general-autoloads llama-autoloads simple-auto-compile-autoloads mode-local find-func elpaca-menu-elpa no-littering compat no-littering-autoloads elpaca-menu-melpa elpaca-menu-org elpaca-use-package use-package use-package-ensure use-package-delight use-package-diminish use-package-bind-key bind-key easy-mmode use-package-core elpaca-use-package-autoloads elpaca-log elpaca-ui url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util url-parse auth-source eieio eieio-core cl-macs password-cache json map byte-opt url-vars mailcap elpaca elpaca-process elpaca-autoloads notmuch-version comp cl-seq comp-cstr cl-extra help-mode comp-common warnings subr-x rx gv bytecomp byte-compile xdg cus-edit pp cus-start cus-load icons wid-edit cl-loaddefs cl-lib rmc iso-transl tooltip cconv eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd touch-screen tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs theme-loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify lcms2 dynamic-setting font-render-setting cairo xinput2 x multi-tty move-toolbar make-network-process tty-child-frames native-compile mps emacs) Memory information: ((conses 24 0 0) (symbols 56 0 0) (strings 40 0 0) (string-bytes 1 0) (vectors 24 0) (vector-slots 8 0 0) (floats 24 0 0) (intervals 64 0 0) (buffers 1072 0)) --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=before.png Content-Transfer-Encoding: base64 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 BpVpLwAAAABJRU5ErkJggg== --=-=-= Content-Type: image/png Content-Disposition: attachment; filename=after.png Content-Transfer-Encoding: base64 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 1HBQI7m8OPm8U1sXG63iwBz06N9fmQwPsge6gQVwQA/8+QWNkq1x/n2bfB+ku3f5bsj79aOYU2oU GID73gMevCA+tEtwqOkHesXxL2JPEuODfIYND6q2jmd8vd7hH/d+ILO8IPv0VYkRFzCi5bzXA5yq aRXHLnWOePTvt0yGB9kD3MACOCCcX9Ao2ZpLuP+wcJN/62SHP6P7JniBAgNQSe1AFoBdSfn6fImI yMtfKa+2VcAOxwUA4P7DPdgPOasj+Ti/AACAjdRMzwt2c/eVt2ffPHeH+bYMeWNOq1ERfDWsYp+k SKlH4ucvvnn4YkGmnvcKdu/Yr96kKaHtfEuf//V/n+82+WZ26Vfe/nNMLDHpn8Tl61OOXchPyTJo RSYo5D4hbu171Z0wKbRLoO0yQcbxxDLOJC78JWn/OVVaIe8Z5N6hX70pU0Pb+ZXcO6bb+Py+9w5L QmjDDftatC9ZhMSYGyOHXb9s4Nu+03vjFNdyBxhiFmSzWUtr1Mc2xm/4K/1ctDornym8XRq19R86 Nmxsb9eyvVOlOwkTel06oecipvXY+bLy+IqoRVvSLyfp9Ap5cGOffqPCpzzp7Wv1OEmOfvTNz2RW UHBoQ/ymPekXYgqz1OTs5dSwlV//UWHjBrp78HbPZN3tNzqd3pZfKvPUK8bsXFHyM8VDrf9eXb8O Z2GBUUdeHz3uxjUtKZo2Wr+5aduSDxDFhPiJIy6fUJFQN3TRH236eFm9Y/ZJvjntWNEPpmZuWZO4 62j29URtroYp3ZV1G3t3Hxw6YbR/PSeb7litr2Imo6Ieb9XolBmZXNUqZsdMtjjHqlpgSDzywcHn N2gkmdvUjb3eblN2ayx17cl+szK0nHz4j/3mD5Zb3PIbt5ZzJXnJosQ9p/JSciSFn1vb3vUmz2jQ ReCFmo5fVDnHrCljdk1+LT6/OHSjZDrucutm5xMX/pJ0IFKVVsh7BLp16Bc6ZWpoe3/bHc6qVjGr KrI5hd+Cgmj5FWx1n/gsLTBm1RfLT0kADqNGghcFd+Z+kPBvDiOiO+eTZs327rks9D9aVwtWsQeW tufCh2/eSi4a71jKiM/evTT7wK60T1Z2GBNu9YUv0x7+/OSMVXkFpoNyaPVpcdm747L3brn14s9d Xu8it0k2cAKXve/ik68nJemL0pKZmL13efahvemfrWj/ZMNa00VHn5T8v2kXN143FOeZLj0/cl9+ 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 SUD/1Q8kFAcAAAAAAACA8WQoAlMREo7Nnzrhu+CLSYJEyo4jELsAAAAAAAAAMAWMvDCN9PPzetZv O2VdeJJAnLVXs3e7VLdmKBYAyE2I2TimgZu10tajxcc740UUCAAAAABAoSB4YQLZkYv7dZ6847ZO 4uxrjVx6Kjb62NqPGlqjYIpJiP6lsYLlx9kO+ktr4rS0If2tOMZ455F7skt6Xt483alP/WSMMVXH ZQkYeWSQ/tzSb1adic/MTr99bN53f0QLKBIAAAAAgMJA8MJo2rCZQz7ekygSV67DL4ePrRhV34l/ 83v1KPuAf8oa75SQGXrc3AV4OSlxRScVY0zmPTlU91pTYmWcHWVPBmUxlZOTLXpgAAAAAIBCwZwX RhLjfp8261ymxGQ+o9ZsmFTbBkViNM6164w/Kzx8EXTRhy0ZN+tIOvICJR7vO/7PEHHO5ovpjg0G TxnqhofLAAAAAAAKBcEL4+jDVyw8nCYR59znh+87lsWViCkwmyrt+lXJ8YHWdu/EWUeQFygNlN5d PpnbBeUAAAAAAFAkGLRsFP3lv/+J1BPxnoM+7OGE0EUJhsozRSGiFAEAAAAA4LVA8MIY0sPTJ6ME Is65fZcGykKsIMTpL3+Tuatt6oaAlD8qpazxTd3QMG33B1nXTokFz0whpR/PPvNhxj+NU9f5p/xZ PfWvPpn/rdSnZeb93u3JqWu8U57+V09zN5uIKH1VxtrnHz75zz/jWkK+NJKFG7Myd7dNXV8l5c8a aduGaC6HiqJeONc6ZY13yp9DszWmmH9RSr28+X9DWgdWKGOlVNm5BbQa+sP2G5pnszyqu/+RbJpq SYvaMXtC72YBFcraKJVWZdz8GnUb82PIpeSXzP4h43kSEkIXTehax7OsWqGydfFt1HvKspMJ+oLW 0N7+d9n0we3rVHaxt1Io1HbOnjVa9ZuyYH+M5o20xez9Y9x4xtT9Nt069H2Pas5W1o5+7SZuiNRI mRGrgpp42qnUZX1ajfs9IsMkJSY+Pv/HZ/2b+bvaqxUqh4o1Oo6efeB2tsTL+JfELzSxBxZM6dcy sKKjjUqhtnfzb9Lro992RWeYshw0N3bPHt+zSRX3MlYKnuM4udrBvUrTvpMX/Xsn94ys2m1D7Lnn 86e6jNqrJSIhdk7zvPOrqtotuZej9Yt3F7VVMsbkVT8/q9PG7Z05vE01d3uVQm3v6t+078fLTyXm m4Mze9cIJz7/pK0vmdY0xzyy2uzb+2aNbBdY/mkaTQynYd5DDAAAAADA7PDYiDH0Mddj9BKRPKBm Nfkrv511JGv/h9rHOS/V9FJ2opS4W5u4N/vGOKu2U2XKPJd+OjHm68yTGwXd84ucbCn1vC71vO76 OnmjFVaVK5kgG9Jd3Ymhmuibz9LQikmh2WdP6R/+qDLhK1PE+F2TOvVfEJ7+LJn4yCNrvzq298T8 X/1NWCdZV38f2Wv8hmuZL0os/vrpHddP71yzrPuskLXj69gauLxmMv7hP6ObDv79RvbT9RKjT//1 2387/9q/eM+6Ef6KPNUSs/GD7kErL6W/uPbUPbwVceRWxJGQlSvGrNkxv2eFNzNrq/QoZOKALTse kSSK1w/Of78Xe9DlwCerruqZJIo3jiwd1SXD4fyaXs7MmBIT4jaN7PD+H1FZT9fIuhOxb/nHh3ad WDLfv6AeJftG8Ie9R6+8mPY8FW181Mm/o07+s3LJoEXbVr7vrzQ+84l7JnfsN+9CWo6QgD4r5f61 EyHXTv61Zu30rTu/b2W6Z7vEO8Hv9x6x6bb+SXLahKgTIb+e3LH10IoDawdXMk3XKt7fOmrs+2vj dM/TOBny66ntm3cv3BscVEXxRg4xAAAAAIA3AcELY0hJj5IkIiYr5+L4qjEsmfqwz7SPM4isOK+x Kt9mnNqamECZ1/TX5mlvxUgPlmjON7Bp3CLnpZWUOCvz+EZBILJupqwRJHfxZixVfLAvO3y5Li1G d2JUltXfKjfbp992HKpu2YaeXrek6y99nf1YT6pWqvq9uVzXazxzcsjxpyhe/1wTfVMiRtaNFAH9 5Y7uJD0S74doI2drHUw1NEdK3Dxx+MLwdIm4MrUGTfqob9PKZYTESwd+n71oxm8JClPVSNrhaT3H bIjSSczWr8vwoF5NfMpyKXFnd/2+fGtEUuy2yT3HVzy3uqdz/utX6cKC6eG65hPmjOpcy12VcTd8 /+q5S/fFaGJDPhrZqMmRqVVyxCL0l34dOGLlpUySlWswaNyIro383W25jIRrJ0IWzQu+kBS+ZNjw 6mF7x3m/iWFN2afPW80OTxpR6eH2Kd0GLLtybdF0GrDq8sn+HvEbx3R4f13s3c3zgmf0mODJFbvE xLhVY8esjcqSmKJ8i5GTRnWp62EnPLhycM1vC7+YFW9vcLfSQ7/oMWzlZS0pKrb76Kup/Zr7OXLJ Maf+njvjlx3RUetH93CseHpOG3vj4grp+74aveBCmsSsA/pO+zyofaCbjYwJGfcj9iye8fPfUUmn Zr7/WYtLSzs+OWDkdT9cteGdZ1HB1MM/jV8WruOcO3/921D/XIEn3rW+wYCH7sy8/4XZ9/7y6wEt /Jz41LgzO5b8tvJEvDZm04SJHVr/M7z88/qX1R67fH0H7bOQghC9/uNvtscX5i1A+ivLv78q7zR9 +egutcsr026e2Pzbj8tOJGTf+nviyHnNjn6cs1ma6RADAAAAAHhDJEl6/q+RG0ktgFRqZf0z2I4R Mfsh27Je8VXhZOamysmrvVP2rBbE3IvE2KxdfsmrvZI3fKrT5/z8rnZv1eTVXskbhmlTdblWydiW 8WRrO5fl3dpTD7X7/ZJXeyVv+U4nvHTHxMisbT7Jq72Sg0dr03MlL979InWtT/Jqr+S1Q7SZolEl Jdyc01zJiJhV/W/OpOdcEP/PcO8nV2CqbmuSCijnHcPKMiJmM3DrS8tZiJ3fSs2ImG2TGWfSci7R XF3UxZkjYvJa317MmcusLf3UjIjJFB7919/KuUS4v3lQBZ6IeJ+PT2bnWKA7Pc1fRkTyOt+G59md lEMTfGVEJK+ZO5Vi5KWotPtGu3JEvNekY092VoiZ01xBJK89I+LJrujCvgqUEXFOI3ZpjSgxfcSM 2nIi4hzfWR6Ts1mKD/eMraKSMSJSdlgan6PBCHGL2lozIs6x85Lo7Fw1dmdDP3eeiKkaz7qmN64E sg9/WIEnYupW827mafP66780UbIneTdY6mLC8o5Kyll8BTeyOwvbKIiIKW1qTzmSnPO40F7+uZk1 I2LKFnNjCz7ssk9+4svnLyXJULNUer236V7OTWVd/KmpNSMimf+0/3QmO8QAAAAAAN6kwgQTMOeF uYJEaZJOJOJYmSpcntu4zFPZ4ZzdwHC73v+T5bzlqw3VJWqIeK7SOIVt7iEyVl2Uvj5EkvRony5D NGrHssP1KQIRxzwGK6xzJs+Y24dKZxM1kIz/jp3PlojZdZk6qV7OZ1E4l65fTmhkmtvC0qODu05n ScS5Dfh6Sr1cL61VVQn6ZqSfjCTd5T17Y/KXmMSqjvyiX8Wc+edce3zY34snEm6dPnU3xyqyejPC 0zWarLRTX9bI86iDXdNe7V04In1UWETmG2lnzNbu6UMezN7BnhExWzu7Jx9wdg72HJGkyXw+gUkx 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 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 05 13:46:49 2025 Received: (at 79141) by debbugs.gnu.org; 5 Aug 2025 17:46:49 +0000 Received: from localhost ([127.0.0.1]:56875 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ujLkP-00057h-9d for submit@debbugs.gnu.org; Tue, 05 Aug 2025 13:46:49 -0400 Received: from mout-y-209.mailbox.org ([91.198.250.237]:53976) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ujLkL-00057G-OY for 79141@debbugs.gnu.org; Tue, 05 Aug 2025 13:46:46 -0400 Received: from smtp202.mailbox.org (smtp202.mailbox.org [10.196.197.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-y-209.mailbox.org (Postfix) with ESMTPS id 4bxLTB10JCzB0bb; Tue, 5 Aug 2025 19:46:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; t=1754415998; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=flakq8VGaJhIDTRXZNhFQzoqbNG78MSsG24nlL7DaFA=; b=ZDioT7mnI1e7X1dOvrJyehnSMqZqM3dadUIH8lyaxMMJsA9QJZyhOxZkjC6zG58yfu/m7a WBuqG6gKpqhkdZJdZa/+Ckzl/ZWzSVOJzmNMbAi/D2Ge9ZuzAK+eHa1QWIEb++lQYLGn4l b+MjWXsaOZX7Ns9MJ1VEW6OSjkiHD1EJsbyDWLDocomWi39u7W9Sks4JJcaCVA2G6TtPkz nSR8NH9peX+1Kw+VWhnFimdXteTsmbsH/IdVeb1N2Qpb6tqxKPAwjM4YSC/k5cTVf9/PX3 QD+Czjw4OUZQdunguAEgehbHktNVnbUhGXwGmX2ZJOjiPOfdrbe3qLR1lrSOGw== From: Juri Linkov To: Steven Allen Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <87bjoywyzf.fsf@stebalien.com> Organization: LINKOV.NET References: <87bjoywyzf.fsf@stebalien.com> Date: Tue, 05 Aug 2025 20:43:00 +0300 Message-ID: <87fre5d5qz.fsf@mail.linkov.net> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Daniel Mendler , 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Thanks for the detailed test cases that demonstrate the problem. > The the `tab-bar-format-align-right' width cache isn't updated when > faces change and doesn't take into account the fact that faces can have > different attributes on different frames. > > To reproduce, launch "emacs -Q" then yank the following into the scratch > buffer: > > (setq global-mode-string > (list "" "GNU Emacs is a version of Emacs...") > tab-bar-format > '(tab-bar-format-align-right tab-bar-format-global)) > (tab-bar-mode 1) > > And evaluate the buffer (M-x eval-buffer RET). > > Finally, increase the font size with `global-text-scale-adjust': C-x C-M-0 +++++ > > The tab-bar text will get pushed off the right side on Emacs master but > not in the latest release. See the attached screenshots. > > Furthermore, different frames can have different text sizes. Personally, > I use this to scale each of my frames' text based on the monitor's > DPI. To reproduce, launch "emacs -Q", yank the following into the > scratch buffer, and evaluate it: > > (setq global-mode-string > (list "" "GNU Emacs is a version of Emacs...") > tab-bar-format > '(tab-bar-format-align-right tab-bar-format-global)) > (tab-bar-mode 1) > (set-face-attribute 'default (selected-frame) :height (* 2 (face-attribute 'default :height))) > (make-frame) > > The tab-bar text will be correctly aligned in the new frame but not in > the original frame. > > The per-frame issue can be fixed by making the cache per-frame but > reacting to face changes is harder. Given that this is simply a cache, > I'd recommend reverting the change and living with the slight > performance hit. Instead of reverting the change maybe it would be better to add a customizable cache function that anyone could change to adapt caching to own needs by adding more cache keys such as e.g. '(selected-frame)', '(face-all-attributes 'default)', 'face-remapping-alist', ... From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 06 07:27:14 2025 Received: (at 79141) by debbugs.gnu.org; 6 Aug 2025 11:27:14 +0000 Received: from localhost ([127.0.0.1]:58250 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ujcIb-0004TA-Kz for submit@debbugs.gnu.org; Wed, 06 Aug 2025 07:27:14 -0400 Received: from mail-vk1-xa35.google.com ([2607:f8b0:4864:20::a35]:53661) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1ujcIY-0004Sx-Ox for 79141@debbugs.gnu.org; Wed, 06 Aug 2025 07:27:11 -0400 Received: by mail-vk1-xa35.google.com with SMTP id 71dfb90a1353d-539754975f9so961653e0c.3 for <79141@debbugs.gnu.org>; Wed, 06 Aug 2025 04:27:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1754479625; x=1755084425; darn=debbugs.gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Kv7SgaHZV3AuHOz5IzvRm+5DX5hJ2jiBEwlPhBPl3YM=; b=BkPUswptGOxehvGazm9jOagI1AGH3OZSDKfRTsZ4dlxGKu1iPPMMWAnzHMY5VifuCX Jo7nsidnBsV5BUya1UCB2vpTXdy18MHcPCH2GouktFm5mDExR2z2I7N+UUFCmVhw9+r1 O2PduSfS4/9tAD4tXaOjr2B0CuoTKzbjL0ga2rGsjPppsLaS/4ACRmVo+MfPxE9vkZfG Yjza6oHfBU4/C0pTSbDvyOBmIA5tYaF1w1VgLI5lEDFEEJN5cn3emMjbN892pB0S+TRZ VrN3zrGRzZGJlFYyIcj+ZOXMeZ8TFmBUSohvF2vCom/jxDjVVQM+KBVHl9u5x5ELHidF 9CXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754479625; x=1755084425; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Kv7SgaHZV3AuHOz5IzvRm+5DX5hJ2jiBEwlPhBPl3YM=; b=wDhec6VoYLDOVNx6QlVoCZxW55cPv+Se0SDZDEGeFPXvefIhwrPhEF9fHDlV/6E6tA T70QKuzfMa1lo+EMtqEv5xMEoRtCE96zMI7xkLStECLacwLZy0nbUZih4IwxPVIhN2b8 Qg/zQCpJQ1Kqzz8gRLdPD7/kpEfK336QMnUIb6m8+rtN3NZiTE6YlKUU0br6PNOUb52y q4/heCtMJxaWOrb8dseagSTRHrYAy9FJ4LSfEa18SvO2L6n1EpwZVsBvwiCOtq7g+5DO yki7Xi7HYA4Q8vskDEP5swwrP+FKQpN+BLtZ9JQQlzNEf65seHpbxPU3vNHkgpesmqqj B6ZA== X-Forwarded-Encrypted: i=1; AJvYcCXp4CZacxAaucb6MXzqtoCynmMe1npkwjzjFHKmbtGy8px6W0pzZA/a0mjlePrQUqHR4JaAEQ==@debbugs.gnu.org X-Gm-Message-State: AOJu0Yx4q68k2FoHjOgoc9ju09rfrIvYAPLlBhAB9HqREgbZedMcTm2Y MELH+ngNR1GtQWF2OW5zAwaRao1T0czibQqbaem1wM9PhNcnfWsmuSFHNw6cWp4432PECvP88eB IbS6+hQ6RMEsakOk18kDXUlsQlnDGuVM= X-Gm-Gg: ASbGncskKLRxogrSAtjorjOF7T6nrSE09Gxl20jIXzAroP03YxL7S2rEyK1p0hLOeV7 kcTk4FI6Kjtst+wed3rqDV2KkxQ8ghJtwiSCBT627eLBMDD1uAJljgozBuI/qq6ybQhpYhKBI6B BgEknDKVrvwq34jeD4zlRbRe67H+oT36cqNhmFIaoICc8sx9BFXS+yp5JQl1iK/C51uUwXvsHKy PIDn+7U6Q== X-Google-Smtp-Source: AGHT+IGHLrnh5TfBjNc7CYeeUjcvduCXxSIYD0KGMpCpV6vmF8YrZyBaf1x1OJjKUQJBuBQQ6h4GuQA37df3vGXRido= X-Received: by 2002:a05:6122:3c8d:b0:52f:47de:3700 with SMTP id 71dfb90a1353d-539a03fd50amr952582e0c.5.1754479624871; Wed, 06 Aug 2025 04:27:04 -0700 (PDT) MIME-Version: 1.0 References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> In-Reply-To: <87fre5d5qz.fsf@mail.linkov.net> From: =?UTF-8?Q?St=C3=A9phane_Marks?= Date: Wed, 6 Aug 2025 07:26:53 -0400 X-Gm-Features: Ac12FXzw7toL9fx3GIucRdFPmG7vT-LL1uoqr9YSd9fvcaudlb54cmtXKoXu5AU Message-ID: Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account To: Juri Linkov Content-Type: multipart/alternative; boundary="000000000000ce63ae063bb09ef7" X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 79141 Cc: Daniel Mendler , Steven Allen , 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --000000000000ce63ae063bb09ef7 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Aug 6, 2025 at 3:51=E2=80=AFAM Juri Linkov wrote: > Thanks for the detailed test cases that demonstrate the problem. > > > The the `tab-bar-format-align-right' width cache isn't updated when > > faces change and doesn't take into account the fact that faces can have > > different attributes on different frames. > > > > To reproduce, launch "emacs -Q" then yank the following into the scratc= h > > buffer: > > > > (setq global-mode-string > > (list "" "GNU Emacs is a version of Emacs...") > > tab-bar-format > > '(tab-bar-format-align-right tab-bar-format-global)) > > (tab-bar-mode 1) > > > > And evaluate the buffer (M-x eval-buffer RET). > > > > Finally, increase the font size with `global-text-scale-adjust': C-x > C-M-0 +++++ > > > > The tab-bar text will get pushed off the right side on Emacs master but > > not in the latest release. See the attached screenshots. > > > > Furthermore, different frames can have different text sizes. Personally= , > > I use this to scale each of my frames' text based on the monitor's > > DPI. To reproduce, launch "emacs -Q", yank the following into the > > scratch buffer, and evaluate it: > > > > (setq global-mode-string > > (list "" "GNU Emacs is a version of Emacs...") > > tab-bar-format > > '(tab-bar-format-align-right tab-bar-format-global)) > > (tab-bar-mode 1) > > (set-face-attribute 'default (selected-frame) :height (* 2 > (face-attribute 'default :height))) > > (make-frame) > > > > The tab-bar text will be correctly aligned in the new frame but not in > > the original frame. > > > > The per-frame issue can be fixed by making the cache per-frame but > > reacting to face changes is harder. Given that this is simply a cache, > > I'd recommend reverting the change and living with the slight > > performance hit. > > Instead of reverting the change maybe it would be better to add > a customizable cache function that anyone could change to adapt caching > to own needs by adding more cache keys such as e.g. '(selected-frame)', > '(face-all-attributes 'default)', 'face-remapping-alist', ... > I right align text on my tab bar and also use multiple text scales on different frames. IMO, customizing the cache function pushes too much of the cache (and string-pixel-width) implementation details on users, and seems a likely source of confusion. --000000000000ce63ae063bb09ef7 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
= On Wed, Aug 6, 2025 at 3:51=E2=80=AFAM Juri Linkov <juri@linkov.net> wrote:
Thanks for the detailed test cases that demonstrate the probl= em.

> The the `tab-bar-format-align-right' width cache isn't updated= when
> faces change and doesn't take into account the fact that faces can= have
> different attributes on different frames.
>
> To reproduce, launch "emacs -Q" then yank the following into= the scratch
> buffer:
>
>=C2=A0 =C2=A0 =C2=A0(setq global-mode-string
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(list "" "GNU= =C2=A0 Emacs=C2=A0 is a version of Emacs...")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tab-bar-format
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'(tab-bar-format-align-rig= ht tab-bar-format-global))
>=C2=A0 =C2=A0 =C2=A0(tab-bar-mode 1)
>
> And evaluate the buffer (M-x eval-buffer RET).
>
> Finally, increase the font size with `global-text-scale-adjust': C= -x C-M-0 +++++
>
> The tab-bar text will get pushed off the right side on Emacs master bu= t
> not in the latest release. See the attached screenshots.
>
> Furthermore, different frames can have different text sizes. Personall= y,
> I use this to scale each of my frames' text based on the monitor&#= 39;s
> DPI. To reproduce, launch "emacs -Q", yank the following int= o the
> scratch buffer, and evaluate it:
>
>=C2=A0 =C2=A0 =C2=A0(setq global-mode-string
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(list "" "GNU= =C2=A0 Emacs=C2=A0 is a version of Emacs...")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tab-bar-format
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'(tab-bar-format-align-rig= ht tab-bar-format-global))
>=C2=A0 =C2=A0 =C2=A0(tab-bar-mode 1)
>=C2=A0 =C2=A0 =C2=A0(set-face-attribute 'default (selected-frame) := height (* 2 (face-attribute 'default :height)))
>=C2=A0 =C2=A0 =C2=A0(make-frame)
>
> The tab-bar text will be correctly aligned in the new frame but not in=
> the original frame.
>
> The per-frame issue can be fixed by making the cache per-frame but
> reacting to face changes is harder. Given that this is simply a cache,=
> I'd recommend reverting the change and living with the slight
> performance hit.

Instead of reverting the change maybe it would be better to add
a customizable cache function that anyone could change to adapt caching
to own needs by adding more cache keys such as e.g. '(selected-frame)&#= 39;,
'(face-all-attributes 'default)', 'face-remapping-alist'= ;, ...

I right align text on my tab bar and also use multi= ple text scales on different frames.=C2=A0 IMO, customizing the cache funct= ion pushes too much of the cache (and string-pixel-width) implementation=C2= =A0details on users, and seems a likely source of confusion.
--000000000000ce63ae063bb09ef7-- From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 06 12:54:12 2025 Received: (at 79141) by debbugs.gnu.org; 6 Aug 2025 16:54:13 +0000 Received: from localhost ([127.0.0.1]:59919 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ujhP2-0000Xy-It for submit@debbugs.gnu.org; Wed, 06 Aug 2025 12:54:12 -0400 Received: from fout-b5-smtp.messagingengine.com ([202.12.124.148]:50781) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ujhOz-0000Xj-Pi for 79141@debbugs.gnu.org; Wed, 06 Aug 2025 12:54:10 -0400 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfout.stl.internal (Postfix) with ESMTP id BB6E51D00081; Wed, 6 Aug 2025 12:54:03 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-02.internal (MEProxy); Wed, 06 Aug 2025 12:54:03 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stebalien.com; h=cc:cc:content-type:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1754499243; x= 1754585643; bh=saRyFllVC5nT26ksc+XGiATdU9Qx2LWzCYKpO38c00U=; b=P CD4BuWMpZLUqFKrEOp5itaodJ6DDQL6W4SDQI0RLMBLpZn6AxXCTgsIMcjmT/tSh TtVh+5tL3uXKOYjTGgzVLL1GtiMoz6fTf1BYc9RoWFRD3n5OewpCmMLgFtEtDuq2 VBLlPW+plw09Rth0pEbwCouiy/wAnszUJMtRFPvw+oBtAULZII0LD1AfzFh3KqfG 0FID8fmBceH59pq+0rUNX1mPMmahqF78VuMpUZlcm4NgbpDjJTK1cmHLR7JIlM8I h1fKQnbr+FwVhuD4KXoko8DAuVmZ6+Jt7bdAumyXrS/YyQffpLg8LkQdoMf9HiSr TE8AU60LpnE7b3x8cUMhA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1754499243; x=1754585643; bh=saRyFllVC5nT26ksc+XGiATdU9Qx2LWzCYK pO38c00U=; b=fIAUtpY2qFJpMCje4+kQ9wt6+/o0fvCjJPsn/yS7cO7RGb6odXr cW7gC5FVUflabyCtlUi5p6prlXKi5hu4d/1SJ0YKH2BCzKbDURJNomIj48AcPu1w 2HDz9te95dc1AoMyu3y5cA76jjv24Mc5J5IvKOD88FnhRHGfTPDFPj7NreKMoYCk hquGPLTIvz+V0RF+qtzCpyFmhUXw0RnBfS+UIdvs/1KFEU/ICQ/royCn+Atbd9Kl 7QSeg8RNDt18GH+AqiBqFA7xiOE/QXCcCqHFqAEKczOJoY3N7YVFeuPeGAKUXGNb 1KS5qevSd8Io+B4sodwEx3GvToM8rs0wCFw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdduudekheekucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefujghffffkgggtsehttdertddttddtnecuhfhrohhmpefuthgvvhgvnhcu tehllhgvnhcuoehsthgvvhgvnhesshhtvggsrghlihgvnhdrtghomheqnecuggftrfgrth htvghrnhepvdekheekgeelheehgefgudelkeethffhgfeuffetkeegtddvfeduuddttdej jedvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepsh htvghvvghnsehsthgvsggrlhhivghnrdgtohhmpdhnsggprhgtphhtthhopeefpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehjuhhriheslhhinhhkohhvrdhnvghtpdhrtg hpthhtohepmhgrihhlsegurghnihgvlhdqmhgvnhgulhgvrhdruggvpdhrtghpthhtohep jeeludegudesuggvsggsuhhgshdrghhnuhdrohhrgh X-ME-Proxy: Feedback-ID: ie8a146a7:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 6 Aug 2025 12:54:02 -0400 (EDT) From: Steven Allen To: Juri Linkov Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <87fre5d5qz.fsf@mail.linkov.net> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> Date: Wed, 06 Aug 2025 09:32:19 -0700 Message-ID: <871ppoh0mk.fsf@stebalien.com> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Daniel Mendler , 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Juri Linkov writes: > Instead of reverting the change maybe it would be better to add > a customizable cache function that anyone could change to adapt caching > to own needs by adding more cache keys such as e.g. '(selected-frame)', > '(face-all-attributes 'default)', 'face-remapping-alist', ... That's going to lead to a very poor user experience; we can't reasonably ask users just "figure it out". I'd be less concerned if this were just a weird edge-case, but causes issues with `global-text-scale-adjust'. I've looked into what it would take to make a bug-free cache without modifying Emacs core and/or advice, and it's not simple. You'd need to use `object-intervals' to extract all the face properties, then parse the face properties to extract the faces (both inline faces and named faces), then use face-all-attributes to extract the attributes. At that point, you might as well just recompute the width. If modifying Emacs core is on the table, the simplest solution I can think of is to: 1. Have a per-frame cache. 2. Update a global `face-modification-tick' (similar to `buffer-modification-tick') whenever faces are updated, invalidating the cache whenever this changes. Unfortunately, that second part would likely require modifying `internal-set-lisp-face-attribute' (in C) and it feels kind of icky. On the other hand, having the ability to detect that faces have changed _is_ kind of useful. From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 06 13:37:49 2025 Received: (at 79141) by debbugs.gnu.org; 6 Aug 2025 17:37:49 +0000 Received: from localhost ([127.0.0.1]:59987 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1uji5F-0002Xs-1I for submit@debbugs.gnu.org; Wed, 06 Aug 2025 13:37:49 -0400 Received: from server.qxqx.de ([2a01:4f8:c012:9177::1]:48817 helo=mail.qxqx.de) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1uji5C-0002Xb-0e for 79141@debbugs.gnu.org; Wed, 06 Aug 2025 13:37:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=daniel-mendler.de; s=key; h=Content-Type:MIME-Version:Message-ID:Date: References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=q7o56CbuDCdP+NxNCTJWMNpP5eIJQcnF5GFzO4I2eVo=; b=jiDzZJ29tp5lHAbUhxfsgIM4Af UwCyJeHyJpsPWhfUd8q0Om2SASzPiIxtv5xkBkTRX1qZVpEIgSPTJoiRhhhQW7TlO9lPwM7vpmTud byPj76ZEcQbgGa1C3zd82iiZJ+TlfXFl085Id1S7t4Qax5ui8l2KwVfnMbCSaLTuyqds=; From: Daniel Mendler To: Steven Allen Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <871ppoh0mk.fsf@stebalien.com> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> Date: Wed, 06 Aug 2025 19:37:37 +0200 Message-ID: <87zfcctkpq.fsf@daniel-mendler.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: 79141@debbugs.gnu.org, Juri Linkov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Steven Allen writes: > Juri Linkov writes: >> Instead of reverting the change maybe it would be better to add >> a customizable cache function that anyone could change to adapt caching >> to own needs by adding more cache keys such as e.g. '(selected-frame)', >> '(face-all-attributes 'default)', 'face-remapping-alist', ... > > That's going to lead to a very poor user experience; we can't reasonably > ask users just "figure it out". I'd be less concerned if this were just > a weird edge-case, but causes issues with `global-text-scale-adjust'. > > I've looked into what it would take to make a bug-free cache without > modifying Emacs core and/or advice, and it's not simple. You'd need to > use `object-intervals' to extract all the face properties, then parse > the face properties to extract the faces (both inline faces and named > faces), then use face-all-attributes to extract the attributes. At that > point, you might as well just recompute the width. A simpler solution, which might cover most scenarios, would be to only compute the default line pixel height or pixel height of the tab-bar face and use that together with the propertized string as the frame-local cache key. > If modifying Emacs core is on the table, the simplest solution I can > think of is to: > > 1. Have a per-frame cache. > 2. Update a global `face-modification-tick' (similar to > `buffer-modification-tick') whenever faces are updated, invalidating the > cache whenever this changes. A face-modification-tick or hook sounds like a great idea, independent of the problem here. I'd imagine there are plenty of other use cases, which right now require ugly hacks or potentially expensive recomputations. > Unfortunately, that second part would likely require modifying > `internal-set-lisp-face-attribute' (in C) and it feels kind of icky. On > the other hand, having the ability to detect that faces have changed > _is_ kind of useful. Daniel From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 06 15:25:18 2025 Received: (at 79141) by debbugs.gnu.org; 6 Aug 2025 19:25:18 +0000 Received: from localhost ([127.0.0.1]:60272 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ujjlG-0007Ui-5U for submit@debbugs.gnu.org; Wed, 06 Aug 2025 15:25:18 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:37034) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ujjlC-0007Sq-Nl for 79141@debbugs.gnu.org; Wed, 06 Aug 2025 15:25:15 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ujjl3-0008Rq-Aw; Wed, 06 Aug 2025 15:25:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=asb6XqN+yZjIu+vnGE1l5Ywwfsp1ZYjo4zYm+bW0/Tg=; b=UFQhnvuKjf6/ UA/arQAIr8C75XoXYOTp6w5KoEeNvj0Djx8AYN3mecxhluG9UMjRk55aJ7XF/atalnHd5aOuMIgux TRuR9W4V3NbKGc4MjG03fwdB5PASIB0LjkBUP+Kg6hrt/KLqh61RxboZiHmb3Ymc/soNb+0O7lL0q 1rZQtQFkGveMXZZCbfYT3OA7Dl5wk5mv8pOZBDTluf7awWH1OAd0SyWy7sOaBPi8MvXHB8IF3e40z 0yDDYq1b/S5VYjMoNoMlWdGDxiqpdG51uwi7LJfMktbYcM8PItSPOUWXETdJJMGr0V7SVslMDiEJn 8j6/uMgpsc4Kq0gDtaA2tw==; Date: Wed, 06 Aug 2025 22:25:03 +0300 Message-Id: <86ectos168.fsf@gnu.org> From: Eli Zaretskii To: Steven Allen In-Reply-To: <871ppoh0mk.fsf@stebalien.com> (bug-gnu-emacs@gnu.org) Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 79141 Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org, juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Cc: Daniel Mendler , 79141@debbugs.gnu.org > Date: Wed, 06 Aug 2025 09:32:19 -0700 > From: Steven Allen via "Bug reports for GNU Emacs, > the Swiss army knife of text editors" > > If modifying Emacs core is on the table, the simplest solution I can > think of is to: > > 1. Have a per-frame cache. > 2. Update a global `face-modification-tick' (similar to > `buffer-modification-tick') whenever faces are updated, invalidating the > cache whenever this changes. Please be advised that the current code invalidates the frame's face cache and frees all the faces whenever some face is changed. That's because we don't currently track face dependencies, and so have no idea what other faces will change as result of changing some face. So if you want a more efficient face cache, you first need to solve this dependency-tracking issue. From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 06 15:48:07 2025 Received: (at 79141) by debbugs.gnu.org; 6 Aug 2025 19:48:07 +0000 Received: from localhost ([127.0.0.1]:60326 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ujk7L-0000Ch-ES for submit@debbugs.gnu.org; Wed, 06 Aug 2025 15:48:07 -0400 Received: from server.qxqx.de ([2a01:4f8:c012:9177::1]:42273 helo=mail.qxqx.de) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ujk7J-0000C3-2B for 79141@debbugs.gnu.org; Wed, 06 Aug 2025 15:48:06 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=daniel-mendler.de; s=key; h=Content-Type:MIME-Version:Message-ID:Date: References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=aBTaJx4t/dSu0xjCtE4IIgSIH67Mvx9zIsYiLu2tkCo=; b=NXHx7vYnB1nVjJoX/5mWJ2ZC+N zu7Ixrw2Y8u+ZSdmaMXFdnqbeIdvob+5oWDMaFolxXQc4E/T45Bd9uSVHy/XZMwZBSvpe7NsNjkTb qxALDDv6RJnFqaXxUYxUiiMtfqeLGPyCWvHscdjH9Mn0cBpLK6D1Awo0lLRiy4nFsgb4=; From: Daniel Mendler To: Eli Zaretskii Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <86ectos168.fsf@gnu.org> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> Date: Wed, 06 Aug 2025 21:47:57 +0200 Message-ID: <87sei4ut8y.fsf@daniel-mendler.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: 79141@debbugs.gnu.org, Steven Allen , juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Eli Zaretskii writes: >> Cc: Daniel Mendler , 79141@debbugs.gnu.org >> Date: Wed, 06 Aug 2025 09:32:19 -0700 >> From: Steven Allen via "Bug reports for GNU Emacs, >> the Swiss army knife of text editors" >> >> If modifying Emacs core is on the table, the simplest solution I can >> think of is to: >> >> 1. Have a per-frame cache. >> 2. Update a global `face-modification-tick' (similar to >> `buffer-modification-tick') whenever faces are updated, invalidating the >> cache whenever this changes. > > Please be advised that the current code invalidates the frame's face > cache and frees all the faces whenever some face is changed. That's > because we don't currently track face dependencies, and so have no > idea what other faces will change as result of changing some face. So > if you want a more efficient face cache, you first need to solve this > dependency-tracking issue. Couldn't this face cache invalidation logic be used here? Whenever such a face cache invalidation happens, the proposed `face-modification-tick' variable would be incremented. Daniel From debbugs-submit-bounces@debbugs.gnu.org Thu Aug 07 00:42:52 2025 Received: (at 79141) by debbugs.gnu.org; 7 Aug 2025 04:42:52 +0000 Received: from localhost ([127.0.0.1]:32908 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ujsSq-0003gu-7U for submit@debbugs.gnu.org; Thu, 07 Aug 2025 00:42:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35668) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ujsSl-0003gc-9P for 79141@debbugs.gnu.org; Thu, 07 Aug 2025 00:42:49 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ujsSd-00046Z-BO; Thu, 07 Aug 2025 00:42:39 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=dxXtptwUdpNXACA0iWzV5L0k1yLcqqn7X2sQfUEljwc=; b=hN9IYwAUiuRJ o7HWeoa7BmymCB3qtmMLLrmmH6OCrQdPyGLwekTutWegwduH6pz8GwnaHnkX2q/PLwz0Sd//KarVN tPE+ltMV866/DyRZnTZxNutNkNFHND6+tm2kyrEi5S58zAgrIf8oF2Y4q4NMu0G9AnIEeS086h/hE WJ4LZXPmJUbu0keyu1aMM6lnhKZArO1FLEU8vI7CKmBK4fQYo4qn+ucMbnegIw6x8n8KL0KNXLpwo 0iEj/uF/+KBZrAjFrGWKeBh7FdiPimIdztiw+II6eU99b8neOE+Wc0e4JDnHC2bo6aOaF725gjcoL k9KuR3j0j9tI/vkED1/Nww==; Date: Thu, 07 Aug 2025 07:42:34 +0300 Message-Id: <868qjvspxh.fsf@gnu.org> From: Eli Zaretskii To: Daniel Mendler In-Reply-To: <87sei4ut8y.fsf@daniel-mendler.de> (message from Daniel Mendler on Wed, 06 Aug 2025 21:47:57 +0200) Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 79141 Cc: 79141@debbugs.gnu.org, steven@stebalien.com, juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Daniel Mendler > Cc: Steven Allen , juri@linkov.net, > 79141@debbugs.gnu.org > Date: Wed, 06 Aug 2025 21:47:57 +0200 > > Eli Zaretskii writes: > > >> 1. Have a per-frame cache. > >> 2. Update a global `face-modification-tick' (similar to > >> `buffer-modification-tick') whenever faces are updated, invalidating the > >> cache whenever this changes. > > > > Please be advised that the current code invalidates the frame's face > > cache and frees all the faces whenever some face is changed. That's > > because we don't currently track face dependencies, and so have no > > idea what other faces will change as result of changing some face. So > > if you want a more efficient face cache, you first need to solve this > > dependency-tracking issue. > > Couldn't this face cache invalidation logic be used here? Whenever such > a face cache invalidation happens, the proposed `face-modification-tick' > variable would be incremented. I don't quite understand what would that tick be used for, but we already have in Emacs indications that the face cache was invalidated, so maybe there's no need for introducing that tick. From debbugs-submit-bounces@debbugs.gnu.org Sun Aug 10 15:03:58 2025 Received: (at 79141) by debbugs.gnu.org; 10 Aug 2025 19:03:58 +0000 Received: from localhost ([127.0.0.1]:45970 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ulBKn-0007mf-Sh for submit@debbugs.gnu.org; Sun, 10 Aug 2025 15:03:58 -0400 Received: from mout-p-103.mailbox.org ([80.241.56.161]:52486) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ulBKh-0007lu-7r for 79141@debbugs.gnu.org; Sun, 10 Aug 2025 15:03:53 -0400 Received: from smtp102.mailbox.org (smtp102.mailbox.org [10.196.197.102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-103.mailbox.org (Postfix) with ESMTPS id 4c0Rxq3rhVz9smF; Sun, 10 Aug 2025 21:03:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; t=1754852623; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=s1hb18d6zXCL1vc2Q39k5DIAs71wMFt3gPjpu1ou0ZQ=; b=xgmzhfD3y+O/DC9bZOmbi1UPq053QKloFcSyG2hHD75OVMyP41q/yxLLoOZZgLik/Frd7J vKYaH8hMbm3AyimOJ5Cvv/SFbwfpeJkX/2CArHhpmXAKJ/+aqzlojEhWPaO9Rxfv+WBVUQ 9DkCBw+xMV5qdoj7+dYYv6qTe6r7EwErAujCjpGP4NLkJFVTXPRuJoabMWs3ABigK6Cd3O FUU4y6rzfQ006c0Bn3yn4XHZKrDhz61nReXCu9pUFr4x+1UyEtCvgpqqalNsXDq2tV6tIk HMf5FLmJV9ysHTlECMfZytgEgF/Hf+toRMwshGWkaGXfGsT6083h5T1msrpTVg== From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <868qjvspxh.fsf@gnu.org> Organization: LINKOV.NET References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> Date: Sun, 10 Aug 2025 21:52:32 +0300 Message-ID: <87wm7b3sqf.fsf@mail.linkov.net> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Daniel Mendler , steven@stebalien.com, 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> >> 1. Have a per-frame cache. >> >> 2. Update a global `face-modification-tick' (similar to >> >> `buffer-modification-tick') whenever faces are updated, invalidating the >> >> cache whenever this changes. >> > >> > Please be advised that the current code invalidates the frame's face >> > cache and frees all the faces whenever some face is changed. That's >> > because we don't currently track face dependencies, and so have no >> > idea what other faces will change as result of changing some face. So >> > if you want a more efficient face cache, you first need to solve this >> > dependency-tracking issue. >> >> Couldn't this face cache invalidation logic be used here? Whenever such >> a face cache invalidation happens, the proposed `face-modification-tick' >> variable would be incremented. > > I don't quite understand what would that tick be used for, but we > already have in Emacs indications that the face cache was invalidated, > so maybe there's no need for introducing that tick. Are these indications exposed to Lisp? From debbugs-submit-bounces@debbugs.gnu.org Mon Aug 11 08:19:53 2025 Received: (at 79141) by debbugs.gnu.org; 11 Aug 2025 12:19:54 +0000 Received: from localhost ([127.0.0.1]:47416 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ulRVJ-0003GF-Dn for submit@debbugs.gnu.org; Mon, 11 Aug 2025 08:19:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:52560) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ulRVE-0003Fw-8F for 79141@debbugs.gnu.org; Mon, 11 Aug 2025 08:19:49 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ulRV5-0005wq-UQ; Mon, 11 Aug 2025 08:19:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=6+2DsinPiBstPZ7K47+V9evi8Cc1heCE+vJ6JILMi4Q=; b=J0FPnKhL+wxj 5i0+M6GHhpe3HK7QJXw8d7eGf/E8hydtaF8VobOkwpFuQAFnsRU54Ba2iqGY5ky8PXzsuVmV2WXog /j4H3LfnqkLVkG+hJ6Gx2wKcTsuZKPe+C+wEclVU/MGZ/pXpI3iRw5JhGtDkStYlnwxJfe+lL+f+H eP9ZHrVaLnGhYvm/V76fQ/BWj9vIF+SCtdrFE6gtazCPANi5uhifxSEY+k+Hxp6wzZo3by0zKPYtQ NN5VUaegzA1TXZGiM8qdBcK8pz5uw69VG0pQlFFiXi6uTAtZQSm3ne5v/Y+aOwf4BRgJOq7EkrPas /mvSxH7vDgixOQfk3y9z3w==; Date: Mon, 11 Aug 2025 15:19:35 +0300 Message-Id: <86ldnqaw4o.fsf@gnu.org> From: Eli Zaretskii To: Juri Linkov In-Reply-To: <87wm7b3sqf.fsf@mail.linkov.net> (message from Juri Linkov on Sun, 10 Aug 2025 21:52:32 +0300) Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 79141 Cc: mail@daniel-mendler.de, steven@stebalien.com, 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Juri Linkov > Cc: Daniel Mendler , steven@stebalien.com, > 79141@debbugs.gnu.org > Date: Sun, 10 Aug 2025 21:52:32 +0300 > > >> >> 1. Have a per-frame cache. > >> >> 2. Update a global `face-modification-tick' (similar to > >> >> `buffer-modification-tick') whenever faces are updated, invalidating the > >> >> cache whenever this changes. > >> > > >> > Please be advised that the current code invalidates the frame's face > >> > cache and frees all the faces whenever some face is changed. That's > >> > because we don't currently track face dependencies, and so have no > >> > idea what other faces will change as result of changing some face. So > >> > if you want a more efficient face cache, you first need to solve this > >> > dependency-tracking issue. > >> > >> Couldn't this face cache invalidation logic be used here? Whenever such > >> a face cache invalidation happens, the proposed `face-modification-tick' > >> variable would be incremented. > > > > I don't quite understand what would that tick be used for, but we > > already have in Emacs indications that the face cache was invalidated, > > so maybe there's no need for introducing that tick. > > Are these indications exposed to Lisp? No. Faces are generally managed in C, not in Lisp. But like I said: I don't have a clear idea what should the proposed modification hook be used for, so I'm not sure whether we need to expose anything to Lisp. If you or someone else could describe the proposed use of such a tick, I could try providing a more useful advice. From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 12 13:52:20 2025 Received: (at 79141) by debbugs.gnu.org; 12 Aug 2025 17:52:20 +0000 Received: from localhost ([127.0.0.1]:54692 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ultAZ-00009F-HV for submit@debbugs.gnu.org; Tue, 12 Aug 2025 13:52:19 -0400 Received: from mout-p-102.mailbox.org ([80.241.56.152]:34786) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ultAR-00008X-PI; Tue, 12 Aug 2025 13:52:15 -0400 Received: from smtp1.mailbox.org (smtp1.mailbox.org [10.196.197.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-102.mailbox.org (Postfix) with ESMTPS id 4c1fG96l0yz9v6M; Tue, 12 Aug 2025 19:52:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; t=1755021122; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=VE1KYdx5QzoT2QF/AbRSNkxn3QTaw05gclK+vcz/u+I=; b=JLfZ8SLKXqQTnO6pqdTRq9yIVt2xjK+EJPtj1C3jEUYxYgpy70H8+kVy08EMWV59zRs/Iu XFg9QIN0JMitKgaZt7qHiE3HPGRdhr8T324aKcsSJZiAa7LCqsI9MDn8atL1zddksQWqY0 PcOOj5eOmyhK/D3qDKfpxkhohXw50ubc+XccwV1RnxEPEBGG3KDAc+A/qpDsIQISmJrzfE dyvm6MNVXR7AVX1yjjvqxQStvt6mbj1Jv1jh15NFh/qYWnSTxlqmpzDpGKLO3hMBIX0jQQ YNMMnphoccR1epGcb2tAMM0eI9YmUMcCabxc4JO/SNRNFerLsLcx48KpXNuq8w== From: Juri Linkov To: Eli Zaretskii Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <86ldnqaw4o.fsf@gnu.org> Organization: LINKOV.NET References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> Date: Tue, 12 Aug 2025 20:49:20 +0300 Message-ID: <871ppgh1lr.fsf@mail.linkov.net> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: mail@daniel-mendler.de, steven@stebalien.com, 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) close 79141 31.0.50 quit > I don't have a clear idea what should the proposed modification hook be > used for, so I'm not sure whether we need to expose anything to Lisp. > If you or someone else could describe the proposed use of such a tick, > I could try providing a more useful advice. Since no one has an idea how to use such a tick, I had to revert the last change. Anyone who needs a (possibly unreliable) caching version, it's easy to create a copy of the existing 'tab-bar-format-align-right', add caching to it, and use in 'tab-bar-format'. From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 12 14:02:59 2025 Received: (at 79141) by debbugs.gnu.org; 12 Aug 2025 18:03:00 +0000 Received: from localhost ([127.0.0.1]:54718 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ultKs-0003UA-TV for submit@debbugs.gnu.org; Tue, 12 Aug 2025 14:02:59 -0400 Received: from server.qxqx.de ([2a01:4f8:c012:9177::1]:43493 helo=mail.qxqx.de) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ultKi-0003Th-UC for 79141@debbugs.gnu.org; Tue, 12 Aug 2025 14:02:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=daniel-mendler.de; s=key; h=Content-Type:MIME-Version:Message-ID:Date: References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=VibkIn9F3UIECTExupv2TW+TnOU3aEGLS/lwgaXJx5Y=; b=tJK6EmfPh3Tyo868i+NODHKcY4 PmPiTvGcqm03Pbj0I2QXNt4W2iuPKd9vKZEXc7JgrMiYn5EBlycN8ETTYHt6fUCxAKOtV0WnIVl4V MF/mlGqP6XybZKy+ne4iA27wmXV5CBZQcRu78i7OPDcnv44F6+cGE1x8riAPbkOeWmeA=; From: Daniel Mendler To: Juri Linkov Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <871ppgh1lr.fsf@mail.linkov.net> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> Date: Tue, 12 Aug 2025 20:02:41 +0200 Message-ID: <87sehwcta6.fsf@daniel-mendler.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Eli Zaretskii , steven@stebalien.com, 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Juri Linkov writes: > close 79141 31.0.50 > quit > >> I don't have a clear idea what should the proposed modification hook be >> used for, so I'm not sure whether we need to expose anything to Lisp. >> If you or someone else could describe the proposed use of such a tick, >> I could try providing a more useful advice. > > Since no one has an idea how to use such a tick, > I had to revert the last change. To me the idea seemed clear. Expose a face change tick variable, which is incremented when the face cache is flushed. Assuming that the face cache logic is valid, the tick would be usable to monitor face changes. > Anyone who needs a (possibly unreliable) caching version, it's easy > to create a copy of the existing 'tab-bar-format-align-right', > add caching to it, and use in 'tab-bar-format'. Indeed, this is what I had before. From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 12 14:07:25 2025 Received: (at 79141) by debbugs.gnu.org; 12 Aug 2025 18:07:25 +0000 Received: from localhost ([127.0.0.1]:54732 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ultPA-0003hg-M9 for submit@debbugs.gnu.org; Tue, 12 Aug 2025 14:07:25 -0400 Received: from fhigh-a4-smtp.messagingengine.com ([103.168.172.155]:41329) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ultP4-0003hJ-Fl for 79141@debbugs.gnu.org; Tue, 12 Aug 2025 14:07:20 -0400 Received: from phl-compute-09.internal (phl-compute-09.internal [10.202.2.49]) by mailfhigh.phl.internal (Postfix) with ESMTP id EEF0B14000D2; Tue, 12 Aug 2025 14:07:12 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-09.internal (MEProxy); Tue, 12 Aug 2025 14:07:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stebalien.com; h=cc:cc:content-type:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1755022032; x= 1755108432; bh=a7v6PwcCPJDg79ICWlPUeqWlVllpQe5IV//3iNWR01c=; b=C 6TC8NAZVVoa37Pi7TcX5BtU4vuDCGYJIwkdF7bgokV65PyISjq42gQEgB8kVe1H4 I1R+kSXfzDw94491G9T3ANyj1srzC09Hks2BcgqBSwSRyACAGmr5Ww39BvAUWnsX o44R4HeC/lK/b/s7iyA8arbjHSQV2Llb6Bqjq+XxBI4ue6sltI4YRiiGsQyYWHxW hJ84toGdV4xzkhej3F0YhvPQZi6MdiGuB7w7z2nmat8KPwfRjFITl51VNFHeKgMX zkyMDWa0vBU1FjGNNU0ExNSBqEVX/zqu7C7fuclAsSd6//b3iOZ27o1YVztZLncK bGAsiirHYTUQuO5vaOSVA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1755022032; x=1755108432; bh=a7v6PwcCPJDg79ICWlPUeqWlVllpQe5IV// 3iNWR01c=; b=U10ibGlfgaCfo1f1pMhjfS8KbZvoEZlWHogROsD0kU0zjhSquti ge4vZpn2wEytnWF1vq1cOpI2yAhuZGoIxXGbRknJof4X9TMtQqgXV5nYzdpyAv6Z JWj6dNp74CVAYVlqv5ZDMKiG2trJA6E4Ybo6jbbd35ElNGvmh0vvRyn4YQddLgLx AIMWnvFilI50re0zDa/viSnnSgrxfIo9IVjyq8nIMg0JoowjC3QirFNmY/pPxdm0 SdXb3pa4tZWTVzt1P5ROcqdMWBKGvfbxjxeKp7BOdA3v/yi4BrFhEbk3fzlJlTXz wp0Prh56hIqXgp41HANikWXIwlzNYn317SQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgddufeeitdduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefujghffffkgggtsehttdertddttddtnecuhfhrohhmpefuthgvvhgvnhcu tehllhgvnhcuoehsthgvvhgvnhesshhtvggsrghlihgvnhdrtghomheqnecuggftrfgrth htvghrnhepvdekheekgeelheehgefgudelkeethffhgfeuffetkeegtddvfeduuddttdej jedvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepsh htvghvvghnsehsthgvsggrlhhivghnrdgtohhmpdhnsggprhgtphhtthhopeegpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehjuhhriheslhhinhhkohhvrdhnvghtpdhrtg hpthhtohepvghlihiisehgnhhurdhorhhgpdhrtghpthhtohepmhgrihhlsegurghnihgv lhdqmhgvnhgulhgvrhdruggvpdhrtghpthhtohepjeeludegudesuggvsggsuhhgshdrgh hnuhdrohhrgh X-ME-Proxy: Feedback-ID: ie8a146a7:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 12 Aug 2025 14:07:11 -0400 (EDT) From: Steven Allen To: Juri Linkov , Eli Zaretskii Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <871ppgh1lr.fsf@mail.linkov.net> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> Date: Tue, 12 Aug 2025 11:07:08 -0700 Message-ID: <87jz38h0s3.fsf@stebalien.com> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Juri Linkov writes: > close 79141 31.0.50 > quit > >> I don't have a clear idea what should the proposed modification hook be >> used for, so I'm not sure whether we need to expose anything to Lisp. >> If you or someone else could describe the proposed use of such a tick, >> I could try providing a more useful advice. > > Since no one has an idea how to use such a tick, > I had to revert the last change. > > Anyone who needs a (possibly unreliable) caching version, it's easy > to create a copy of the existing 'tab-bar-format-align-right', > add caching to it, and use in 'tab-bar-format'. I can describe it in this case, at least: 1. Any time any face attribute is updated, the "tick" would be incremented. 2. We'd change `tab-bar--align-right-cache' to be (cached-tick . cached-string). 3. When checking the cache, we'd check if (new-tick . new-string) is `equal-including-properties' to (cached-tick . cached-string). IMO, the real question is: where else would/could we use this. Adding a new `face-modification-tick' just to support this one cache seems a bit overkill. From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 12 14:14:48 2025 Received: (at 79141) by debbugs.gnu.org; 12 Aug 2025 18:14:48 +0000 Received: from localhost ([127.0.0.1]:54750 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ultWJ-00041T-Oh for submit@debbugs.gnu.org; Tue, 12 Aug 2025 14:14:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:57286) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ultWF-00041B-4r for 79141@debbugs.gnu.org; Tue, 12 Aug 2025 14:14:44 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ultW8-0001lZ-CG; Tue, 12 Aug 2025 14:14:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=a9tlgJe94Y1NR+OYKFoSigurGI55CM4O10tUXVqACdI=; b=Pr0bvLQKEloT H9B6e6h4npF9ROC5a58waTaQp0EogrEsjy7CIKE5RDJcJmUtJK/4Wfm74gF8a24xZ2SKdLyShPlOp LqXE9WLhXCkgcQbOxoCZuxSEOuyg7BZ68uviQBYaTl+dJtC9Dcv0P6AVQ5cHuYfPmrv2e9u9mv/iw ymqiG/8UU3T6+QEFfmIDsGMP60cgqGQhPMwtd5eBJ6PMiE50OxI2bGenPTkYLpDmG3cPzKSKd0m2i 8rYMC9CTrF/Mxbb1qOJHLg59NoK8yLF8DgJPq3mDLoPhgiQo65lA9Vr/Wu36I9wzBKIcRE1qn3RZ+ Uq1zjEj7sf39g9QoL6LWfA==; Date: Tue, 12 Aug 2025 21:14:32 +0300 Message-Id: <865xes9zlj.fsf@gnu.org> From: Eli Zaretskii To: Daniel Mendler In-Reply-To: <87sehwcta6.fsf@daniel-mendler.de> (message from Daniel Mendler on Tue, 12 Aug 2025 20:02:41 +0200) Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87sehwcta6.fsf@daniel-mendler.de> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 79141 Cc: 79141@debbugs.gnu.org, steven@stebalien.com, juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Daniel Mendler > Cc: Eli Zaretskii , steven@stebalien.com, 79141@debbugs.gnu.org > Date: Tue, 12 Aug 2025 20:02:41 +0200 > > Juri Linkov writes: > > > close 79141 31.0.50 > > quit > > > >> I don't have a clear idea what should the proposed modification hook be > >> used for, so I'm not sure whether we need to expose anything to Lisp. > >> If you or someone else could describe the proposed use of such a tick, > >> I could try providing a more useful advice. > > > > Since no one has an idea how to use such a tick, > > I had to revert the last change. > > To me the idea seemed clear. Expose a face change tick variable, which > is incremented when the face cache is flushed. Assuming that the face > cache logic is valid, the tick would be usable to monitor face changes. What would you do with this monitoring? IOW, how would you act when Emacs indicates that it recomputed all the faces on a frame? From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 12 14:18:23 2025 Received: (at 79141) by debbugs.gnu.org; 12 Aug 2025 18:18:23 +0000 Received: from localhost ([127.0.0.1]:54759 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ultZn-0004E0-3d for submit@debbugs.gnu.org; Tue, 12 Aug 2025 14:18:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53290) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ultZi-0004Dl-JL for 79141@debbugs.gnu.org; Tue, 12 Aug 2025 14:18:20 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ultZc-0002Dg-VF; Tue, 12 Aug 2025 14:18:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=0dgkHUlWQoplaLduWwn0Cj+aXxteZiYUJCS5lr/96So=; b=dFannX79qOBA Cgx1eyQcCCR5b+R+IMLTUsgO9PYUg33dlv4/7FUc/cUjkI3tdbeBAIPuQNX+CjkCqFLbnnDbFRQRw RvY/5Z6fqxsy7z3isUeFzOli0FonpqwQhzR++SK/J5/gFGLAmYpXmwtuwy5GH7IKkJZCt5vIY/1Mq qnG4y5QmCPp/5w5yWWoMtlbIM2k3UR87HQQODYmFaUlijDbedu5tuobsGu/tf2sEkyzwsnitOFfGC m9OtAewzJXnwy72yL0jjb634OYI/SYeOkdXvkpyMpmKkVNgVFudiFp854aSSDr31ww3fH2BIPmlWY rgFfY8ML/DmcOloADIbRcQ==; Date: Tue, 12 Aug 2025 21:18:07 +0300 Message-Id: <864iuc9zfk.fsf@gnu.org> From: Eli Zaretskii To: Steven Allen In-Reply-To: <87jz38h0s3.fsf@stebalien.com> (message from Steven Allen on Tue, 12 Aug 2025 11:07:08 -0700) Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 79141 Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org, juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Steven Allen > Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org > Date: Tue, 12 Aug 2025 11:07:08 -0700 > > > Anyone who needs a (possibly unreliable) caching version, it's easy > > to create a copy of the existing 'tab-bar-format-align-right', > > add caching to it, and use in 'tab-bar-format'. > > I can describe it in this case, at least: > > 1. Any time any face attribute is updated, the "tick" would be incremented. Why do you think it makes any sense to do that? When an attribute of any face is modified, Emacs discards and recomputes all the faces on that frame. How would the tick help you? From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 12 14:40:32 2025 Received: (at 79141) by debbugs.gnu.org; 12 Aug 2025 18:40:32 +0000 Received: from localhost ([127.0.0.1]:54800 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ultvD-0005Mv-FS for submit@debbugs.gnu.org; Tue, 12 Aug 2025 14:40:32 -0400 Received: from server.qxqx.de ([2a01:4f8:c012:9177::1]:33467 helo=mail.qxqx.de) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ultv7-0005MV-Kw for 79141@debbugs.gnu.org; Tue, 12 Aug 2025 14:40:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=daniel-mendler.de; s=key; h=Content-Type:MIME-Version:Message-ID:Date: References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=MWd9BNbJ22BUG3pLDzoCpSTmgxVReYcyTxvS9pconJY=; b=UVz30vJAg+6jDggyOkfkiK5Pmq St07qli/P5r8FN6hTW+NdDwnywzSCHfJHgXbhmWEUOUTxZGobW1BKJXqDdlE8p+d25B/SpJWiULjX 6YPPy41LS0A/QbrPvzRF1nv+wiIQ67VWR97j0ajIG2ZyjaUD3jJoCrqhW2FTBcq+/CPE=; From: Daniel Mendler To: Steven Allen Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <87jz38h0s3.fsf@stebalien.com> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> Date: Tue, 12 Aug 2025 20:40:13 +0200 Message-ID: <87frdwbcz6.fsf@daniel-mendler.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Eli Zaretskii , 79141@debbugs.gnu.org, Juri Linkov X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Steven Allen writes: > Juri Linkov writes: > >> close 79141 31.0.50 >> quit >> >>> I don't have a clear idea what should the proposed modification hook be >>> used for, so I'm not sure whether we need to expose anything to Lisp. >>> If you or someone else could describe the proposed use of such a tick, >>> I could try providing a more useful advice. >> >> Since no one has an idea how to use such a tick, >> I had to revert the last change. >> >> Anyone who needs a (possibly unreliable) caching version, it's easy >> to create a copy of the existing 'tab-bar-format-align-right', >> add caching to it, and use in 'tab-bar-format'. > > I can describe it in this case, at least: > > 1. Any time any face attribute is updated, the "tick" would be incremented. > 2. We'd change `tab-bar--align-right-cache' to be (cached-tick . cached-string). > 3. When checking the cache, we'd check if (new-tick . new-string) is > `equal-including-properties' to (cached-tick . cached-string). Yes, this is how I understood the proposal. > IMO, the real question is: where else would/could we use this. Adding a > new `face-modification-tick' just to support this one cache seems a bit overkill. Agree. Right now I don't have other good use case in mind, but I remember that I had some problems with face recomputation in my corfu and org-modern packages. However the face change tick might be too rough. I went back to my own pixel width caching for my system status bar. Maybe in this scenario the pixel width computation is particularly expensive since the tab elements to the right of tab-bar-format-align-right are long. During redisplay dominated loads, e.g. when doing pixel precise scrolling, the pixel width computation accounts for 5% or more of the runtime according to the profiler. With pixel caching the tab bar recomputation disappears from the profile. I have seen similar issues with expensive mode line elements. Daniel From debbugs-submit-bounces@debbugs.gnu.org Tue Aug 12 15:54:33 2025 Received: (at 79141) by debbugs.gnu.org; 12 Aug 2025 19:54:33 +0000 Received: from localhost ([127.0.0.1]:54994 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ulv4q-0000qe-NK for submit@debbugs.gnu.org; Tue, 12 Aug 2025 15:54:33 -0400 Received: from fhigh-a5-smtp.messagingengine.com ([103.168.172.156]:50531) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1ulv4l-0000qI-DF for 79141@debbugs.gnu.org; Tue, 12 Aug 2025 15:54:29 -0400 Received: from phl-compute-01.internal (phl-compute-01.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 67FBB14000F7; Tue, 12 Aug 2025 15:54:21 -0400 (EDT) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-01.internal (MEProxy); Tue, 12 Aug 2025 15:54:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stebalien.com; h=cc:cc:content-type:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1755028461; x= 1755114861; bh=0jAqudlZFB7M7DMyQr4EIFLcxbCVoTgA0lxNwm369j4=; b=O k4v8SlfBtjNaIb32Iq9M7t8V2btrnBLInQeMtqUftTXa8l5iI83xgyzozn6Mr66H ztvlmy3p4Ty5EaRf6yI3i/9HRZEiN0/BCudzdjHg7hEOla5zrqcsaHhjN5+xhEhe UkZLKX0X/N2bl8rHQwRth/sbIXrGrKFpP/U7H6BRqCOy2fks9uDg3FF3X/CR/ySB jPu0DkkVkEh4Ag72APJN/udyIH4a/lOMrCp1dKWQyI8e8mJV6o6u8Sg8WD8abZP9 EM46czm4v4LPlzvFGsjrIyIZntdC2HgiB4ZD9vTdX5ttajR0APPD2DmUlGp57+1j 7lFXv/6vSAPacjGSFgNRg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1755028461; x=1755114861; bh=0jAqudlZFB7M7DMyQr4EIFLcxbCVoTgA0lx Nwm369j4=; b=SF6jvByNDhqoAJ0iDqSIh9rXDlPqt0oFtS1qwfJBDiVv5U6Kh+P 2HflH5F9fgnPk198CXJDcYJ4eGIjgnNNNcPktGOat8AX65KR/UaU2NOmjQBJpFYL Su2Wyjrvt2oSJKD4MLh1We04ZRympuvK5lesPgHPW0NZ/hEAPuvscUHqrxL60WBn x8W46x2rl3Q4dLSZSeucqkTfw2boAT+T5Cq9Z9pn/aBtAXF0K8DygLlV9+UMDHrm zrCDBpN7mRPJh/TVHqQwbMZQPRQT6/eaMBPno5LKVBqAsFVpoagg5Q1XXseDqPle GYdxD11jJDzWUDDKkUA+BUWEWzwwxANxB6A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgddufeeivddvucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefujghffffkgggtsehttdertddttddtnecuhfhrohhmpefuthgvvhgvnhcu tehllhgvnhcuoehsthgvvhgvnhesshhtvggsrghlihgvnhdrtghomheqnecuggftrfgrth htvghrnhepvdekheekgeelheehgefgudelkeethffhgfeuffetkeegtddvfeduuddttdej jedvnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepsh htvghvvghnsehsthgvsggrlhhivghnrdgtohhmpdhnsggprhgtphhtthhopeegpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvlhhiiiesghhnuhdrohhrghdprhgtphhtth hopehjuhhriheslhhinhhkohhvrdhnvghtpdhrtghpthhtohepmhgrihhlsegurghnihgv lhdqmhgvnhgulhgvrhdruggvpdhrtghpthhtohepjeeludegudesuggvsggsuhhgshdrgh hnuhdrohhrgh X-ME-Proxy: Feedback-ID: ie8a146a7:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Tue, 12 Aug 2025 15:54:19 -0400 (EDT) From: Steven Allen To: Eli Zaretskii Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <864iuc9zfk.fsf@gnu.org> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <864iuc9zfk.fsf@gnu.org> Date: Tue, 12 Aug 2025 12:54:13 -0700 Message-ID: <87ikisuxi2.fsf@stebalien.com> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org, juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Eli Zaretskii writes: >> From: Steven Allen >> Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org >> Date: Tue, 12 Aug 2025 11:07:08 -0700 >> >> > Anyone who needs a (possibly unreliable) caching version, it's easy >> > to create a copy of the existing 'tab-bar-format-align-right', >> > add caching to it, and use in 'tab-bar-format'. >> >> I can describe it in this case, at least: >> >> 1. Any time any face attribute is updated, the "tick" would be incremented. > > Why do you think it makes any sense to do that? When an attribute of > any face is modified, Emacs discards and recomputes all the faces on > that frame. How would the tick help you? We're caching the pixel-width of the right-aligned tab-bar segment. The pixel-width of that segment depends on the faces used to display that segment; when those faces are modified, the width of that segment can change and there's currently no easy way to detect this situation. Adding a `face-modification-tick' would make it possible to detect when face attributes have changed, allowing us to invalidate the cached width. From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 13 02:50:00 2025 Received: (at 79141) by debbugs.gnu.org; 13 Aug 2025 06:50:01 +0000 Received: from localhost ([127.0.0.1]:56000 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1um5J9-00029C-Ly for submit@debbugs.gnu.org; Wed, 13 Aug 2025 02:50:00 -0400 Received: from mout-p-101.mailbox.org ([80.241.56.151]:58058) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1um5Ix-00028g-K6 for 79141@debbugs.gnu.org; Wed, 13 Aug 2025 02:49:53 -0400 Received: from smtp1.mailbox.org (smtp1.mailbox.org [IPv6:2001:67c:2050:b231:465::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4c1zWP1npXz9t76; Wed, 13 Aug 2025 08:49:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; t=1755067777; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=qEWE0JUuNei1fNjxXaMG371LfurTCcH+wBGhUnMpifE=; b=aXpMogoyFOCX6079XkyK64gMAUVIZrYa5BlKIwpMHv5i/1el107um4BcWZTTNcfX49FQRb IsWwvDwE0zwIoLxOaPp5evb2TgefY3x9JlUjWObkD9sfr0DI3CyYECnY5O1lYvRzrdsFZM l56carZat1qqfKDNupPtWGXpuSsV/hQ5RPeiKu8VrPKHmLAprPbfSZp/4G9BLGRhc8S4sn 60XglwGiGAGd8VWrzF7XAh5LSIyJwvK72nLqgJyH5RSOMV016ZPKeRdlYlqp8JBF13Dnkx 0puTWvk0gHIUYiNIXyDTK27ijCHMZbs5UyF8qYkUx3DT9QxMtvdzcNxGKOX4CQ== Authentication-Results: outgoing_mbo_mout; dkim=none; spf=pass (outgoing_mbo_mout: domain of juri@linkov.net designates 2001:67c:2050:b231:465::1 as permitted sender) smtp.mailfrom=juri@linkov.net From: Juri Linkov To: Daniel Mendler Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <87frdwbcz6.fsf@daniel-mendler.de> Organization: LINKOV.NET References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <87frdwbcz6.fsf@daniel-mendler.de> Date: Wed, 13 Aug 2025 09:49:02 +0300 Message-ID: <87349vu36p.fsf@mail.linkov.net> MIME-Version: 1.0 Content-Type: text/plain X-Rspamd-Queue-Id: 4c1zWP1npXz9t76 X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Eli Zaretskii , Steven Allen , 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) > I went back to my own pixel width caching for my system status bar. > Maybe in this scenario the pixel width computation is particularly > expensive since the tab elements to the right of > tab-bar-format-align-right are long. During redisplay dominated loads, > e.g. when doing pixel precise scrolling, the pixel width computation > accounts for 5% or more of the runtime according to the profiler. With > pixel caching the tab bar recomputation disappears from the profile. I > have seen similar issues with expensive mode line elements. How often your tab-bar is updated? For frequent string-pixel-width calls using debounce or throttle like from https://github.com/karthink/timeout could help. From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 13 02:55:00 2025 Received: (at 79141) by debbugs.gnu.org; 13 Aug 2025 06:55:00 +0000 Received: from localhost ([127.0.0.1]:56013 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1um5Nz-0002O7-9w for submit@debbugs.gnu.org; Wed, 13 Aug 2025 02:55:00 -0400 Received: from server.qxqx.de ([2a01:4f8:c012:9177::1]:44083 helo=mail.qxqx.de) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1um5No-0002Na-7K for 79141@debbugs.gnu.org; Wed, 13 Aug 2025 02:54:55 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=daniel-mendler.de; s=key; h=Content-Type:MIME-Version:Message-ID:Date: References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=iZrijIFXQ0Z8653SR8/d6MXy4WmiEYYegcySRhZbkmU=; b=LcM2gG1AM3WhohcZFU/eVLN0Q5 TxoT3Ln7h7OZNyCj23HX5CjZoxONAxFQIwKoJQXo54YMEWN8d1BJATUc7QdytB87uDCLSpKxP+Ca7 S7Ul9kpASzZNoSGYLb2ruHAO2a+I5ptRF8rVnAQCDc3BSgs37MXCZNFsfN66uwmnGVHY=; From: Daniel Mendler To: Juri Linkov Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <87349vu36p.fsf@mail.linkov.net> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <87frdwbcz6.fsf@daniel-mendler.de> <87349vu36p.fsf@mail.linkov.net> Date: Wed, 13 Aug 2025 08:54:40 +0200 Message-ID: <87frdvk8y7.fsf@daniel-mendler.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Eli Zaretskii , Steven Allen , 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Juri Linkov writes: >> I went back to my own pixel width caching for my system status bar. >> Maybe in this scenario the pixel width computation is particularly >> expensive since the tab elements to the right of >> tab-bar-format-align-right are long. During redisplay dominated loads, >> e.g. when doing pixel precise scrolling, the pixel width computation >> accounts for 5% or more of the runtime according to the profiler. With >> pixel caching the tab bar recomputation disappears from the profile. I >> have seen similar issues with expensive mode line elements. > > How often your tab-bar is updated? For frequent string-pixel-width calls > using debounce or throttle like from https://github.com/karthink/timeout > could help. It is recomputed completely on every redisplay. It might be possible to throttle the tab bar recomputation, such that it happens only a few times per second. This will lead to other difficulties however, since in some cases the tab bar should react immediately (e.g., when creating new tabs or when toggling some elements). Daniel From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 13 07:19:35 2025 Received: (at 79141) by debbugs.gnu.org; 13 Aug 2025 11:19:35 +0000 Received: from localhost ([127.0.0.1]:56528 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1um9W3-0007QF-4p for submit@debbugs.gnu.org; Wed, 13 Aug 2025 07:19:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47008) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1um9Vz-0007Py-EO for 79141@debbugs.gnu.org; Wed, 13 Aug 2025 07:19:32 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1um9Vs-0006fO-E5; Wed, 13 Aug 2025 07:19:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=tuwY+kLNgFhVSahOfYQF9u/8PM9OycO78KFuu8wXyVA=; b=NEM8iU0ZwQQl RTH5u2FdzDjZx6MhxLX3Wr9LZNif9P2MP4syMJX4KJsOMKvRcuNCDk+PoHD9WNm0a5U+jM3o/B1xP KeK2jPszxDa4zNEY6slkGWH42Y5mqe/FAOYmBohta4A6uOjDHb4W8NcEweyOP4omYDE7DnEQ7JlLj P/3cNSExhSCCkPHCscPIl2viP76qVpP1gmxaeDtrZhauT2I0+bmxW8GGL++HsYz4Y9uh97mSik3bI qqjbDNAuBeSKuj6LWXthPoZaEJgwb6FMH2L9JE6u756cZybzMi63PZ8y5CBYMaTe+B/BPgWR4E+0K tq7mfKSMQVIC6xhO/cb0ig==; Date: Wed, 13 Aug 2025 14:19:20 +0300 Message-Id: <86ectfo4ef.fsf@gnu.org> From: Eli Zaretskii To: Steven Allen In-Reply-To: <87ikisuxi2.fsf@stebalien.com> (message from Steven Allen on Tue, 12 Aug 2025 12:54:13 -0700) Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <864iuc9zfk.fsf@gnu.org> <87ikisuxi2.fsf@stebalien.com> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 79141 Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org, juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Steven Allen > Cc: juri@linkov.net, mail@daniel-mendler.de, 79141@debbugs.gnu.org > Date: Tue, 12 Aug 2025 12:54:13 -0700 > > Eli Zaretskii writes: > > >> From: Steven Allen > >> Cc: mail@daniel-mendler.de, 79141@debbugs.gnu.org > >> Date: Tue, 12 Aug 2025 11:07:08 -0700 > >> > >> > Anyone who needs a (possibly unreliable) caching version, it's easy > >> > to create a copy of the existing 'tab-bar-format-align-right', > >> > add caching to it, and use in 'tab-bar-format'. > >> > >> I can describe it in this case, at least: > >> > >> 1. Any time any face attribute is updated, the "tick" would be incremented. > > > > Why do you think it makes any sense to do that? When an attribute of > > any face is modified, Emacs discards and recomputes all the faces on > > that frame. How would the tick help you? > > We're caching the pixel-width of the right-aligned tab-bar segment. Ah. But isn't it better and simpler not to cache, recomputing it anew each time? > Adding a `face-modification-tick' would make it possible to detect when > face attributes have changed, allowing us to invalidate the cached > width. But then whatever problems caused you to cache the pixel width will happen again once Emacs recomputes the faces (which happens quite frequently). So I'm not sure this will be a useful feature, at least in your case. From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 13 07:35:16 2025 Received: (at 79141) by debbugs.gnu.org; 13 Aug 2025 11:35:16 +0000 Received: from localhost ([127.0.0.1]:56567 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1um9lD-0002hb-K8 for submit@debbugs.gnu.org; Wed, 13 Aug 2025 07:35:15 -0400 Received: from server.qxqx.de ([2a01:4f8:c012:9177::1]:58035 helo=mail.qxqx.de) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1um9l8-0002ba-A2 for 79141@debbugs.gnu.org; Wed, 13 Aug 2025 07:35:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=daniel-mendler.de; s=key; h=Content-Type:MIME-Version:Message-ID:Date: References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=DRozyqckalgAlUThgMQvyvLCONAhEdrVikIywclb0/s=; b=qDFsU7gcAsgAl0DUqCk4SgN76h QFYZE4E108Mg22/CzQsmGn4DDO3IRgwyYqEjZdUZ1UuyT6o18ojEmsjM32tZD7OLAiPGAY2g2dqo3 22htVDa+DilbMtRuVOLQQe7sMbl/qEUUx5E0JaCdiXb7RrjsgegVonmyhyxcT3/Vl3Js=; From: Daniel Mendler To: Eli Zaretskii Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <86ectfo4ef.fsf@gnu.org> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <864iuc9zfk.fsf@gnu.org> <87ikisuxi2.fsf@stebalien.com> <86ectfo4ef.fsf@gnu.org> Date: Wed, 13 Aug 2025 13:35:03 +0200 Message-ID: <87ms83pi8o.fsf@daniel-mendler.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: 79141@debbugs.gnu.org, Steven Allen , juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Eli Zaretskii writes: >> >> > Anyone who needs a (possibly unreliable) caching version, it's easy >> >> > to create a copy of the existing 'tab-bar-format-align-right', >> >> > add caching to it, and use in 'tab-bar-format'. >> >> >> >> I can describe it in this case, at least: >> >> >> >> 1. Any time any face attribute is updated, the "tick" would be incremented. >> > >> > Why do you think it makes any sense to do that? When an attribute of >> > any face is modified, Emacs discards and recomputes all the faces on >> > that frame. How would the tick help you? >> >> We're caching the pixel-width of the right-aligned tab-bar segment. > > Ah. But isn't it better and simpler not to cache, recomputing it anew > each time? Obviously simpler. In my profiling the string-pixel-width computation took a significant fraction of the runtime. >> Adding a `face-modification-tick' would make it possible to detect when >> face attributes have changed, allowing us to invalidate the cached >> width. > > But then whatever problems caused you to cache the pixel width will > happen again once Emacs recomputes the faces (which happens quite > frequently). So I'm not sure this will be a useful feature, at least > in your case. Tbh I cannot really tell. My assumption was that faces are not recomputed often, but this assumption might not be correct. Could you clarify when face recomputations happen? Only when attributes change? Attribute changes should not happen, right? Daniel From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 13 13:10:48 2025 Received: (at 79141) by debbugs.gnu.org; 13 Aug 2025 17:10:48 +0000 Received: from localhost ([127.0.0.1]:58478 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1umEzv-0003Tv-L3 for submit@debbugs.gnu.org; Wed, 13 Aug 2025 13:10:47 -0400 Received: from mout-p-201.mailbox.org ([2001:67c:2050:0:465::201]:49024) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1umEzr-0003TS-EX for 79141@debbugs.gnu.org; Wed, 13 Aug 2025 13:10:44 -0400 Received: from smtp1.mailbox.org (smtp1.mailbox.org [IPv6:2001:67c:2050:b231:465::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4c2FHq1j40z9tKj; Wed, 13 Aug 2025 19:10:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linkov.net; s=MBO0001; t=1755105031; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=pavmjzBjc2uSjXQCHfh1DMxPoWiRkOcCWA5CXhUotoM=; b=Amfhi7QbbY3j5KBh6vWjPco+gUD7jdsFlTVQVAr+VooA1sE+TK8PozuJpqq5NE/uZ0/89R qKbQmhXOHRwpEuio37bIs9OQsnjIk7HBiAzLUSa82E8POnCkRoB2MhI9G9uSS7+slerRfX 0TJ3fy2ef29Ur+jsMWcQncFA2epeNde7DYqu2eGh7N7b6kxYZ67hWkZd9tdu75M7vXgBj/ DPB49IRXwTAUQB37oVKpyFl+2kjWDOQ4AjffEEu/0yudY7lIY1CCmSvzsUQq3h93dm6z/0 +yL8p/Y6k2oLQ7qd2Rkiab86OFQuNHPFTcquZjtYn0DssNzrlHfqypwPjA/lbA== Authentication-Results: outgoing_mbo_mout; dkim=none; spf=pass (outgoing_mbo_mout: domain of juri@linkov.net designates 2001:67c:2050:b231:465::1 as permitted sender) smtp.mailfrom=juri@linkov.net From: Juri Linkov To: Daniel Mendler Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <87frdvk8y7.fsf@daniel-mendler.de> Organization: LINKOV.NET References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <87frdwbcz6.fsf@daniel-mendler.de> <87349vu36p.fsf@mail.linkov.net> <87frdvk8y7.fsf@daniel-mendler.de> Date: Wed, 13 Aug 2025 20:08:09 +0300 Message-ID: <87o6sjm9om.fsf@mail.linkov.net> MIME-Version: 1.0 Content-Type: text/plain X-Rspamd-Queue-Id: 4c2FHq1j40z9tKj X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Eli Zaretskii , Steven Allen , 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) >> How often your tab-bar is updated? For frequent string-pixel-width calls >> using debounce or throttle like from https://github.com/karthink/timeout >> could help. > > It is recomputed completely on every redisplay. It might be possible to > throttle the tab bar recomputation, such that it happens only a few > times per second. This will lead to other difficulties however, since in > some cases the tab bar should react immediately (e.g., when creating new > tabs or when toggling some elements). What I actually meant is more like setting a short cache eviction time, for example 1 sec after changing the faces the tab-bar will be in a broken state using an old cached value, but later the width will be recomputed and updated. From debbugs-submit-bounces@debbugs.gnu.org Wed Aug 13 13:19:22 2025 Received: (at 79141) by debbugs.gnu.org; 13 Aug 2025 17:19:22 +0000 Received: from localhost ([127.0.0.1]:58498 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1umF8E-0003r3-28 for submit@debbugs.gnu.org; Wed, 13 Aug 2025 13:19:22 -0400 Received: from server.qxqx.de ([2a01:4f8:c012:9177::1]:59089 helo=mail.qxqx.de) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1umF89-0003qX-JQ for 79141@debbugs.gnu.org; Wed, 13 Aug 2025 13:19:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=daniel-mendler.de; s=key; h=Content-Type:MIME-Version:Message-ID:Date: References:In-Reply-To:Subject:Cc:To:From:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=hVWWnp22vub2v1A8jewSBTM0TEACKUS57ffnAlOye4A=; b=HiwZ+Yy9ssITbkmsgypP+GXyG+ 0/U9HARPwdGMH3+n7zl7hWaj7hJNLxpoEsMAeM3kSFmLtRqBsBTurVO9Ecd19vfXPTM/N+2SSHcvT urqgra2aQYuRtyCcc4JMhsJ52d/s5MJ0f3/66+PlGlLtvFm330KkCPzOG5QKxGzuXvM0=; From: Daniel Mendler To: Juri Linkov Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account In-Reply-To: <87o6sjm9om.fsf@mail.linkov.net> References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <87frdwbcz6.fsf@daniel-mendler.de> <87349vu36p.fsf@mail.linkov.net> <87frdvk8y7.fsf@daniel-mendler.de> <87o6sjm9om.fsf@mail.linkov.net> Date: Wed, 13 Aug 2025 19:19:09 +0200 Message-ID: <87o6sjqgvm.fsf@daniel-mendler.de> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 79141 Cc: Eli Zaretskii , Steven Allen , 79141@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) Juri Linkov writes: >>> How often your tab-bar is updated? For frequent string-pixel-width calls >>> using debounce or throttle like from https://github.com/karthink/timeout >>> could help. >> >> It is recomputed completely on every redisplay. It might be possible to >> throttle the tab bar recomputation, such that it happens only a few >> times per second. This will lead to other difficulties however, since in >> some cases the tab bar should react immediately (e.g., when creating new >> tabs or when toggling some elements). > > What I actually meant is more like setting a short cache eviction time, > for example 1 sec after changing the faces the tab-bar will be > in a broken state using an old cached value, but later the width > will be recomputed and updated. Yes, this would work, but it might also look a bit broken. A face-modified-tick sounds like a better solution to me. Daniel From debbugs-submit-bounces@debbugs.gnu.org Sat Aug 16 03:07:56 2025 Received: (at 79141) by debbugs.gnu.org; 16 Aug 2025 07:07:56 +0000 Received: from localhost ([127.0.0.1]:40633 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1unB1A-0004Wt-Ab for submit@debbugs.gnu.org; Sat, 16 Aug 2025 03:07:56 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60864) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1unB17-0004WX-E2 for 79141@debbugs.gnu.org; Sat, 16 Aug 2025 03:07:54 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1unB10-0007pz-Fn; Sat, 16 Aug 2025 03:07:46 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=References:Subject:In-Reply-To:To:From:Date: mime-version; bh=IQI4ysMlV9EbWKj0bJwRONmihx1sA6t5H8otB/LszNo=; b=EOVVPp1PpMgq utUF8P/ua6HGSo0qZ+RvEdrHT6ZFIiR7ZS0vwqsGcSsHQoBEp8N78Zwcp5dsPByOqSLwGwQ9QlqAc ggKcaTOzHFyA6Ww4Jce9ApS7UZRBl4D/zaGG6UbDexfh5qSODia/kZrS2gtpAz1R8ImN8rCFJBobn 2UGxI7g8HHivDU6NkEVTDigU1PYGfXnCjOYBiVQuMl318IVgLaYTQ4MWqX5mSoOUpP+E/YqdX7vCr we6VUAAKch+a6O+DjdxBlw4lLnKZnLbIlaf9OH8kN19Gdux8UsKOa/zLPPWjeVVeERayxvgu/wUpM 5kedX12C22stauJnaBRn2A==; Date: Sat, 16 Aug 2025 10:07:43 +0300 Message-Id: <86h5y7lp6o.fsf@gnu.org> From: Eli Zaretskii To: Daniel Mendler In-Reply-To: <87ms83pi8o.fsf@daniel-mendler.de> (message from Daniel Mendler on Wed, 13 Aug 2025 13:35:03 +0200) Subject: Re: bug#79141: 31.0.50; The tab-bar-format-align-right cache doesn't take face changes and per-frame faces into account References: <87bjoywyzf.fsf@stebalien.com> <87fre5d5qz.fsf@mail.linkov.net> <871ppoh0mk.fsf@stebalien.com> <86ectos168.fsf@gnu.org> <87sei4ut8y.fsf@daniel-mendler.de> <868qjvspxh.fsf@gnu.org> <87wm7b3sqf.fsf@mail.linkov.net> <86ldnqaw4o.fsf@gnu.org> <871ppgh1lr.fsf@mail.linkov.net> <87jz38h0s3.fsf@stebalien.com> <864iuc9zfk.fsf@gnu.org> <87ikisuxi2.fsf@stebalien.com> <86ectfo4ef.fsf@gnu.org> <87ms83pi8o.fsf@daniel-mendler.de> X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 79141 Cc: 79141@debbugs.gnu.org, steven@stebalien.com, juri@linkov.net X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > From: Daniel Mendler > Cc: Steven Allen , juri@linkov.net, > 79141@debbugs.gnu.org > Date: Wed, 13 Aug 2025 13:35:03 +0200 > > Eli Zaretskii writes: > > >> Adding a `face-modification-tick' would make it possible to detect when > >> face attributes have changed, allowing us to invalidate the cached > >> width. > > > > But then whatever problems caused you to cache the pixel width will > > happen again once Emacs recomputes the faces (which happens quite > > frequently). So I'm not sure this will be a useful feature, at least > > in your case. > > Tbh I cannot really tell. My assumption was that faces are not > recomputed often, but this assumption might not be correct. Could you > clarify when face recomputations happen? Only when attributes change? > Attribute changes should not happen, right? You can see that in xfaces.c, where the face_change flag is set. Basically, whenever any named face changes. This happens when any of the following functions is called: clear-face-cache, internal-make-lisp-face, internal-copy-lisp-face, internal-set-lisp-face-attribute, and any callers of these in Lisp. Also, if set-frame-parameter and modify-frame-parameters are called to change face-related parameters, like fore/background colors, mouse color, cursor color, etc. If you want to get the impression of how frequently this happens, put breakpoints inside the two inner 'if's of this 'if' block from xdisp.c, where Emacs calls free_all_realized_faces: /* If face attributes have been changed since the last redisplay, free realized faces now because they depend on face definitions that might have changed. Don't free faces while there might be desired matrices pending which reference these faces. */ if (!inhibit_free_realized_faces) { if (face_change) { face_change = false; XFRAME (w->frame)->face_change = 0; free_all_realized_faces (Qnil); } else if (XFRAME (w->frame)->face_change) { XFRAME (w->frame)->face_change = 0; free_all_realized_faces (w->frame); } } then run Emacs, and see how frequently the breakpoint is hit.