* buffer.c (Fset_buffer_multibyte): Do not force redisplay

if changed buffer is not shown in a window.
* insdel.c (prepare_to_modify_buffer): Likewise.
* window.c (replace_buffer_in_windows_safely): Do nothing
if buffer is not shown in a window.
(Fforce_window_update): Likewise if string or buffer argument
is passed.
This commit is contained in:
Dmitry Antipov 2012-12-11 13:51:12 +04:00
parent 1b47babdb7
commit c6afe371b0
4 changed files with 34 additions and 20 deletions

View file

@ -1,3 +1,13 @@
2012-12-11 Dmitry Antipov <dmantipov@yandex.ru>
* buffer.c (Fset_buffer_multibyte): Do not force redisplay
if changed buffer is not shown in a window.
* insdel.c (prepare_to_modify_buffer): Likewise.
* window.c (replace_buffer_in_windows_safely): Do nothing
if buffer is not shown in a window.
(Fforce_window_update): Likewise if string or buffer argument
is passed.
2012-12-11 Eli Zaretskii <eliz@gnu.org>
* inotify.c (Finotify_add_watch): Rename decoded_file_name to

View file

@ -2691,10 +2691,11 @@ current buffer is cleared. */)
UNGCPRO;
/* Changing the multibyteness of a buffer means that all windows
showing that buffer must be updated thoroughly. */
current_buffer->prevent_redisplay_optimizations_p = 1;
++windows_or_buffers_changed;
/* If buffer is shown in a window, let redisplay consider other windows. */
if (buffer_window_count (current_buffer))
++windows_or_buffers_changed;
/* Copy this buffer's new multibyte status
into all of its indirect buffers. */

View file

@ -1800,9 +1800,10 @@ prepare_to_modify_buffer (ptrdiff_t start, ptrdiff_t end,
if (!NILP (BVAR (current_buffer, read_only)))
Fbarf_if_buffer_read_only ();
/* Let redisplay consider other windows than selected_window
if modifying another buffer. */
if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer)
/* If we're modifying the buffer other than shown in a selected window,
let redisplay consider other windows if this buffer is visible. */
if (XBUFFER (XWINDOW (selected_window)->buffer) != current_buffer
&& buffer_window_count (current_buffer))
++windows_or_buffers_changed;
if (buffer_intervals (current_buffer))

View file

@ -2988,22 +2988,24 @@ replace_buffer_in_windows (Lisp_Object buffer)
call1 (Qreplace_buffer_in_windows, buffer);
}
/* Safely replace BUFFER with some other buffer in all windows of all
frames, even those on other keyboards. */
/* If BUFFER is shown in a window, safely replace it with some other
buffer in all windows of all frames, even those on other keyboards. */
void
replace_buffer_in_windows_safely (Lisp_Object buffer)
{
Lisp_Object tail, frame;
if (buffer_window_count (XBUFFER (buffer)))
{
Lisp_Object tail, frame;
/* A single call to window_loop won't do the job because it only
considers frames on the current keyboard. So loop manually over
frames, and handle each one. */
FOR_EACH_FRAME (tail, frame)
window_loop (REPLACE_BUFFER_IN_WINDOWS_SAFELY, buffer, 1, frame);
/* A single call to window_loop won't do the job because it only
considers frames on the current keyboard. So loop manually over
frames, and handle each one. */
FOR_EACH_FRAME (tail, frame)
window_loop (REPLACE_BUFFER_IN_WINDOWS_SAFELY, buffer, 1, frame);
}
}
/* If *ROWS or *COLS are too small a size for FRAME, set them to the
minimum allowable size. */
@ -3338,11 +3340,11 @@ displaying that buffer. */)
if (STRINGP (object))
object = Fget_buffer (object);
if (BUFFERP (object) && BUFFER_LIVE_P (XBUFFER (object)))
if (BUFFERP (object) && BUFFER_LIVE_P (XBUFFER (object))
&& buffer_window_count (XBUFFER (object)))
{
/* Walk all windows looking for buffer, and force update
of each of those windows. */
/* If buffer is live and shown in at least one window, find
all windows showing this buffer and force update of them. */
object = window_loop (REDISPLAY_BUFFER_WINDOWS, object, 0, Qvisible);
return NILP (object) ? Qnil : Qt;
}