diff options
Diffstat (limited to 'zwgc/zwgc.el')
-rw-r--r-- | zwgc/zwgc.el | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/zwgc/zwgc.el b/zwgc/zwgc.el new file mode 100644 index 0000000..a0941b7 --- /dev/null +++ b/zwgc/zwgc.el @@ -0,0 +1,180 @@ +; zwgc.el +; +; This file is part of the Project Athena Zephyr Notification System. +; Created by: Mark W. Eichin <eichin@athena.mit.edu> +; $Source$ +; $Author$ +; Copyright (c) 1988 by the Massachusetts Institute of Technology. +; For copying and distribution information, see the file +; "mit-copyright.h". +; +; Emacs mode for running zwgc in a sub process of emacs. It pops up a +; window for every new message; if you make bells appear between each +; message, it will be able to seperate them. If you move the mouse +; into the message window and hit `delete' it will delete the current +; message; if there are other messages, it will show them, if not, it +; will make the window go away. +; +; Invoke with M-x zwgc. +; +; Also included is M-x zsend, which prompts for a user name and a +; message to send to them. If the message is blank, a buffer is popped +; up to edit the message in. If a prefix argument is given, zsend +; prompts for an instance instead. If the user name is blank, the last +; one is reused. +; +; The following should be added to your .zephyr.desc file if you want +; to take advantage of the zwgc message seperation features: +; does $mode +; match tty +; beep +; endmatch +; enddoes +; +(defvar zwgc_el-RCS-id) +(setq zwgc_el-RCS-id "$Header$") +; +; + +(defun narrow-to-string (str) + "narrow and put up a string..." + (interactive "sString: ") + (narrow-to-region (point) (point)) + (insert str)) + +(defvar zwgc-prog "/usr/etc/zwgc" + "*Program to run as the zwgc process. Should set it for the machine type.") + +(defun zwgc-wakeup (proc string) + "Procedure called when zwgc spits something out" + (save-excursion (set-buffer (get-buffer "*zwgc*")) + (goto-char (point-max)) + (if (= 7 (string-to-char string)) + (progn + (ding 1) + (message "got one!") + (narrow-to-string string)) + (insert string))) + (Special-pop-up-window (get-buffer "*zwgc*")) + ) + +(defun zwgc () + "emacs mode for running zwgc in a sub process of emacs. It pops up a +window for every new message; if you make bells appear between each +message, it will be able to seperate them. If you move the mouse into +the message window and hit `delete' it will delete the current +message; if there are other messages, it will show them, if not, it +will make the window go away." + (interactive) + (require 'shell) + (let ((buffer (get-buffer-create "*zwgc*")) proc status) + (setq proc (get-buffer-process buffer)) + (if proc + (setq status (process-status proc))) + (save-excursion + (set-buffer buffer) + (if (memq status '(run stop)) + nil + (if proc (delete-process proc)) + (setq proc (start-process "Zwgc" buffer + zwgc-prog "-disable" "X" + "-default" "plain" "-nofork")) + (set-process-filter proc 'zwgc-wakeup)) + (shell-mode) + (local-set-key "\177" 'zwgc-punt) + ) + )) + + +(defun Special-pop-up-window (buffer &optional max-height) + "Pop up a window that is just big enough to hold the current buffer." + (interactive "bBuffer to pop: ") + (let* ((retwin (selected-window)) + (pop-up-windows t) + (window-min-height 1)) + (pop-to-buffer buffer) + (setq lines (1+ (count-lines (point-min) (point-max)))) + (enlarge-window (- lines (window-height (selected-window)))) + (goto-char (point-min)) + (other-window 1) + )) + +(defun zwgc-punt () + "Delete the current ZephyrGram from the *zwgc* buffer." + (interactive) + (let ((window-min-height 1)) + (display-buffer (get-buffer "*zwgc*")) + (delete-region (point-min) (point-max)) + (widen) + (if (not (search-backward "\007" nil t)) + (delete-windows-on "*zwgc*") + (narrow-to-region (point) (point-max)) + (enlarge-window (- (1+ (count-lines (point-min) (point-max))) + (window-height (selected-window)))) + (goto-char (point-min)) + ))) +;; +;; [eichin:19880309.2005EST] +;; zsend.el +;; Send zephyrgrams from emacs... +;; + +(defvar *who* "" "last user sent to with zsend") + +(defun zsend (&optional who message) + "zsend prompts for a user name and a message to send to them as a +ZephyrGram. If the message is blank, a buffer is popped up to edit the +message in. If a prefix argument is given, zsend prompts for an +instance instead. If the user name is blank, the last one is reused." + (interactive + (list (if current-prefix-arg ; is this portable??? + (cons 'instance (read-input "Instance:")) + (cons 'who (read-input "Who:"))) +; (select-window (minibuffer-window)) +; (enlarge-window 4) + (read-input "Message:"))) + (save-excursion + (let ((tempbuf (get-buffer-create " *zephyr*send*"))) + (switch-to-buffer tempbuf) + (local-set-key "\C-c\C-c" 'exit-recursive-edit) + (erase-buffer) + (if (and (equal (cdr who) "") + (equal *who* "")) + (message "Please specify user at least once.") + (if (not (equal (cdr who) "")) + (setq *who* who) ; save *who* for next time + (setq who *who*)) ; or, use the old value + (if (not (equal message "")) + (progn + (insert message) + (zwrite who)) + (progn + (recursive-edit) + (zwrite who))))))) + + +(defun zwrite (who) + "Send a ZephyrGram to user WHO, zsend is the user interface to this." + (if (eq 'who (car who)) + (call-process-region (point-min) (point-max) ;range + "/usr/athena/zwrite" ;process + t ;delete-p + t ;output-p + nil ;redisplay-p + "-q" ;args -- ignore server responses. + (cdr who)) + (call-process-region (point-min) (point-max) ;range + "/usr/athena/zwrite" ;process + t ;delete-p + t ;output-p + nil ;redisplay-p + "-q" ;args -- ignore server responses. + "-i" ;[eichin:19880312.0015EST] + (cdr who))) + (if (not (equal (point-max) 1)) + (message (buffer-substring 1 (1- (point-max)))))) + +; suggested binding (control-meta-z) +;(global-set-key "\M-\C-z" 'zsend) + + |