diff options
| author | Martin Rudalics | 2012-06-05 11:11:06 +0200 |
|---|---|---|
| committer | Martin Rudalics | 2012-06-05 11:11:06 +0200 |
| commit | 51a5f9d8163744dab918e2b6fe3f452f5a4cddfd (patch) | |
| tree | cb870fbea84630ef4994c25be9b57ac2bcf2fa37 | |
| parent | 08f9f7385c43bd2ae47e8062350f1774a307e8e6 (diff) | |
| download | emacs-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/NEWS | 3 | ||||
| -rw-r--r-- | lisp/ChangeLog | 13 | ||||
| -rw-r--r-- | lisp/window.el | 152 |
3 files changed, 85 insertions, 83 deletions
| @@ -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 | ||
| 344 | now 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 @@ | |||
| 1 | 2012-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 | |||
| 1 | 2012-06-05 Glenn Morris <rgm@gnu.org> | 14 | 2012-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. |
| 1261 | Return a full-width window if possible. A minibuffer window is | 1261 | Return a full-width window if possible. A minibuffer window is |
| 1262 | never a candidate. A dedicated window is never a candidate | 1262 | never a candidate. A dedicated window is never a candidate |
| 1263 | unless DEDICATED is non-nil, so if all windows are dedicated, the | 1263 | unless DEDICATED is non-nil, so if all windows are dedicated, the |
| 1264 | value is nil. Avoid returning the selected window if possible. | 1264 | value is nil. Avoid returning the selected window if possible. |
| 1265 | Optional argument NOT-SELECTED non-nil means never return the | ||
| 1266 | selected window. | ||
| 1265 | 1267 | ||
| 1266 | The following non-nil values of the optional argument ALL-FRAMES | 1268 | The following non-nil values of the optional argument ALL-FRAMES |
| 1267 | have special meanings: | 1269 | have special meanings: |
| @@ -1280,7 +1282,8 @@ Any other value of ALL-FRAMES means consider all windows on the | |||
| 1280 | selected frame and no others." | 1282 | selected 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. |
| 1297 | Do not return a minibuffer window. | 1300 | A minibuffer window is never a candidate. A dedicated window is |
| 1301 | never a candidate unless DEDICATED is non-nil, so if all windows | ||
| 1302 | are dedicated, the value is nil. Optional argument NOT-SELECTED | ||
| 1303 | non-nil means never return the selected window. | ||
| 1298 | 1304 | ||
| 1299 | The following non-nil values of the optional argument ALL-FRAMES | 1305 | The following non-nil values of the optional argument ALL-FRAMES |
| 1300 | have special meanings: | 1306 | have 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. |
| 1324 | A minibuffer window is never a candidate. A dedicated window is | 1332 | A minibuffer window is never a candidate. A dedicated window is |
| 1325 | never a candidate unless DEDICATED is non-nil, so if all windows | 1333 | never a candidate unless DEDICATED is non-nil, so if all windows |
| 1326 | are dedicated, the value is nil. | 1334 | are dedicated, the value is nil. Optional argument NOT-SELECTED |
| 1335 | non-nil means never return the selected window. | ||
| 1327 | 1336 | ||
| 1328 | The following non-nil values of the optional argument ALL-FRAMES | 1337 | The following non-nil values of the optional argument ALL-FRAMES |
| 1329 | have special meanings: | 1338 | have 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. | ||
| 4579 | Do 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. |
| 4594 | Set `window-dedicated-p' to DEDICATED if non-nil. | 4583 | TYPE must be one of the symbols `reuse', `window' or `frame' and |
| 4595 | Return WINDOW." | 4584 | is passed unaltered to `display-buffer-record-window'. Set |
| 4585 | `window-dedicated-p' to DEDICATED if non-nil. Return WINDOW if | ||
| 4586 | BUFFER 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'." | |||
| 4943 | Search for a usable window, set that window to the buffer, and | 4943 | Search for a usable window, set that window to the buffer, and |
| 4944 | return the window. If no suitable window is found, return nil." | 4944 | return 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. |
| 4982 | BUFFER may be a buffer, a string (a buffer name), or nil. If it | 4968 | BUFFER may be a buffer, a string (a buffer name), or nil. If it |