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
				
			
		|  | @ -25,6 +25,8 @@ | |||
| 
 | ||||
| ;;; Code: | ||||
| 
 | ||||
| (require 'server) | ||||
| 
 | ||||
| (require 'exwm-core) | ||||
| 
 | ||||
| (defvar exwm-workspace-number 1 "Initial number of workspaces.") | ||||
|  | @ -1046,15 +1048,32 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first." | |||
| 
 | ||||
| (defun exwm-workspace--confirm-kill-emacs (prompt &optional force) | ||||
|   "Confirm before exiting Emacs." | ||||
|   (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) | ||||
|   (when (cond | ||||
|          ((and force (not (eq force 'no-check))) | ||||
|           ;; Force killing Emacs. | ||||
|           t) | ||||
|          ((or (eq force 'no-check) (not exwm--id-buffer-alist)) | ||||
|           ;; Check if there's any unsaved file. | ||||
|           (pcase (catch 'break | ||||
|                    (let ((kill-emacs-query-functions | ||||
|                           (append kill-emacs-query-functions | ||||
|                                   (list (lambda () | ||||
|                                           (throw 'break 'break)))))) | ||||
|                      (save-buffers-kill-emacs))) | ||||
|             (`break (y-or-n-p prompt)) | ||||
|             (x x))) | ||||
|          (t | ||||
|           (yes-or-no-p (format "[EXWM] %d window(s) will be destroyed.  %s" | ||||
|                                (length exwm--id-buffer-alist) prompt)))) | ||||
|     ;; Run `kill-emacs-hook' (`server-force-stop' excluded) before Emacs | ||||
|     ;; frames are unmapped so that errors (if any) can be visible. | ||||
|     (if (memq #'server-force-stop kill-emacs-hook) | ||||
|         (progn | ||||
|           (setq kill-emacs-hook (delq #'server-force-stop kill-emacs-hook)) | ||||
|           (run-hooks 'kill-emacs-hook) | ||||
|           (setq kill-emacs-hook (list #'server-force-stop))) | ||||
|       (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) | ||||
|  | @ -1079,22 +1098,20 @@ Please check `exwm-workspace--minibuffer-own-frame-p' first." | |||
|                            :parent exwm--root | ||||
|                            :x 0 | ||||
|                            :y 0)))) | ||||
|     ;; Exit each module. | ||||
|     (exwm--exit) | ||||
|     ;; Destroy all resources created by this connection. | ||||
|     (xcb:disconnect exwm--connection) | ||||
|     (setq exwm--connection nil) | ||||
|     ;; Extra cleanups for emacsclient. | ||||
|     ;; Restore the 'client' frame parameter (before `exwm--exit'). | ||||
|     (when exwm-workspace--client | ||||
|       (dolist (f exwm-workspace--list) | ||||
|         (set-frame-parameter f 'client exwm-workspace--client)) | ||||
|       (when (exwm-workspace--minibuffer-own-frame-p) | ||||
|         (set-frame-parameter exwm-workspace--minibuffer 'client | ||||
|                              exwm-workspace--client)) | ||||
|       ;; Kill the client. | ||||
|       (server-save-buffers-kill-terminal nil)) | ||||
|                              exwm-workspace--client))) | ||||
|     ;; Exit each module. | ||||
|     (exwm--exit) | ||||
|     ;; Destroy all resources created by this connection. | ||||
|     (xcb:disconnect exwm--connection) | ||||
|     (setq exwm--connection nil) | ||||
|     ;; Set the return value. | ||||
|     (not exwm-workspace--client))) | ||||
|     t)) | ||||
| 
 | ||||
| (defun exwm-workspace--set-desktop-geometry () | ||||
|   "Set _NET_DESKTOP_GEOMETRY." | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue