emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: force-mode-line-update ALL argument


From: martin rudalics
Subject: Re: force-mode-line-update ALL argument
Date: Sun, 23 May 2010 14:16:27 +0200
User-agent: Thunderbird 2.0.0.21 (Windows/20090302)

>> What makes you conclude that a `set-buffer' on the value returned by
>> `other-buffer' causes updating the modeline
>
> I trust (my assummption) that it does.
> I have no way to _visually_ confirm this. Its Kantian Emacsology :P

The entire idea is that `set-buffer' should not have an effect on the
mode line, only `set-window-buffer' should.

>> of a buffer that maybe has neither been changed nor displayed?
>
> The return value of `other-buffer' is not affected by whether it has been
> changed but it does affect it.

It does affect what?

>> What is a non-visible buffer on a frame?
>
> Precisely that.
>
>> When a buffer is visible it is on a frame.
>> When a buffer is not visible it is on no frame.
>
>>From :FILE src/buffer.c
>
> /* Switch to buffer B temporarily for redisplay purposes.
>    This avoids certain things that don't need to be done within
> redisplay.  */

set_buffer_temp doesn't enter here.

> /* Move the assoc for buffer BUF to the front of buffer-alist.  Since
>    we do this each time BUF is selected visibly, the more recently
>    selected buffers are always closer to the front of the list.  This
>    means that other_buffer is more likely to choose a relevant buffer.
>    */

record_buffer doesn't enter here either.

> /* Set the current buffer to B.
>
>    We previously set windows_or_buffers_changed here to invalidate
>    global unchanged information in beg_unchanged and end_unchanged.
>    This is no longer necessary because we now compute unchanged
>    information on a buffer-basis.  Every action affecting other
>    windows than the selected one requires a select_window at some
>    time, and that increments windows_or_buffers_changed.  */

This must be the clue ;-)  In fact, this change

1999-09-02  Gerd Moellmann  <address@hidden>

        * buffer.c (set_buffer_internal): Never set
        windows_or_buffers_changed.

completely defeats the purpose of

  (if all (with-current-buffer (other-buffer)))

in `force-mode-line-update' and the ALL argument has no effect.  When
the current buffer is shown in some window, the following snippet from
Fset_buffer_modified_p

  XSETBUFFER (buffer, current_buffer);
  window = Fget_buffer_window (buffer, Qt);
  if (WINDOWP (window))
    {
      ++update_mode_lines;

asserts that _all_ modelines are updated.  If the current buffer is not
shown in any window, other modelines are not updated even if the ALL
argument has been set.  Now, usually the current buffer is shown in the
selected window, so this went by unnoticed ever since that.

> Good luck! :)

Thanks, martin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]