diff --git a/src/ChangeLog b/src/ChangeLog index 3472dbec611..9d9002ed77b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2012-12-11 Dmitry Antipov + + * 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 * inotify.c (Finotify_add_watch): Rename decoded_file_name to diff --git a/src/buffer.c b/src/buffer.c index 1194431841a..748422df73a 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -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. */ diff --git a/src/insdel.c b/src/insdel.c index 5803a48e949..74e938c4b8c 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -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)) diff --git a/src/window.c b/src/window.c index 17489cb95e9..f696e3c2a1b 100644 --- a/src/window.c +++ b/src/window.c @@ -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; }