1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 18:40:39 -08:00

Implemented display ids for multiple emacsclients on the same tty. Plus assorted bugfixes.

* lisp/frame.el (make-frame-on-display): Update doc.
(make-frame): Handle display-id parameter.  Update doc.
(frames-on-display-list): Update for display ids.
(framep-on-display): Ditto.
(suspend-frame): Use display-name, not frame-tty-name.
(selected-display): New function.

* lisp/server.el (server-delete-client): Use delete-display, not delete-tty.
(server-tty-live-p, server-handle-delete-tty): Removed.
(server-handle-delete-frame): Delete tty clients, if needed.
(server-process-filter): Set the display parameter, and use it when appropriate.
(server-handle-suspend-tty): Use the display parameter.
(server-start, server-unload-hook): Removed obsolete delete-tty hook.

* lisp/talk.el (talk): Always use talk-add-display.
(talk-add-tty-frame, talk-handle-delete-tty): Removed.
(talk-handle-delete-frame): New function.
(talk-add-display): Open a new frame only if parameter was not a frame.

* src/dispextern.h (get_display, Fdisplay_tty_type):  New prototypes.
(Fframe_tty_type): Removed.

* src/dispnew.c (init_display): Use Fdisplay_tty_type, not Fframe_tty_type.

* src/frame.c (Qdisplay_id, Qdisplay_live_p): New symbols.
(make_terminal_frame): Get display as a parameter.
(Fmake_terminal_frame): Get/create display here; pass it to
make_terminal_frame.
(Fframe_display): New function.
(Fdelete_frame): Stop if the hook deleted the frame.
(syms_of_frame): Register new stuff.

* src/frame.h (Qdisplay_id, Qdisplay_live_p, make_terminal_frame):
Updated prototypes.

* src/keyboard.c (interrupt_signal): Updated comment.

* src/term.c (Vdelete_tty_after_functions): Removed variable.
(Qframe_tty_name, Qframe_tty_type): Removed.
(next_display_id): New var.
(tty_ring_bell): Don't do anything on suspended frames.
(Ftty_display_color_p, Ftty_display_color_cells): Doc update.
(get_display): New function.
(get_tty_display): Use it.
(get_named_tty_display): Ignore suspended displays.
(Fframe_tty_name): Renamed to Fdisplay_name.  Handle all kinds of
displays.
(Fframe_tty_type): Renamed to Fdisplay_tty_type.
(init_initial_display): Set display name.
(term_init): Allow more displays on the same device.  Set display name.
(Fdelete_tty): Removed.
(delete_tty): Don't run hooks.
(create_display): Set display id.
(delete_display): Free display name.
(Fdelete_display, Fdisplay_live_p, Fdisplay_list): New functions.
(Fsuspend_tty): Call hook with display id.  Doc update.
(Fresume_tty): Refuse to resume when there is already an active display
on the same device.  Call hook with display id.  Doc update.
(syms_of_term): Reflect above changes.

* src/termhooks.h (struct display): Added `id' and `name' members.
(DISPLAY_ACTIVE_P): New macro.

* src/xfns.c (check_x_display_info): Handle display ids.
(Fx_create_frame): Try to get display from `display-id' parameter.

* src/xterm.c (x_term_init): Set display name.
(x_delete_display): Handle the case when `font_table' is NULL.

git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-207
This commit is contained in:
Karoly Lorentey 2004-07-04 04:48:55 +00:00
parent 91b726f0f8
commit b6660415b3
13 changed files with 497 additions and 365 deletions

View file

@ -234,9 +234,9 @@ If NOFRAME is non-nil, let the frames live. (To be used from
(kill-buffer (current-buffer))))))
;; Delete the client's tty.
(let ((tty (server-client-get client 'tty)))
(when (and tty (server-tty-live-p tty))
(delete-tty tty)))
(let ((display-id (server-client-get client 'display)))
(when (eq (display-live-p display-id) t)
(delete-display display-id)))
;; Delete the client's frames.
(unless noframe
@ -264,38 +264,32 @@ If NOFRAME is non-nil, let the frames live. (To be used from
string)
(or (bolp) (newline)))))
(defun server-tty-live-p (tty)
"Return non-nil if the tty device named TTY has a live frame."
(let (result)
(dolist (frame (frame-list) result)
(when (and (eq (frame-live-p frame) t)
(equal (frame-tty-name frame) tty))
(setq result t)))))
(defun server-sentinel (proc msg)
"The process sentinel for Emacs server connections."
(server-log (format "Status changed to %s: %s" (process-status proc) msg) proc)
(server-delete-client proc))
(defun server-handle-delete-tty (tty)
"Delete the client connection when the emacsclient terminal device is closed."
(dolist (proc (server-clients-with 'tty tty))
(server-log (format "server-handle-delete-tty, tty %s" tty) proc)
(server-delete-client proc)))
(defun server-handle-delete-frame (frame)
"Delete the client connection when the emacsclient frame is deleted."
(let ((proc (frame-parameter frame 'client)))
(when (and proc (window-system frame))
;; (Closing a terminal frame must not trigger a delete;
;; we must wait for delete-tty-after-functions.)
(when (and proc
(or (window-system frame)
;; A terminal display must not yet be deleted if
;; there are other frames on it.
(< 0 (let ((frame-num 0))
(mapc (lambda (f)
(when (eq (frame-display f)
(frame-display frame))
(setq frame-num (1+ frame-num))))
(frame-list))
frame-num))))
(server-log (format "server-handle-delete-frame, frame %s" frame) proc)
(server-delete-client proc 'noframe)))) ; Let delete-frame delete the frame later.
(defun server-handle-suspend-tty (tty)
(defun server-handle-suspend-tty (display)
"Notify the emacsclient process to suspend itself when its tty device is suspended."
(dolist (proc (server-clients-with 'tty tty))
(server-log (format "server-handle-suspend-tty, tty %s" tty) proc)
(dolist (proc (server-clients-with 'display display))
(server-log (format "server-handle-suspend-tty, display %s" display) proc)
(process-send-string proc "-suspend \n")))
(defun server-select-display (display)
@ -395,7 +389,6 @@ Prefix arg means just kill any existing server communications subprocess."
(server-log (message "Restarting server"))
(server-log (message "Starting server")))
(letf (((default-file-modes) ?\700))
(add-hook 'delete-tty-after-functions 'server-handle-delete-tty)
(add-hook 'suspend-tty-functions 'server-handle-suspend-tty)
(add-hook 'delete-frame-functions 'server-handle-delete-frame)
(add-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
@ -496,21 +489,24 @@ PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"."
(modify-frame-parameters frame (list (cons 'client proc)))
(select-frame frame)
(server-client-set client 'frame frame)
(server-client-set client 'display (frame-display frame))
(setq dontkill t))
;; -resume: Resume a suspended tty frame.
((equal "-resume" arg)
(let ((tty (server-client-get client 'tty)))
(let ((display-id (server-client-get client 'display)))
(setq dontkill t)
(when tty (resume-tty tty))))
(when (eq (display-live-p display-id) t)
(resume-tty display-id))))
;; -suspend: Suspend the client's frame. (In case we
;; get out of sync, and a C-z sends a SIGTSTP to
;; emacsclient.)
((equal "-suspend" arg)
(let ((tty (server-client-get client 'tty)))
(let ((display-id (server-client-get client 'display)))
(setq dontkill t)
(when tty (suspend-tty tty))))
(when (eq (display-live-p display-id) t)
(suspend-tty display-id))))
;; -ignore COMMENT: Noop; useful for debugging emacsclient.
;; (The given comment appears in the server log.)
@ -528,7 +524,8 @@ PROC is the server process. Format of STRING is \"PATH PATH PATH... \\n\"."
(setq frame (make-frame-on-tty tty type (list (cons 'client proc))))
(select-frame frame)
(server-client-set client 'frame frame)
(server-client-set client 'tty (frame-tty-name frame))
(server-client-set client 'tty (display-name frame))
(server-client-set client 'display (frame-display frame))
;; Set up display for the remote locale.
(configure-display-for-locale)
;; Reply with our pid.
@ -912,7 +909,6 @@ If FRAME is nil or missing, then the selected frame is used."
(defun server-unload-hook ()
(server-start t)
(remove-hook 'delete-tty-after-functions 'server-handle-delete-tty)
(remove-hook 'suspend-tty-functions 'server-handle-suspend-tty)
(remove-hook 'delete-frame-functions 'server-handle-delete-frame)
(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)