]> code.delx.au - gnu-emacs/blobdiff - lisp/server.el
Doc fixes
[gnu-emacs] / lisp / server.el
index 78b81e0b05b450de6709761b3b20405f0a4cebb5..ced07714dcf2945d964b554ed90d467dda4b2768 100644 (file)
@@ -367,18 +367,27 @@ If CLIENT is non-nil, add a description of it to the logged message."
   (server-log (format "Status changed to %s: %s" (process-status proc) msg) proc)
   (server-delete-client proc))
 
+(defun server--on-display-p (frame display)
+  (and (equal (frame-parameter frame 'display) display)
+       ;; Note: TTY frames still get a `display' parameter set to the value of
+       ;; $DISPLAY.  This is useful when running from that tty frame
+       ;; sub-processes that want to connect to the X server, but that means we
+       ;; have to be careful here not to be tricked into thinking those frames
+       ;; are on `display'.
+       (not (eq (framep frame) t))))
+
 (defun server-select-display (display)
   ;; If the current frame is on `display' we're all set.
   ;; Similarly if we are unable to open frames on other displays, there's
   ;; nothing more we can do.
   (unless (or (not (fboundp 'make-frame-on-display))
-              (equal (frame-parameter (selected-frame) 'display) display))
+              (server--on-display-p (selected-frame) display))
     ;; Otherwise, look for an existing frame there and select it.
     (dolist (frame (frame-list))
-      (when (equal (frame-parameter frame 'display) display)
+      (when (server--on-display-p frame display)
        (select-frame frame)))
     ;; If there's no frame on that display yet, create and select one.
-    (unless (equal (frame-parameter (selected-frame) 'display) display)
+    (unless (server--on-display-p (selected-frame) display)
       (let* ((buffer (generate-new-buffer " *server-dummy*"))
              (frame (make-frame-on-display
                      display
@@ -1124,6 +1133,13 @@ The following commands are accepted by the client:
                 ;; Unknown command.
                 (arg (error "Unknown command: %s" arg))))
 
+           ;; If both -no-wait and -tty are given with file or sexp
+           ;; arguments, use an existing frame.
+           (and nowait
+                (not (eq tty-name 'window-system))
+                (or files commands)
+                (setq use-current-frame t))
+
            (setq frame
                  (cond
                   ((and use-current-frame
@@ -1559,34 +1575,39 @@ only these files will be asked to be saved."
 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)
-       address port secret process)
-    (unless (file-exists-p auth-file)
-      (error "No such server definition: %s" auth-file))
+returns the process ID of the Emacs instance running \"server\"."
+  (let* ((server-dir (if server-use-tcp server-auth-dir server-socket-dir))
+        (server-file (expand-file-name server server-dir))
+        (coding-system-for-read 'binary)
+        (coding-system-for-write 'binary)
+        address port secret process)
+    (unless (file-exists-p server-file)
+      (error "No such server: %s" server))
     (with-temp-buffer
-      (insert-file-contents auth-file)
-      (unless (looking-at "\\([0-9.]+\\):\\([0-9]+\\)")
-       (error "Invalid auth file"))
-      (setq address (match-string 1)
-           port (string-to-number (match-string 2)))
-      (forward-line 1)
-      (setq secret (buffer-substring (point) (line-end-position)))
-      (erase-buffer)
-      (unless (setq process (open-network-stream "eval-at" (current-buffer)
-                                                address port))
-       (error "Unable to contact the server"))
-      (set-process-query-on-exit-flag process nil)
-      (process-send-string
-       process
-       (concat "-auth " secret " -eval "
-              (server-quote-arg (format "%S" form))
-              "\n"))
+      (when server-use-tcp
+       (let ((coding-system-for-read 'no-conversion))
+         (insert-file-contents server-file)
+         (unless (looking-at "\\([0-9.]+\\):\\([0-9]+\\)")
+           (error "Invalid auth file"))
+         (setq address (match-string 1)
+               port (string-to-number (match-string 2)))
+         (forward-line 1)
+         (setq secret (buffer-substring (point) (line-end-position)))
+         (erase-buffer)))
+      (unless (setq process (make-network-process
+                            :name "eval-at"
+                            :buffer (current-buffer)
+                            :host address
+                            :service (if server-use-tcp port server-file)
+                            :family (if server-use-tcp 'ipv4 'local)
+                            :noquery t))
+              (error "Unable to contact the server"))
+      (if server-use-tcp
+         (process-send-string process (concat "-auth " secret "\n")))
+      (process-send-string process
+                          (concat "-eval "
+                                  (server-quote-arg (format "%S" form))
+                                  "\n"))
       (while (memq (process-status process) '(open run))
        (accept-process-output process 0 10))
       (goto-char (point-min))
@@ -1600,7 +1621,8 @@ This function requires the use of TCP sockets. "
                                          (progn (skip-chars-forward "^\n")
                                                 (point))))))
        (if (not (equal answer ""))
-           (read (server-unquote-arg answer)))))))
+           (read (decode-coding-string (server-unquote-arg answer)
+                                       'emacs-internal)))))))
 
 \f
 (provide 'server)