aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Rudalics2011-09-21 10:20:21 +0200
committerMartin Rudalics2011-09-21 10:20:21 +0200
commitcf4eacfdca9685473374498e17ace141d71c9ad9 (patch)
tree6b15976a360657769ca615a73be5eab2adf128a6
parent3341db6299a2bb63a641210d72f73e93e2d1542e (diff)
downloademacs-cf4eacfdca9685473374498e17ace141d71c9ad9.tar.gz
emacs-cf4eacfdca9685473374498e17ace141d71c9ad9.zip
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 <thierry.volpiatto@gmail.com>. (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.
-rw-r--r--lisp/ChangeLog17
-rw-r--r--lisp/help.el18
-rw-r--r--lisp/window.el157
3 files changed, 116 insertions, 76 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 17a8628b3d5..9b90ea1a98e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,20 @@
12011-09-21 Martin Rudalics <rudalics@gmx.at>
2
3 * window.el (set-window-buffer-start-and-point): Call
4 set-window-start with NOFORCE argument t. Suggested by Thierry
5 Volpiatto <thierry.volpiatto@gmail.com>.
6 (quit-window): Reword doc-string. Handle new format of
7 quit-restore parameter. Don't delete window if it has a
8 previous buffer we can show instead of the present one.
9 (display-buffer-record-window): Rewrite using a new format for
10 the quit-restore window parameter
11 (special-display-popup-frame, display-buffer-same-window)
12 (display-buffer-reuse-window, display-buffer-pop-up-frame)
13 (display-buffer-pop-up-window, display-buffer-use-some-window):
14 Adapt symbol passed to display-buffer-record-window.
15 * help.el (help-window-setup): Handle new format of quit-restore
16 parameter.
17
12011-09-21 Stefan Monnier <monnier@iro.umontreal.ca> 182011-09-21 Stefan Monnier <monnier@iro.umontreal.ca>
2 19
3 * faces.el (face-list): Fix docstring (bug#9564). 20 * faces.el (face-list): Fix docstring (bug#9564).
diff --git a/lisp/help.el b/lisp/help.el
index 0c8d67106d3..f4338c28ffb 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -1066,7 +1066,7 @@ HELP-WINDOW is the window used for displaying the help buffer."
1066 (let* ((help-buffer (when (window-live-p help-window) 1066 (let* ((help-buffer (when (window-live-p help-window)
1067 (window-buffer help-window))) 1067 (window-buffer help-window)))
1068 (help-setup (when (window-live-p help-window) 1068 (help-setup (when (window-live-p help-window)
1069 (window-parameter help-window 'help-setup)))) 1069 (car (window-parameter help-window 'quit-restore)))))
1070 (when help-buffer 1070 (when help-buffer
1071 ;; Handle `help-window-point-marker'. 1071 ;; Handle `help-window-point-marker'.
1072 (when (eq (marker-buffer help-window-point-marker) help-buffer) 1072 (when (eq (marker-buffer help-window-point-marker) help-buffer)
@@ -1077,7 +1077,7 @@ HELP-WINDOW is the window used for displaying the help buffer."
1077 (cond 1077 (cond
1078 ((or (eq help-window (selected-window)) 1078 ((or (eq help-window (selected-window))
1079 (and (or (eq help-window-select t) 1079 (and (or (eq help-window-select t)
1080 (eq help-setup 'new-frame) 1080 (eq help-setup 'frame)
1081 (and (eq help-window-select 'other) 1081 (and (eq help-window-select 'other)
1082 (eq (window-frame help-window) (selected-frame)) 1082 (eq (window-frame help-window) (selected-frame))
1083 (> (length (window-list nil 'no-mini)) 2))) 1083 (> (length (window-list nil 'no-mini)) 2)))
@@ -1085,12 +1085,12 @@ HELP-WINDOW is the window used for displaying the help buffer."
1085 ;; The help window is or gets selected ... 1085 ;; The help window is or gets selected ...
1086 (help-window-display-message 1086 (help-window-display-message
1087 (cond 1087 (cond
1088 ((eq help-setup 'new-window) 1088 ((eq help-setup 'window)
1089 ;; ... and is new, ... 1089 ;; ... and is new, ...
1090 "Type \"q\" to delete help window") 1090 "Type \"q\" to delete help window")
1091 ((eq help-setup 'new-frame) 1091 ((eq help-setup 'frame)
1092 "Type \"q\" to delete help frame") 1092 "Type \"q\" to delete help frame")
1093 ((eq help-setup 'reuse-other) 1093 ((eq help-setup 'other)
1094 ;; ... or displayed some other buffer before. 1094 ;; ... or displayed some other buffer before.
1095 "Type \"q\" to restore previous buffer")) 1095 "Type \"q\" to restore previous buffer"))
1096 help-window t)) 1096 help-window t))
@@ -1100,19 +1100,19 @@ HELP-WINDOW is the window used for displaying the help buffer."
1100 ;; other one is the selected one. 1100 ;; other one is the selected one.
1101 (help-window-display-message 1101 (help-window-display-message
1102 (cond 1102 (cond
1103 ((eq help-setup 'new-window) 1103 ((eq help-setup 'window)
1104 "Type \\[delete-other-windows] to delete the help window") 1104 "Type \\[delete-other-windows] to delete the help window")
1105 ((eq help-setup 'reuse-other) 1105 ((eq help-setup 'other)
1106 "Type \"q\" in help window to restore its previous buffer")) 1106 "Type \"q\" in help window to restore its previous buffer"))
1107 help-window 'other)) 1107 help-window 'other))
1108 (t 1108 (t
1109 ;; The help window is not selected ... 1109 ;; The help window is not selected ...
1110 (help-window-display-message 1110 (help-window-display-message
1111 (cond 1111 (cond
1112 ((eq help-setup 'new-window) 1112 ((eq help-setup 'window)
1113 ;; ... and is new, ... 1113 ;; ... and is new, ...
1114 "Type \"q\" in help window to delete it") 1114 "Type \"q\" in help window to delete it")
1115 ((eq help-setup 'reuse-other) 1115 ((eq help-setup 'other)
1116 ;; ... or displayed some other buffer before. 1116 ;; ... or displayed some other buffer before.
1117 "Type \"q\" in help window to restore previous buffer")) 1117 "Type \"q\" in help window to restore previous buffer"))
1118 help-window)))))) 1118 help-window))))))
diff --git a/lisp/window.el b/lisp/window.el
index 50b8e7345c3..ffbe710593e 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -2531,7 +2531,8 @@ before was current this also makes BUFFER the current buffer."
2531 (when (and selected current) 2531 (when (and selected current)
2532 (set-buffer buffer)) 2532 (set-buffer buffer))
2533 (when start 2533 (when start
2534 (set-window-start window start)) 2534 ;; Don't force window-start here (even if POINT is nil).
2535 (set-window-start window start t))
2535 (when point 2536 (when point
2536 (if selected 2537 (if selected
2537 (with-current-buffer buffer 2538 (with-current-buffer buffer
@@ -2868,8 +2869,9 @@ all window-local buffer lists."
2868 2869
2869(defun quit-window (&optional kill window) 2870(defun quit-window (&optional kill window)
2870 "Quit WINDOW and bury its buffer. 2871 "Quit WINDOW and bury its buffer.
2871WINDOW defaults to the selected window. 2872WINDOW must be a live window and defaults to the selected one.
2872With a prefix argument, kill the buffer instead. 2873With prefix argument KILL non-nil, kill the buffer instead of
2874burying it.
2873 2875
2874According to information stored in WINDOW's `quit-restore' window 2876According to information stored in WINDOW's `quit-restore' window
2875parameter either \(1) delete WINDOW and its frame, \(2) delete 2877parameter either \(1) delete WINDOW and its frame, \(2) delete
@@ -2878,50 +2880,62 @@ or \(4) make WINDOW display some other buffer than the present
2878one. If non-nil, reset `quit-restore' parameter to nil." 2880one. If non-nil, reset `quit-restore' parameter to nil."
2879 (interactive "P") 2881 (interactive "P")
2880 (setq window (window-normalize-live-window window)) 2882 (setq window (window-normalize-live-window window))
2881 (let ((buffer (window-buffer window)) 2883 (let* ((buffer (window-buffer window))
2882 (quit-restore (window-parameter window 'quit-restore)) 2884 (quit-restore (window-parameter window 'quit-restore))
2883 resize) 2885 (prev-buffer
2886 (let* ((prev-buffers (window-prev-buffers window))
2887 (prev-buffer (caar prev-buffers)))
2888 (and (or (not (eq prev-buffer buffer))
2889 (and (cdr prev-buffers)
2890 (not (eq (setq prev-buffer (cadr prev-buffers))
2891 buffer))))
2892 prev-buffer)))
2893 quad resize)
2884 (cond 2894 (cond
2885 ((and (eq (car-safe quit-restore) 'new-frame) 2895 ((and (not prev-buffer)
2886 (eq (nth 1 quit-restore) (window-buffer window)) 2896 (eq (nth 1 quit-restore) 'frame)
2887 (eq (window-deletable-p window) 'frame)) 2897 (eq (window-deletable-p window) 'frame)
2898 (eq (nth 3 quit-restore) buffer))
2888 ;; WINDOW's frame can be deleted. 2899 ;; WINDOW's frame can be deleted.
2889 (delete-frame (window-frame window)) 2900 (delete-frame (window-frame window))
2890 ;; If the previously selected window is still alive, select it. 2901 ;; If the previously selected window is still alive, select it.
2891 (when (window-live-p (nth 2 quit-restore)) 2902 (when (window-live-p (nth 2 quit-restore))
2892 (select-window (nth 2 quit-restore)))) 2903 (select-window (nth 2 quit-restore))))
2893 ((and (eq (car-safe quit-restore) 'new-window) 2904 ((and (not prev-buffer)
2894 (eq (nth 1 quit-restore) (window-buffer window)) 2905 (eq (nth 1 quit-restore) 'window)
2895 (eq (window-deletable-p window) t)) 2906 (eq (window-deletable-p window) t)
2896 ;; WINDOW's can be deleted. 2907 (eq (nth 3 quit-restore) buffer))
2908 ;; WINDOW can be deleted.
2897 (delete-window window) 2909 (delete-window window)
2898 ;; If the previously selected window is still alive, select it. 2910 ;; If the previously selected window is still alive, select it.
2899 (when (window-live-p (nth 2 quit-restore)) 2911 (when (window-live-p (nth 2 quit-restore))
2900 (select-window (nth 2 quit-restore)))) 2912 (select-window (nth 2 quit-restore))))
2901 ((and (buffer-live-p (nth 0 quit-restore)) 2913 ((and (listp (setq quad (nth 1 quit-restore)))
2902 ;; The buffer currently shown in WINDOW must still be the 2914 (buffer-live-p (car quad))
2903 ;; buffer shown when its `quit-restore' parameter was created 2915 (eq (nth 3 quit-restore) buffer))
2904 ;; in the first place. 2916 ;; Show another buffer stored in quit-restore parameter.
2905 (eq (window-buffer window) (nth 3 quit-restore))) 2917 (setq resize (with-current-buffer buffer
2906 (setq resize (with-current-buffer buffer temp-buffer-resize-mode)) 2918 (and temp-buffer-resize-mode
2919 (/= (nth 3 quad) (window-total-size window)))))
2907 (unrecord-window-buffer window buffer) 2920 (unrecord-window-buffer window buffer)
2908 ;; Display buffer stored in the quit-restore parameter.
2909 (set-window-dedicated-p window nil) 2921 (set-window-dedicated-p window nil)
2910 (set-window-buffer window (nth 0 quit-restore)) 2922 (when resize
2911 (set-window-start window (nth 1 quit-restore)) 2923 ;; Try to resize WINDOW to its old height but don't signal an
2912 (set-window-point window (nth 2 quit-restore)) 2924 ;; error.
2913 (and resize 2925 (condition-case nil
2914 (/= (nth 4 quit-restore) (window-total-size window)) 2926 (window-resize window (- (nth 3 quad) (window-total-size window)))
2915 (window-resize window 2927 (error nil)))
2916 (- (nth 4 quit-restore) 2928 ;; Restore WINDOW's previous buffer, window start and point.
2917 (window-total-size window)))) 2929 (set-window-buffer-start-and-point
2930 window (nth 0 quad) (nth 1 quad) (nth 2 quad))
2918 ;; Reset the quit-restore parameter. 2931 ;; Reset the quit-restore parameter.
2919 (set-window-parameter window 'quit-restore nil) 2932 (set-window-parameter window 'quit-restore nil)
2920 (when (window-live-p (nth 5 quit-restore)) 2933 ;; Select old window.
2921 (select-window (nth 5 quit-restore)))) 2934 (when (window-live-p (nth 2 quit-restore))
2935 (select-window (nth 2 quit-restore))))
2922 (t 2936 (t
2923 ;; Otherwise, show another buffer in WINDOW and reset the 2937 ;; Show some other buffer in WINDOW and reset the quit-restore
2924 ;; quit-restore parameter. 2938 ;; parameter.
2925 (set-window-parameter window 'quit-restore nil) 2939 (set-window-parameter window 'quit-restore nil)
2926 (switch-to-prev-buffer window 'bury-or-kill))) 2940 (switch-to-prev-buffer window 'bury-or-kill)))
2927 2941
@@ -3787,39 +3801,48 @@ subwindows can get as small as `window-safe-min-height' and
3787 3801
3788(defun display-buffer-record-window (type window buffer) 3802(defun display-buffer-record-window (type window buffer)
3789 "Record information for window used by `display-buffer'. 3803 "Record information for window used by `display-buffer'.
3790TYPE must be one of the symbols reuse-window, pop-up-window, or 3804TYPE specifies the type of the calling operation and must be one
3791pop-up-frame. WINDOW is the window used for or created by the 3805of the symbols 'reuse \(when WINDOW existed already and was
3792`display-buffer' routines. BUFFER is the buffer that shall be 3806reused for displaying BUFFER), 'window \(when WINDOW was created
3793displayed." 3807on an already existing frame), or 'frame \(when WINDOW was
3808created on a new frame). WINDOW is the window used for or created
3809by the `display-buffer' routines. BUFFER is the buffer that
3810shall be displayed.
3811
3812This function installs or updates the quit-restore parameter of
3813WINDOW. The quit-restore parameter is a list of four elements:
3814The first element is one of the symbols 'window, 'frame, 'same or
3815'other. The second element is either one of the symbols 'window
3816or 'frame or a list whose elements are the buffer previously
3817shown in the window, that buffer's window start and window point,
3818and the window's height. The third element is the window
3819selected at the time the parameter was created. The fourth
3820element is BUFFER."
3794 (cond 3821 (cond
3795 ((eq type 'reuse-window) 3822 ((eq type 'reuse)
3796 ;; In `help-setup' window parameter record whether we used a window 3823 (if (eq (window-buffer window) buffer)
3797 ;; on the same buffer or another one. 3824 ;; WINDOW shows BUFFER already.
3798 (set-window-parameter 3825 (when (consp (window-parameter window 'quit-restore))
3799 window 'help-setup 3826 ;; If WINDOW has a quit-restore parameter, reset its car.
3800 (if (eq (window-buffer window) buffer) 'reuse-same 'reuse-other)) 3827 (setcar (window-parameter window 'quit-restore) 'same))
3801 ;; In `quit-restore' parameter record information about the old 3828 ;; WINDOW shows another buffer.
3802 ;; buffer unless such information exists already.
3803 (unless (window-parameter window 'quit-restore)
3804 (set-window-parameter 3829 (set-window-parameter
3805 window 'quit-restore 3830 window 'quit-restore
3806 (list (window-buffer window) (window-start window) 3831 (list 'other
3807 (window-point window) buffer 3832 ;; A quadruple of WINDOW's buffer, start, point and height.
3808 (window-total-size window) (selected-window))))) 3833 (list (window-buffer window) (window-start window)
3809 ((eq type 'pop-up-window) 3834 (window-point window) (window-total-size window))
3810 ;; In `help-setup' window parameter record window as new. 3835 (selected-window) buffer))))
3811 (set-window-parameter window 'help-setup 'new-window) 3836 ((eq type 'window)
3812 ;; In `quit-restore' parameter record that we popped up this window, 3837 ;; WINDOW has been created on an existing frame.
3813 ;; its buffer, and which window was selected before.
3814 (set-window-parameter 3838 (set-window-parameter
3815 window 'quit-restore (list 'new-window buffer (selected-window)))) 3839 window 'quit-restore
3816 ((eq type 'pop-up-frame) 3840 (list 'window 'window (selected-window) buffer)))
3817 ;; In `help-setup' window parameter record window as on new frame. 3841 ((eq type 'frame)
3818 (set-window-parameter window 'help-setup 'new-frame) 3842 ;; WINDOW has been created on a new frame.
3819 ;; In `quit-restore' parameter record that we popped up this window
3820 ;; on a new frame, the buffer, and which window was selected before.
3821 (set-window-parameter 3843 (set-window-parameter
3822 window 'quit-restore (list 'new-frame buffer (selected-window)))))) 3844 window 'quit-restore
3845 (list 'frame 'frame (selected-window) buffer)))))
3823 3846
3824(defcustom display-buffer-function nil 3847(defcustom display-buffer-function nil
3825 "If non-nil, function to call to handle `display-buffer'. 3848 "If non-nil, function to call to handle `display-buffer'.
@@ -4065,7 +4088,7 @@ and (cdr ARGS) as second."
4065 (let ((frame (window-frame window))) 4088 (let ((frame (window-frame window)))
4066 (make-frame-visible frame) 4089 (make-frame-visible frame)
4067 (raise-frame frame) 4090 (raise-frame frame)
4068 (display-buffer-record-window 'reuse-window window buffer) 4091 (display-buffer-record-window 'reuse window buffer)
4069 window)) 4092 window))
4070 ;; Reuse the current window if the user requested it. 4093 ;; Reuse the current window if the user requested it.
4071 (when (cdr (assq 'same-window args)) 4094 (when (cdr (assq 'same-window args))
@@ -4083,7 +4106,7 @@ and (cdr ARGS) as second."
4083 (with-current-buffer buffer 4106 (with-current-buffer buffer
4084 (make-frame (append args special-display-frame-alist))))) 4107 (make-frame (append args special-display-frame-alist)))))
4085 (display-buffer-record-window 4108 (display-buffer-record-window
4086 'pop-up-frame (frame-selected-window frame) buffer) 4109 'frame (frame-selected-window frame) buffer)
4087 (set-window-buffer (frame-selected-window frame) buffer) 4110 (set-window-buffer (frame-selected-window frame) buffer)
4088 (set-window-dedicated-p (frame-selected-window frame) t) 4111 (set-window-dedicated-p (frame-selected-window frame) t)
4089 (frame-selected-window frame)))))) 4112 (frame-selected-window frame))))))
@@ -4644,7 +4667,7 @@ selected window."
4644 (unless (or (cdr (assq 'inhibit-same-window alist)) 4667 (unless (or (cdr (assq 'inhibit-same-window alist))
4645 (window-minibuffer-p) 4668 (window-minibuffer-p)
4646 (window-dedicated-p)) 4669 (window-dedicated-p))
4647 (display-buffer-record-window 'reuse-window (selected-window) buffer) 4670 (display-buffer-record-window 'reuse (selected-window) buffer)
4648 (window--display-buffer-2 buffer (selected-window)))) 4671 (window--display-buffer-2 buffer (selected-window))))
4649 4672
4650(defun display-buffer--maybe-same-window (buffer alist) 4673(defun display-buffer--maybe-same-window (buffer alist)
@@ -4689,7 +4712,7 @@ terminal if either of those variables is non-nil."
4689 (get-buffer-window-list buffer 'nomini 4712 (get-buffer-window-list buffer 'nomini
4690 frames)))))) 4713 frames))))))
4691 (when window 4714 (when window
4692 (display-buffer-record-window 'reuse-window window buffer) 4715 (display-buffer-record-window 'reuse window buffer)
4693 (window--display-buffer-1 window)))) 4716 (window--display-buffer-1 window))))
4694 4717
4695(defun display-buffer--special (buffer alist) 4718(defun display-buffer--special (buffer alist)
@@ -4713,7 +4736,7 @@ return the window used; otherwise return nil."
4713 (when (and fun 4736 (when (and fun
4714 (setq frame (funcall fun)) 4737 (setq frame (funcall fun))
4715 (setq window (frame-selected-window frame))) 4738 (setq window (frame-selected-window frame)))
4716 (display-buffer-record-window 'pop-up-frame window buffer) 4739 (display-buffer-record-window 'frame window buffer)
4717 (window--display-buffer-2 buffer window) 4740 (window--display-buffer-2 buffer window)
4718 ;; Reset list of WINDOW's previous buffers to nil. 4741 ;; Reset list of WINDOW's previous buffers to nil.
4719 (set-window-prev-buffers window nil) 4742 (set-window-prev-buffers window nil)
@@ -4739,7 +4762,7 @@ If sucessful, return the new window; otherwise return nil."
4739 (get-largest-window frame t)) 4762 (get-largest-window frame t))
4740 (window--try-to-split-window 4763 (window--try-to-split-window
4741 (get-lru-window frame t))))) 4764 (get-lru-window frame t)))))
4742 (display-buffer-record-window 'pop-up-window window buffer) 4765 (display-buffer-record-window 'window window buffer)
4743 (window--display-buffer-2 buffer window) 4766 (window--display-buffer-2 buffer window)
4744 ;; Reset list of WINDOW's previous buffers to nil. 4767 ;; Reset list of WINDOW's previous buffers to nil.
4745 (set-window-prev-buffers window nil) 4768 (set-window-prev-buffers window nil)
@@ -4793,7 +4816,7 @@ return the window. If no suitable window is found, return nil."
4793 ;; Restore dedicated status of selected window. 4816 ;; Restore dedicated status of selected window.
4794 (set-window-dedicated-p window-to-undedicate nil))) 4817 (set-window-dedicated-p window-to-undedicate nil)))
4795 (when window 4818 (when window
4796 (display-buffer-record-window 'reuse-window window buffer) 4819 (display-buffer-record-window 'reuse window buffer)
4797 (window--even-window-heights window) 4820 (window--even-window-heights window)
4798 (window--display-buffer-2 buffer window)))) 4821 (window--display-buffer-2 buffer window))))
4799 4822