From: Martin Rudalics Date: Mon, 17 Oct 2016 08:52:01 +0000 (+0200) Subject: Fix frame focus redirection with shared minibuffer windows (Bug#24500) X-Git-Tag: emacs-26.0.90~1462^2~10 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=421c0512f76683e0b85ea5e1362291c2da4149ba;p=emacs.git Fix frame focus redirection with shared minibuffer windows (Bug#24500) * src/frame.c (do_switch_frame): Redirect frame focus also when the frame switched to has its minibuffer window on the selected frame. * src/window.c (candidate_window_p): To qualify as candidate it's not sufficient for the window's frame to just share the minibuffer window - it must be active as well. --- diff --git a/src/frame.c b/src/frame.c index 45559b0be98..a1c2199d044 100644 --- a/src/frame.c +++ b/src/frame.c @@ -1160,7 +1160,12 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor if (FRAMEP (xfocus)) { focus = FRAME_FOCUS_FRAME (XFRAME (xfocus)); - if (FRAMEP (focus) && XFRAME (focus) == SELECTED_FRAME ()) + if ((FRAMEP (focus) && XFRAME (focus) == SELECTED_FRAME ()) + /* Redirect frame focus also when FRAME has its minibuffer + window on the selected frame (see Bug#24500). */ + || (NILP (focus) + && EQ (FRAME_MINIBUF_WINDOW (XFRAME (frame)), + sf->selected_window))) Fredirect_frame_focus (xfocus, frame); } } diff --git a/src/window.c b/src/window.c index 753ebc16fbf..acbefcdad16 100644 --- a/src/window.c +++ b/src/window.c @@ -2377,8 +2377,10 @@ candidate_window_p (Lisp_Object window, Lisp_Object owindow, == FRAME_TERMINAL (XFRAME (selected_frame))); } else if (WINDOWP (all_frames)) - candidate_p = (EQ (FRAME_MINIBUF_WINDOW (f), all_frames) - || EQ (XWINDOW (all_frames)->frame, w->frame) + /* To qualify as candidate, it's not sufficient for WINDOW's frame + to just share the minibuffer window - it must be active as well + (see Bug#24500). */ + candidate_p = (EQ (XWINDOW (all_frames)->frame, w->frame) || EQ (XWINDOW (all_frames)->frame, FRAME_FOCUS_FRAME (f))); else if (FRAMEP (all_frames)) candidate_p = EQ (all_frames, w->frame);