diff options
Diffstat (limited to 'chess-chat.el')
| -rw-r--r-- | chess-chat.el | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/chess-chat.el b/chess-chat.el new file mode 100644 index 0000000..ab1dd3b --- /dev/null +++ b/chess-chat.el @@ -0,0 +1,46 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Implements chess chat, which is very much like kibitzing, but not +;; saved. RET is used to send each chat line. +;; + +(defvar chess-chat-input-last nil) + +(make-variable-buffer-local 'chess-chat-input-last) + +(define-derived-mode chess-chat-mode text-mode "Chat" + "A mode for editing chess annotations." + (set-buffer-modified-p nil) + (setq chess-chat-input-last (copy-marker (point-max) t)) + (let ((map (current-local-map))) + (define-key map [return] 'chess-chat-send) + (define-key map [(control ?m)] 'chess-chat-send))) + +(defun chess-chat-send () + (interactive) + (chess-game-run-hooks chess-module-game 'chat + (buffer-substring-no-properties + chess-chat-input-last (point-max))) + (set-marker chess-chat-input-last (point-max)) + (set-buffer-modified-p nil)) + +(defun chess-chat-handler (game event &rest args) + (cond + ((eq event 'initialize) + (kill-buffer (current-buffer)) + (set-buffer (generate-new-buffer "*Chat*")) + (chess-chat-mode) + t) + + ((eq event 'switch-to-chat) + (switch-to-buffer-other-window (current-buffer))) + + ((eq event 'chat) + (chess-chat-handler 'switch-to-chat) + (save-excursion + (goto-char chess-chat-input-last) + (insert (car args)))))) + +(provide 'chess-chat) + +;;; chess-chat.el ends here |
