From 6eaa0301f17898449827c778d52456800f776e65 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 29 Dec 2023 16:55:25 -0800 Subject: Correctly stop the subordinate Emacs daemon This patch starts Emacs as a foreground daemon (so it can accurately be killed) and terminates it by sending a signal (because 'server-force-delete' stops the local server, not the named server). * exwm.el (exwm--server-timeout): The time to politely wait for the subordinate server to exit before killing it. (exwm--server-stop): Send SIGTERM to the subordinate process instead of using 'server-force-delete'. (exwm--server-eval-at): Prevent Emacs from forking so we can manage it as a subprocess. --- exwm.el | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/exwm.el b/exwm.el index 5745533720..5e8489fee6 100644 --- a/exwm.el +++ b/exwm.el @@ -5,7 +5,7 @@ ;; Author: Chris Feng ;; Maintainer: Adrián Medraño Calvo ;; Version: 0.28 -;; Package-Requires: ((xelb "0.18")) +;; Package-Requires: ((emacs "26.1") (xelb "0.18")) ;; Keywords: unix ;; URL: https://github.com/ch11ng/exwm @@ -110,6 +110,9 @@ (defconst exwm--server-name "server-exwm" "Name of the subordinate Emacs server.") +(defvar exwm--server-timeout 1 + "Number of seconds to wait for the subordinate Emacs server to exit before killing it.") + (defvar exwm--server-process nil "Process of the subordinate Emacs server.") (defun exwm-reset () @@ -999,8 +1002,13 @@ FRAME, if given, indicates the X display EXWM should manage." (defun exwm--server-stop () "Stop the subordinate Emacs server." (exwm--log) - (server-force-delete exwm--server-name) (when exwm--server-process + (when (process-live-p exwm--server-process) + (cl-loop + initially (signal-process exwm--server-process 'TERM) + while (process-live-p exwm--server-process) + repeat (* 10 exwm--server-timeout) + do (sit-for 0.1))) (delete-process exwm--server-process) (setq exwm--server-process nil))) @@ -1017,7 +1025,7 @@ FUNCTION is the function to be evaluated, ARGS are the arguments." (car command-line-args) ;The executable file "-d" (frame-parameter nil 'display) "-Q" - (concat "--daemon=" exwm--server-name) + (concat "--fg-daemon=" exwm--server-name) "--eval" ;; Create an invisible frame "(make-frame '((window-system . x) (visibility)))")) -- cgit 1.4.1