Skip to content

Commit

Permalink
Fix usage of golden-ration in gnus buffers (#49).
Browse files Browse the repository at this point in the history
* golden-ratio.el: Fix issue by reverting PR (#48).
  • Loading branch information
Thierry Volpiatto committed May 1, 2015
1 parent 7593ba5 commit 5a661d3
Showing 1 changed file with 61 additions and 43 deletions.
104 changes: 61 additions & 43 deletions golden-ratio.el
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@

;; Major modes that are exempt from being resized. An example of this
;; for users of Org-mode might be:
;; ("calendar-mode") or (calendar-mode)
;; ("calendar-mode")
(defcustom golden-ratio-exclude-modes nil
"A list of symbols or strings naming major modes.
"An array of strings naming major modes.
Switching to a buffer whose major mode is a member of this list
will not cause the window to be resized to the golden ratio."
:type '(repeat (choice symbol string))
:type '(repeat string)
:group 'golden-ratio)

;; Buffer names that are exempt from being resized. An example of this
Expand Down Expand Up @@ -115,58 +115,76 @@ 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 (and
(window-resizable-p (selected-window) nrow)
;; don't enlarge ignored windows
(> nrow 0))
(when (window-resizable-p (selected-window) nrow)
(enlarge-window nrow))
(when (and (window-resizable-p (selected-window) ncol t)
;; don't enlarge ignored windows
(> ncol 0))
(when (window-resizable-p (selected-window) ncol t)
(enlarge-window ncol t)))))

(defun golden-ratio-exclude-major-mode-p ()
"Returns non-nil if `major-mode' should not use golden-ratio."
(or (memq major-mode golden-ratio-exclude-modes)
(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)
(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)))
(unless (or (not golden-ratio-mode)
(window-minibuffer-p)
(one-window-p)
(member (symbol-name major-mode)
golden-ratio-exclude-modes)
(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))))

;;;###autoload
(define-minor-mode golden-ratio-mode
"Enable automatic window resizing with golden ratio."
:lighter " Golden"
:global t)
: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)))


(provide 'golden-ratio)
Expand Down

0 comments on commit 5a661d3

Please sign in to comment.