aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Rudalics2018-12-08 09:37:40 +0100
committerMartin Rudalics2018-12-08 09:37:40 +0100
commitd2b3a37886d97abdc10e16f6389200e8ad45dd7a (patch)
treef1649e61eb920544548e52931803278ebef4addc
parent1d676aabca4bdba6948fb7a9d875ba63b51aed63 (diff)
downloademacs-d2b3a37886d97abdc10e16f6389200e8ad45dd7a.tar.gz
emacs-d2b3a37886d97abdc10e16f6389200e8ad45dd7a.zip
New buffer display action alist entry 'window-min-height' (Bug#32825)
* lisp/window.el (display-buffer-below-selected): Handle 'window-min-height' action alist entry (Bug#32825). * doc/lispref/windows.texi (Buffer Display Action Functions) (Buffer Display Action Alists): Add documentation for 'window-min-height' action alist entries. * etc/NEWS: Mention 'window-min-height' action alist entry.
-rw-r--r--doc/lispref/windows.texi22
-rw-r--r--etc/NEWS6
-rw-r--r--lisp/window.el41
3 files changed, 60 insertions, 9 deletions
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index b86bccab202..eb057662112 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -2607,6 +2607,12 @@ suitable @code{window-height} or @code{window-width} entry, see above.
2607If splitting the selected window fails and there is a non-dedicated 2607If splitting the selected window fails and there is a non-dedicated
2608window below the selected one showing some other buffer, this function 2608window below the selected one showing some other buffer, this function
2609tries to use that window for showing @var{buffer}. 2609tries to use that window for showing @var{buffer}.
2610
2611If @var{alist} contains a @code{window-min-height} entry, this
2612function ensures that the window used is or can become at least as
2613high as specified by that entry's value. Note that this is only a
2614guarantee. In order to actually resize the window used, @var{alist}
2615must also provide an appropriate @code{window-height} entry.
2610@end defun 2616@end defun
2611 2617
2612@defun display-buffer-at-bottom buffer alist 2618@defun display-buffer-at-bottom buffer alist
@@ -2790,6 +2796,22 @@ The value specifies an alist of window parameters to give the chosen
2790window. All action functions that choose a window should process this 2796window. All action functions that choose a window should process this
2791entry. 2797entry.
2792 2798
2799@vindex window-min-height@r{, a buffer display action alist entry}
2800@item window-min-height
2801The value specifies a minimum height of the window used, in lines. If
2802a window is not or cannot be made as high as specified by this entry,
2803the window is not considered for use. The only client of this entry
2804is presently @code{display-buffer-below-selected}.
2805
2806Note that providing such an entry alone does not necessarily make the
2807window as tall as specified by its value. To actually resize an
2808existing window or make a new window as tall as specified by that
2809value, a @code{window-height} entry specifying that value should be
2810provided as well. Such a @code{window-height} entry can, however,
2811specify a completely different value or ask the window height to be
2812fit to that of its buffer in which case the @code{window-min-height}
2813entry provides the guaranteed minimum height of the window used.
2814
2793@vindex window-height@r{, a buffer display action alist entry} 2815@vindex window-height@r{, a buffer display action alist entry}
2794@item window-height 2816@item window-height
2795The value specifies whether and how to adjust the height of the chosen 2817The value specifies whether and how to adjust the height of the chosen
diff --git a/etc/NEWS b/etc/NEWS
index cad44f92338..7a0db872653 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1228,6 +1228,12 @@ A buffer-local value of this hook is now run only if at least one
1228window showing the buffer has changed its size. 1228window showing the buffer has changed its size.
1229 1229
1230+++ 1230+++
1231** New buffer display action alist entry 'window-min-height'.
1232Such an entry allows to specify a minimum height of the window used
1233for displaying a buffer. 'display-buffer-below-selected' is the only
1234action function to respect it at the moment.
1235
1236+++
1231** The function 'assoc-delete-all' now takes an optional predicate argument. 1237** The function 'assoc-delete-all' now takes an optional predicate argument.
1232 1238
1233+++ 1239+++
diff --git a/lisp/window.el b/lisp/window.el
index a16ceb4eb99..25a599f91d2 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -7465,22 +7465,45 @@ If there is a window below the selected one and that window
7465already displays BUFFER, use that window. Otherwise, try to 7465already displays BUFFER, use that window. Otherwise, try to
7466create a new window below the selected one and show BUFFER there. 7466create a new window below the selected one and show BUFFER there.
7467If that attempt fails as well and there is a non-dedicated window 7467If that attempt fails as well and there is a non-dedicated window
7468below the selected one, use that window." 7468below the selected one, use that window.
7469 (let (window) 7469
7470If ALIST contains a 'window-min-height' entry, this function
7471ensures that the window used is or can become at least as high as
7472specified by that entry's value. Note that such an entry alone
7473will not resize the window per se. In order to do that, ALIST
7474must also contain a 'window-height' entry with the same value."
7475 (let ((min-height (cdr (assq 'window-min-height alist)))
7476 window)
7470 (or (and (setq window (window-in-direction 'below)) 7477 (or (and (setq window (window-in-direction 'below))
7471 (eq buffer (window-buffer window)) 7478 (eq buffer (window-buffer window))
7479 (or (not (numberp min-height))
7480 (>= (window-height window) min-height)
7481 ;; 'window--display-buffer' can resize this window if
7482 ;; and only if it has a 'quit-restore' parameter
7483 ;; certifying that it always showed BUFFER before.
7484 (let ((height (window-height window))
7485 (quit-restore (window-parameter window 'quit-restore)))
7486 (and quit-restore
7487 (eq (nth 1 quit-restore) 'window)
7488 (window-resizable-p window (- min-height height)))))
7472 (window--display-buffer buffer window 'reuse alist)) 7489 (window--display-buffer buffer window 'reuse alist))
7473 (and (not (frame-parameter nil 'unsplittable)) 7490 (and (not (frame-parameter nil 'unsplittable))
7474 (let ((split-height-threshold 0) 7491 (or (not (numberp min-height))
7492 (window-sizable-p nil (- min-height)))
7493 (let ((split-height-threshold 0)
7475 split-width-threshold) 7494 split-width-threshold)
7476 (setq window (window--try-to-split-window 7495 (setq window (window--try-to-split-window
7477 (selected-window) alist))) 7496 (selected-window) alist)))
7478 (window--display-buffer 7497 (window--display-buffer
7479 buffer window 'window alist display-buffer-mark-dedicated)) 7498 buffer window 'window alist display-buffer-mark-dedicated))
7480 (and (setq window (window-in-direction 'below)) 7499 (and (setq window (window-in-direction 'below))
7481 (not (window-dedicated-p window)) 7500 (not (window-dedicated-p window))
7501 (or (not (numberp min-height))
7502 ;; A window that showed another buffer before cannot
7503 ;; be resized.
7504 (>= (window-height window) min-height))
7482 (window--display-buffer 7505 (window--display-buffer
7483 buffer window 'reuse alist display-buffer-mark-dedicated))))) 7506 buffer window 'reuse alist display-buffer-mark-dedicated)))))
7484 7507
7485(defun display-buffer--maybe-at-bottom (buffer alist) 7508(defun display-buffer--maybe-at-bottom (buffer alist)
7486 (let ((alist (append alist `(,(if temp-buffer-resize-mode 7509 (let ((alist (append alist `(,(if temp-buffer-resize-mode