Mercurial > emacs
changeset 93404:33721f8a9b20
(split-window-preferred-horizontally): New function.
author | Juri Linkov <juri@jurta.org> |
---|---|
date | Sat, 29 Mar 2008 23:03:18 +0000 |
parents | ca4f82c2e75c |
children | ba44d1d76296 |
files | lisp/window.el |
diffstat | 1 files changed, 37 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/window.el Sat Mar 29 23:02:22 2008 +0000 +++ b/lisp/window.el Sat Mar 29 23:03:18 2008 +0000 @@ -614,6 +614,43 @@ (setq size (+ (window-width) size))) (split-window-save-restore-data (split-window nil size t) old-w))) +(defun split-window-preferred-horizontally (window) + "Split WINDOW horizontally or select an appropriate existing window. +It is called by `display-buffer' to split windows horizontally +when the option `split-window-preferred-function' is set to \"horizontally\". +This function tries to match the implementation of vertical splitting +in `display-buffer' as close as possible but with the logic of +horizontal splitting. It returns a new window or an appropriate +existing window if splitting is not eligible." + (interactive) + ;; If the largest window is wide enough, eligible for splitting, + ;; and the only window, split it horizontally. + (if (and window + (not (frame-parameter (window-frame window) 'unsplittable)) + (one-window-p (window-frame window)) + (>= (window-width window) (* 2 window-min-width))) + (split-window window nil t) + ;; Otherwise, if the LRU window is wide enough, eligible for + ;; splitting and selected or the only window, split it horizontally. + (setq window (get-lru-window nil t)) + (if (and window + (not (frame-parameter (window-frame window) 'unsplittable)) + (or (eq window (selected-window)) + (one-window-p (window-frame window))) + (>= (window-width window) (* 2 window-min-width))) + (split-window window nil t) + ;; Otherwise, if get-lru-window returns nil, try other approaches. + (or + (get-lru-window nil nil) + ;; Try visible frames first. + (get-buffer-window (current-buffer) 'visible) + (get-largest-window 'visible) + ;; If that didn't work, try iconified frames. + (get-buffer-window (current-buffer) 0) + (get-largest-window 0) + ;; As a last resort, make a new frame. + (frame-selected-window (funcall pop-up-frame-function)))))) + (defun set-window-text-height (window height) "Sets the height in lines of the text display area of WINDOW to HEIGHT.