Subject: bug#74091: closed (Re: bug#74091: 31.0.50; string-pixel-width in mode line disables region)

From: [email-masked] (GNU bug Tracking System)
Date: Wed, 30 Oct 2024 16:02:02 +0000

Your bug report

#74091: 31.0.50; string-pixel-width in mode line disables region

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
74091: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=74091
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#74091: 31.0.50; string-pixel-width in mode line disables region
From: Eli Zaretskii <[email-masked]>
To: Eshel Yaron <[email-masked]>
Cc: [email-masked]
Date: Wed, 30 Oct 2024 18:01:11 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

> From: Eshel Yaron <[email-masked]>
> Cc: [email-masked]
> Date: Wed, 30 Oct 2024 16:26:38 +0100
> 
> >> 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.
> 
> Great!  That seems to work.

Thanks for testing, I will close this bug.

> >> 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.
> 
> Hmm but string-pixel-width used to modify a buffer also in the old
> implementation, and that never caused this issue...

The new implementation also didn't cause this issue in some buffers.
For example, in *scratch*.  Trying to understand the logic of a bug is
never a good investment of time.

> And in both the old
> implementation and in the new one, the modification is in a different
> buffer, is that expected to disable the mark in the original buffer?

The variable deactivate-mark only becomes buffer-local if set;
otherwise the global value will be changed.

> > 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.
> 
> Well, that's how Emacs implements mode-line-format-right-align :)

One reason why I don't like it.  mode-line-format is evaluated in many
more contexts than most people realize, so putting arbitrary calls
there without a good understanding what those calls do and how is not
the best idea, although it will mostly work.

Subject: 31.0.50; string-pixel-width in mode line disables region
From: Eshel Yaron <[email-masked]>
To: [email-masked]
Date: Tue, 29 Oct 2024 18:27:05 +0100
List-Id: <debbugs-submit.debbugs.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.

I'm not really sure why this happens...  Also, if I now trace
string-pixel-width, then it no longer disables the region and everything
starts working as expected.

Thanks,

Eshel