emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-26 5d34e1b 2/3: Allow split-window-sensibly to split


From: João Távora
Subject: [Emacs-diffs] emacs-26 5d34e1b 2/3: Allow split-window-sensibly to split threshold in further edge case
Date: Fri, 3 Nov 2017 12:14:19 -0400 (EDT)

branch: emacs-26
commit 5d34e1b2881caa5743816030c2e9cdcda58e9719
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>

    Allow split-window-sensibly to split threshold in further edge case
    
    As a fallback, and to avoid creating a frame, split-window-sensibly
    would previously disregard split-height-threshold if the window to be
    split is the frame's root window.
    
    This change generalizes that: it disregards the threshold if the
    window to be split is the frame's only _usable_ window (it is either
    the only one, as before, or all the other windows are dedicated to
    some buffer and thus cannot be touched).
    
    This is required for the fix to bug#28814.
    
    * lisp/window.el (split-height-threshold): Adjust doc to match
    split-window-sensibly.
    (split-window-sensibly): Also disregard threshold if all other
    windows are dedicated.
---
 lisp/window.el | 35 ++++++++++++++++++++++++-----------
 1 file changed, 24 insertions(+), 11 deletions(-)

diff --git a/lisp/window.el b/lisp/window.el
index f87294c..8939e7d 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -6465,8 +6465,9 @@ If this is an integer, `split-window-sensibly' may split 
a window
 vertically only if it has at least this many lines.  If this is
 nil, `split-window-sensibly' is not allowed to split a window
 vertically.  If, however, a window is the only window on its
-frame, `split-window-sensibly' may split it vertically
-disregarding the value of this variable."
+frame, or all the other ones are dedicated,
+`split-window-sensibly' may split it vertically disregarding the
+value of this variable."
   :type '(choice (const nil) (integer :tag "lines"))
   :version "23.1"
   :group 'windows)
@@ -6573,15 +6574,27 @@ split."
             ;; Split window horizontally.
             (with-selected-window window
               (split-window-right)))
-       (and (eq window (frame-root-window (window-frame window)))
-            (not (window-minibuffer-p window))
-            ;; If WINDOW is the only window on its frame and is not the
-            ;; minibuffer window, try to split it vertically disregarding
-            ;; the value of `split-height-threshold'.
-            (let ((split-height-threshold 0))
-              (when (window-splittable-p window)
-                (with-selected-window window
-                  (split-window-below))))))))
+       (and
+         ;; If WINDOW is the only usable window on its frame (it is
+         ;; the only one or, not being the only one, all the other
+         ;; ones are dedicated) and is not the minibuffer window, try
+         ;; to split it vertically disregarding the value of
+         ;; `split-height-threshold'.
+         (let ((frame (window-frame window)))
+           (or
+            (eq window (frame-root-window frame))
+            (catch 'done
+              (walk-window-tree (lambda (w)
+                                  (unless (or (eq w window)
+                                              (window-dedicated-p w))
+                                    (throw 'done nil)))
+                                frame)
+              t)))
+        (not (window-minibuffer-p window))
+        (let ((split-height-threshold 0))
+          (when (window-splittable-p window)
+            (with-selected-window window
+              (split-window-below))))))))
 
 (defun window--try-to-split-window (window &optional alist)
   "Try to split WINDOW.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]