summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-07-14 18:47:10 +0800
committerPo Lu <luangruo@yahoo.com>2022-07-14 18:49:19 +0800
commitade1238bce1cf69ebce8809a2d73cb92db94b977 (patch)
tree2eee5f604958e5bead901ce67c5299c935b98775
parent2a05479c221d4a13b15ed731e4eb1c0de99e97ed (diff)
downloademacs-ade1238bce1cf69ebce8809a2d73cb92db94b977.tar.gz
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.
-rw-r--r--src/xterm.c21
1 files changed, 21 insertions, 0 deletions
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