Skip to content

Commit

Permalink
Advice minibuffer-selected-window to return correct window
Browse files Browse the repository at this point in the history
minibuffer-selected-window must return window selected just before mini-frame window was selected.
radian-software/ctrlf#57
  • Loading branch information
muffinmad committed Aug 28, 2020
1 parent 5e89f4a commit 41d87d1
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions mini-frame.el
Expand Up @@ -5,7 +5,7 @@
;; Author: Andrii Kolomoiets <andreyk.mad@gmail.com>
;; Keywords: frames
;; URL: https://github.com/muffinmad/emacs-mini-frame
;; Package-Version: 1.1
;; Package-Version: 1.2
;; Package-Requires: ((emacs "26.1"))

;; This file is NOT part of GNU Emacs.
Expand Down Expand Up @@ -137,6 +137,7 @@ Option `resize-mini-frames' is available on Emacs 27 and later."

(defvar mini-frame-frame nil)
(defvar mini-frame-selected-frame nil)
(defvar mini-frame-selected-window nil)
(defvar mini-frame-completions-frame nil)

(defun mini-frame--shift-color (from to &optional by)
Expand Down Expand Up @@ -238,6 +239,7 @@ ALIST is passed to `window--display-buffer'."
(defun mini-frame--display (fn args)
"Show mini-frame and call FN with ARGS."
(let* ((selected-frame (selected-frame))
(selected-window (selected-window))
(selected-is-mini-frame (memq selected-frame
(list mini-frame-frame
mini-frame-completions-frame)))
Expand All @@ -252,9 +254,11 @@ ALIST is passed to `window--display-buffer'."
(if (frame-live-p mini-frame-frame)
(unless selected-is-mini-frame
(setq mini-frame-selected-frame selected-frame)
(setq mini-frame-selected-window selected-window)
(modify-frame-parameters mini-frame-frame parent-frame-parameters))
(progn
(setq mini-frame-selected-frame selected-frame)
(setq mini-frame-selected-window selected-window)
(setq mini-frame-frame
(make-frame (append '((minibuffer . only))
mini-frame--common-parameters
Expand All @@ -270,6 +274,14 @@ ALIST is passed to `window--display-buffer'."
(setq default-directory dd)
(apply fn args)))

(defun mini-frame--minibuffer-selected-window (fn &rest args)
"Call FN with ARGS. Return window selected just before mini-frame window was selected."
(let ((window (apply fn args)))
(if (and window
(eq mini-frame-frame (window-frame window)))
mini-frame-selected-window
window)))

(defun mini-frame--delete-frame (frame)
"Called before delete FRAME."
(cond
Expand Down Expand Up @@ -340,9 +352,11 @@ ALIST is passed to `window--display-buffer'."
:global t
(cond
(mini-frame-mode
(advice-add 'read-from-minibuffer :around #'mini-frame-read-from-minibuffer))
(advice-add 'read-from-minibuffer :around #'mini-frame-read-from-minibuffer)
(advice-add 'minibuffer-selected-window :around #'mini-frame--minibuffer-selected-window))
(t
(advice-remove 'read-from-minibuffer #'mini-frame-read-from-minibuffer)
(advice-remove 'minibuffer-selected-window #'mini-frame--minibuffer-selected-window)
(when (frame-live-p mini-frame-frame)
(delete-frame mini-frame-frame))
(when (frame-live-p mini-frame-completions-frame)
Expand Down

0 comments on commit 41d87d1

Please sign in to comment.