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:
parent
91b726f0f8
commit
b6660415b3
13 changed files with 497 additions and 365 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue