summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Rudalics <rudalics@gmx.at>2016-08-16 09:19:18 +0200
committerMartin Rudalics <rudalics@gmx.at>2016-08-16 09:19:18 +0200
commit0cee66c3f1e92702774e670b32f3dded1a4c3957 (patch)
tree335ba8ef62c700295ef8a78228b3bd59e0f30283
parent8d681476bd44a2f843030579a5bbf5a248488afb (diff)
downloademacs-0cee66c3f1e92702774e670b32f3dded1a4c3957.tar.gz
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'.
-rw-r--r--doc/lispref/windows.texi21
-rw-r--r--lisp/window.el25
2 files changed, 39 insertions, 7 deletions
diff --git a/doc/lispref/windows.texi b/doc/lispref/windows.texi
index 55d90bd5d0d..386584bf9e5 100644
--- a/doc/lispref/windows.texi
+++ b/doc/lispref/windows.texi
@@ -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};
diff --git a/lisp/window.el b/lisp/window.el
index f7a547b915a..8505bef6b12 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -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)