aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorKaroly Lorentey2003-12-31 05:09:29 +0000
committerKaroly Lorentey2003-12-31 05:09:29 +0000
commit819b8f00ed7b8a9a2190efaa02376ed332ecf763 (patch)
treec30ab72204225385c428db008580a9f67f5c215c /lisp
parent16c290d8c16fb0fdb574c837c6b1badbc655efe2 (diff)
downloademacs-819b8f00ed7b8a9a2190efaa02376ed332ecf763.tar.gz
emacs-819b8f00ed7b8a9a2190efaa02376ed332ecf763.zip
A few more bugfixes and new features.
(Sigh.) I obviously need to remember to separate individual changes to multiple commits. src/emacsclient.c: Improved error handling. (decode_options): Changed frame option (again) from -f to -t. (print_help_and_exit): Ditto. (copy_from_to): Check EINTR after write, not EAGAIN. Removed SIGIO hack. (pty_conversation): Handle errors transmitted through the socket. Handle pty errors by not reading from it anymore. (main): Restore correct errno after socket_status failed. Send -tty on -t, not -pty. lisp/server.el (server-process-filter): Watch -tty, not -pty. Use make-frame-on-tty instead of make-terminal-frame. Don't set newframe to t if make-frame-on-tty failed. Don't delete frames here. Print correct message when there are no files to edit, but a new frame was requested. (server-sentinel): Delete the frame after the process. (server-handle-delete-frame): New function for delete-frame-functions. (server-start): Add server-handle-delete-frame to delete-frame-functions. (server-buffer-done): Don't delete frames here. src/alloc.c (mark_ttys): Add prototype. (Fgarbage_collect): Call mark_ttys. src/emacs.c: (shut_down_emacs): Don't flush stdout before reset_sys_modes(). src/process.c (add_keyboard_wait_descriptor_called_flag): Removed. (add_keyboard_wait_descriptor): Removed stdin hack. src/sysdep.c: Unconditionally include sysselect.h. (old_fcntl_flags): Changed to an array. (init_sigio, reset_sigio): Use it. (narrow_foreground_group, widen_foreground_group): Use setpgid, not setpgrp. (old_fcntl_owner): Changed to an array. (init_sys_modes, reset_sys_modes): Use it. Fix fsync() and reset_sigio() calls. src/term.c (Qframe_tty_name, Qframe_tty_type): New variables. (syms_of_term): Initialize them. (Fframe_tty_name, Fframe_tty_type): New functions. (term_init): Call add_keyboard_wait_descriptor(). (Fdelete_tty): New function. (delete_tty): Call delete_keyboard_wait_descriptor(). (get_current_tty): Removed. (mark_ttys): New function. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-28
Diffstat (limited to 'lisp')
-rw-r--r--lisp/server.el52
1 files changed, 31 insertions, 21 deletions
diff --git a/lisp/server.el b/lisp/server.el
index bf7d4a5d358..ef9aa47b6bd 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -185,9 +185,6 @@ are done with it in the server.")
185 ;; Remove PROC from the list of clients. 185 ;; Remove PROC from the list of clients.
186 (when client 186 (when client
187 (setq server-clients (delq client server-clients)) 187 (setq server-clients (delq client server-clients))
188 (let ((frame (assq (car client) server-frames)))
189 (setq server-frames (delq frame server-frames))
190 (when (frame-live-p (cadr frame)) (delete-frame (cadr frame) 'force)))
191 (dolist (buf (cdr client)) 188 (dolist (buf (cdr client))
192 (with-current-buffer buf 189 (with-current-buffer buf
193 ;; Remove PROC from the clients of each buffer. 190 ;; Remove PROC from the clients of each buffer.
@@ -197,9 +194,24 @@ are done with it in the server.")
197 (or (and server-kill-new-buffers 194 (or (and server-kill-new-buffers
198 (not server-existing-buffer)) 195 (not server-existing-buffer))
199 (server-temp-file-p))) 196 (server-temp-file-p)))
200 (kill-buffer (current-buffer))))))) 197 (kill-buffer (current-buffer)))))
198 (let ((frame (assq (car client) server-frames)))
199 (when frame
200 (setq server-frames (delq frame server-frames))
201 (when (frame-live-p (cadr frame)) (delete-frame (cadr frame) 'force))))))
201 (server-log (format "Status changed to %s" (process-status proc)) proc)) 202 (server-log (format "Status changed to %s" (process-status proc)) proc))
202 203
204(defun server-handle-delete-frame (frame)
205 (dolist (entry server-frames)
206 (let ((proc (nth 0 entry))
207 (f (nth 1 entry)))
208 (when (eq f frame)
209 (let ((client (assq proc server-clients)))
210 (if (and (cdr client) (not (yes-or-no-p "Frame has pending buffers; close anyway? ")))
211 (error "Frame deletion cancelled")
212 (setq server-frames (delq entry server-frames))
213 (delete-process (car client))))))))
214
203(defun server-select-display (display) 215(defun server-select-display (display)
204 ;; If the current frame is on `display' we're all set. 216 ;; If the current frame is on `display' we're all set.
205 (unless (equal (frame-parameter (selected-frame) 'display) display) 217 (unless (equal (frame-parameter (selected-frame) 'display) display)
@@ -276,6 +288,7 @@ Prefix arg means just kill any existing server communications subprocess."
276 (if server-process 288 (if server-process
277 (server-log (message "Restarting server"))) 289 (server-log (message "Restarting server")))
278 (letf (((default-file-modes) ?\700)) 290 (letf (((default-file-modes) ?\700))
291 (add-to-list 'delete-frame-functions 'server-handle-delete-frame)
279 (setq server-process 292 (setq server-process
280 (make-network-process 293 (make-network-process
281 :name "server" :family 'local :server t :noquery t 294 :name "server" :family 'local :server t :noquery t
@@ -335,18 +348,18 @@ PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"."
335 (error (process-send-string proc (nth 1 err)) 348 (error (process-send-string proc (nth 1 err))
336 (setq request ""))))) 349 (setq request "")))))
337 ;; Open a new frame at the client. ARG is the name of the pseudo tty. 350 ;; Open a new frame at the client. ARG is the name of the pseudo tty.
338 ((and (equal "-pty" arg) (string-match "\\([^ ]*\\) \\([^ ]*\\) " request)) 351 ((and (equal "-tty" arg) (string-match "\\([^ ]*\\) \\([^ ]*\\) " request))
339 (setq newframe t) 352 (let ((tty (server-unquote-arg (match-string 1 request)))
340 (let ((pty (server-unquote-arg (match-string 1 request)))
341 (type (server-unquote-arg (match-string 2 request)))) 353 (type (server-unquote-arg (match-string 2 request))))
342 (setq request (substring request (match-end 0))) 354 (setq request (substring request (match-end 0)))
343 (condition-case err 355 (condition-case err
344 (let ((frame (make-terminal-frame `((tty . ,pty) (tty-type . ,type))))) 356 (let ((frame (make-frame-on-tty tty type)))
345 (setq server-frames (cons (list (car client) frame) server-frames)) 357 (setq server-frames (cons (list (car client) frame) server-frames))
346 (sit-for 0) 358 (sit-for 0)
347 (process-send-string proc (concat (number-to-string (emacs-pid)) "\n")) 359 (process-send-string proc (concat (number-to-string (emacs-pid)) "\n"))
348 (select-frame frame)) 360 (select-frame frame)
349 (error (process-send-string proc (nth 1 err)) 361 (setq newframe t))
362 (error (ignore-errors (process-send-string proc (concat (nth 1 err) "\n")))
350 (setq request ""))))) 363 (setq request "")))))
351 ;; ARG is a line number option. 364 ;; ARG is a line number option.
352 ((string-match "\\`\\+[0-9]+\\'" arg) 365 ((string-match "\\`\\+[0-9]+\\'" arg)
@@ -386,19 +399,19 @@ PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"."
386 (if (and (not newframe) (null (cdr client))) 399 (if (and (not newframe) (null (cdr client)))
387 ;; This client is empty; get rid of it immediately. 400 ;; This client is empty; get rid of it immediately.
388 (progn 401 (progn
389 (let ((frame (assq (car client) server-frames)))
390 (setq server-frames (delq frame server-frames))
391 (when (frame-live-p (cadr frame)) (delete-frame (cadr frame) 'force)))
392 (delete-process proc) 402 (delete-process proc)
393 (server-log "Close empty client" proc)) 403 (server-log "Close empty client" proc))
394 ;; We visited some buffer for this client. 404 ;; We visited some buffer for this client.
395 (or nowait (push client server-clients)) 405 (or nowait (push client server-clients))
396 (unless (or isearch-mode (minibufferp)) 406 (unless (or isearch-mode (minibufferp))
397 (server-switch-buffer (nth 1 client)) 407 (if (and newframe (null (cdr client)))
398 (run-hooks 'server-switch-hook) 408 (message (substitute-command-keys
399 (unless nowait 409 "When done with this frame, type \\[delete-frame]"))
400 (message (substitute-command-keys 410 (server-switch-buffer (nth 1 client))
401 "When done with a buffer, type \\[server-edit]"))))))) 411 (run-hooks 'server-switch-hook)
412 (unless nowait
413 (message (substitute-command-keys
414 "When done with a buffer, type \\[server-edit]"))))))))
402 ;; Save for later any partial line that remains. 415 ;; Save for later any partial line that remains.
403 (when (> (length string) 0) 416 (when (> (length string) 0)
404 (process-put proc 'previous-string string))) 417 (process-put proc 'previous-string string)))
@@ -475,9 +488,6 @@ FOR-KILLING if non-nil indicates that we are called from `kill-buffer'."
475 ;; If client now has no pending buffers, 488 ;; If client now has no pending buffers,
476 ;; tell it that it is done, and forget it entirely. 489 ;; tell it that it is done, and forget it entirely.
477 (unless (cdr client) 490 (unless (cdr client)
478 (let ((frame (assq (car client) server-frames)))
479 (setq server-frames (delq frame server-frames))
480 (when (frame-live-p (cadr frame)) (delete-frame (cadr frame) 'force)))
481 (delete-process (car client)) 491 (delete-process (car client))
482 (server-log "Close" (car client)) 492 (server-log "Close" (car client))
483 (setq server-clients (delq client server-clients)))) 493 (setq server-clients (delq client server-clients))))