Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify `golden-ratio-mode' #48

Merged
merged 3 commits into from
May 1, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 34 additions & 57 deletions golden-ratio.el
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,14 @@ will not cause the window to be resized to the golden ratio."
(with-selected-window (or window (selected-window))
(let ((nrow (floor (- (first dimensions) (window-height))))
(ncol (floor (- (second dimensions) (window-width)))))
(when (window-resizable-p (selected-window) nrow)
(when (and
(window-resizable-p (selected-window) nrow)
;; don't enlarge ignored windows
(> nrow 0))
(enlarge-window nrow))
(when (window-resizable-p (selected-window) ncol t)
(when (and (window-resizable-p (selected-window) ncol t)
;; don't enlarge ignored windows
(> ncol 0))
(enlarge-window ncol t)))))

(defun golden-ratio-exclude-major-mode-p ()
Expand All @@ -126,70 +131,42 @@ will not cause the window to be resized to the golden ratio."
(member (symbol-name major-mode)
golden-ratio-exclude-modes)))

(defvar golden-ratio-in-progress nil
"Avoid recursive adjustment.")

;;;###autoload
(defun golden-ratio ()
"Resizes current window to the golden-ratio's size specs."
(interactive)
(unless (or (not golden-ratio-mode)
(window-minibuffer-p)
(one-window-p)
(golden-ratio-exclude-major-mode-p)
(member (buffer-name)
golden-ratio-exclude-buffer-names)
(and golden-ratio-inhibit-functions
(loop for fun in golden-ratio-inhibit-functions
thereis (funcall fun))))
(let ((dims (golden-ratio--dimensions))
(golden-ratio-mode nil))
;; Always disable `golden-ratio-mode' to avoid
;; infinite loop in `balance-windows'.
(balance-windows)
(golden-ratio--resize-window dims)
(when golden-ratio-recenter
(scroll-right) (recenter)))))

;; Should return nil
(defadvice other-window
(after golden-ratio-resize-window)
(golden-ratio) nil)

;; Should return the buffer
(defadvice pop-to-buffer
(around golden-ratio-resize-window)
(prog1 ad-do-it (golden-ratio)))

(defun golden-ratio--post-command-hook ()
(when (or (memq this-command golden-ratio-extra-commands)
(and (consp this-command) ; A lambda form.
(loop for com in golden-ratio-extra-commands
thereis (or (memq com this-command)
(memq (car-safe com) this-command)))))
;; This is needed in emacs-25 to avoid this error from `recenter':
;; `recenter'ing a window that does not display current-buffer.
;; This doesn't happen in emacs-24.4 and previous versions.
(run-with-idle-timer 0.01 nil (lambda () (golden-ratio)))))

(defun golden-ratio--mouse-leave-buffer-hook ()
(run-at-time 0.1 nil (lambda ()
(golden-ratio))))
(when (and golden-ratio-mode
(not golden-ratio-in-progress))
(let ((golden-ratio-in-progress t))
(unless (or (window-minibuffer-p)
(one-window-p)
(golden-ratio-exclude-major-mode-p)
(member (buffer-name)
golden-ratio-exclude-buffer-names)
(and golden-ratio-inhibit-functions
(loop for fun in golden-ratio-inhibit-functions
thereis (funcall fun))))
(balance-windows)
(golden-ratio--resize-window (golden-ratio--dimensions))
(when golden-ratio-recenter
(scroll-right) (recenter))))))

(defadvice select-window (after golden-ratio-select-window activate)
(when golden-ratio-mode
(golden-ratio)))

(defadvice split-window (after golden-ratio-select-window activate)
(when golden-ratio-mode
(golden-ratio)))

;;;###autoload
(define-minor-mode golden-ratio-mode
"Enable automatic window resizing with golden ratio."
:lighter " Golden"
:global t
(if golden-ratio-mode
(progn
(add-hook 'window-configuration-change-hook 'golden-ratio)
(add-hook 'post-command-hook 'golden-ratio--post-command-hook)
(add-hook 'mouse-leave-buffer-hook 'golden-ratio--mouse-leave-buffer-hook)
(ad-activate 'other-window)
(ad-activate 'pop-to-buffer))
(remove-hook 'window-configuration-change-hook 'golden-ratio)
(remove-hook 'post-command-hook 'golden-ratio--post-command-hook)
(remove-hook 'mouse-leave-buffer-hook 'golden-ratio--mouse-leave-buffer-hook)
(ad-deactivate 'other-window)
(ad-deactivate 'pop-to-buffer)))
:global t)


(provide 'golden-ratio)
Expand Down