diff options
| author | Martin Rudalics | 2018-12-08 09:37:40 +0100 |
|---|---|---|
| committer | Martin Rudalics | 2018-12-08 09:37:40 +0100 |
| commit | d2b3a37886d97abdc10e16f6389200e8ad45dd7a (patch) | |
| tree | f1649e61eb920544548e52931803278ebef4addc | |
| parent | 1d676aabca4bdba6948fb7a9d875ba63b51aed63 (diff) | |
| download | emacs-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.texi | 22 | ||||
| -rw-r--r-- | etc/NEWS | 6 | ||||
| -rw-r--r-- | lisp/window.el | 41 |
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. | |||
| 2607 | If splitting the selected window fails and there is a non-dedicated | 2607 | If splitting the selected window fails and there is a non-dedicated |
| 2608 | window below the selected one showing some other buffer, this function | 2608 | window below the selected one showing some other buffer, this function |
| 2609 | tries to use that window for showing @var{buffer}. | 2609 | tries to use that window for showing @var{buffer}. |
| 2610 | |||
| 2611 | If @var{alist} contains a @code{window-min-height} entry, this | ||
| 2612 | function ensures that the window used is or can become at least as | ||
| 2613 | high as specified by that entry's value. Note that this is only a | ||
| 2614 | guarantee. In order to actually resize the window used, @var{alist} | ||
| 2615 | must 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 | |||
| 2790 | window. All action functions that choose a window should process this | 2796 | window. All action functions that choose a window should process this |
| 2791 | entry. | 2797 | entry. |
| 2792 | 2798 | ||
| 2799 | @vindex window-min-height@r{, a buffer display action alist entry} | ||
| 2800 | @item window-min-height | ||
| 2801 | The value specifies a minimum height of the window used, in lines. If | ||
| 2802 | a window is not or cannot be made as high as specified by this entry, | ||
| 2803 | the window is not considered for use. The only client of this entry | ||
| 2804 | is presently @code{display-buffer-below-selected}. | ||
| 2805 | |||
| 2806 | Note that providing such an entry alone does not necessarily make the | ||
| 2807 | window as tall as specified by its value. To actually resize an | ||
| 2808 | existing window or make a new window as tall as specified by that | ||
| 2809 | value, a @code{window-height} entry specifying that value should be | ||
| 2810 | provided as well. Such a @code{window-height} entry can, however, | ||
| 2811 | specify a completely different value or ask the window height to be | ||
| 2812 | fit to that of its buffer in which case the @code{window-min-height} | ||
| 2813 | entry 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 |
| 2795 | The value specifies whether and how to adjust the height of the chosen | 2817 | The value specifies whether and how to adjust the height of the chosen |
| @@ -1228,6 +1228,12 @@ A buffer-local value of this hook is now run only if at least one | |||
| 1228 | window showing the buffer has changed its size. | 1228 | window showing the buffer has changed its size. |
| 1229 | 1229 | ||
| 1230 | +++ | 1230 | +++ |
| 1231 | ** New buffer display action alist entry 'window-min-height'. | ||
| 1232 | Such an entry allows to specify a minimum height of the window used | ||
| 1233 | for displaying a buffer. 'display-buffer-below-selected' is the only | ||
| 1234 | action 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 | |||
| 7465 | already displays BUFFER, use that window. Otherwise, try to | 7465 | already displays BUFFER, use that window. Otherwise, try to |
| 7466 | create a new window below the selected one and show BUFFER there. | 7466 | create a new window below the selected one and show BUFFER there. |
| 7467 | If that attempt fails as well and there is a non-dedicated window | 7467 | If that attempt fails as well and there is a non-dedicated window |
| 7468 | below the selected one, use that window." | 7468 | below the selected one, use that window. |
| 7469 | (let (window) | 7469 | |
| 7470 | If ALIST contains a 'window-min-height' entry, this function | ||
| 7471 | ensures that the window used is or can become at least as high as | ||
| 7472 | specified by that entry's value. Note that such an entry alone | ||
| 7473 | will not resize the window per se. In order to do that, ALIST | ||
| 7474 | must 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 |