GNU bug report logs - #74091
31.0.50; string-pixel-width in mode line disables region

Previous Next

Package: emacs;

Reported by: Eshel Yaron <me <at> eshelyaron.com>

Date: Tue, 29 Oct 2024 17:28:02 UTC

Severity: normal

Found in version 31.0.50

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #8 received at 74091 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Eshel Yaron <me <at> eshelyaron.com>
Cc: 74091 <at> debbugs.gnu.org
Subject: Re: bug#74091: 31.0.50;
 string-pixel-width in mode line disables region
Date: Wed, 30 Oct 2024 16:59:49 +0200
> Date: Tue, 29 Oct 2024 18:27:05 +0100
> From:  Eshel Yaron via "Bug reports for GNU Emacs,
>  the Swiss army knife of text editors" <bug-gnu-emacs <at> gnu.org>
> 
> 
> 
> The new implementation of string-pixel-width has some unexpected effect
> when it is called from mode-line-format, as happens for example when
> mode-line-format-right-align occurs in mode-line-format:
> 
> 1. emacs -Q
> 2. (setq-default mode-line-format
> 	      '("" (:eval (progn (string-pixel-width "foo") nil))))
> 3. C-x C-f /path/to/emacs/lisp/subr.el
> 4. C-SPC
> 5. C-n
> 
> At this point the region is expected to be active since we activated it
> in step 4.  But in step 5 the mode line is updated, which calls
> string-pixel-width, which in turn unexpectedly disables the region.

Thanks, should be fixed now.

> I'm not really sure why this happens...

It happens because string-pixel-width modifies a buffer, and that sets
deactivate-mark, which then causes the region to be deactivated when
a command finishes.  When you inject string-pixel-width into
mode-line-format, you indirectly cause it to be called from C-n and
the like, because those evaluate the mode-line format.  So doing that
is quite a risky thing, in general.




This bug report was last modified 194 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.