(defcustom server-auth-dir (locate-user-emacs-file "server/")
"Directory for server authentication files.
+We only use this if `server-use-tcp' is non-nil.
+Otherwise we use `server-socket-dir'.
NOTE: On FAT32 filesystems, directories are not secure;
files can be read and modified by any user or process.
;; visible. If not (which can happen if the user's customizations call
;; pop-to-buffer etc.), delete it to avoid preserving the connection after
;; the last real frame is deleted.
- (if (and (eq (frame-first-window frame)
- (next-window (frame-first-window frame) 'nomini))
- (eq (window-buffer (frame-first-window frame))
- (frame-parameter frame 'server-dummy-buffer)))
- ;; The temp frame still only shows one buffer, and that is the
- ;; internal temp buffer.
- (delete-frame frame)
- (set-frame-parameter frame 'visibility t))
- (kill-buffer (frame-parameter frame 'server-dummy-buffer))
- (set-frame-parameter frame 'server-dummy-buffer nil)))
+
+ ;; Rewritten to avoid inadvertently killing the current buffer after
+ ;; `delete-frame' removed FRAME (Bug#10729).
+ (let ((buffer (frame-parameter frame 'server-dummy-buffer)))
+ (if (and (one-window-p 'nomini frame)
+ (eq (window-buffer (frame-first-window frame)) buffer))
+ ;; The temp frame still only shows one buffer, and that is the
+ ;; internal temp buffer.
+ (delete-frame frame)
+ (set-frame-parameter frame 'visibility t)
+ (set-frame-parameter frame 'server-dummy-buffer nil))
+ (when (buffer-live-p buffer)
+ (kill-buffer buffer)))))
(defun server-handle-delete-frame (frame)
"Delete the client connection when the emacsclient frame is deleted.
nil)
(defun server-eval-at (server form)
- "Eval FORM on Emacs Server SERVER."
+ "Contact the Emacs server named SERVER and evaluate FORM there.
+Returns the result of the evaluation, or signals an error if it
+cannot contact the specified server. For example:
+ \(server-eval-at \"server\" '(emacs-pid))
+returns the process ID of the Emacs instance running \"server\".
+This function requires the use of TCP sockets. "
+ (or server-use-tcp
+ (error "This function requires TCP sockets"))
(let ((auth-file (expand-file-name server server-auth-dir))
(coding-system-for-read 'binary)
(coding-system-for-write 'binary)