aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Rudalics2012-06-05 11:11:06 +0200
committerMartin Rudalics2012-06-05 11:11:06 +0200
commit51a5f9d8163744dab918e2b6fe3f452f5a4cddfd (patch)
treecb870fbea84630ef4994c25be9b57ac2bcf2fa37
parent08f9f7385c43bd2ae47e8062350f1774a307e8e6 (diff)
downloademacs-51a5f9d8163744dab918e2b6fe3f452f5a4cddfd.tar.gz
emacs-51a5f9d8163744dab918e2b6fe3f452f5a4cddfd.zip
Clean up and simplify buffer display routines.
* window.el (get-lru-window, get-mru-window, get-largest-window): New argument NOT-SELECTED to avoid picking the selected window. (window--display-buffer-1, window--display-buffer-2): Replace by new function window--display-buffer (display-buffer-same-window, display-buffer-reuse-window) (display-buffer-pop-up-frame, display-buffer-pop-up-window): Use window--display-buffer. (display-buffer-use-some-window): Remove temporary dedication hack by calling get-lru-window and get-largest-window with NOT-SELECTED argument non-nil. Call window--display-buffer.
-rw-r--r--etc/NEWS3
-rw-r--r--lisp/ChangeLog13
-rw-r--r--lisp/window.el152
3 files changed, 85 insertions, 83 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 858cde1ba04..fa959ef8c44 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -340,6 +340,9 @@ The interpretation of the DECLS is determined by `defun-declarations-alist'.
340 340
341** New error type and new function `user-error'. Doesn't trigger the debugger. 341** New error type and new function `user-error'. Doesn't trigger the debugger.
342 342
343** The functions get-lru-window, get-mru-window and get-largest-window
344now accept a third argument to avoid chosing the selected window.
345
343** Completion 346** Completion
344 347
345*** New function `completion-table-with-quoting' to handle completion 348*** New function `completion-table-with-quoting' to handle completion
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 2446b654694..9577d902a2d 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,16 @@
12012-06-05 Martin Rudalics <rudalics@gmx.at>
2
3 * window.el (get-lru-window, get-mru-window, get-largest-window):
4 New argument NOT-SELECTED to avoid picking the selected window.
5 (window--display-buffer-1, window--display-buffer-2): Replace by
6 new function window--display-buffer
7 (display-buffer-same-window, display-buffer-reuse-window)
8 (display-buffer-pop-up-frame, display-buffer-pop-up-window): Use
9 window--display-buffer.
10 (display-buffer-use-some-window): Remove temporary dedication
11 hack by calling get-lru-window and get-largest-window with
12 NOT-SELECTED argument non-nil. Call window--display-buffer.
13
12012-06-05 Glenn Morris <rgm@gnu.org> 142012-06-05 Glenn Morris <rgm@gnu.org>
2 15
3 * vc/vc-sccs.el (vc-sccs-workfile-unchanged-p): 16 * vc/vc-sccs.el (vc-sccs-workfile-unchanged-p):
diff --git a/lisp/window.el b/lisp/window.el
index bf5b342b9f3..2dcc296ace1 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -1256,12 +1256,14 @@ and no others."
1256 1256
1257(defalias 'some-window 'get-window-with-predicate) 1257(defalias 'some-window 'get-window-with-predicate)
1258 1258
1259(defun get-lru-window (&optional all-frames dedicated) 1259(defun get-lru-window (&optional all-frames dedicated not-selected)
1260 "Return the least recently used window on frames specified by ALL-FRAMES. 1260 "Return the least recently used window on frames specified by ALL-FRAMES.
1261Return a full-width window if possible. A minibuffer window is 1261Return a full-width window if possible. A minibuffer window is
1262never a candidate. A dedicated window is never a candidate 1262never a candidate. A dedicated window is never a candidate
1263unless DEDICATED is non-nil, so if all windows are dedicated, the 1263unless DEDICATED is non-nil, so if all windows are dedicated, the
1264value is nil. Avoid returning the selected window if possible. 1264value is nil. Avoid returning the selected window if possible.
1265Optional argument NOT-SELECTED non-nil means never return the
1266selected window.
1265 1267
1266The following non-nil values of the optional argument ALL-FRAMES 1268The following non-nil values of the optional argument ALL-FRAMES
1267have special meanings: 1269have special meanings:
@@ -1280,7 +1282,8 @@ Any other value of ALL-FRAMES means consider all windows on the
1280selected frame and no others." 1282selected frame and no others."
1281 (let (best-window best-time second-best-window second-best-time time) 1283 (let (best-window best-time second-best-window second-best-time time)
1282 (dolist (window (window-list-1 nil 'nomini all-frames)) 1284 (dolist (window (window-list-1 nil 'nomini all-frames))
1283 (when (or dedicated (not (window-dedicated-p window))) 1285 (when (and (or dedicated (not (window-dedicated-p window)))
1286 (or (not not-selected) (not (eq window (selected-window)))))
1284 (setq time (window-use-time window)) 1287 (setq time (window-use-time window))
1285 (if (or (eq window (selected-window)) 1288 (if (or (eq window (selected-window))
1286 (not (window-full-width-p window))) 1289 (not (window-full-width-p window)))
@@ -1292,9 +1295,12 @@ selected frame and no others."
1292 (setq best-window window))))) 1295 (setq best-window window)))))
1293 (or best-window second-best-window))) 1296 (or best-window second-best-window)))
1294 1297
1295(defun get-mru-window (&optional all-frames) 1298(defun get-mru-window (&optional all-frames dedicated not-selected)
1296 "Return the most recently used window on frames specified by ALL-FRAMES. 1299 "Return the most recently used window on frames specified by ALL-FRAMES.
1297Do not return a minibuffer window. 1300A minibuffer window is never a candidate. A dedicated window is
1301never a candidate unless DEDICATED is non-nil, so if all windows
1302are dedicated, the value is nil. Optional argument NOT-SELECTED
1303non-nil means never return the selected window.
1298 1304
1299The following non-nil values of the optional argument ALL-FRAMES 1305The following non-nil values of the optional argument ALL-FRAMES
1300have special meanings: 1306have special meanings:
@@ -1314,16 +1320,19 @@ selected frame and no others."
1314 (let (best-window best-time time) 1320 (let (best-window best-time time)
1315 (dolist (window (window-list-1 nil 'nomini all-frames)) 1321 (dolist (window (window-list-1 nil 'nomini all-frames))
1316 (setq time (window-use-time window)) 1322 (setq time (window-use-time window))
1317 (when (or (not best-time) (> time best-time)) 1323 (when (and (or dedicated (not (window-dedicated-p window)))
1324 (or (not not-selected) (not (eq window (selected-window))))
1325 (or (not best-time) (> time best-time)))
1318 (setq best-time time) 1326 (setq best-time time)
1319 (setq best-window window))) 1327 (setq best-window window)))
1320 best-window)) 1328 best-window))
1321 1329
1322(defun get-largest-window (&optional all-frames dedicated) 1330(defun get-largest-window (&optional all-frames dedicated not-selected)
1323 "Return the largest window on frames specified by ALL-FRAMES. 1331 "Return the largest window on frames specified by ALL-FRAMES.
1324A minibuffer window is never a candidate. A dedicated window is 1332A minibuffer window is never a candidate. A dedicated window is
1325never a candidate unless DEDICATED is non-nil, so if all windows 1333never a candidate unless DEDICATED is non-nil, so if all windows
1326are dedicated, the value is nil. 1334are dedicated, the value is nil. Optional argument NOT-SELECTED
1335non-nil means never return the selected window.
1327 1336
1328The following non-nil values of the optional argument ALL-FRAMES 1337The following non-nil values of the optional argument ALL-FRAMES
1329have special meanings: 1338have special meanings:
@@ -1343,7 +1352,8 @@ selected frame and no others."
1343 (let ((best-size 0) 1352 (let ((best-size 0)
1344 best-window size) 1353 best-window size)
1345 (dolist (window (window-list-1 nil 'nomini all-frames)) 1354 (dolist (window (window-list-1 nil 'nomini all-frames))
1346 (when (or dedicated (not (window-dedicated-p window))) 1355 (when (and (or dedicated (not (window-dedicated-p window)))
1356 (or (not not-selected) (not (eq window (selected-window)))))
1347 (setq size (* (window-total-size window) 1357 (setq size (* (window-total-size window)
1348 (window-total-size window t))) 1358 (window-total-size window t)))
1349 (when (> size best-size) 1359 (when (> size best-size)
@@ -4253,17 +4263,11 @@ and (cdr ARGS) as second."
4253 special-display-buffer-names special-display-regexps) 4263 special-display-buffer-names special-display-regexps)
4254 (display-buffer buffer))) 4264 (display-buffer buffer)))
4255 ;; If no window yet, make one in a new frame. 4265 ;; If no window yet, make one in a new frame.
4256 (let* ((frame 4266 (let ((frame
4257 (with-current-buffer buffer 4267 (with-current-buffer buffer
4258 (make-frame (append args special-display-frame-alist)))) 4268 (make-frame (append args special-display-frame-alist)))))
4259 (window (frame-selected-window frame))) 4269 (window--display-buffer
4260 (display-buffer-record-window 'frame window buffer) 4270 buffer (frame-selected-window frame) 'frame t))))))
4261 ;; FIXME: Use window--display-buffer-2?
4262 (set-window-buffer window buffer)
4263 ;; Reset list of WINDOW's previous buffers to nil.
4264 (set-window-prev-buffers window nil)
4265 (set-window-dedicated-p window t)
4266 window)))))
4267 4271
4268(defcustom special-display-function 'special-display-popup-frame 4272(defcustom special-display-function 'special-display-popup-frame
4269 "Function to call for displaying special buffers. 4273 "Function to call for displaying special buffers.
@@ -4574,30 +4578,34 @@ is higher than WINDOW."
4574 (enlarge-window (/ (- (window-height window) (window-height)) 2)) 4578 (enlarge-window (/ (- (window-height window) (window-height)) 2))
4575 (error nil))))) 4579 (error nil)))))
4576 4580
4577(defun window--display-buffer-1 (window) 4581(defun window--display-buffer (buffer window type &optional dedicated)
4578 "Raise the frame containing WINDOW.
4579Do not raise the selected frame. Return WINDOW."
4580 (let* ((frame (window-frame window))
4581 (visible (frame-visible-p frame)))
4582 (unless (or (not visible)
4583 ;; Assume the selected frame is already visible enough.
4584 (eq frame (selected-frame))
4585 ;; Assume the frame from which we invoked the minibuffer
4586 ;; is visible.
4587 (and (minibuffer-window-active-p (selected-window))
4588 (eq frame (window-frame (minibuffer-selected-window)))))
4589 (raise-frame frame))
4590 window))
4591
4592(defun window--display-buffer-2 (buffer window &optional dedicated)
4593 "Display BUFFER in WINDOW and make its frame visible. 4582 "Display BUFFER in WINDOW and make its frame visible.
4594Set `window-dedicated-p' to DEDICATED if non-nil. 4583TYPE must be one of the symbols `reuse', `window' or `frame' and
4595Return WINDOW." 4584is passed unaltered to `display-buffer-record-window'. Set
4585`window-dedicated-p' to DEDICATED if non-nil. Return WINDOW if
4586BUFFER and WINDOW are live."
4596 (when (and (buffer-live-p buffer) (window-live-p window)) 4587 (when (and (buffer-live-p buffer) (window-live-p window))
4597 (set-window-buffer window buffer) 4588 (let* ((frame (window-frame window))
4598 (when dedicated 4589 (visible (frame-visible-p frame)))
4599 (set-window-dedicated-p window dedicated)) 4590 (unless (eq buffer (window-buffer window))
4600 (window--display-buffer-1 window))) 4591 (set-window-dedicated-p window nil)
4592 (display-buffer-record-window type window buffer)
4593 (set-window-buffer window buffer)
4594 (when dedicated
4595 (set-window-dedicated-p window dedicated))
4596 (when (memq type '(window frame))
4597 (set-window-prev-buffers window nil)))
4598
4599 (unless (or (not visible)
4600 ;; Assume the selected frame is already visible enough.
4601 (eq frame (selected-frame))
4602 ;; Assume the frame from which we invoked the minibuffer
4603 ;; is visible.
4604 (and (minibuffer-window-active-p (selected-window))
4605 (eq frame (window-frame (minibuffer-selected-window)))))
4606 (raise-frame frame))
4607
4608 window)))
4601 4609
4602;; FIXME: Not implemented. 4610;; FIXME: Not implemented.
4603;; FIXME: By the way, there could be more levels of dedication: 4611;; FIXME: By the way, there could be more levels of dedication:
@@ -4819,8 +4827,7 @@ selected window."
4819 (unless (or (cdr (assq 'inhibit-same-window alist)) 4827 (unless (or (cdr (assq 'inhibit-same-window alist))
4820 (window-minibuffer-p) 4828 (window-minibuffer-p)
4821 (window-dedicated-p)) 4829 (window-dedicated-p))
4822 (display-buffer-record-window 'reuse (selected-window) buffer) 4830 (window--display-buffer buffer (selected-window) 'reuse)))
4823 (window--display-buffer-2 buffer (selected-window))))
4824 4831
4825(defun display-buffer--maybe-same-window (buffer alist) 4832(defun display-buffer--maybe-same-window (buffer alist)
4826 "Conditionally display BUFFER in the selected window. 4833 "Conditionally display BUFFER in the selected window.
@@ -4864,8 +4871,7 @@ terminal if either of those variables is non-nil."
4864 (get-buffer-window-list buffer 'nomini 4871 (get-buffer-window-list buffer 'nomini
4865 frames)))))) 4872 frames))))))
4866 (when window 4873 (when window
4867 (display-buffer-record-window 'reuse window buffer) 4874 (window--display-buffer buffer window 'reuse))))
4868 (window--display-buffer-1 window))))
4869 4875
4870(defun display-buffer--special-action (buffer) 4876(defun display-buffer--special-action (buffer)
4871 "Return special display action for BUFFER, if any. 4877 "Return special display action for BUFFER, if any.
@@ -4891,11 +4897,8 @@ return the window used; otherwise return nil."
4891 (when (and fun 4897 (when (and fun
4892 (setq frame (funcall fun)) 4898 (setq frame (funcall fun))
4893 (setq window (frame-selected-window frame))) 4899 (setq window (frame-selected-window frame)))
4894 (display-buffer-record-window 'frame window buffer) 4900 (window--display-buffer
4895 (window--display-buffer-2 buffer window display-buffer-mark-dedicated) 4901 buffer window 'frame display-buffer-mark-dedicated))))
4896 ;; Reset list of WINDOW's previous buffers to nil.
4897 (set-window-prev-buffers window nil)
4898 window)))
4899 4902
4900(defun display-buffer-pop-up-window (buffer _alist) 4903(defun display-buffer-pop-up-window (buffer _alist)
4901 "Display BUFFER by popping up a new window. 4904 "Display BUFFER by popping up a new window.
@@ -4917,11 +4920,8 @@ If successful, return the new window; otherwise return nil."
4917 (get-largest-window frame t)) 4920 (get-largest-window frame t))
4918 (window--try-to-split-window 4921 (window--try-to-split-window
4919 (get-lru-window frame t))))) 4922 (get-lru-window frame t)))))
4920 (display-buffer-record-window 'window window buffer) 4923 (window--display-buffer
4921 (window--display-buffer-2 buffer window display-buffer-mark-dedicated) 4924 buffer window 'window display-buffer-mark-dedicated))))
4922 ;; Reset list of WINDOW's previous buffers to nil.
4923 (set-window-prev-buffers window nil)
4924 window)))
4925 4925
4926(defun display-buffer--maybe-pop-up-frame-or-window (buffer alist) 4926(defun display-buffer--maybe-pop-up-frame-or-window (buffer alist)
4927 "Try displaying BUFFER based on `pop-up-frames' or `pop-up-windows'. 4927 "Try displaying BUFFER based on `pop-up-frames' or `pop-up-windows'.
@@ -4943,40 +4943,26 @@ again with `display-buffer-pop-up-window'."
4943Search for a usable window, set that window to the buffer, and 4943Search for a usable window, set that window to the buffer, and
4944return the window. If no suitable window is found, return nil." 4944return the window. If no suitable window is found, return nil."
4945 (let* ((not-this-window (cdr (assq 'inhibit-same-window alist))) 4945 (let* ((not-this-window (cdr (assq 'inhibit-same-window alist)))
4946 (window-to-undedicate
4947 ;; When NOT-THIS-WINDOW is non-nil, temporarily dedicate the
4948 ;; selected window to its buffer, to prevent any of the
4949 ;; `get-' routines below from choosing it. (Bug#1415)
4950 (and not-this-window (not (window-dedicated-p))
4951 (set-window-dedicated-p (selected-window) t)
4952 (selected-window)))
4953 (frame (or (window--frame-usable-p (selected-frame)) 4946 (frame (or (window--frame-usable-p (selected-frame))
4954 (window--frame-usable-p (last-nonminibuffer-frame)))) 4947 (window--frame-usable-p (last-nonminibuffer-frame))))
4955 window) 4948 (window
4956 (unwind-protect 4949 ;; Reuse an existing window.
4957 (setq window 4950 (or (get-lru-window frame nil not-this-window)
4958 ;; Reuse an existing window. 4951 (let ((window (get-buffer-window buffer 'visible)))
4959 (or (get-lru-window frame) 4952 (unless (and not-this-window
4960 (let ((window (get-buffer-window buffer 'visible))) 4953 (eq window (selected-window)))
4961 (unless (and not-this-window 4954 window))
4962 (eq window (selected-window))) 4955 (get-largest-window 'visible nil not-this-window)
4963 window)) 4956 (let ((window (get-buffer-window buffer 0)))
4964 (get-largest-window 'visible) 4957 (unless (and not-this-window
4965 (let ((window (get-buffer-window buffer 0))) 4958 (eq window (selected-window)))
4966 (unless (and not-this-window 4959 window))
4967 (eq window (selected-window))) 4960 (get-largest-window 0 not-this-window))))
4968 window))
4969 (get-largest-window 0)))
4970 (when (window-live-p window-to-undedicate)
4971 ;; Restore dedicated status of selected window.
4972 (set-window-dedicated-p window-to-undedicate nil)))
4973 (when window 4961 (when window
4974 (display-buffer-record-window 'reuse window buffer)
4975 (window--even-window-heights window) 4962 (window--even-window-heights window)
4976 (window--display-buffer-2 buffer window)))) 4963 (window--display-buffer buffer window 'reuse))))
4977 4964
4978;;; Display + selection commands: 4965;;; Display + selection commands:
4979
4980(defun pop-to-buffer (buffer &optional action norecord) 4966(defun pop-to-buffer (buffer &optional action norecord)
4981 "Select buffer BUFFER in some window, preferably a different one. 4967 "Select buffer BUFFER in some window, preferably a different one.
4982BUFFER may be a buffer, a string (a buffer name), or nil. If it 4968BUFFER may be a buffer, a string (a buffer name), or nil. If it