From ade1238bce1cf69ebce8809a2d73cb92db94b977 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 14 Jul 2022 18:47:10 +0800 Subject: [PATCH] Try to restore the initial "daemon" frame when a display goes down * src/xterm.c (x_try_restore_frame): New function. (x_connection_closed): Call it if selected_frame is nil. --- src/xterm.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/xterm.c b/src/xterm.c index 1d0e69d32bc..85367b78e3c 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -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