emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] /srv/bzr/emacs/trunk r105866: Rewrite code quitting window


From: martin rudalics
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r105866: Rewrite code quitting windows and restoring the previous buffer.
Date: Wed, 21 Sep 2011 10:20:21 +0200
User-agent: Bazaar (2.3.1)

------------------------------------------------------------
revno: 105866
committer: martin rudalics <address@hidden>
branch nick: trunk
timestamp: Wed 2011-09-21 10:20:21 +0200
message:
  Rewrite code quitting windows and restoring the previous buffer.
  
  * window.el (set-window-buffer-start-and-point): Call
  set-window-start with NOFORCE argument t.  Suggested by Thierry
  Volpiatto <address@hidden>.
  (quit-window): Reword doc-string.  Handle new format of
  quit-restore parameter.  Don't delete window if it has a
  previous buffer we can show instead of the present one.
  (display-buffer-record-window): Rewrite using a new format for
  the quit-restore window parameter
  (special-display-popup-frame, display-buffer-same-window)
  (display-buffer-reuse-window, display-buffer-pop-up-frame)
  (display-buffer-pop-up-window, display-buffer-use-some-window):
  Adapt symbol passed to display-buffer-record-window.
  * help.el (help-window-setup): Handle new format of quit-restore
  parameter.
modified:
  lisp/ChangeLog
  lisp/help.el
  lisp/window.el
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2011-09-21 01:31:53 +0000
+++ b/lisp/ChangeLog    2011-09-21 08:20:21 +0000
@@ -1,3 +1,20 @@
+2011-09-21  Martin Rudalics  <address@hidden>
+
+       * window.el (set-window-buffer-start-and-point): Call
+       set-window-start with NOFORCE argument t.  Suggested by Thierry
+       Volpiatto <address@hidden>.
+       (quit-window): Reword doc-string.  Handle new format of
+       quit-restore parameter.  Don't delete window if it has a
+       previous buffer we can show instead of the present one.
+       (display-buffer-record-window): Rewrite using a new format for
+       the quit-restore window parameter
+       (special-display-popup-frame, display-buffer-same-window)
+       (display-buffer-reuse-window, display-buffer-pop-up-frame)
+       (display-buffer-pop-up-window, display-buffer-use-some-window):
+       Adapt symbol passed to display-buffer-record-window.
+       * help.el (help-window-setup): Handle new format of quit-restore
+       parameter.
+
 2011-09-21  Stefan Monnier  <address@hidden>
 
        * faces.el (face-list): Fix docstring (bug#9564).

=== modified file 'lisp/help.el'
--- a/lisp/help.el      2011-09-14 09:17:30 +0000
+++ b/lisp/help.el      2011-09-21 08:20:21 +0000
@@ -1066,7 +1066,7 @@
   (let* ((help-buffer (when (window-live-p help-window)
                        (window-buffer help-window)))
         (help-setup (when (window-live-p help-window)
-                      (window-parameter help-window 'help-setup))))
+                      (car (window-parameter help-window 'quit-restore)))))
     (when help-buffer
       ;; Handle `help-window-point-marker'.
       (when (eq (marker-buffer help-window-point-marker) help-buffer)
@@ -1077,7 +1077,7 @@
       (cond
        ((or (eq help-window (selected-window))
            (and (or (eq help-window-select t)
-                    (eq help-setup 'new-frame)
+                    (eq help-setup 'frame)
                     (and (eq help-window-select 'other)
                          (eq (window-frame help-window) (selected-frame))
                          (> (length (window-list nil 'no-mini)) 2)))
@@ -1085,12 +1085,12 @@
        ;; The help window is or gets selected ...
        (help-window-display-message
         (cond
-         ((eq help-setup 'new-window)
+         ((eq help-setup 'window)
           ;; ... and is new, ...
           "Type \"q\" to delete help window")
-         ((eq help-setup 'new-frame)
+         ((eq help-setup 'frame)
           "Type \"q\" to delete help frame")
-         ((eq help-setup 'reuse-other)
+         ((eq help-setup 'other)
           ;; ... or displayed some other buffer before.
           "Type \"q\" to restore previous buffer"))
         help-window t))
@@ -1100,19 +1100,19 @@
        ;; other one is the selected one.
        (help-window-display-message
         (cond
-         ((eq help-setup 'new-window)
+         ((eq help-setup 'window)
           "Type \\[delete-other-windows] to delete the help window")
-         ((eq help-setup 'reuse-other)
+         ((eq help-setup 'other)
           "Type \"q\" in help window to restore its previous buffer"))
         help-window 'other))
        (t
        ;; The help window is not selected ...
        (help-window-display-message
         (cond
-         ((eq help-setup 'new-window)
+         ((eq help-setup 'window)
           ;; ... and is new, ...
           "Type \"q\" in help window to delete it")
-         ((eq help-setup 'reuse-other)
+         ((eq help-setup 'other)
           ;; ... or displayed some other buffer before.
           "Type \"q\" in help window to restore previous buffer"))
         help-window))))))

=== modified file 'lisp/window.el'
--- a/lisp/window.el    2011-09-21 01:30:35 +0000
+++ b/lisp/window.el    2011-09-21 08:20:21 +0000
@@ -2531,7 +2531,8 @@
     (when (and selected current)
       (set-buffer buffer))
     (when start
-      (set-window-start window start))
+      ;; Don't force window-start here (even if POINT is nil).
+      (set-window-start window start t))
     (when point
       (if selected
          (with-current-buffer buffer
@@ -2868,8 +2869,9 @@
 
 (defun quit-window (&optional kill window)
   "Quit WINDOW and bury its buffer.
-WINDOW defaults to the selected window.
-With a prefix argument, kill the buffer instead.
+WINDOW must be a live window and defaults to the selected one.
+With prefix argument KILL non-nil, kill the buffer instead of
+burying it.
 
 According to information stored in WINDOW's `quit-restore' window
 parameter either \(1) delete WINDOW and its frame, \(2) delete
@@ -2878,50 +2880,62 @@
 one.  If non-nil, reset `quit-restore' parameter to nil."
   (interactive "P")
   (setq window (window-normalize-live-window window))
-  (let ((buffer (window-buffer window))
-       (quit-restore (window-parameter window 'quit-restore))
-       resize)
+  (let* ((buffer (window-buffer window))
+        (quit-restore (window-parameter window 'quit-restore))
+        (prev-buffer
+         (let* ((prev-buffers (window-prev-buffers window))
+                (prev-buffer (caar prev-buffers)))
+           (and (or (not (eq prev-buffer buffer))
+                    (and (cdr prev-buffers)
+                         (not (eq (setq prev-buffer (cadr prev-buffers))
+                                  buffer))))
+                prev-buffer)))
+        quad resize)
     (cond
-     ((and (eq (car-safe quit-restore) 'new-frame)
-          (eq (nth 1 quit-restore) (window-buffer window))
-          (eq (window-deletable-p window) 'frame))
+     ((and (not prev-buffer)
+          (eq (nth 1 quit-restore) 'frame)
+          (eq (window-deletable-p window) 'frame)
+          (eq (nth 3 quit-restore) buffer))
       ;; WINDOW's frame can be deleted.
       (delete-frame (window-frame window))
       ;; If the previously selected window is still alive, select it.
       (when (window-live-p (nth 2 quit-restore))
        (select-window (nth 2 quit-restore))))
-     ((and (eq (car-safe quit-restore) 'new-window)
-          (eq (nth 1 quit-restore) (window-buffer window))
-          (eq (window-deletable-p window) t))
-      ;; WINDOW's can be deleted.
+     ((and (not prev-buffer)
+          (eq (nth 1 quit-restore) 'window)
+          (eq (window-deletable-p window) t)
+          (eq (nth 3 quit-restore) buffer))
+      ;; WINDOW can be deleted.
       (delete-window window)
       ;; If the previously selected window is still alive, select it.
       (when (window-live-p (nth 2 quit-restore))
        (select-window (nth 2 quit-restore))))
-     ((and (buffer-live-p (nth 0 quit-restore))
-          ;; The buffer currently shown in WINDOW must still be the
-          ;; buffer shown when its `quit-restore' parameter was created
-          ;; in the first place.
-          (eq (window-buffer window) (nth 3 quit-restore)))
-      (setq resize (with-current-buffer buffer temp-buffer-resize-mode))
+     ((and (listp (setq quad (nth 1 quit-restore)))
+          (buffer-live-p (car quad))
+          (eq (nth 3 quit-restore) buffer))
+      ;; Show another buffer stored in quit-restore parameter.
+      (setq resize (with-current-buffer buffer
+                    (and temp-buffer-resize-mode
+                         (/= (nth 3 quad) (window-total-size window)))))
       (unrecord-window-buffer window buffer)
-      ;; Display buffer stored in the quit-restore parameter.
       (set-window-dedicated-p window nil)
-      (set-window-buffer window (nth 0 quit-restore))
-      (set-window-start window (nth 1 quit-restore))
-      (set-window-point window (nth 2 quit-restore))
-      (and resize
-          (/= (nth 4 quit-restore) (window-total-size window))
-          (window-resize window
-                         (- (nth 4 quit-restore)
-                            (window-total-size window))))
+      (when resize
+       ;; Try to resize WINDOW to its old height but don't signal an
+       ;; error.
+       (condition-case nil
+           (window-resize window (- (nth 3 quad) (window-total-size window)))
+         (error nil)))
+      ;; Restore WINDOW's previous buffer, window start and point.
+      (set-window-buffer-start-and-point
+       window (nth 0 quad) (nth 1 quad) (nth 2 quad))
       ;; Reset the quit-restore parameter.
       (set-window-parameter window 'quit-restore nil)
-      (when (window-live-p (nth 5 quit-restore))
-       (select-window (nth 5 quit-restore))))
+      ;; Select old window.
+      (when (window-live-p (nth 2 quit-restore))
+       (select-window (nth 2 quit-restore))))
      (t
-      ;; Otherwise, show another buffer in WINDOW and reset the
-      ;; quit-restore parameter.
+      ;; Show some other buffer in WINDOW and reset the quit-restore
+      ;; parameter.
       (set-window-parameter window 'quit-restore nil)
       (switch-to-prev-buffer window 'bury-or-kill)))
 
@@ -3787,39 +3801,48 @@
 
 (defun display-buffer-record-window (type window buffer)
   "Record information for window used by `display-buffer'.
-TYPE must be one of the symbols reuse-window, pop-up-window, or
-pop-up-frame.  WINDOW is the window used for or created by the
-`display-buffer' routines.  BUFFER is the buffer that shall be
-displayed."
+TYPE specifies the type of the calling operation and must be one
+of the symbols 'reuse \(when WINDOW existed already and was
+reused for displaying BUFFER), 'window \(when WINDOW was created
+on an already existing frame), or 'frame \(when WINDOW was
+created on a new frame). WINDOW is the window used for or created
+by the `display-buffer' routines.  BUFFER is the buffer that
+shall be displayed.
+
+This function installs or updates the quit-restore parameter of
+WINDOW.  The quit-restore parameter is a list of four elements:
+The first element is one of the symbols 'window, 'frame, 'same or
+'other.  The second element is either one of the symbols 'window
+or 'frame or a list whose elements are the buffer previously
+shown in the window, that buffer's window start and window point,
+and the window's height.  The third element is the window
+selected at the time the parameter was created.  The fourth
+element is BUFFER."
   (cond
-   ((eq type 'reuse-window)
-    ;; In `help-setup' window parameter record whether we used a window
-    ;; on the same buffer or another one.
-    (set-window-parameter
-     window 'help-setup
-     (if (eq (window-buffer window) buffer) 'reuse-same 'reuse-other))
-    ;; In `quit-restore' parameter record information about the old
-    ;; buffer unless such information exists already.
-    (unless (window-parameter window 'quit-restore)
+   ((eq type 'reuse)
+    (if (eq (window-buffer window) buffer)
+       ;; WINDOW shows BUFFER already.
+       (when (consp (window-parameter window 'quit-restore))
+         ;; If WINDOW has a quit-restore parameter, reset its car.
+         (setcar (window-parameter window 'quit-restore) 'same))
+      ;; WINDOW shows another buffer.
       (set-window-parameter
        window 'quit-restore
-       (list (window-buffer window) (window-start window)
-            (window-point window) buffer
-            (window-total-size window) (selected-window)))))
-   ((eq type 'pop-up-window)
-    ;; In `help-setup' window parameter record window as new.
-    (set-window-parameter window 'help-setup 'new-window)
-    ;; In `quit-restore' parameter record that we popped up this window,
-    ;; its buffer, and which window was selected before.
-    (set-window-parameter
-     window 'quit-restore (list 'new-window buffer (selected-window))))
-   ((eq type 'pop-up-frame)
-    ;; In `help-setup' window parameter record window as on new frame.
-    (set-window-parameter window 'help-setup 'new-frame)
-    ;; In `quit-restore' parameter record that we popped up this window
-    ;; on a new frame, the buffer, and which window was selected before.
-    (set-window-parameter
-     window 'quit-restore (list 'new-frame buffer (selected-window))))))
+       (list 'other
+            ;; A quadruple of WINDOW's buffer, start, point and height.
+            (list (window-buffer window) (window-start window)
+                  (window-point window) (window-total-size window))
+            (selected-window) buffer))))
+   ((eq type 'window)
+    ;; WINDOW has been created on an existing frame.
+    (set-window-parameter
+     window 'quit-restore
+     (list 'window 'window (selected-window) buffer)))
+   ((eq type 'frame)
+    ;; WINDOW has been created on a new frame.
+    (set-window-parameter
+     window 'quit-restore
+     (list 'frame 'frame (selected-window) buffer)))))
 
 (defcustom display-buffer-function nil
   "If non-nil, function to call to handle `display-buffer'.
@@ -4065,7 +4088,7 @@
         (let ((frame (window-frame window)))
           (make-frame-visible frame)
           (raise-frame frame)
-          (display-buffer-record-window 'reuse-window window buffer)
+          (display-buffer-record-window 'reuse window buffer)
           window))
        ;; Reuse the current window if the user requested it.
        (when (cdr (assq 'same-window args))
@@ -4083,7 +4106,7 @@
              (with-current-buffer buffer
                (make-frame (append args special-display-frame-alist)))))
         (display-buffer-record-window
-         'pop-up-frame (frame-selected-window frame) buffer)
+         'frame (frame-selected-window frame) buffer)
         (set-window-buffer (frame-selected-window frame) buffer)
         (set-window-dedicated-p (frame-selected-window frame) t)
         (frame-selected-window frame))))))
@@ -4644,7 +4667,7 @@
   (unless (or (cdr (assq 'inhibit-same-window alist))
              (window-minibuffer-p)
              (window-dedicated-p))
-    (display-buffer-record-window 'reuse-window (selected-window) buffer)
+    (display-buffer-record-window 'reuse (selected-window) buffer)
     (window--display-buffer-2 buffer (selected-window))))
 
 (defun display-buffer--maybe-same-window (buffer alist)
@@ -4689,7 +4712,7 @@
                              (get-buffer-window-list buffer 'nomini
                                                      frames))))))
     (when window
-      (display-buffer-record-window 'reuse-window window buffer)
+      (display-buffer-record-window 'reuse window buffer)
       (window--display-buffer-1 window))))
 
 (defun display-buffer--special (buffer alist)
@@ -4713,7 +4736,7 @@
     (when (and fun
               (setq frame (funcall fun))
               (setq window (frame-selected-window frame)))
-      (display-buffer-record-window 'pop-up-frame window buffer)
+      (display-buffer-record-window 'frame window buffer)
       (window--display-buffer-2 buffer window)
       ;; Reset list of WINDOW's previous buffers to nil.
       (set-window-prev-buffers window nil)
@@ -4739,7 +4762,7 @@
                                 (get-largest-window frame t))
                                (window--try-to-split-window
                                 (get-lru-window frame t)))))
-      (display-buffer-record-window 'pop-up-window window buffer)
+      (display-buffer-record-window 'window window buffer)
       (window--display-buffer-2 buffer window)
       ;; Reset list of WINDOW's previous buffers to nil.
       (set-window-prev-buffers window nil)
@@ -4793,7 +4816,7 @@
        ;; Restore dedicated status of selected window.
        (set-window-dedicated-p window-to-undedicate nil)))
     (when window
-      (display-buffer-record-window 'reuse-window window buffer)
+      (display-buffer-record-window 'reuse window buffer)
       (window--even-window-heights window)
       (window--display-buffer-2 buffer window))))
 


reply via email to

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