]> git.eshelyaron.com Git - emacs.git/commitdiff
Try to restore the initial "daemon" frame when a display goes down
authorPo Lu <luangruo@yahoo.com>
Thu, 14 Jul 2022 10:47:10 +0000 (18:47 +0800)
committerPo Lu <luangruo@yahoo.com>
Thu, 14 Jul 2022 10:49:19 +0000 (18:49 +0800)
* src/xterm.c (x_try_restore_frame): New function.
(x_connection_closed): Call it if selected_frame is nil.

src/xterm.c

index 1d0e69d32bc2f5d5f8fa17cd65fb56d9723cb1ed..85367b78e3c665fa08ee40e54333216b6fbdae05 100644 (file)
@@ -23312,6 +23312,22 @@ x_trace_wire (Display *dpy)
 
 static char *error_msg;
 
+/* Try to find a frame in Vframe_list, and make it the selected frame.
+   `delete_frame' sometimes misses the initial frame for an unknown
+   reason when Emacs is running as a background daemon.  */
+
+static void
+x_try_restore_frame (void)
+{
+  Lisp_Object tail, frame;
+
+  FOR_EACH_FRAME (tail, frame)
+    {
+      if (!NILP (do_switch_frame (frame, 1, Qnil)))
+       return;
+    }
+}
+
 /* Handle the loss of connection to display DPY.  ERROR_MESSAGE is
    the text of an error message that lead to the connection loss.  */
 
@@ -23529,6 +23545,11 @@ For details, see etc/PROBLEMS.\n",
       Fdelete_terminal (tmp, Qnoelisp);
     }
 
+  /* The initial "daemon" frame is sometimes not selected by
+     `delete_frame' when Emacs is a background daemon.  */
+  if (NILP (selected_frame))
+    x_try_restore_frame ();
+
   unblock_input ();
 
   /* Sometimes another terminal is still alive, but deleting this