branch: elpa/helm
commit 249d09492c70c36f50f3028cd35a281edd185960
Author: Thierry Volpiatto <thie...@posteo.net>
Commit: Thierry Volpiatto <thie...@posteo.net>

    Remove limitation to two windows in helm-swap-windows
---
 helm-core.el | 165 ++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 84 insertions(+), 81 deletions(-)

diff --git a/helm-core.el b/helm-core.el
index a9e3ffc52b8..9a0d9c32d79 100644
--- a/helm-core.el
+++ b/helm-core.el
@@ -7317,45 +7317,48 @@ unless FORCE-LONGEST is non nil."
   "Toggle resplit helm window, vertically or horizontally."
   (interactive)
   (with-helm-alive-p
-    (if (and (= (length (window-list nil 1)) 2)
-             (not (window-dedicated-p
-                   (get-buffer-window helm-current-buffer))))
-        (progn
-          (when helm-prevent-escaping-from-minibuffer
-            (helm-prevent-switching-other-window :enabled nil))
-          (unwind-protect
-              (with-helm-window
-                (cond ((or helm-full-frame (one-window-p t))
-                       (user-error "Attempt to resplit a single window"))
-                      ((helm-action-window)
-                       (user-error "Can't resplit while selecting actions"))
-                      (t
-                       (let ((before-height (window-height)))
-                         (delete-window)
-                         (set-window-buffer
-                          (select-window
-                           (if (= (window-height) before-height) ; initial 
split was horizontal.
-                               ;; Split window vertically with `helm-buffer' 
placed
-                               ;; on the good side according to actual value of
-                               ;; `helm-split-window-default-side'.
-                               (prog1
-                                   (cond ((or (eq 
helm-split-window-default-side 'above)
-                                              (eq 
helm-split-window-default-side 'left))
-                                          (split-window
-                                           (selected-window) nil 'above))
-                                         (t (split-window-vertically)))
-                                 (setq helm-split-window-state 'vertical))
-                             ;; Split window vertically, same comment as above.
-                             (setq helm-split-window-state 'horizontal)
-                             (cond ((or (eq helm-split-window-default-side 
'left)
-                                        (eq helm-split-window-default-side 
'above))
-                                    (split-window (selected-window) nil 'left))
-                                   (t (split-window-horizontally)))))
-                          helm-buffer))))
-                (setq helm--window-side-state (helm--get-window-side-state)))
-            (when helm-prevent-escaping-from-minibuffer
-              (helm-prevent-switching-other-window :enabled t))))
-      (error "current window configuration not suitable for splitting"))))
+    (cond ((> (length (window-list nil 1)) 2)
+           (helm-swap-windows))
+          ((and (= (length (window-list nil 1)) 2)
+                (not (window-dedicated-p
+                      (get-buffer-window helm-current-buffer))))
+           (when helm-prevent-escaping-from-minibuffer
+             (helm-prevent-switching-other-window :enabled nil))
+           (unwind-protect
+                (with-helm-window
+                  (cond ((or helm-full-frame (one-window-p t))
+                         (user-error "Attempt to resplit a single window"))
+                        ((helm-action-window)
+                         (user-error "Can't resplit while selecting actions"))
+                        ((window-parameter (get-buffer-window 
helm-current-buffer) 'window-slot)
+                         (user-error "Can't resplit a side window"))
+                        (t
+                         (let ((before-height (window-height)))
+                           (delete-window)
+                           (set-window-buffer
+                            (select-window
+                             (if (= (window-height) before-height) ; initial 
split was horizontal.
+                                 ;; Split window vertically with `helm-buffer' 
placed
+                                 ;; on the good side according to actual value 
of
+                                 ;; `helm-split-window-default-side'.
+                                 (prog1
+                                     (cond ((or (eq 
helm-split-window-default-side 'above)
+                                                (eq 
helm-split-window-default-side 'left))
+                                            (split-window
+                                             (selected-window) nil 'above))
+                                           (t (split-window-vertically)))
+                                   (setq helm-split-window-state 'vertical))
+                               ;; Split window vertically, same comment as 
above.
+                               (setq helm-split-window-state 'horizontal)
+                               (cond ((or (eq helm-split-window-default-side 
'left)
+                                          (eq helm-split-window-default-side 
'above))
+                                      (split-window (selected-window) nil 
'left))
+                                     (t (split-window-horizontally)))))
+                            helm-buffer))))
+                  (setq helm--window-side-state (helm--get-window-side-state)))
+             (when helm-prevent-escaping-from-minibuffer
+               (helm-prevent-switching-other-window :enabled t))))
+          (t (error "current window configuration not suitable for 
splitting")))))
 (put 'helm-toggle-resplit-window 'helm-only t)
 
 ;; Utility: Resize helm window.
@@ -7409,48 +7412,48 @@ If N is positive enlarge, if negative narrow."
   "Swap window holding `helm-buffer' with other window."
   (interactive)
   (with-helm-alive-p
-    (if (= (length (window-list nil 1)) 2)
-        (cond ((and helm-full-frame (one-window-p t))
-               (user-error "Can't swap windows in a single window"))
-              ((helm-action-window)
-               (user-error "Can't resplit while selecting actions"))
-              (t
-               (let* ((w1          (helm-window))
-                      (split-state (eq helm-split-window-state 'horizontal))
-                      (w1size      (window-total-size w1 split-state))
-                      (b1          (window-buffer w1)) ; helm-buffer
-                      (s1          (window-start w1))
-                      (cur-frame   (window-frame w1))
-                      (w2          (with-selected-window (helm-window)
-                                     ;; Don't try to display helm-buffer
-                                     ;; in a dedicated window.
-                                     (get-window-with-predicate
-                                      (lambda (w) (not (window-dedicated-p w)))
-                                      1 cur-frame)))
-                      (w2size      (window-total-size w2 split-state))
-                      (b2          (window-buffer w2)) ; probably 
helm-current-buffer
-                      (s2          (window-start w2))
-                      resize)
-                 (with-selected-frame (window-frame w1)
-                   (helm-replace-buffer-in-window w1 b1 b2)
-                   (helm-replace-buffer-in-window w2 b2 b1)
-                   (setq resize
-                         (cond ( ;; helm-window is smaller than other window.
-                                (< w1size w2size)
-                                (- (- (max w2size w1size)
-                                      (min w2size w1size))))
-                               ( ;; helm-window is larger than other window.
-                                (> w1size w2size)
-                                (- (max w2size w1size)
-                                   (min w2size w1size)))
-                               ( ;; windows have probably same size.
-                                t nil)))
-                   ;; Maybe resize the window holding helm-buffer.
-                   (and resize (window-resize w2 resize split-state))
-                   (set-window-start w1 s2 t)
-                   (set-window-start w2 s1 t))
-                 (setq helm--window-side-state 
(helm--get-window-side-state)))))
-      (error "current window configuration not suitable for splitting"))))
+    (cond ((and helm-full-frame (one-window-p t))
+           (user-error "Can't swap windows in a single window"))
+          ((helm-action-window)
+           (user-error "Can't swap windows while selecting actions"))
+          ((window-parameter (get-buffer-window helm-current-buffer) 
'window-slot)
+           (user-error "Can't swap with a side window"))
+          (t
+           (let* ((w1          (helm-window))
+                  (split-state (eq helm-split-window-state 'horizontal))
+                  (w1size      (window-total-size w1 split-state))
+                  (b1          (window-buffer w1)) ; helm-buffer
+                  (s1          (window-start w1))
+                  (cur-frame   (window-frame w1))
+                  (w2          (with-selected-window (helm-window)
+                                 ;; Don't try to display helm-buffer
+                                 ;; in a dedicated window.
+                                 (get-window-with-predicate
+                                  (lambda (w) (not (window-dedicated-p w)))
+                                  1 cur-frame)))
+                  (w2size      (window-total-size w2 split-state))
+                  (b2          (window-buffer w2)) ; probably 
helm-current-buffer
+                  (s2          (window-start w2))
+                  resize)
+             (with-selected-frame (window-frame w1)
+               (helm-replace-buffer-in-window w1 b1 b2)
+               (helm-replace-buffer-in-window w2 b2 b1)
+               (setq resize
+                     (cond (;; helm-window is smaller than other window.
+                            (< w1size w2size)
+                            (- (- (max w2size w1size)
+                                  (min w2size w1size))))
+                           (;; helm-window is larger than other window.
+                            (> w1size w2size)
+                            (- (max w2size w1size)
+                               (min w2size w1size)))
+                           (;; windows have probably same size.
+                            t nil)))
+               ;; Maybe resize the window holding helm-buffer.
+               (and resize (window-resize w2 resize split-state))
+               (set-window-start w1 s2 t)
+               (set-window-start w2 s1 t))
+             (setq helm--window-side-state (helm--get-window-side-state)))))))
 (put 'helm-swap-windows 'helm-only t)
 
 (defun helm--get-window-side-state ()

Reply via email to