From a3dba8edd9001e89e24c204b9186fdf8b444e78c Mon Sep 17 00:00:00 2001 From: Chris Feng Date: Sun, 31 Jul 2016 13:14:43 +0800 Subject: [PATCH] Fix restarting issues * exwm-workspace.el (exwm-workspace--confirm-kill-emacs): * exwm.el (exwm-restart): Run `kill-emacs-hook' early; do not check for X windows before restarting. --- exwm-workspace.el | 15 ++++++++++----- exwm.el | 8 ++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/exwm-workspace.el b/exwm-workspace.el index b73059ab4..3e2fe1abb 100644 --- a/exwm-workspace.el +++ b/exwm-workspace.el @@ -1039,12 +1039,17 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first." (declare-function exwm-manage--unmanage-window "exwm-manage.el") (declare-function exwm--exit "exwm.el") -(defun exwm-workspace--confirm-kill-emacs (prompt) +(defun exwm-workspace--confirm-kill-emacs (prompt &optional force) "Confirm before exiting Emacs." - (when (pcase (length exwm--id-buffer-alist) - (0 (y-or-n-p prompt)) - (x (yes-or-no-p (format "[EXWM] %d window%s currently alive. %s" - x (if (= x 1) "" "s") prompt)))) + (when (or (and force (not (eq force 'no-check))) + (and (or (eq force 'no-check) (not exwm--id-buffer-alist)) + (y-or-n-p prompt)) + (yes-or-no-p (format "[EXWM] %d window(s) will be destroyed. %s" + (length exwm--id-buffer-alist) prompt))) + ;; Run `kill-emacs-hook' before Emacs frames are unmapped so that + ;; errors can be visible. + (run-hooks 'kill-emacs-hook) + (setq kill-emacs-hook nil) ;; Hide & reparent out all frames (save-set can't be used here since ;; X windows will be re-mapped). (when (exwm-workspace--minibuffer-own-frame-p) diff --git a/exwm.el b/exwm.el index b04990b32..9a593d5ec 100644 --- a/exwm.el +++ b/exwm.el @@ -87,15 +87,11 @@ (defun exwm-restart () "Restart EXWM." (interactive) - (when (exwm-workspace--confirm-kill-emacs "[EXWM] Restart? ") - (server-force-delete) - (run-hooks 'kill-emacs-hook) - ;; FIXME: more? + (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. - (let ((kill-emacs-hook nil)) - (kill-emacs)))) + (kill-emacs))) (defun exwm--update-window-type (id &optional force) "Update _NET_WM_WINDOW_TYPE."