Subject: bug#55412: 28.1; In Emacs 28.1, using ':eval' in 'frame-title-format' doesn't work properly

From: Alan Mackenzie <[email-masked]>
Date: Wed, 18 May 2022 15:49:36 +0000

Hello, Martin and Eli.

On Wed, May 18, 2022 at 17:01:43 +0200, martin rudalics wrote:
>  >> When I type M-:, save the expression to evaluate from some other frame,
>  >> and the subsequent yank inserts that expression into a normal buffer
>  >> instead of the minibuffer, the resulting behavior does not constitute a
>  >> less important inconsistency but an annoying regression.  This is one of
>  >> the things that used to work "ever since".

>  > Can you tell more about the inconsistency you get in this scenario?
>  > I'm afraid I don't follow the description and therefore cannot try
>  > reproducing it myself.

> Suppose I want to calculate the sum of two numbers: number-1 is shown in
> a buffer on frame-1, number-2 is show in a buffer on frame-2.  I start
> typing M-: (+ on frame-1 then I do C-x o, mark number-1, type M-w, C-x o
> and C-y to yank number-1 into the minibuffer.  Then I add a space to the
> minibuffer, type C-x 5 o to go to frame-2, mark number-2, type M-w and
> C-x 5 o to get back to frame-1.

> Ever since, that last C-x 5 o got me to the minibuffer window.  With the
> proposed change, that C-x 5 o will get me to the window of number-1 and
> I have to manually select the minibuffer window to yank number-2 there.

Please try the following patch, which may solve the above problem
without hurting the bug fix.

diff --git a/src/frame.c b/src/frame.c
index ccac18d23c..7869726850 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -1564,6 +1564,10 @@ do_switch_frame (Lisp_Object frame, int track, int for_deletion, Lisp_Object nor
   if (! FRAME_MINIBUF_ONLY_P (XFRAME (selected_frame)))
     last_nonminibuf_frame = XFRAME (selected_frame);
 
+  if (EQ (f->selected_window, f->minibuffer_window)
+      && NILP (Fminibufferp (XWINDOW (f->minibuffer_window)->contents, Qt)))
+    Fset_frame_selected_window (frame, Fframe_first_window (frame), Qnil);
+
   Fselect_window (f->selected_window, norecord);
 
   /* We want to make sure that the next event generates a frame-switch
diff --git a/src/frame.h b/src/frame.h
index 0b8cdf62de..87c44dd22b 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -123,7 +123,8 @@ #define EMACS_FRAME_H
   /* This frame's selected window.
      Each frame has its own window hierarchy
      and one of the windows in it is selected within the frame.
-     The selected window of the selected frame is Emacs's selected window.  */
+     The selected window of the selected frame is Emacs's selected window.
+     This window may be the mini-window of the frame.  */
   Lisp_Object selected_window;
 
   /* This frame's selected window when run_window_change_functions was
diff --git a/src/minibuf.c b/src/minibuf.c
index 847e7be5ad..66aed0ad70 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -203,14 +203,6 @@ move_minibuffers_onto_frame (struct frame *of, bool for_deletion)
       zip_minibuffer_stacks (f->minibuffer_window, of->minibuffer_window);
       if (for_deletion && XFRAME (MB_frame) != of)
 	MB_frame = selected_frame;
-      if (!for_deletion
-	  && MINI_WINDOW_P (XWINDOW (FRAME_SELECTED_WINDOW (of))))
-	{
-	  Lisp_Object old_frame;
-	  XSETFRAME (old_frame, of);
-	  Fset_frame_selected_window (old_frame,
-				      Fframe_first_window (old_frame), Qnil);
-	}
     }
 }
 
diff --git a/src/xdisp.c b/src/xdisp.c
index 6963935666..7e166121df 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -12796,8 +12796,10 @@ gui_consider_frame_title (Lisp_Object frame)
 	 mode_line_noprop_buf; then display the title.  */
       record_unwind_protect (unwind_format_mode_line,
 			     format_mode_line_unwind_data
-			     (NULL, current_buffer, Qnil, false));
+			     (f, current_buffer, selected_window, false)
+			     /* (NULL, current_buffer, Qnil, false) */);
 
+      Fselect_window (f->selected_window, Qt);
       set_buffer_internal_1
 	(XBUFFER (XWINDOW (f->selected_window)->contents));
       fmt = FRAME_ICONIFIED_P (f) ? Vicon_title_format : Vframe_title_format;

> martin

-- 
Alan Mackenzie (Nuremberg, Germany).