]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow 'display-buffer' to set up body size of chosen window (Bug#17065)
authorMartin Rudalics <rudalics@gmx.at>
Mon, 25 Oct 2021 08:42:17 +0000 (10:42 +0200)
committerMartin Rudalics <rudalics@gmx.at>
Mon, 25 Oct 2021 08:42:17 +0000 (10:42 +0200)
* 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.

doc/lispref/windows.texi
etc/NEWS
lisp/window.el

index 262516054ab38348d076d9c2d0cf252d20d43360..9ce185a7a6bb2bb99be1d0a1e1169617d5869ff3 100644 (file)
@@ -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
index f6d36f1e914b017e2a94405a248c900f4a6b0eae..90ad8d3a46ca00b4918f680dbf930437fb992368 100644 (file)
--- a/etc/NEWS
+++ b/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.
 \f
 * Editing Changes in Emacs 29.1
 
index 132f0930cebcb00be669797e8e2cbcf0d0fe4944..848e61811d9cbb35a1f9c883cb61586fd7475e6a 100644 (file)
@@ -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.
-
-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.
+    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', `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