]> code.delx.au - gnu-emacs/commitdiff
* buffer.c (Fset_buffer_multibyte): Do not force redisplay
authorDmitry Antipov <dmantipov@yandex.ru>
Tue, 11 Dec 2012 09:51:12 +0000 (13:51 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Tue, 11 Dec 2012 09:51:12 +0000 (13:51 +0400)
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.

src/ChangeLog
src/buffer.c
src/insdel.c
src/window.c

index 3472dbec6115e5bfce15cf8f3c2da7b31ceba638..9d9002ed77b034e4d4dc66cdbc0cec4a0b239752 100644 (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
index 1194431841a055c8e1eb8b6ccf9f9ca57160fb2c..748422df73adf054f9849e25b4a017b9642ac99c 100644 (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.  */
index 5803a48e949dcb843db47b3f8a6f12926103bb1e..74e938c4b8c4e5a83ae0f83f9f6e20ec79a5bf73 100644 (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))
index 17489cb95e906ad3811e267d31719993865200b5..f696e3c2a1b83df7ebac6f6abe9784bb6c07b7eb 100644 (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);
+    }
 }
-\f
+
 /* 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;
     }