From b360b106e9954a1f31bb4a22f023820958eafe5a Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Thu, 21 Aug 2014 10:40:29 +0200 Subject: [PATCH] Handle failed attempts to split a side window (Bug#18304). * window.el (window--side-window-p): New function. (split-window, window-splittable-p): Use window--side-window-p to determine whether WINDOW can be split (Bug#18304). * calendar/calendar.el (calendar-basic-setup): Fix one call of `window-splittable-p' and add another (Bug#18304). --- lisp/ChangeLog | 8 ++++++++ lisp/calendar/calendar.el | 8 +++++++- lisp/window.el | 18 +++++++++++------- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 115497c7e41..5ac028e91da 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2014-08-21 Martin Rudalics + + * window.el (window--side-window-p): New function. + (split-window, window-splittable-p): Use window--side-window-p to + determine whether WINDOW can be split (Bug#18304). + * calendar/calendar.el (calendar-basic-setup): Fix one call of + `window-splittable-p' and add another (Bug#18304). + 2014-08-20 Sam Steingold * progmodes/python.el (python-new-pythonpath): Extract from diff --git a/lisp/calendar/calendar.el b/lisp/calendar/calendar.el index 581dd3437d9..7579f07cb2d 100644 --- a/lisp/calendar/calendar.el +++ b/lisp/calendar/calendar.el @@ -1423,10 +1423,16 @@ display the generated calendar." ;; the right thing in that case. ;; ;; Is this a wide frame? If so, split it horizontally. - (if (window-splittable-p t) (split-window-right)) + + ;; The following doesn't sound useful: If we split horizontally + ;; here, the subsequent `pop-to-buffer' will likely split again + ;; horizontally and we end up with three side-by-side windows. + (when (window-splittable-p (selected-window) t) + (split-window-right)) (pop-to-buffer calendar-buffer) ;; Has the window already been split vertically? (when (and (not (window-dedicated-p)) + (window-splittable-p (selected-window)) (window-full-height-p)) (let ((win (split-window-below))) ;; In the upper window, show whatever was visible before. diff --git a/lisp/window.el b/lisp/window.el index a05dddeac9e..e159bd967f1 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -743,6 +743,15 @@ number of slots on that side." (integer :tag "Number" :value 3 :size 5))) :group 'windows) +(defun window--side-window-p (window) + "Return non-nil if WINDOW is a side window or the parent of one." + (or (window-parameter window 'window-side) + (and (window-child window) + (or (window-parameter + (window-child window) 'window-side) + (window-parameter + (window-last-child window) 'window-side))))) + (defun window--major-non-side-window (&optional frame) "Return the major non-side window of frame FRAME. The optional argument FRAME must be a live frame and defaults to @@ -4378,12 +4387,7 @@ frame. The selected window is not changed by this function." ;; side window, throw an error unless `window-combination-resize' ;; equals 'side. ((and (not (eq window-combination-resize 'side)) - (or (window-parameter window 'window-side) - (and (window-child window) - (or (window-parameter - (window-child window) 'window-side) - (window-parameter - (window-last-child window) 'window-side))))) + (window--side-window-p window)) (error "Cannot split side window or parent of side window")) ;; If `window-combination-resize' is 'side and window has a side ;; window sibling, bind `window-combination-limit' to t. @@ -5798,7 +5802,7 @@ hold: wide as `split-width-threshold'. - When WINDOW is split evenly, the emanating windows are at least `window-min-width' or two (whichever is larger) columns wide." - (when (window-live-p window) + (when (and (window-live-p window) (not (window--side-window-p window))) (with-current-buffer (window-buffer window) (if horizontal ;; A window can be split horizontally when its width is not -- 2.39.5