diff --git a/lisp/server.el b/lisp/server.el index 1b027f88ce..e88cffa8fb 100644 --- a/lisp/server.el +++ b/lisp/server.el @@ -1780,17 +1780,25 @@ server-save-buffers-kill-terminal If emacsclient was started with a list of filenames to edit, then only these files will be asked to be saved." - (if server-stop-automatically - (server-stop-automatically--handle-delete-frame (selected-frame)) (let ((proc (frame-parameter nil 'client))) (cond ((eq proc 'nowait) ;; Nowait frames have no client buffer list. - (if (cdr (frame-list)) + (if (length> (frame-list) (if server-stop-automatically 2 1)) + ;; If there are any other frames, only delete this one. + ;; When `server-stop-automatically' is set, don't count + ;; the daemon frame. (progn (save-some-buffers arg) (delete-frame)) ;; If we're the last frame standing, kill Emacs. (save-buffers-kill-emacs arg))) ((processp proc) + (if (or (not server-stop-automatically) + (length> server-clients 1) + (seq-some + (lambda (frame) + (when-let ((p (frame-parameter frame 'client))) + (not (eq proc p)))) + (frame-list))) (let ((buffers (process-get proc 'buffers))) (save-some-buffers arg (if buffers @@ -1801,31 +1809,20 @@ server-save-buffers-kill-terminal ;; ARG is non-nil), since we're not killing ;; Emacs (unlike `save-buffers-kill-emacs'). (and arg t))) - (server-delete-client proc))) - (t (error "Invalid client frame")))))) + (server-delete-client proc)) + ;; If `server-stop-automatically' is set, there are no + ;; other client processes, and no other client frames + ;; (e.g. `nowait' frames), kill Emacs. + (save-buffers-kill-emacs arg))) + (t (error "Invalid client frame"))))) (defun server-stop-automatically--handle-delete-frame (frame) "Handle deletion of FRAME when `server-stop-automatically' is used." - (when server-stop-automatically - (if (if (and (processp (frame-parameter frame 'client)) - (eq this-command 'save-buffers-kill-terminal)) - (progn - (dolist (f (frame-list)) - (when (and (eq (frame-parameter frame 'client) - (frame-parameter f 'client)) - (not (eq frame f))) - (set-frame-parameter f 'client nil) - (let ((server-stop-automatically nil)) - (delete-frame f)))) - (if (cddr (frame-list)) - (let ((server-stop-automatically nil)) - (delete-frame frame) - nil) - t)) + (when (and server-stop-automatically (null (cddr (frame-list)))) (let ((server-stop-automatically nil)) (save-buffers-kill-emacs) - (delete-frame frame))))) + (delete-frame frame)))) (defun server-stop-automatically--maybe-kill-emacs () "Handle closing of Emacs daemon when `server-stop-automatically' is used."