annotate lisp/vm/vm-easymenu.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 ;;; easymenu.el --- support the easymenu interface for defining a menu.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 ;; Copyright (C) 1994 Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 ;; Keywords: emulations
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 ;; Author: rms
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ;; any later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 ;; GNU General Public License for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 ;;; This is compatible with easymenu.el by Per Abrahamsen
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 ;;; but it is much simpler as it doesn't try to support other Emacs versions.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 ;;; The code was mostly derived from lmenu.el.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 ;;; Changed 17-May-1995, Kyle Jones
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 ;;; Made easy-menu-create-keymaps handle the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 ;;; [ NAME CALLBACK ENABLE ]
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 ;;; case properly. Previously the enabler function was not
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 ;;; being put on the property list of the command.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 ;;; Changed 20-May-1995, Kyle Jones
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 ;;; Made easy-menu-create-keymaps handle the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 ;;; [ NAME CALLBACK ENABLE SUFFIX ]
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 ;;; case properly.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 ;;; Changed 25-May-1995, Kyle Jones
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 ;;; Renamed easy-menu- functions to vm-easy-menu- to avoid
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 ;;; non-vm compatible versions.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 ;;; Changed 2-July-1995, Kyle Jones
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 ;;; If callback is a symbol use it in the menu keymap instead
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 ;;; of the uninterned menu-function-XXX symbols. This allows
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 ;;; Emacs' menu code to set this-command properly when
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 ;;; launching a command from the menubar.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 ;;; Code:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 (provide 'vm-easymenu)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 ;;;###autoload
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 (defmacro vm-easy-menu-define (symbol maps doc menu)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 "Define a menu bar submenu in maps MAPS, according to MENU.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 The menu keymap is stored in symbol SYMBOL, both as its value
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 and as its function definition. DOC is used as the doc string for SYMBOL.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 The first element of MENU must be a string. It is the menu bar item name.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 The rest of the elements are menu items.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 A menu item is usually a vector of three elements: [NAME CALLBACK ENABLE]
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 NAME is a string--the menu item name.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 CALLBACK is a command to run when the item is chosen,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 or a list to evaluate when the item is chosen.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 ENABLE is an expression; the item is enabled for selection
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 whenever this expression's value is non-nil.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 Alternatively, a menu item may have the form:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 [ NAME CALLBACK [ KEYWORD ARG ] ... ]
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 Where KEYWORD is one of the symbol defined below.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 :keys KEYS
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 KEYS is a string; a complex keyboard equivalent to this menu item.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 This is normally not needed because keyboard equivalents are usually
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 computed automatically.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 :active ENABLE
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 ENABLE is an expression; the item is enabled for selection
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 whenever this expression's value is non-nil.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 :suffix NAME
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 NAME is a string; the name of an argument to CALLBACK.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 :style
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 STYLE is a symbol describing the type of menu item. The following are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 defined:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 toggle: A checkbox.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 Currently just prepend the name with the string \"Toggle \".
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 radio: A radio button.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 nil: An ordinary menu item.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 :selected SELECTED
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 SELECTED is an expression; the checkbox or radio button is selected
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 whenever this expression's value is non-nil.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 Currently just disable radio buttons, no effect on checkboxes.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 A menu item can be a string. Then that string appears in the menu as
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 unselectable text. A string consisting solely of hyphens is displayed
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 as a solid horizontal line.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 A menu item can be a list. It is treated as a submenu.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 The first element should be the submenu name. That's used as the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 menu item in the top-level menu. The cdr of the submenu list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 is a list of menu items, as above."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 (` (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 (defvar (, symbol) nil (, doc))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 (vm-easy-menu-do-define (quote (, symbol)) (, maps) (, doc) (, menu)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 (defun vm-easy-menu-do-define (symbol maps doc menu)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 ;; We can't do anything that might differ between Emacs dialects in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 ;; `vm-easy-menu-define' in order to make byte compiled files
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 ;; compatible. Therefore everything interesting is done in this
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 ;; function.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 (set symbol (vm-easy-menu-create-keymaps (car menu) (cdr menu)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 (fset symbol (` (lambda (event) (, doc) (interactive "@e")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 (easy-popup-menu event (, symbol)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 (mapcar (function (lambda (map)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 (define-key map (vector 'menu-bar (intern (car menu)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 (cons (car menu) (symbol-value symbol)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 (if (keymapp maps) (list maps) maps)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 (defvar vm-easy-menu-item-count 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 ;; Return a menu keymap corresponding to a Lucid-style menu list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 ;; MENU-ITEMS, and with name MENU-NAME.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 ;;;###autoload
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 (defun vm-easy-menu-create-keymaps (menu-name menu-items)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 (let ((menu (make-sparse-keymap menu-name)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 ;; Process items in reverse order,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 ;; since the define-key loop reverses them again.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 (setq menu-items (reverse menu-items))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 (while menu-items
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 (let* ((item (car menu-items))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 (callback (if (vectorp item) (aref item 1)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 command enabler name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 (cond ((stringp item)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 (setq command nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 (setq name (if (string-match "^-+$" item) "" item)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 ((consp item)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 (setq command (vm-easy-menu-create-keymaps (car item) (cdr item)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 (setq name (car item)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 ((vectorp item)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 (if (symbolp callback)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 (setq command callback)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 (setq command (make-symbol (format "menu-function-%d"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 vm-easy-menu-item-count)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 (setq vm-easy-menu-item-count (1+ vm-easy-menu-item-count)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 (setq name (aref item 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 (let ((keyword (aref item 2)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 (if (and (symbolp keyword)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 (= ?: (aref (symbol-name keyword) 0)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 (let ((count 2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 style selected active keys
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 (while (> (length item) count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 (setq keyword (aref item count))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 (setq arg (aref item (1+ count)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 (setq count (+ 2 count))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 (cond ((eq keyword ':keys)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 (setq keys arg))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 ((eq keyword ':active)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 (setq active arg))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 ((eq keyword ':suffix)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 (setq name (concat name " " arg)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 ((eq keyword ':style)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 (setq style arg))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 ((eq keyword ':selected)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 (setq selected arg))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 (if keys
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 (setq name (concat name " (" keys ")")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 (if (eq style 'toggle)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 ;; Simulate checkboxes.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 (setq name (concat "Toggle " name)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 (if active
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 (put command 'menu-enable active)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 (and (eq style 'radio)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 selected
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 ;; Simulate radio buttons with menu-enable.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 (put command 'menu-enable
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 (list 'not selected)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 (if (= (length item) 4)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 (setq name (concat name " " (aref item 3))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 (put command 'menu-enable keyword)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 (if (keymapp callback)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 (setq name (concat name " ...")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 (if (symbolp callback)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 nil ;;(fset command callback)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 (fset command (list 'lambda () '(interactive) callback)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 (if (null command)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 ;; Handle inactive strings specially--allow any number
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 ;; of identical ones.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 (setcdr menu (cons (list nil name) (cdr menu)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 (if name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 (define-key menu (vector (intern name)) (cons name command)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 (setq menu-items (cdr menu-items)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 menu))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 (defun vm-easy-menu-change (path name items)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 "Change menu found at PATH as item NAME to contain ITEMS.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 PATH is a list of strings for locating the menu containing NAME in the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 menu bar. ITEMS is a list of menu items, as in `vm-easy-menu-define'.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 These items entirely replace the previous items in that map.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 Call this from `activate-menubar-hook' to implement dynamic menus."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 (let ((map (key-binding (apply 'vector
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 'menu-bar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 (mapcar 'intern (append path (list name)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 (if (keymapp map)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 (setcdr map (cdr (vm-easy-menu-create-keymaps name items)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 (error "Malformed menu in `vm-easy-menu-change'"))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 (defun vm-easy-menu-remove (menu))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 (defun vm-easy-menu-add (menu &optional map))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 ;;; vm-easymenu.el ends here