;;; 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, Inc., 59 Temple Place - Suite 330,;; Boston, MA 02111-1307, 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:(defvartalk-display-alistnil"Alist of displays on which Emacs talk is now running.Each element has the form (DISPLAY FRAME BUFFER).");;;###autoload(defuntalk-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-displaymydisp));; Make sure we have an entry for the specified display.(talk-add-displaydisplay);; Add the new buffers to all talk frames.(talk-update-buffers))(defuntalk-add-display(display)(let*((elt(assocdisplaytalk-display-alist))(name(concat"*talk-"display"*"))bufferframe)(if(not(andelt(frame-live-p(setqframe(nth1elt)))))(setqframe(make-frame-on-displaydisplay(list(cons'namename)))))(if(not(andelt(buffer-name(get-buffer(setqbuffer(nth2elt))))))(setqbuffer(get-buffer-createname)))(setqtalk-display-alist(cons(listdisplayframebuffer)(delqelttalk-display-alist)))))(defuntalk-disconnect()"Disconnect this display from the Emacs talk group."(interactive)(let*((mydisp(cdr(assq'display(frame-parameters(selected-frame)))))(elt(assocmydisptalk-display-alist)))(delete-frame(nth1elt))(kill-buffer(nth2elt))(setqtalk-display-alist(delqelttalk-display-alist))(talk-update-buffers)))(defuntalk-update-buffers()"Update all the talk frames so that each shows all the talk buffers."(let((tailtalk-display-alist))(whiletail(let((frame(nth1(cartail)))(this-buffer(nth2(cartail)))(buffers(mapcar(function(lambda(elt)(nth2elt)))talk-display-alist)));; Put this display's own talk buffer;; at the front of the list.(setqbuffers(consthis-buffer(delqthis-bufferbuffers)))(talk-split-up-frameframebuffers))(setqtail(cdrtail)))))(defuntalk-split-up-frame(framebuffers)"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-heightframe)(lengthbuffers)))(old-frame(selected-frame)))(unwind-protect(progn(select-frameframe)(select-window(frame-first-windowframe))(delete-other-windows)(while(progn(switch-to-buffer(carbuffers))(setqbuffers(cdrbuffers)))(split-window-verticallylines-per-buffer)(other-window1))(select-window(frame-first-windowframe)))(select-frameold-frame))))(provide'talk);;; talk.el ends here