From fe6ff62de3f18c2d8f9c0a0032fff39615380299 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 1 Dec 2022 12:19:44 -0800 Subject: [PATCH 6/7] Merge kill-terminal implementations Now that 'server-stop-automatically--handle-kill-terminal' and 'server-save-buffers-kill-terminal' are almost the same, merge them into a single function. * lisp/server.el (server-stop-automatically--handle-kill-terminal): Merge this... (server-save-buffers-kill-terminal): ... into this. --- lisp/server.el | 92 +++++++++++++++++++------------------------------- 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/lisp/server.el b/lisp/server.el index 9b91fbbbdc..6eeaa932a7 100644 --- a/lisp/server.el +++ b/lisp/server.el @@ -1780,29 +1780,41 @@ 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-kill-terminal (selected-frame)) - (let ((proc (frame-parameter nil 'client))) - (cond ((eq proc 'nowait) - ;; Nowait frames have no client buffer list. - (if (cdr (frame-list)) - (progn (save-some-buffers arg) - (delete-frame)) - ;; If we're the last frame standing, kill Emacs. - (save-buffers-kill-emacs arg))) - ((processp proc) - (let ((buffers (process-get proc 'buffers))) - (save-some-buffers - arg (if buffers - ;; Only files from emacsclient file list. - (lambda () (memq (current-buffer) buffers)) - ;; No emacsclient file list: don't override - ;; `save-some-buffers-default-predicate' (unless - ;; 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")))))) + (let ((proc (frame-parameter nil 'client))) + (cond ((eq proc 'nowait) + ;; Nowait frames have no client buffer 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 + ;; Only files from emacsclient file list. + (lambda () (memq (current-buffer) buffers)) + ;; No emacsclient file list: don't override + ;; `save-some-buffers-default-predicate' (unless + ;; ARG is non-nil), since we're not killing + ;; Emacs (unlike `save-buffers-kill-emacs'). + (and arg t))) + (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." @@ -1812,40 +1824,6 @@ server-stop-automatically--handle-delete-frame (save-buffers-kill-emacs) (delete-frame frame))))) -(defun server-stop-automatically--handle-kill-terminal (frame) - "Handle deletion of FRAME when `server-stop-automatically' is used." - (when server-stop-automatically - (let ((proc (frame-parameter frame 'client))) - (cond ((eq proc 'nowait) - (if (cddr (frame-list)) - ;; If there are any other non-daemon frames, don't - ;; kill Emacs, but *do* save some buffers, as in - ;; `server-save-buffers-kill-terminal'. - (progn - (save-some-buffers) - (delete-frame)) - ;; If we're the last non-daemon frame standing, kill - ;; Emacs. - (save-buffers-kill-emacs))) - ((processp proc) - (if ;; Keep the server alive if... - (or - ;; a) there are any other clients, or... - (length> server-clients 1) - ;; b) there are any frames not owned by this client. - (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 - nil (if buffers - ;; Only files from emacsclient file list. - (lambda () (memq (current-buffer) buffers)))) - (server-delete-client)) - (save-buffers-kill-emacs))))))) - (defun server-stop-automatically--maybe-kill-emacs () "Handle closing of Emacs daemon when `server-stop-automatically' is used." (unless (cdr (frame-list)) -- 2.25.1