summaryrefslogtreecommitdiff
path: root/chess-module.el
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2002-04-15 05:40:38 +0000
committerJohn Wiegley <johnw@newartisans.com>2002-04-15 05:40:38 +0000
commit6fbcc92505250d896b5d408483822b115bc614c7 (patch)
treebd360156e0855b1ee5a113a4d86e892ae23a8365 /chess-module.el
parent82a87e7216f16f2c8336a2c0625c214f3e0834cc (diff)
*** no comment ***
Diffstat (limited to 'chess-module.el')
-rw-r--r--chess-module.el103
1 files changed, 103 insertions, 0 deletions
diff --git a/chess-module.el b/chess-module.el
new file mode 100644
index 0000000..8d6eed9
--- /dev/null
+++ b/chess-module.el
@@ -0,0 +1,103 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Basic module support code underlying all chess.el modules
+;;
+;; $Revision$
+
+(defvar chess-module-game nil)
+(defvar chess-module-event-handler nil)
+(defvar chess-module-leader nil)
+
+(make-variable-buffer-local 'chess-module-game)
+(make-variable-buffer-local 'chess-module-event-handler)
+(make-variable-buffer-local 'chess-module-leader)
+
+(chess-message-catalog 'english
+ '((no-such-module . "There is no module named '%s'")))
+
+(defmacro chess-with-current-buffer (buffer &rest body)
+ `(let ((buf ,buffer))
+ (if buf
+ (with-current-buffer buf
+ ,@body)
+ ,@body)))
+
+(defun chess-module-create (derived game &optional buffer-name
+ &rest ctor-args)
+ (let* ((name (symbol-name derived))
+ (handler (intern-soft (concat name "-handler")))
+ buffer)
+ (unless handler
+ (chess-error 'no-such-module name))
+ (with-current-buffer (generate-new-buffer (or buffer-name
+ (format " *%s*" name)))
+ (if (not (apply handler game 'initialize ctor-args))
+ (ignore
+ (kill-buffer (current-buffer)))
+ (add-hook 'kill-buffer-hook 'chess-module-destroy nil t)
+ (setq chess-module-event-handler handler)
+ (chess-module-set-game* nil game)
+ (current-buffer)))))
+
+(defun chess-module-game (module)
+ (chess-with-current-buffer module
+ chess-module-game))
+
+(defun chess-module-game-index (module)
+ (chess-with-current-buffer module
+ (chess-game-index chess-module-game)))
+
+(defun chess-module-detach-game (module)
+ (chess-with-current-buffer module
+ (chess-game-remove-hook chess-module-game
+ 'chess-module-event-handler
+ (or module (current-buffer)))
+ ;; if we are the leader, shutdown the game we were attached to
+ ;; previously
+ (if chess-module-leader
+ (chess-game-run-hooks chess-module-game 'destroy))))
+
+(defun chess-engine-set-game (module game &optional no-setup)
+ (chess-with-current-buffer module
+ (let ((chess-game-inhibit-events no-setup))
+ (chess-game-copy-game chess-module-game game))))
+
+(defun chess-module-set-game* (module game)
+ (chess-with-current-buffer module
+ (assert game)
+ (if chess-module-game
+ (chess-module-detach-game nil))
+ (setq chess-module-game game)
+ (chess-game-add-hook game 'chess-module-event-handler
+ (or module (current-buffer)))))
+
+(defsubst chess-module-leader-p (module)
+ (chess-with-current-buffer module
+ chess-module-leader))
+
+(defsubst chess-module-set-leader (module)
+ (chess-with-current-buffer module
+ (setq chess-module-leader t)))
+
+(defsubst chess-module-clear-leader (module)
+ (chess-with-current-buffer module
+ (setq chess-module-leader nil)))
+
+(defun chess-module-destroy (&optional module)
+ (interactive)
+ (let ((buf (or module (current-buffer))))
+ (when (buffer-live-p buf)
+ (with-current-buffer buf
+ (remove-hook 'kill-buffer-hook 'chess-module-destroy t))
+ (chess-module-detach-game nil)
+ (kill-buffer buf))))
+
+(defun chess-module-event-handler (game object event &rest args)
+ (with-current-buffer object
+ (apply chess-module-event-handler game event args)
+ (if (eq event 'destroy)
+ (chess-module-destroy nil))))
+
+(provide 'chess-module)
+
+;;; chess-module.el ends here