- (let ((window (get-buffer-window buffer t)))
- (if window
- ;; If we have a window already, make it visible.
- (let ((frame (window-frame window)))
- (make-frame-visible frame)
- (raise-frame frame)
- window)
- ;; If no window yet, make one in a new frame.
- (let ((frame (make-frame (append args special-display-frame-alist))))
- (set-window-buffer (frame-selected-window frame) buffer)
- (set-window-dedicated-p (frame-selected-window frame) t)
- (frame-selected-window frame))))))
+ (let ((window (get-buffer-window buffer 0)))
+ (or
+ ;; If we have a window already, make it visible.
+ (when window
+ (let ((frame (window-frame window)))
+ (make-frame-visible frame)
+ (raise-frame frame)
+ window))
+ ;; Reuse the current window if the user requested it.
+ (when (cdr (assq 'same-window args))
+ (condition-case nil
+ (progn (switch-to-buffer buffer) (selected-window))
+ (error nil)))
+ ;; Stay on the same frame if requested.
+ (when (or (cdr (assq 'same-frame args)) (cdr (assq 'same-window args)))
+ (let* ((pop-up-frames nil) (pop-up-windows t)
+ special-display-regexps special-display-buffer-names
+ (window (display-buffer buffer)))
+ ;; Only do it if this is a new window:
+ ;; (set-window-dedicated-p window t)
+ window))
+ ;; If no window yet, make one in a new frame.
+ (let ((frame
+ (with-current-buffer buffer
+ (make-frame (append args special-display-frame-alist)))))
+ (set-window-buffer (frame-selected-window frame) buffer)
+ (set-window-dedicated-p (frame-selected-window frame) t)
+ (frame-selected-window frame))))))