Prevent server-mode from issuing a prompt in kill-emacs-hook.
authorChong Yidong <cyd@stupidchicken.com>
Mon, 1 Nov 2010 03:35:06 +0000 (23:35 -0400)
committerChong Yidong <cyd@stupidchicken.com>
Mon, 1 Nov 2010 03:35:06 +0000 (23:35 -0400)
* server.el (server-start): New arg INHIBIT-PROMPT prevents asking
user for confirmation.
(server-force-stop): Use it.
(server-start): Use server-force-stop for kill-emacs-hook, to
avoid user interaction while killing Emacs.

lisp/ChangeLog
lisp/server.el

index d2a1713..bc43863 100644 (file)
@@ -1,3 +1,11 @@
+2010-11-01  Chong Yidong  <cyd@stupidchicken.com>
+
+       * server.el (server-start): New arg INHIBIT-PROMPT prevents asking
+       user for confirmation.
+       (server-force-stop): Use it.
+       (server-start): Use server-force-stop for kill-emacs-hook, to
+       avoid user interaction while killing Emacs.
+
 2010-10-31  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * vc/log-edit.el (log-edit-rewrite-fixes): New var.
index 265b422..17d6743 100644 (file)
@@ -485,7 +485,7 @@ See variable `server-auth-dir' for details."
        (error "The directory `%s' is unsafe" dir)))))
 
 ;;;###autoload
-(defun server-start (&optional leave-dead)
+(defun server-start (&optional leave-dead inhibit-prompt)
   "Allow this Emacs process to be a server for client processes.
 This starts a server communications subprocess through which
 client \"editors\" can send your editing commands to this Emacs
@@ -495,7 +495,10 @@ Emacs distribution as your standard \"editor\".
 Optional argument LEAVE-DEAD (interactively, a prefix arg) means just
 kill any existing server communications subprocess.
 
-If a server is already running, the server is not started.
+If a server is already running, restart it.  If clients are
+running, ask the user for confirmation first, unless optional
+argument INHIBIT-PROMPT is non-nil.
+
 To force-start a server, do \\[server-force-delete] and then
 \\[server-start]."
   (interactive "P")
@@ -503,12 +506,14 @@ To force-start a server, do \\[server-force-delete] and then
            ;; Ask the user before deleting existing clients---except
            ;; when we can't get user input, which may happen when
            ;; doing emacsclient --eval "(kill-emacs)" in daemon mode.
-           (if (and (daemonp)
-                    (null (cdr (frame-list)))
-                    (eq (selected-frame) terminal-frame))
-               leave-dead
-             (yes-or-no-p
-              "The current server still has clients; delete them? ")))
+           (cond
+            ((and (daemonp)
+                  (null (cdr (frame-list)))
+                  (eq (selected-frame) terminal-frame))
+             leave-dead)
+            (inhibit-prompt t)
+            (t (yes-or-no-p
+                "The current server still has clients; delete them? "))))
     (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
           (server-file (expand-file-name server-name server-dir)))
       (when server-process
@@ -545,7 +550,7 @@ server or call `M-x server-force-delete' to forcibly disconnect it.")
          (add-hook 'delete-frame-functions 'server-handle-delete-frame)
          (add-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
          (add-hook 'kill-emacs-query-functions 'server-kill-emacs-query-function)
-         (add-hook 'kill-emacs-hook (lambda () (server-mode -1))) ;Cleanup upon exit.
+         (add-hook 'kill-emacs-hook 'server-force-stop) ;Cleanup upon exit.
          (setq server-process
                (apply #'make-network-process
                       :name server-name
@@ -586,6 +591,11 @@ server or call `M-x server-force-delete' to forcibly disconnect it.")
                        " " (int-to-string (emacs-pid))
                        "\n" auth-key)))))))))
 
+(defun server-force-stop ()
+  "Kill all connections to the current server.
+This function is meant to be called from `kill-emacs-hook'."
+  (server-start nil t))
+
 ;;;###autoload
 (defun server-force-delete (&optional name)
   "Unconditionally delete connection file for server NAME.