|
|
diff --git a/popwin.el b/popwin.el
|
|
|
index 22f64f0..a5bafeb 100644
|
|
|
--- a/popwin.el
|
|
|
+++ b/popwin.el
|
|
|
@@ -4,7 +4,7 @@
|
|
|
|
|
|
;; Author: Tomohiro Matsuyama <tomo@cx4a.org>
|
|
|
;; Keywords: convenience
|
|
|
-;; Version: 0.3
|
|
|
+;; Version: 0.4
|
|
|
|
|
|
;; This program is free software; you can redistribute it and/or modify
|
|
|
;; it under the terms of the GNU General Public License as published by
|
|
|
@@ -69,7 +69,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
-;;; Common API
|
|
|
+;;; Common
|
|
|
+
|
|
|
+(defmacro popwin:save-selected-window (&rest body)
|
|
|
+ "Evaluate BODY saving the selected window."
|
|
|
+ `(with-selected-window (selected-window) ,@body))
|
|
|
+
|
|
|
+(defun popwin:switch-to-buffer (buffer-or-name &optional norecord)
|
|
|
+ "Call `switch-to-buffer' forcing BUFFER-OF-NAME be displayed in
|
|
|
+the selected window."
|
|
|
+ (with-no-warnings
|
|
|
+ (if (>= emacs-major-version 24)
|
|
|
+ (switch-to-buffer buffer-or-name norecord t)
|
|
|
+ (switch-to-buffer buffer-or-name norecord))))
|
|
|
|
|
|
(defun popwin:last-selected-window ()
|
|
|
"Return currently selected window or lastly selected window if
|
|
|
@@ -82,6 +94,12 @@ minibuffer window is selected."
|
|
|
"Return t if BUFFER might be thought of as a buried buffer."
|
|
|
(eq (car (last (buffer-list))) buffer))
|
|
|
|
|
|
+(defun popwin:called-interactively-p ()
|
|
|
+ (with-no-warnings
|
|
|
+ (if (>= emacs-major-version 23)
|
|
|
+ (called-interactively-p 'any)
|
|
|
+ (called-interactively-p))))
|
|
|
+
|
|
|
(defvar popwin:empty-buffer nil
|
|
|
"Marker buffer of indicating a window of the buffer is being a
|
|
|
popup window.")
|
|
|
@@ -142,7 +160,7 @@ horizontal factor HFACTOR, and vertical factor VFACTOR."
|
|
|
(cdr node)
|
|
|
(popwin:adjust-window-edges window edges hfactor vfactor)
|
|
|
(with-selected-window window
|
|
|
- (switch-to-buffer buffer t))
|
|
|
+ (popwin:switch-to-buffer buffer t))
|
|
|
(when selected
|
|
|
(select-window window)))
|
|
|
(destructuring-bind (dir edges . windows) node
|
|
|
@@ -221,7 +239,8 @@ window-configuration."
|
|
|
(root-win (popwin:last-selected-window))
|
|
|
(hfactor 1)
|
|
|
(vfactor 1))
|
|
|
- (delete-other-windows root-win)
|
|
|
+ (popwin:save-selected-window
|
|
|
+ (delete-other-windows root-win))
|
|
|
(let ((root-width (window-width root-win))
|
|
|
(root-height (window-height root-win)))
|
|
|
(when adjust
|
|
|
@@ -238,7 +257,7 @@ window-configuration."
|
|
|
(popwin:create-popup-window-1 root-win size position)
|
|
|
;; Mark popup-win being a popup window.
|
|
|
(with-selected-window popup-win
|
|
|
- (switch-to-buffer (popwin:empty-buffer) t))
|
|
|
+ (popwin:switch-to-buffer (popwin:empty-buffer) t))
|
|
|
(popwin:replicate-window-config master-win root hfactor vfactor)
|
|
|
(list master-win popup-win)))))
|
|
|
|
|
|
@@ -410,7 +429,7 @@ BUFFER."
|
|
|
popwin:selected-window (selected-window))
|
|
|
(popwin:start-close-popup-window-timer))))
|
|
|
(with-selected-window popwin:popup-window
|
|
|
- (switch-to-buffer buffer))
|
|
|
+ (popwin:switch-to-buffer buffer))
|
|
|
(setq popwin:popup-buffer buffer
|
|
|
popwin:popup-window-stuck-p stick)
|
|
|
(if noselect
|
|
|
@@ -438,6 +457,10 @@ be closed by `popwin:close-popup-window'."
|
|
|
|
|
|
;;; Special Display
|
|
|
|
|
|
+(defmacro popwin:without-special-display (&rest body)
|
|
|
+ "Evaluate BODY without special displaying."
|
|
|
+ `(let (display-buffer-function special-display-function) ,@body))
|
|
|
+
|
|
|
(defcustom popwin:special-display-config
|
|
|
'(("*Help*")
|
|
|
("*Completions*" :noselect t)
|
|
|
@@ -481,13 +504,19 @@ buffers will be shown at the left of the frame with width 80."
|
|
|
|
|
|
(defun popwin:original-display-buffer (buffer &optional not-this-window)
|
|
|
"Call `display-buffer' for BUFFER without special displaying."
|
|
|
- (let (display-buffer-function special-display-function)
|
|
|
- ;; Close the popup window here so that the popup window won't to
|
|
|
- ;; be splitted.
|
|
|
- (when (and (eq (selected-window) popwin:popup-window)
|
|
|
- (not (same-window-p (buffer-name buffer))))
|
|
|
- (popwin:close-popup-window))
|
|
|
- (display-buffer buffer not-this-window)))
|
|
|
+ (popwin:without-special-display
|
|
|
+ ;; Close the popup window here so that the popup window won't to
|
|
|
+ ;; be splitted.
|
|
|
+ (when (and (eq (selected-window) popwin:popup-window)
|
|
|
+ (not (same-window-p (buffer-name buffer))))
|
|
|
+ (popwin:close-popup-window))
|
|
|
+ (if (and (>= emacs-major-version 24)
|
|
|
+ (boundp 'action)
|
|
|
+ (boundp 'frame))
|
|
|
+ ;; Use variables ACTION and FRAME which are formal parameters
|
|
|
+ ;; of DISPLAY-BUFFER.
|
|
|
+ (display-buffer buffer action frame)
|
|
|
+ (display-buffer buffer not-this-window))))
|
|
|
|
|
|
(defun* popwin:display-buffer-1 (buffer-or-name &key default-config-keywords if-buffer-not-found if-config-not-found)
|
|
|
"Display BUFFER-OR-NAME, if possible, in a popup
|
|
|
@@ -548,9 +577,9 @@ usual. This function can be used as a value of
|
|
|
(popwin:display-buffer-1
|
|
|
buffer-or-name
|
|
|
:if-config-not-found
|
|
|
- (unless (interactive-p)
|
|
|
- (lambda (buffer-or-name)
|
|
|
- (popwin:original-display-buffer buffer-or-name not-this-window)))))
|
|
|
+ (unless (popwin:called-interactively-p)
|
|
|
+ (lambda (buffer)
|
|
|
+ (popwin:original-display-buffer buffer not-this-window)))))
|
|
|
|
|
|
(defun popwin:special-display-popup-window (buffer &rest ignore)
|
|
|
"The `special-display-function' with a popup window."
|