diff options
| author | Karoly Lorentey | 2003-12-31 05:09:29 +0000 |
|---|---|---|
| committer | Karoly Lorentey | 2003-12-31 05:09:29 +0000 |
| commit | 819b8f00ed7b8a9a2190efaa02376ed332ecf763 (patch) | |
| tree | c30ab72204225385c428db008580a9f67f5c215c /lisp | |
| parent | 16c290d8c16fb0fdb574c837c6b1badbc655efe2 (diff) | |
| download | emacs-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.el | 52 |
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)))) |