1 ;;; riece-addon.el --- add-on management
2 ;; Copyright (C) 1998-2004 Daiki Ueno
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
6 ;; Keywords: IRC, riece
8 ;; This file is part of Riece.
10 ;; This program is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; This program is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
27 (defvar riece-addon-list-mode-map
28 (let ((keymap (make-sparse-keymap)))
29 (define-key keymap "+" 'riece-command-enable-addon)
30 (define-key keymap "-" 'riece-command-disable-addon)
33 (defun riece-load-and-build-addon-dependencies (addons)
34 (let ((load-path (cons riece-addon-directory load-path))
37 (require (car addons)) ;error will be reported here
39 (funcall (or (intern-soft
40 (concat (symbol-name (car addons)) "-requires"))
44 ;; Increment succs' pred count.
45 (if (setq entry (assq (car addons) dependencies))
46 (setcar (cdr entry) (+ (length requires) (nth 1 entry)))
47 (setq dependencies (cons (list (car addons) (length requires))
49 ;; Merge pred's succs.
51 (if (setq entry (assq (car pointer) dependencies))
53 (cons (car addons) (nthcdr 2 entry)))
54 (setq dependencies (cons (list (car pointer) 0 (car addons))
56 (setq pointer (cdr pointer))))
57 (setq addons (cdr addons)))
60 (defun riece-resolve-addons (addons)
61 (let ((pointer addons)
65 (if (memq (car pointer) (cdr pointer))
67 (setq pointer (cdr pointer)))
68 (setq dependencies (riece-load-and-build-addon-dependencies
73 (if (zerop (nth 1 (car pointer)))
74 (setq dependencies (delq (car pointer) dependencies)
75 queue (cons (car pointer) queue)))
76 (setq pointer (cdr pointer)))
79 (setq addons (cons (car (car queue)) addons)
80 pointer (nthcdr 2 (car queue)))
82 (let* ((entry (assq (car pointer) dependencies))
83 (count (1- (nth 1 entry))))
86 (setq dependencies (delq entry dependencies)
87 queue (nconc queue (list entry))))
88 (setcar (cdr entry) count)))
89 (setq pointer (cdr pointer)))
90 (setq queue (cdr queue)))
92 (error "Circular add-on dependency found"))
95 (defun riece-insinuate-addon (addon)
96 (require addon) ;implicit dependency
97 (funcall (intern (concat (symbol-name addon) "-insinuate")))
99 (message "Add-on %S is insinuated" addon)))
101 (defun riece-enable-addon (addon)
102 (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
105 (message "Add-on %S doesn't support enable/disable" addon))
106 (if (symbol-value enabled)
108 (message "Can't enable add-on %S" addon))
109 (funcall (intern (concat (symbol-name addon) "-enable")))
111 (message "Add-on %S enabled" addon))))))
113 (defun riece-disable-addon (addon)
114 (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
117 (message "Add-on %S doesn't support enable/disable" addon))
118 (if (symbol-value enabled)
120 (funcall (intern (concat (symbol-name addon) "-disable")))
122 (message "Add-on %S disabled" addon)))
124 (message "Can't disable add-on %S" addon))))))
126 (defun riece-addon-list-mode ()
127 "Major mode for displaying addon list.
128 All normal editing commands are turned off."
129 (kill-all-local-variables)
130 (buffer-disable-undo)
131 (setq major-mode 'riece-addon-list-mode
133 mode-line-buffer-identification
134 (riece-mode-line-buffer-identification '("Riece: "))
137 (use-local-map riece-addon-list-mode-map)
138 (run-hooks 'riece-addon-list-mode-hook))
140 (defun riece-command-list-addons ()
143 (set-buffer (riece-get-buffer-create "*AddOns*" 'riece-addon-list-mode))
144 (riece-addon-list-mode)
145 (let ((inhibit-read-only t)
147 (pointer riece-addons)
148 enabled description point)
150 (riece-kill-all-overlays)
152 (setq enabled (intern-soft (concat (symbol-name (car pointer))
154 description (intern-soft (concat (symbol-name (car pointer))
157 (insert (format "%c %S: %s\n"
158 (if (not (featurep (car pointer)))
162 (if (symbol-value enabled)
167 (symbol-value description)
168 "(no description)")))
169 (put-text-property point (point) 'riece-addon (car pointer))
170 (setq pointer (cdr pointer)))
172 Symbols in the leftmost column:
174 + The add-on is enabled.
175 - The add-on is disabled.
176 = The add-on doesn't support enable/disable operation.
177 ? The add-on status is not known.
179 (insert (substitute-command-keys "
182 `\\[riece-command-enable-addon]' to enable the current add-on.
183 `\\[riece-command-disable-addon]' to disable the current add-on.
185 (pop-to-buffer (current-buffer))))
187 (defun riece-command-enable-addon (addon)
190 (or (if (eq major-mode 'riece-addon-list-mode)
191 (get-text-property (point) 'riece-addon))
192 (completing-read "Add-on: "
193 (mapcar #'list riece-addons)
195 (setq enabled (intern-soft (concat (car pointer)
198 (null (symbol-value enabled))))
200 (riece-enable-addon addon)
201 (riece-command-list-addons))
203 (defun riece-command-disable-addon (addon)
206 (or (if (eq major-mode 'riece-addon-list-mode)
207 (get-text-property (point) 'riece-addon))
208 (completing-read "Add-on: "
209 (mapcar #'list riece-addons)
211 (setq enabled (intern-soft (concat (car pointer)
214 (symbol-value enabled)))
216 (riece-disable-addon addon)
217 (riece-command-list-addons))
219 (provide 'riece-addon)
221 ;;; riece-addon.el ends here