diff options
Diffstat (limited to 'exwm.el')
-rw-r--r-- | exwm.el | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/exwm.el b/exwm.el index 861d51a9707b..dd279bbcd091 100644 --- a/exwm.el +++ b/exwm.el @@ -88,10 +88,29 @@ "Restart EXWM." (interactive) (when (exwm-workspace--confirm-kill-emacs "[EXWM] Restart? " 'no-check) - (apply #'call-process (car command-line-args) nil nil nil - (cdr command-line-args)) - ;; Kill this instance at last. - (kill-emacs))) + (let* ((attr (process-attributes (emacs-pid))) + (args (cdr (assq 'args attr))) + (ppid (cdr (assq 'ppid attr))) + (pargs (cdr (assq 'args (process-attributes ppid))))) + (cond + ((= ppid 1) + ;; The parent is the init process. This probably means this + ;; instance is an emacsclient. Anyway, start a control instance + ;; to manage the subsequent ones. + (call-process (car command-line-args)) + (kill-emacs)) + ((string= args pargs) + ;; This is a subordinate instance. Return a magic number to + ;; inform the parent (control instance) to start another one. + (kill-emacs ?R)) + (t + ;; This is the control instance. Keep starting subordinate + ;; instances until told to exit. + ;; Run `server-force-stop' if it exists. + (run-hooks 'kill-emacs-hook) + (with-temp-buffer + (while (= ?R (shell-command-on-region (point) (point) args)))) + (kill-emacs)))))) (defun exwm--update-window-type (id &optional force) "Update _NET_WM_WINDOW_TYPE." |