Package: emacs;
Reported by: AKIYAMA Kouhei <misohena <at> gmail.com>
Date: Mon, 24 Feb 2025 07:50:02 UTC
Severity: normal
Found in version 30.1
Done: Eli Zaretskii <eliz <at> gnu.org>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 76519 in the body.
You can then email your comments to 76519 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-gnu-emacs <at> gnu.org:bug#76519; Package emacs.
(Mon, 24 Feb 2025 07:50:02 GMT) Full text and rfc822 format available.AKIYAMA Kouhei <misohena <at> gmail.com>:bug-gnu-emacs <at> gnu.org.
(Mon, 24 Feb 2025 07:50:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: AKIYAMA Kouhei <misohena <at> gmail.com> To: bug-gnu-emacs <at> gnu.org Subject: 30.1; Unexpected Results from window-text-pixel-size Date: Mon, 24 Feb 2025 16:16:45 +0900
Dear Emacs Developers,
Thank you for developing and maintaining Emacs. I have encountered
some unexpected behavior in the `window-text-pixel-size` function and
would like to share my findings in case they are helpful.
I tested this on Emacs 30.1 for MS-Windows, launched with the
following commands:
wget https://ftp.gnu.org/gnu/emacs/windows/emacs-30/emacs-30.1.zip
unzip emacs-30.1.zip
cd bin
./emacs -Q
* Issue 1: Zero Width Returned in Certain Cases
Depending on the values of `header-line-format` and `truncate-lines`,
`window-text-pixel-size` sometimes returns a width of zero. This can
be reproduced as follows:
;; --------------------------------------------------------
;; 1. Display the header line in the scratch buffer.
(setq header-line-format "header")
;; 2. Evaluate the following code in the scratch buffer:
(require 'cl-lib)
(with-temp-buffer
;; Set buffer-local variables:
(setq truncate-lines t) ;; Without this, the problem will not occur
;; (setq header-line-format "") ;; If uncomment this, the problem will not occur
;; Insert text
(insert " -rw-rw-rw- 1 ***** none 8541546 18-02-01 17:43 01 - test test test test test.mp3
-rw-rw-rw- 1 ***** none 10519534 18-02-01 17:42 01 - test test test.mp3
")
;; Get width before file names
(save-window-excursion ;; Same method as `shr-pixel-column'
(set-window-dedicated-p nil nil)
(set-window-buffer nil (current-buffer))
(goto-char (point-min))
(cl-loop while (re-search-forward "01 - " nil t)
collect (window-text-pixel-size
nil
(line-beginning-position)
(match-beginning 0) 100000))))
;; Result:
((408 . 16) (0 . 16))
;; Expected
((408 . 16) (408 . 16))
;; --------------------------------------------------------
* Issue 2: Negative Width Returned When Full-Width Characters Are Present
If the buffer contains full-width characters, `window-text-pixel-size`
sometimes returns negative widths. This can be reproduced as follows:
;; --------------------------------------------------------
;; 1. Evaluate the following code in the scratch buffer:
;; Note: あ = \u3042 (HIRAGANA LETTER A)
(require 'cl-lib)
(with-temp-buffer
(insert "aaaaaaaaaaaaaaaaaaaaaaaa\n"
"あああbbbbbbbbbbbbbbbbbbbb\n"
"aaaaaaaaaaaaaaaaaaaaaaaa\n"
"あああbbbbbbbbbbbbbbbbbbbb\n"
"aaaaaaaaaaaaaaaaaaaaaaaa\n"
"あああbbbbbbbbbbbbbbbbbbbb\n")
(save-window-excursion
(set-window-buffer nil (current-buffer))
(goto-char (point-min))
(cl-loop until (eobp)
if (eolp)
concat "\n"
else
concat (format " %s" (car (window-text-pixel-size
nil (point) (1+ (point)))))
do (forward-char))))
;; Result
" 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
14 14 14 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 -32 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
14 14 14 8 8 -50 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 -80 8 8 8 8 8 8 8 8 8 8 8 8
14 14 14 8 8 8 8 8 8 8 8 -98 8 8 8 8 8 8 8 8 8 8 8
"
;; A strange width is returned from the line after a full-width
;; character appears.
;; Expected
" 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
14 14 14 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
14 14 14 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
14 14 14 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
"
;; --------------------------------------------------------
* Workaround
Both issues occur when measuring the size of a partial text segment
within a buffer. However, I found that narrowing the buffer to the
target range before measuring avoids the problem:
;; --------------------------------------------------------
(with-temp-buffer
(insert "aaaaaaaaaaaaaaaaaaaaaaaa\n"
"あああbbbbbbbbbbbbbbbbbbbb\n"
"aaaaaaaaaaaaaaaaaaaaaaaa\n"
"あああbbbbbbbbbbbbbbbbbbbb\n"
"aaaaaaaaaaaaaaaaaaaaaaaa\n"
"あああbbbbbbbbbbbbbbbbbbbb\n")
(save-window-excursion
(set-window-buffer nil (current-buffer))
(goto-char (point-min))
(cl-loop until (eobp)
if (eolp)
concat "\n"
else
concat (format " %s"
;; [Workaround]
(save-restriction
(narrow-to-region (point) (1+ (point)))
(car (window-text-pixel-size nil (point) (1+ (point))))))
do (forward-char))))
;; --------------------------------------------------------
* Additional Context
I am developing a package that displays file details on the right side
of file names in Dired. This package needs to determine the width of
icons (inserted by `all-the-icons-dired` or `nerd-icons-dired`) and
thumbnails (inserted by `image-dired`). I use `window-text-pixel-size`
for this purpose.
Relevant code:
https://github.com/misohena/dired-details-r/blob/5510aae2fb0b2fb1c55ef2c471c84ccd65359f35/dired-details-r.el#L379
Since I have already implemented a workaround using narrowing, this
issue does not block my development. However, I wanted to report it in
case it is useful.
Best regards,
--
# This email was machine-translated from Japanese.
AKIYAMA Kouhei
--
In GNU Emacs 30.1 (build 2, x86_64-w64-mingw32) of 2025-02-24 built on
AVALON
Windowing system distributor 'Microsoft Corp.', version 10.0.26100
System Description: Microsoft Windows 10 Enterprise (v10.0.2009.26100.3194)
Configured using:
'configure --with-modules --without-dbus --with-native-compilation=aot
--without-compress-install --with-tree-sitter CFLAGS=-O2
prefix=/g/rel/install/emacs-30.1'
Configured features:
ACL GIF GMP GNUTLS HARFBUZZ JPEG LCMS2 LIBXML2 MODULES NATIVE_COMP
NOTIFY W32NOTIFY PDUMPER PNG RSVG SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS TREE_SITTER WEBP XPM ZLIB
Important settings:
value of $LANG: ja_JP.CP932
locale-coding-system: cp932
Major mode: Lisp Interaction
Minor modes in effect:
tooltip-mode: t
global-eldoc-mode: t
eldoc-mode: t
show-paren-mode: t
electric-indent-mode: t
mouse-wheel-mode: t
tool-bar-mode: t
menu-bar-mode: t
file-name-shadow-mode: t
global-font-lock-mode: t
font-lock-mode: t
blink-cursor-mode: t
minibuffer-regexp-mode: t
line-number-mode: t
indent-tabs-mode: t
transient-mark-mode: t
auto-composition-mode: t
auto-encryption-mode: t
auto-compression-mode: t
Load-path shadows:
None found.
Features:
(shadow sort mail-extr cl-extra help-mode warnings icons compile comint
ansi-osc ansi-color ring comp-run bytecomp byte-compile comp-common rx
emacsbug message mailcap yank-media puny dired dired-loaddefs rfc822 mml
mml-sec password-cache epa derived epg rfc6068 epg-config gnus-util
text-property-search time-date subr-x mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader cl-loaddefs cl-lib
sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils
japan-util rmc iso-transl tooltip cconv eldoc paren electric uniquify
ediff-hook vc-hooks lisp-float-type elisp-mode mwheel touch-screen
dos-w32 ls-lisp disp-table term/w32-win w32-win w32-vars term/common-win
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
w32notify w32 lcms2 multi-tty move-toolbar make-network-process
native-compile emacs)
Memory information:
((conses 16 81254 32625) (symbols 48 10237 0) (strings 32 21939 6240)
(string-bytes 1 585829) (vectors 16 13241)
(vector-slots 8 312318 15570) (floats 8 26 37)
(intervals 56 3640 2771) (buffers 992 13))
bug-gnu-emacs <at> gnu.org:bug#76519; Package emacs.
(Mon, 24 Feb 2025 19:31:01 GMT) Full text and rfc822 format available.Message #8 received at 76519 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: AKIYAMA Kouhei <misohena <at> gmail.com> Cc: 76519 <at> debbugs.gnu.org Subject: Re: bug#76519: 30.1; Unexpected Results from window-text-pixel-size Date: Mon, 24 Feb 2025 21:29:47 +0200
> From: AKIYAMA Kouhei <misohena <at> gmail.com> > Date: Mon, 24 Feb 2025 16:16:45 +0900 > > > * Issue 1: Zero Width Returned in Certain Cases > > Depending on the values of `header-line-format` and `truncate-lines`, > `window-text-pixel-size` sometimes returns a width of zero. This can > be reproduced as follows: > > ;; -------------------------------------------------------- > ;; 1. Display the header line in the scratch buffer. > (setq header-line-format "header") > > ;; 2. Evaluate the following code in the scratch buffer: > (require 'cl-lib) > (with-temp-buffer > ;; Set buffer-local variables: > (setq truncate-lines t) ;; Without this, the problem will not occur > ;; (setq header-line-format "") ;; If uncomment this, the problem will not occur > > ;; Insert text > (insert " -rw-rw-rw- 1 ***** none 8541546 18-02-01 17:43 01 - test test test test test.mp3 > -rw-rw-rw- 1 ***** none 10519534 18-02-01 17:42 01 - test test test.mp3 > ") > > ;; Get width before file names > (save-window-excursion ;; Same method as `shr-pixel-column' > (set-window-dedicated-p nil nil) > (set-window-buffer nil (current-buffer)) > > (goto-char (point-min)) > (cl-loop while (re-search-forward "01 - " nil t) > collect (window-text-pixel-size > nil > (line-beginning-position) > (match-beginning 0) 100000)))) > > ;; Result: > ((408 . 16) (0 . 16)) > > ;; Expected > ((408 . 16) (408 . 16)) > ;; -------------------------------------------------------- This issue is hard to fix, and I decided not to fix it. Lisp programs that use window-text-pixel-size should make sure the window used for measuring the text dimensions doesn't have any non-trivial features that affect the result, like line-truncation and header-line, turned on, or should turn them off around the call to window-text-pixel-size. Basically, any use of window-text-pixel-size when the buffer is not already shown in the window is problematic. By the way, is there any reason you didn't use string-pixel-width instead? Or does it also have problems in this case? > * Issue 2: Negative Width Returned When Full-Width Characters Are Present > > If the buffer contains full-width characters, `window-text-pixel-size` > sometimes returns negative widths. This can be reproduced as follows: This was due to stupid typo in the code, and is now fixed on the release branch (to be merged to master in a few days). Thanks.
bug-gnu-emacs <at> gnu.org:bug#76519; Package emacs.
(Tue, 25 Feb 2025 13:12:01 GMT) Full text and rfc822 format available.Message #11 received at 76519 <at> debbugs.gnu.org (full text, mbox):
From: AKIYAMA Kouhei <misohena <at> gmail.com> To: Eli Zaretskii <eliz <at> gnu.org> Cc: 76519 <at> debbugs.gnu.org Subject: Re: bug#76519: 30.1; Unexpected Results from window-text-pixel-size Date: Tue, 25 Feb 2025 20:24:07 +0900
Thank you for your response. > > * Issue 1: Zero Width Returned in Certain Cases > > > > Depending on the values of `header-line-format` and `truncate-lines`, > > `window-text-pixel-size` sometimes returns a width of zero. > > This issue is hard to fix, and I decided not to fix it. Lisp programs > that use window-text-pixel-size should make sure the window used for > measuring the text dimensions doesn't have any non-trivial features > that affect the result, like line-truncation and header-line, turned > on, or should turn them off around the call to window-text-pixel-size. > Basically, any use of window-text-pixel-size when the buffer is not > already shown in the window is problematic. Understood. In the first place, adjusting the buffer based on information belonging to the view, such as windows and frames, is not ideal. If we consider the case where a single buffer is displayed in multiple windows or frames, it is clear that issues may arise. In practice, perfection is not necessary, so some degree of compromise can be accepted. It seems better to update the buffer layout after it has been displayed. > By the way, is there any reason you didn't use string-pixel-width > instead? Or does it also have problems in this case? The reason I did not use `string-pixel-width` is that I wanted to measure the width of text that includes icons and thumbnail images displayed via overlays (using the `after-string` and `before-string` properties). While the test case used a temporary buffer, in reality, the measurement was performed in a `dired-mode` buffer, and the timing was within `dired-after-readin-hook` (after `nerd-icons-dired` had added icons). The issue I encountered was that, when `which-function-mode` was enabled, the detailed information I forcibly displayed on the right side of filenames would sometimes shift irregularly. Upon investigation, I found that the issue was not limited to `which-function-mode` but occurred whenever `header-line-format` was used. The overlay icons were not a necessary condition for the issue, but the `truncate-lines` setting in `dired` was relevant. However, not all lines were affected, so there might be other conditions involved. I have not tested `string-pixel-width`. By the way, while looking at the manual, I noticed that the arguments of the `buffer-text-pixel-size` function differ between the manual and Emacs itself. https://www.gnu.org/software/emacs/manual/html_node/elisp/Size-of-Displayed-Text.html#index-buffer_002dtext_002dpixel_002dsize Function: buffer-text-pixel-size &optional buffer-or-name window from to x-limit y-limit (buffer-text-pixel-size &optional BUFFER-OR-NAME WINDOW X-LIMIT Y-LIMIT) > > * Issue 2: Negative Width Returned When Full-Width Characters Are Present > > > > If the buffer contains full-width characters, `window-text-pixel-size` > > sometimes returns negative widths. This can be reproduced as follows: > > This was due to a stupid typo in the code, and is now fixed on the > release branch (to be merged to master in a few days). You've already fixed it? Amazing! Thank you very much! -- # This email was machine-translated from Japanese. AKIYAMA Kouhei
bug-gnu-emacs <at> gnu.org:bug#76519; Package emacs.
(Wed, 26 Feb 2025 12:56:02 GMT) Full text and rfc822 format available.Message #14 received at 76519 <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: AKIYAMA Kouhei <misohena <at> gmail.com> Cc: 76519 <at> debbugs.gnu.org Subject: Re: bug#76519: 30.1; Unexpected Results from window-text-pixel-size Date: Wed, 26 Feb 2025 14:55:18 +0200
> From: AKIYAMA Kouhei <misohena <at> gmail.com> > Date: Tue, 25 Feb 2025 20:24:07 +0900 > Cc: 76519 <at> debbugs.gnu.org > > > By the way, is there any reason you didn't use string-pixel-width > > instead? Or does it also have problems in this case? > > The reason I did not use `string-pixel-width` is that I wanted to > measure the width of text that includes icons and thumbnail images > displayed via overlays (using the `after-string` and `before-string` > properties). While the test case used a temporary buffer, in reality, > the measurement was performed in a `dired-mode` buffer, and the timing > was within `dired-after-readin-hook` (after `nerd-icons-dired` had > added icons). Yes, overlays cannot be part of a string, so string-pixel-width will not do the job when the buffer text has overlay strings. > By the way, while looking at the manual, I noticed that the arguments > of the `buffer-text-pixel-size` function differ between the manual and > Emacs itself. > > https://www.gnu.org/software/emacs/manual/html_node/elisp/Size-of-Displayed-Text.html#index-buffer_002dtext_002dpixel_002dsize Thanks, fixed. > > > * Issue 2: Negative Width Returned When Full-Width Characters Are Present > > > > > > If the buffer contains full-width characters, `window-text-pixel-size` > > > sometimes returns negative widths. This can be reproduced as follows: > > > > This was due to a stupid typo in the code, and is now fixed on the > > release branch (to be merged to master in a few days). > > You've already fixed it? Amazing! > Thank you very much! You're welcome.
Eli Zaretskii <eliz <at> gnu.org>:AKIYAMA Kouhei <misohena <at> gmail.com>:Message #19 received at 76519-done <at> debbugs.gnu.org (full text, mbox):
From: Eli Zaretskii <eliz <at> gnu.org> To: misohena <at> gmail.com Cc: 76519-done <at> debbugs.gnu.org Subject: Re: bug#76519: 30.1; Unexpected Results from window-text-pixel-size Date: Sun, 09 Mar 2025 11:33:57 +0200
> Cc: 76519 <at> debbugs.gnu.org > Date: Wed, 26 Feb 2025 14:55:18 +0200 > From: Eli Zaretskii <eliz <at> gnu.org> > > > From: AKIYAMA Kouhei <misohena <at> gmail.com> > > Date: Tue, 25 Feb 2025 20:24:07 +0900 > > Cc: 76519 <at> debbugs.gnu.org > > > > > By the way, is there any reason you didn't use string-pixel-width > > > instead? Or does it also have problems in this case? > > > > The reason I did not use `string-pixel-width` is that I wanted to > > measure the width of text that includes icons and thumbnail images > > displayed via overlays (using the `after-string` and `before-string` > > properties). While the test case used a temporary buffer, in reality, > > the measurement was performed in a `dired-mode` buffer, and the timing > > was within `dired-after-readin-hook` (after `nerd-icons-dired` had > > added icons). > > Yes, overlays cannot be part of a string, so string-pixel-width will > not do the job when the buffer text has overlay strings. > > > By the way, while looking at the manual, I noticed that the arguments > > of the `buffer-text-pixel-size` function differ between the manual and > > Emacs itself. > > > > https://www.gnu.org/software/emacs/manual/html_node/elisp/Size-of-Displayed-Text.html#index-buffer_002dtext_002dpixel_002dsize > > Thanks, fixed. > > > > > * Issue 2: Negative Width Returned When Full-Width Characters Are Present > > > > > > > > If the buffer contains full-width characters, `window-text-pixel-size` > > > > sometimes returns negative widths. This can be reproduced as follows: > > > > > > This was due to a stupid typo in the code, and is now fixed on the > > > release branch (to be merged to master in a few days). > > > > You've already fixed it? Amazing! > > Thank you very much! > > You're welcome. No further comments, so I'm closing this bug now.
Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org.
(Sun, 06 Apr 2025 11:24:10 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.