Fix restarting issues
* exwm-workspace.el (exwm-workspace--confirm-kill-emacs): Prompt for unsaved files before restarting; avoid running `server-force-stop' early; restore the 'client' frame parameter before calling `exwm--exit'; correctly handle emacsclient. * exwm.el (exwm-restart): Always kill subordinate Emacs instances.
This commit is contained in:
parent
173bbde885
commit
e7ff9a9f90
2 changed files with 59 additions and 23 deletions
27
exwm.el
27
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."
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue