1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 ;; Basic module support code underlying all chess.el modules
8 (defvar chess-module-game nil)
9 (defvar chess-module-event-handler nil)
10 (defvar chess-module-leader nil)
12 (make-variable-buffer-local 'chess-module-game)
13 (make-variable-buffer-local 'chess-module-event-handler)
14 (make-variable-buffer-local 'chess-module-leader)
16 (chess-message-catalog 'english
17 '((no-such-module . "There is no module named '%s'")))
19 (defmacro chess-with-current-buffer (buffer &rest body)
22 (with-current-buffer buf
26 (defun chess-module-create (derived game &optional buffer-name
28 (let* ((name (symbol-name derived))
30 (unless (and (require derived nil t)
31 (setq handler (intern-soft (concat name "-handler"))))
32 (chess-error 'no-such-module name))
33 (with-current-buffer (generate-new-buffer (or buffer-name
34 (format " *%s*" name)))
35 (if (not (apply handler game 'initialize ctor-args))
37 (kill-buffer (current-buffer)))
38 (add-hook 'kill-buffer-hook 'chess-module-destroy nil t)
39 (setq chess-module-event-handler handler)
40 (chess-module-set-game* nil game)
43 (defun chess-module-game (module)
44 (chess-with-current-buffer module
47 (defun chess-module-game-index (module)
48 (chess-with-current-buffer module
49 (chess-game-index chess-module-game)))
51 (defun chess-module-detach-game (module)
52 (chess-with-current-buffer module
53 (chess-game-remove-hook chess-module-game
54 'chess-module-event-handler
55 (or module (current-buffer)))
56 ;; if we are the leader, shutdown the game we were attached to
58 (if chess-module-leader
59 (chess-game-run-hooks chess-module-game 'destroy))))
61 (defun chess-module-set-game (module game &optional no-setup)
62 (chess-with-current-buffer module
63 (let ((chess-game-inhibit-events no-setup))
64 (chess-game-copy-game chess-module-game game))))
66 (defun chess-module-set-game* (module game)
67 (chess-with-current-buffer module
70 (chess-module-detach-game nil))
71 (setq chess-module-game game)
72 (chess-game-add-hook game 'chess-module-event-handler
73 (or module (current-buffer)))))
75 (defsubst chess-module-leader-p (module)
76 (chess-with-current-buffer module
79 (defsubst chess-module-set-leader (module)
80 (chess-with-current-buffer module
81 (setq chess-module-leader t)))
83 (defsubst chess-module-clear-leader (module)
84 (chess-with-current-buffer module
85 (setq chess-module-leader nil)))
87 (defun chess-module-destroy (&optional module)
88 (let ((buf (or module (current-buffer))))
89 (when (buffer-live-p buf)
90 (with-current-buffer buf
91 (remove-hook 'kill-buffer-hook 'chess-module-destroy t))
92 (chess-module-detach-game nil)
95 (defun chess-module-event-handler (game object event &rest args)
96 (with-current-buffer object
97 (apply chess-module-event-handler game event args)
98 (if (eq event 'destroy)
99 (chess-module-destroy nil))))
101 (provide 'chess-module)
103 ;;; chess-module.el ends here