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);