diff lisp/server.el @ 111449:132f2dfd549f

Merge from emacs-23
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 09 Nov 2010 15:07:10 -0500
parents b508dbb6fb11 83594fbec156
children 3655cc4062e4
line wrap: on
line diff
--- a/lisp/server.el	Tue Nov 09 10:29:37 2010 +0000
+++ b/lisp/server.el	Tue Nov 09 15:07:10 2010 -0500
@@ -498,7 +498,7 @@
 	(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
@@ -508,7 +508,10 @@
 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")
@@ -516,12 +519,14 @@
 	    ;; 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
@@ -560,7 +565,7 @@
 	  (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
@@ -601,6 +606,11 @@
 			" " (number-to-string (emacs-pid)) ; Kept for compatibility
 			"\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.