1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs into feature/pgtk

This commit is contained in:
Yuuki Harano 2021-11-13 16:25:48 +09:00
commit c31d3dacf7
93 changed files with 2083 additions and 1525 deletions

View file

@ -1721,6 +1721,9 @@ be a cons cell (LINENUMBER . COLUMNNUMBER)."
(when server-raise-frame
(select-frame-set-input-focus (window-frame)))))
(defvar server-stop-automatically nil
"Internal status variable for `server-stop-automatically'.")
;;;###autoload
(defun server-save-buffers-kill-terminal (arg)
;; Called from save-buffers-kill-terminal in files.el.
@ -1729,27 +1732,103 @@ With ARG non-nil, silently save all file-visiting buffers, then kill.
If emacsclient was started with a list of filenames to edit, then
only these files will be asked to be saved."
(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")))))
(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))
(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"))))))
(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))
(null (cddr (frame-list))))
(let ((server-stop-automatically nil))
(save-buffers-kill-emacs)
(delete-frame frame)))))
(defun server-stop-automatically--maybe-kill-emacs ()
"Handle closing of Emacs daemon when `server-stop-automatically' is used."
(unless (cdr (frame-list))
(when (and
(not (memq t (mapcar (lambda (b)
(and (buffer-file-name b)
(buffer-modified-p b)))
(buffer-list))))
(not (memq t (mapcar (lambda (p)
(and (memq (process-status p)
'(run stop open listen))
(process-query-on-exit-flag p)))
(process-list)))))
(kill-emacs))))
;;;###autoload
(defun server-stop-automatically (arg)
"Automatically stop server as specified by ARG.
If ARG is the symbol `empty', stop the server when it has no
remaining clients, no remaining unsaved file-visiting buffers,
and no running processes with a `query-on-exit' flag.
If ARG is the symbol `delete-frame', ask the user when the last
frame is deleted whether each unsaved file-visiting buffer must
be saved and each running process with a `query-on-exit' flag
can be stopped, and if so, stop the server itself.
If ARG is the symbol `kill-terminal', ask the user when the
terminal is killed with \\[save-buffers-kill-terminal] \
whether each unsaved file-visiting
buffer must be saved and each running process with a `query-on-exit'
flag can be stopped, and if so, stop the server itself.
Any other value of ARG will cause this function to signal an error.
This function is meant to be called from the user init file."
(when (daemonp)
(setq server-stop-automatically arg)
(cond
((eq arg 'empty)
(setq server-stop-automatically nil)
(run-with-timer 10 2
#'server-stop-automatically--maybe-kill-emacs))
((eq arg 'delete-frame)
(add-hook 'delete-frame-functions
#'server-stop-automatically--handle-delete-frame))
((eq arg 'kill-terminal))
(t
(error "Unexpected argument")))))
(define-key ctl-x-map "#" 'server-edit)