diff options
author | Richard M. Stallman <rms@gnu.org> | 1995-05-04 17:24:40 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1995-05-04 17:24:40 +0000 |
commit | cec62daeb7df7ad8b26cec1ec68780a9b0fe93d0 (patch) | |
tree | 4abd6399bbe24ca8ac2334a9a80a378de9b25595 /lisp/talk.el | |
parent | b5afdc0890454678de2fe5af3115d021349081e5 (diff) | |
download | emacs-cec62daeb7df7ad8b26cec1ec68780a9b0fe93d0.tar.gz |
Initial revision
Diffstat (limited to 'lisp/talk.el')
-rw-r--r-- | lisp/talk.el | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/lisp/talk.el b/lisp/talk.el new file mode 100644 index 00000000000..a4d3d1cfd58 --- /dev/null +++ b/lisp/talk.el @@ -0,0 +1,97 @@ +;;; talk.el --- Allow several users to talk to each other through Emacs. + +;; Copyright (C) 1995 Free Software Foundation, Inc. +;; Keywords: comm, frames + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +;;; Commentary: + +;;; This is a multi-user talk package that runs in Emacs. +;;; Use talk-connect to bring a new person into the conversation. + +;;; Code: + +(defvar talk-display-alist nil + "Alist of displays on which Emacs talk is now running. +Each element has the form (DISPLAY FRAME BUFFER).") + +;;;###autoload +(defun talk-connect (display) + "Connect to display DISPLAY for the Emacs talk group." + (interactive "sTalk to display: ") + ;; Make sure we have an entry for the current display. + (let ((mydisp (cdr (assq 'display (frame-parameters (selected-frame)))))) + (talk-add-display mydisp)) + ;; Make sure we have an entry for the specified display. + (talk-add-display display) + ;; Add the new buffers to all talk frames. + (talk-update-buffers)) + +(defun talk-add-display (display) + (or (assoc display talk-display-alist) + (let* ((name (concat "*talk-" display "*")) + (buffer (get-buffer-create name)) + (frame (make-frame-on-display display + (list (cons 'name name))))) + (setq talk-display-alist + (cons (list display frame buffer) + talk-display-alist))))) + +(defun talk-disconnect () + "Disconnect this display from the Emacs talk group." + (let* ((mydisp (cdr (assq 'display (frame-parameters (selected-frame))))) + (elt (assoc mydisp talk-display-alist))) + (delete-frame (nth 1 elt)) + (kill-buffer (nth 2 elt)) + (setq talk-display-alist (delq elt talk-display-alist)) + (talk-update-buffers))) + +(defun talk-update-buffers () + "Update all the talk frames so that each shows all the talk buffers." + (let ((tail talk-display-alist)) + (while tail + (let ((frame (nth 1 (car tail))) + (this-buffer (nth 2 (car tail))) + (buffers + (mapcar (function (lambda (elt) (nth 2 elt))) + talk-display-alist))) + ;; Put this display's own talk buffer + ;; at the front of the list. + (setq buffers (cons this-buffer (delq this-buffer buffers))) + (talk-split-up-frame frame buffers)) + (setq tail (cdr tail))))) + +(defun talk-split-up-frame (frame buffers) + "Split FRAME into equal-sized windows displaying the buffers in BUFFERS. +Select the first of these windows, displaying the first of the buffers." + (let ((lines-per-buffer (/ (frame-height frame) (length buffers))) + (old-frame (selected-frame))) + (unwind-protect + (progn + (select-frame frame) + (select-window (frame-first-window frame)) + (delete-other-windows) + (while (progn + (switch-to-buffer (car buffers)) + (setq buffers (cdr buffers))) + (split-window-vertically lines-per-buffer) + (other-window 1)) + (select-window (frame-first-window frame))) + (select-frame old-frame)))) + +;;; talk.el ends here |