mirror of
https://github.com/masscollaborationlabs/emacs.git
synced 2025-07-05 11:49:37 +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:
parent
8d681476bd
commit
0cee66c3f1
2 changed files with 39 additions and 7 deletions
|
@ -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
|
The fourth element is the buffer whose display caused the creation of
|
||||||
this parameter. @code{quit-restore-window} deletes the specified window
|
this parameter. @code{quit-restore-window} deletes the specified window
|
||||||
only if it still shows that buffer.
|
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
|
@end table
|
||||||
|
|
||||||
There are additional parameters @code{window-atom} and @code{window-side};
|
There are additional parameters @code{window-atom} and @code{window-side};
|
||||||
|
|
|
@ -1383,10 +1383,21 @@ ignore width restrictions for WINDOW."
|
||||||
(let* ((char-size (frame-char-size window t))
|
(let* ((char-size (frame-char-size window t))
|
||||||
(fringes (window-fringes window))
|
(fringes (window-fringes window))
|
||||||
(margins (window-margins 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
|
(pixel-width
|
||||||
(+ (window-safe-min-size window t t)
|
(+ (window-safe-min-size window t t)
|
||||||
(* (or (car margins) 0) char-size)
|
(* (or left-min-margin (car margins) 0) char-size)
|
||||||
(* (or (cdr margins) 0) char-size)
|
(* (or right-min-margin(cdr margins) 0) char-size)
|
||||||
(car fringes) (cadr fringes)
|
(car fringes) (cadr fringes)
|
||||||
(window-scroll-bar-width window)
|
(window-scroll-bar-width window)
|
||||||
(window-right-divider-width window))))
|
(window-right-divider-width window))))
|
||||||
|
@ -4774,7 +4785,7 @@ frame. The selected window is not changed by this function."
|
||||||
(window-sizable-p
|
(window-sizable-p
|
||||||
parent (- (+ new-pixel-size divider-width)) horizontal
|
parent (- (+ new-pixel-size divider-width)) horizontal
|
||||||
(setq ignore 'preserved) t))
|
(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
|
((and (> (+ new-pixel-size divider-width
|
||||||
(window-min-size window horizontal nil t))
|
(window-min-size window horizontal nil t))
|
||||||
old-pixel-size)
|
old-pixel-size)
|
||||||
|
@ -4783,7 +4794,7 @@ frame. The selected window is not changed by this function."
|
||||||
window horizontal (setq ignore 'preserved) t))
|
window horizontal (setq ignore 'preserved) t))
|
||||||
old-pixel-size))
|
old-pixel-size))
|
||||||
;; SIZE unspecified, no resizing.
|
;; 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)
|
((and (>= pixel-size 0)
|
||||||
(or (>= pixel-size old-pixel-size)
|
(or (>= pixel-size old-pixel-size)
|
||||||
(< new-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
|
;; 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
|
;; is larger than the old size or the size of the new window
|
||||||
;; would be less than the safe minimum, signal an error.
|
;; 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
|
(resize
|
||||||
;; SIZE specified, resizing.
|
;; SIZE specified, resizing.
|
||||||
(unless (or (window-sizable-p
|
(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
|
parent (- (+ new-pixel-size divider-width)) horizontal
|
||||||
(setq ignore 'preserved) t))
|
(setq ignore 'preserved) t))
|
||||||
;; If we cannot resize the parent give up.
|
;; 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
|
((or (< new-pixel-size
|
||||||
(window-safe-min-pixel-size window horizontal))
|
(window-safe-min-pixel-size window horizontal))
|
||||||
(< (- old-pixel-size new-pixel-size)
|
(< (- old-pixel-size new-pixel-size)
|
||||||
(window-safe-min-pixel-size window horizontal)))
|
(window-safe-min-pixel-size window horizontal)))
|
||||||
;; SIZE specification violates minimum size restrictions.
|
;; 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)
|
(window--resize-reset frame horizontal)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue