1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-23 07:19:15 +00:00

Facultatively ignore margins when splitting and resizing windows (Bug#24193)

Provide a new window parameter 'min-margins' which allows to
ignore the actual widths of a window's margins when splitting or
resizing that window horizontally.  This should serve as a
workaround for handling the problems raised by Bug#24193.

* lisp/window.el (window--min-size-1): Handle new window
parameter 'min-margins'.
(split-window): Fix text of error messages.
* doc/lispref/windows.texi (Window Parameters): Describe new
parameter 'min-margins'.
This commit is contained in:
Martin Rudalics 2016-08-16 09:19:18 +02:00
parent 8d681476bd
commit 0cee66c3f1
2 changed files with 39 additions and 7 deletions

View File

@ -4349,6 +4349,27 @@ window when it deletes the window passed to it as argument.
The fourth element is the buffer whose display caused the creation of
this parameter. @code{quit-restore-window} deletes the specified window
only if it still shows that buffer.
@item @code{min-margins}
The value of this parameter is a cons cell whose @sc{car} and @sc{cdr},
if non-@code{nil}, specify the minimum values (in columns) for the left
and right margin of this window. When present, Emacs will use these
values instead of the actual margin widths for determining whether a
window can be split or shrunk horizontally.
Emacs never auto-adjusts the margins of any window after splitting or
resizing it. It is sole responsibility of the application that has set
this parameter to adjust the margins of this window as well as those of
any new window that inherits this window's margins due to a split.
Both, @code{window-configuration-change-hook} and
@code{window-size-change-functions} (@pxref{Window Hooks}), should be
employed for this purpose.
This parameter was introduced in Emacs version 25.1 to support
applications that use large margins to center buffer text within a
window and should be used, with due care, exclusively by those
applications. It might be replaced by an improved solution in future
versions of Emacs.
@end table
There are additional parameters @code{window-atom} and @code{window-side};

View File

@ -1383,10 +1383,21 @@ ignore width restrictions for WINDOW."
(let* ((char-size (frame-char-size window t))
(fringes (window-fringes window))
(margins (window-margins window))
;; Let the 'min-margins' parameter override the actual
;; widths of the margins. We allow any number to
;; replace the values specified by `window-margins'.
;; See bug#24193 for the rationale of this parameter.
(min-margins (window-parameter window 'min-margins))
(left-min-margin (and min-margins
(numberp (car min-margins))
(car min-margins)))
(right-min-margin (and min-margins
(numberp (cdr min-margins))
(cdr min-margins)))
(pixel-width
(+ (window-safe-min-size window t t)
(* (or (car margins) 0) char-size)
(* (or (cdr margins) 0) char-size)
(* (or left-min-margin (car margins) 0) char-size)
(* (or right-min-margin(cdr margins) 0) char-size)
(car fringes) (cadr fringes)
(window-scroll-bar-width window)
(window-right-divider-width window))))
@ -4774,7 +4785,7 @@ frame. The selected window is not changed by this function."
(window-sizable-p
parent (- (+ new-pixel-size divider-width)) horizontal
(setq ignore 'preserved) t))
(error "Window %s too small for splitting (1)" parent)))
(error "Window %s too small for splitting" parent)))
((and (> (+ new-pixel-size divider-width
(window-min-size window horizontal nil t))
old-pixel-size)
@ -4783,7 +4794,7 @@ frame. The selected window is not changed by this function."
window horizontal (setq ignore 'preserved) t))
old-pixel-size))
;; SIZE unspecified, no resizing.
(error "Window %s too small for splitting (2)" window))))
(error "Window %s too small for splitting" window))))
((and (>= pixel-size 0)
(or (>= pixel-size old-pixel-size)
(< new-pixel-size
@ -4791,7 +4802,7 @@ frame. The selected window is not changed by this function."
;; SIZE specified as new size of old window. If the new size
;; is larger than the old size or the size of the new window
;; would be less than the safe minimum, signal an error.
(error "Window %s too small for splitting (3)" window))
(error "Window %s too small for splitting" window))
(resize
;; SIZE specified, resizing.
(unless (or (window-sizable-p
@ -4801,13 +4812,13 @@ frame. The selected window is not changed by this function."
parent (- (+ new-pixel-size divider-width)) horizontal
(setq ignore 'preserved) t))
;; If we cannot resize the parent give up.
(error "Window %s too small for splitting (4)" parent)))
(error "Window %s too small for splitting" parent)))
((or (< new-pixel-size
(window-safe-min-pixel-size window horizontal))
(< (- old-pixel-size new-pixel-size)
(window-safe-min-pixel-size window horizontal)))
;; SIZE specification violates minimum size restrictions.
(error "Window %s too small for splitting (5)" window)))
(error "Window %s too small for splitting" window)))
(window--resize-reset frame horizontal)