Subject: Re: bug#18490: 24.3.93; Narrowing in other window no longer redisplays until a call to other-window.
From: Eli Zaretskii <[email-masked]>
To: Matthew Smiglarski <[email-masked]>
Cc: [email-masked]
Date: Thu, 18 Sep 2014 18:20:34 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> Date: Wed, 17 Sep 2014 19:50:46 +0100
> From: Matthew Smiglarski <[email-masked]>
> 
> Hello,
> When a buffer has narrowing applied the window does not update until
> other-window is called.
> 
> This is not the case on 24.3.
> 
> To reproduce:
> 
> 1. Start emacs
> $ emacs -Q
> 
> 2. Enter the following into some buffer
> 
> (defun bug-redisplay-narrowing-on-other-window ()
>   (interactive)
>   (widen)
>   (search-forward-regexp "[a-z]+")
>   (narrow-to-region (match-beginning 0) (match-end 0)))
> 
> (global-set-key (kbd "M-n") 'bug-redisplay-narrowing-on-other-window)
> 
> ;; Create 3 windows
> (split-window-below)
> (split-window-below)
> 
> 3. M-x eval-buffer
> 
> 4. Execute the bug function defined above a few times, mixing it up
> with the odd call to
> #'other-window.
> 
> M-x beginning-of-buffer
> M-n M-n C-x 4 o M-n M-n C-x 4 o M-n M-n
> 
> What happens is the narrowing is only apparent to the poor user when
> another window is selected, and this was not the case previously.

Thanks, I fixed this in revision 117507 on the emacs-24 branch.

> Apologies if this is an intended change but to me it seems that the
> redisplay should occur immediately?

Not immediately, but the next time Emacs schedules redisplay, yes, all
the windows showing the buffer whose narrowing changed should be
updated.  So this is indeed a bug.

Emacs 24.3 and before used to be quite conservative in deciding when a
non-selected window should be redisplayed, as in "when in doubt,
redisplay".  The current code was changed to attempt to refrain even
more from unnecessary redisplays, and this bug is fallout from those
changes.

> I would be interested to know how to determine when the window is
> redisplayed.

There's no simple answer to this question.  Emacs employs several
flags to track when a buffer or a window or a frame might need to be
redrawn, and also tries to distinguish between redisplay of the window
content from redisplay of the mode line.  Look at the first 200 lines
of redisplay_internal to see the complicated logic by which Emacs
decides whether it needs to redisplay more than just the selected
window on the selected frame.