summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Whitton <spwhitton@spwhitton.name>2024-03-21 15:33:26 +0800
committerSean Whitton <spwhitton@spwhitton.name>2024-03-21 18:22:41 +0800
commit0ce54e6590ff697e1fb44f5684d0ab3e90160d12 (patch)
treefa1130f30cc98b155e2a112ed9b25255c9f8d8d5
parent519cd895acac991878b13a9cb8e06e1cbf2e10b6 (diff)
downloaddotfiles-0ce54e6590ff697e1fb44f5684d0ab3e90160d12.tar.gz
rewrite spw/maybe-toggle-split-after-resize
Now toggles both ways, avoids unnecessary redirection to spw/toggle-frame-split, and restores next and previous windows lists.
-rw-r--r--.emacs.d/init.el41
1 files changed, 35 insertions, 6 deletions
diff --git a/.emacs.d/init.el b/.emacs.d/init.el
index 5ab92cf4..4a0c7daf 100644
--- a/.emacs.d/init.el
+++ b/.emacs.d/init.el
@@ -2,7 +2,7 @@
;; Except for parts marked as authored by others, this file is
;;
-;; Copyright (C) 2010-2023 Sean Whitton <spwhitton@spwhitton.name>
+;; Copyright (C) 2010-2024 Sean Whitton <spwhitton@spwhitton.name>
;;
;; and is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -2177,12 +2177,41 @@ Useful after resizing the frame."
(defun spw/maybe-toggle-split-after-resize (frame)
(when (and (framep frame)
(frame-size-changed-p frame)
- (< (frame-width frame) split-width-threshold))
+ (= (count-windows nil frame) 2))
(with-selected-frame frame
- (when (and (= (count-windows) 2)
- (/= (car (window-edges (selected-window)))
- (car (window-edges (next-window)))))
- (spw/toggle-frame-split)))))
+ (let ((width (frame-width))
+ (this-edges (window-edges (selected-window)))
+ (next-edges (window-edges (next-window))))
+ (when (or (and (< width split-width-threshold)
+ (/= (car this-edges) (car next-edges)))
+ (and (>= width split-width-threshold)
+ (/= (cadr this-edges) (cadr next-edges))))
+ (cl-flet ((window-info (window)
+ (cons (window-buffer window)
+ (cons (window-prev-buffers window)
+ (window-next-buffers window))))
+ (set-window-info (window info)
+ (set-window-buffer window (car info))
+ (set-window-prev-buffers window (cadr info))
+ (set-window-next-buffers window (cddr info))))
+ (let ((this-info (window-info (selected-window)))
+ (next-info (window-info (next-window))))
+ ;; Ensure we start with a fresh window.
+ (split-window)
+ (other-window 1)
+ (delete-other-windows)
+
+ (if (and (<= (car this-edges) (car next-edges))
+ (<= (cadr this-edges) (cadr next-edges)))
+ ;; Want to use `pop-to-buffer' for the second window s.t. my
+ ;; rule for REPLs in `display-buffer-alist' takes effect.
+ (progn (set-window-info (selected-window) this-info)
+ (save-selected-window
+ (pop-to-buffer (car next-info))
+ (set-window-info (selected-window) next-info)))
+ (set-window-info (selected-window) next-info)
+ (pop-to-buffer (car this-info))
+ (set-window-info (selected-window) this-info)))))))))
(add-to-list 'window-size-change-functions
#'spw/maybe-toggle-split-after-resize)