mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-05 15:11:30 -08:00
Allow 'display-buffer' to set up body size of chosen window (Bug#17065)
* doc/lispref/windows.texi (Buffer Display Action Alists): Describe new possible values for 'window-height', 'window-width' and 'window-size' action alist entries. * lisp/window.el (window--display-buffer): Handle new values for 'window-height', 'window-width' and 'window-size' ALIST entries. (display-buffer): Update doc-string for new values of some action alist entries. * etc/NEWS: Mention new values of some action alist entries.
This commit is contained in:
parent
709e1e59f0
commit
beaddd87f7
3 changed files with 103 additions and 53 deletions
|
|
@ -3035,6 +3035,11 @@ A floating-point number specifies the fraction of the chosen window's
|
|||
desired total height with respect to the total height of its frame's
|
||||
root window.
|
||||
|
||||
@item
|
||||
A cons cell whose @sc{car} is @code{body-lines} and whose @sc{cdr} is an
|
||||
integer that specifies the height of the chosen window's body in frame
|
||||
lines.
|
||||
|
||||
@item
|
||||
If the value specifies a function, that function is called with one
|
||||
argument---the chosen window. The function is supposed to adjust the
|
||||
|
|
@ -3068,6 +3073,11 @@ A floating-point number specifies the fraction of the chosen window's
|
|||
desired total width with respect to the total width of the frame's
|
||||
root window.
|
||||
|
||||
@item
|
||||
A cons cell whose @sc{car} is @code{body-columns} and whose @sc{cdr} is
|
||||
an integer that specifies the width of the chosen window's body in frame
|
||||
columns.
|
||||
|
||||
@item
|
||||
If the value specifies a function, that function is called with one
|
||||
argument---the chosen window. The function is supposed to adjust the
|
||||
|
|
@ -3077,8 +3087,8 @@ width of the window; its return value is ignored.
|
|||
@vindex window-size@r{, a buffer display action alist entry}
|
||||
@item window-size
|
||||
This entry is a combination of the two preceding ones and can be used to
|
||||
adjust the chosen window's height and width. Since windows can be
|
||||
resized in one direction only without affecting other windows,
|
||||
adjust the chosen window's height @emph{and} width. Since windows can
|
||||
be resized in one direction only without affecting other windows,
|
||||
@code{window-size} is effective only to set up the size of a window
|
||||
appearing alone on a frame. The value can be one of the following:
|
||||
|
||||
|
|
@ -3091,6 +3101,12 @@ A cons cell of two integers specifies the desired total width and height
|
|||
of the chosen window in lines and columns. It's effect is to adjust the
|
||||
size of the frame accordingly.
|
||||
|
||||
@item
|
||||
A cons cell whose @sc{car} equals @code{body-chars} and whose @sc{cdr}
|
||||
is a cons cell of two integers---the desired body width and height of
|
||||
the chosen window in frame columns and lines. It's effect is to adjust
|
||||
the size of the frame accordingly.
|
||||
|
||||
@item
|
||||
If the value specifies a function, that function is called with one
|
||||
argument---the chosen window. The function is supposed to adjust the
|
||||
|
|
|
|||
6
etc/NEWS
6
etc/NEWS
|
|
@ -67,6 +67,12 @@ This support is built by default when the libwebp library is
|
|||
available. To disable it, use the '--without-webp' configure flag.
|
||||
Image specifiers can now use ':type webp'.
|
||||
|
||||
** Windows
|
||||
|
||||
+++
|
||||
*** 'display-buffer' now can set up the body size of the chosen window.
|
||||
For example, an alist entry as '(window-width . (body-columns . 40))'
|
||||
will make the body of the chosen window 40 columns wide.
|
||||
|
||||
* Editing Changes in Emacs 29.1
|
||||
|
||||
|
|
|
|||
130
lisp/window.el
130
lisp/window.el
|
|
@ -7234,7 +7234,8 @@ Return WINDOW if BUFFER and WINDOW are live."
|
|||
(inhibit-modification-hooks t))
|
||||
(funcall (cdr (assq 'body-function alist)) window)))
|
||||
|
||||
(let* ((quit-restore (window-parameter window 'quit-restore))
|
||||
(let* ((frame (window-frame window))
|
||||
(quit-restore (window-parameter window 'quit-restore))
|
||||
(window-height (assq 'window-height alist))
|
||||
(height (cdr window-height))
|
||||
(window-width (assq 'window-width alist))
|
||||
|
|
@ -7256,29 +7257,35 @@ Return WINDOW if BUFFER and WINDOW are live."
|
|||
(when window-size
|
||||
(setq resize-temp-buffer-window-inhibit t)))
|
||||
((consp size)
|
||||
(let ((width (car size))
|
||||
(height (cdr size))
|
||||
(frame (window-frame window)))
|
||||
(when (and (numberp width) (numberp height))
|
||||
;; Modifying the parameters of a newly created frame might
|
||||
;; not work everywhere, but then `temp-buffer-resize-mode'
|
||||
;; will certainly fail in a similar fashion.
|
||||
;; Modifying the parameters of a newly created frame might
|
||||
;; not work everywhere, but then `temp-buffer-resize-mode'
|
||||
;; will certainly fail in a similar fashion.
|
||||
(if (eq (car size) 'body-chars)
|
||||
(let ((width (+ (frame-text-width frame)
|
||||
(* (frame-char-width frame) (cadr size))
|
||||
(- (window-body-width window t))))
|
||||
(height (+ (frame-text-height frame)
|
||||
(* (frame-char-height frame) (cddr size))
|
||||
(- (window-body-height window t)))))
|
||||
(modify-frame-parameters
|
||||
frame `((height . (text-pixels . ,height))
|
||||
(width . (text-pixels . ,width)))))
|
||||
(let ((width (- (+ (frame-width frame) (car size))
|
||||
(window-total-width window)))
|
||||
(height (- (+ (frame-height frame) (cdr size))
|
||||
(window-total-height window))))
|
||||
(modify-frame-parameters
|
||||
frame `((height . ,(+ (frame-height frame)
|
||||
(- height (window-total-height window))))
|
||||
(width . ,(+ (frame-width frame)
|
||||
(- width (window-total-width window))))))))
|
||||
frame `((height . ,height) (width . ,width)))))
|
||||
(setq resize-temp-buffer-window-inhibit t))
|
||||
((functionp size)
|
||||
((functionp size)
|
||||
(ignore-errors (funcall size window))
|
||||
(setq resize-temp-buffer-window-inhibit t))))
|
||||
((or (eq type 'window)
|
||||
(and (eq (car quit-restore) 'same)
|
||||
(eq (nth 1 quit-restore) 'window)))
|
||||
;; A window that never showed another buffer but BUFFER ever
|
||||
;; since it was created on an existing frame.
|
||||
;;
|
||||
;; Adjust width and/or height of window if asked for.
|
||||
;; since it was created on an existing frame. Adjust its width
|
||||
;; and/or height if asked for.
|
||||
(cond
|
||||
((not height)
|
||||
(when window-height
|
||||
|
|
@ -7295,7 +7302,14 @@ Return WINDOW if BUFFER and WINDOW are live."
|
|||
(window-combined-p window))
|
||||
(window-resize window delta nil 'safe)))
|
||||
(setq resize-temp-buffer-window-inhibit 'vertical))
|
||||
((functionp height)
|
||||
((and (consp height) (eq (car height) 'body-lines))
|
||||
(let* ((delta (- (* (frame-char-height frame) (cdr height))
|
||||
(window-body-height window t))))
|
||||
(and (window--resizable-p window delta nil 'safe nil nil nil t)
|
||||
(window-combined-p window)
|
||||
(window-resize window delta nil 'safe t)))
|
||||
(setq resize-temp-buffer-window-inhibit 'vertical))
|
||||
((functionp height)
|
||||
(ignore-errors (funcall height window))
|
||||
(setq resize-temp-buffer-window-inhibit 'vertical)))
|
||||
;; Adjust width of window if asked for.
|
||||
|
|
@ -7315,6 +7329,13 @@ Return WINDOW if BUFFER and WINDOW are live."
|
|||
(window-combined-p window t))
|
||||
(window-resize window delta t 'safe)))
|
||||
(setq resize-temp-buffer-window-inhibit 'horizontal))
|
||||
((and (consp width) (eq (car width) 'body-columns))
|
||||
(let* ((delta (- (* (frame-char-width frame) (cdr width))
|
||||
(window-body-width window t))))
|
||||
(and (window--resizable-p window delta t 'safe nil nil nil t)
|
||||
(window-combined-p window t)
|
||||
(window-resize window delta t 'safe t)))
|
||||
(setq resize-temp-buffer-window-inhibit 'horizontal))
|
||||
((functionp width)
|
||||
(ignore-errors (funcall width window))
|
||||
(setq resize-temp-buffer-window-inhibit 'horizontal)))
|
||||
|
|
@ -7564,11 +7585,12 @@ perform.
|
|||
Action alist entries are:
|
||||
`inhibit-same-window' -- A non-nil value prevents the same
|
||||
window from being used for display.
|
||||
`inhibit-switch-frame' -- A non-nil value prevents any frame used
|
||||
for showing the buffer from being raised or selected. Note
|
||||
that a window manager may still raise a new frame and give it
|
||||
focus, effectively overriding the value specified here.
|
||||
`reusable-frames' -- The value specifies the set of frames to
|
||||
`inhibit-switch-frame' -- A non-nil value prevents any frame
|
||||
used for showing the buffer from being raised or selected.
|
||||
Note that a window manager may still raise a new frame and
|
||||
give it focus, effectively overriding the value specified
|
||||
here.
|
||||
`reusable-frames' -- The value specifies the set of frames to
|
||||
search for a window that already displays the buffer.
|
||||
Possible values are nil (the selected frame), t (any live
|
||||
frame), visible (any visible frame), 0 (any visible or
|
||||
|
|
@ -7577,45 +7599,51 @@ Action alist entries are:
|
|||
frame parameters to give a new frame, if one is created.
|
||||
`window-height' -- The value specifies the desired height of the
|
||||
window chosen and is either an integer (the total height of
|
||||
the window), a floating point number (the fraction of its
|
||||
total height with respect to the total height of the frame's
|
||||
root window) or a function to be called with one argument -
|
||||
the chosen window. The function is supposed to adjust the
|
||||
height of the window; its return value is ignored. Suitable
|
||||
functions are `shrink-window-if-larger-than-buffer' and
|
||||
`fit-window-to-buffer'.
|
||||
the window specified in frame lines), a floating point
|
||||
number (the fraction of its total height with respect to the
|
||||
total height of the frame's root window), a cons cell whose
|
||||
car is 'body-lines' and whose cdr is an integer that
|
||||
specifies the height of the window's body in frame lines, or
|
||||
a function to be called with one argument - the chosen
|
||||
window. That function is supposed to adjust the height of
|
||||
the window. Suitable functions are `fit-window-to-buffer'
|
||||
and `shrink-window-if-larger-than-buffer'.
|
||||
`window-width' -- The value specifies the desired width of the
|
||||
window chosen and is either an integer (the total width of
|
||||
the window), a floating point number (the fraction of its
|
||||
total width with respect to the width of the frame's root
|
||||
window) or a function to be called with one argument - the
|
||||
chosen window. The function is supposed to adjust the width
|
||||
of the window; its return value is ignored.
|
||||
the window specified in frame lines), a floating point
|
||||
number (the fraction of its total width with respect to the
|
||||
width of the frame's root window), a cons cell whose car is
|
||||
'body-columns' and whose cdr is an integer that specifies the
|
||||
width of the window's body in frame columns, or a function to
|
||||
be called with one argument - the chosen window. That
|
||||
function is supposed to adjust the width of the window.
|
||||
`window-size' -- This entry is only useful for windows appearing
|
||||
alone on their frame and specifies the desired size of that
|
||||
window either as a cons of integers (the total width and
|
||||
height of the window on that frame), or a function to be
|
||||
called with one argument - the chosen window. The function
|
||||
is supposed to adjust the size of the frame; its return value
|
||||
is ignored.
|
||||
`preserve-size' -- The value should be either (t . nil) to
|
||||
height of the window on that frame), a cons cell whose car is
|
||||
'body-chars' and whose cdr is a cons of integers (the desired
|
||||
width and height of the window's body in columns and lines of
|
||||
its frame), or a function to be called with one argument -
|
||||
the chosen window. That function is supposed to adjust the
|
||||
size of the frame.
|
||||
`preserve-size' -- The value should be either (t . nil) to
|
||||
preserve the width of the chosen window, (nil . t) to
|
||||
preserve its height or (t . t) to preserve its height and
|
||||
width in future changes of the window configuration.
|
||||
`window-parameters' -- The value specifies an alist of window
|
||||
parameters to give the chosen window.
|
||||
`allow-no-window' -- A non-nil value means that `display-buffer'
|
||||
may not display the buffer and return nil immediately.
|
||||
`body-function' -- A function called with one argument - the
|
||||
displayed window. It is called after the buffer is
|
||||
displayed, and before `window-height', `window-width'
|
||||
and `preserve-size' are applied. The function is supposed
|
||||
to fill the window body with some contents that might depend
|
||||
on dimensions of the displayed window.
|
||||
parameters to give the chosen window. `allow-no-window' -- A
|
||||
non-nil value means that `display-buffer' may not display the
|
||||
buffer and return nil immediately. `body-function' -- A
|
||||
function called with one argument - the displayed window. It
|
||||
is called after the buffer is displayed, and before
|
||||
`window-height', `window-width' and `preserve-size' are
|
||||
applied. The function is supposed to fill the window body
|
||||
with some contents that might depend on dimensions of the
|
||||
displayed window.
|
||||
|
||||
The entries `window-height', `window-width' and `preserve-size'
|
||||
are applied only when the window used for displaying the buffer
|
||||
never showed another buffer before.
|
||||
The entries `window-height', `window-width', `window-size' and
|
||||
`preserve-size' are applied only when the window used for
|
||||
displaying the buffer never showed another buffer before.
|
||||
|
||||
The ACTION argument can also have a non-nil and non-list value.
|
||||
This means to display the buffer in a window other than the
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue