Mercurial > emacs
annotate lisp/emacs-lisp/easymenu.el @ 20792:f0aa5cc14e8a
(fast_string_match): Give re_search byte size of
STRING.
(trivial_regexp_p): Initialize LEN to byte size of REGEXP.
(search_buffer): Give re_search_2 STARTPOS, RANGE and STOP by
counting them by bytes.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Wed, 28 Jan 1998 12:37:25 +0000 |
parents | 0c51c56d0a4f |
children | 8aeddd528f57 |
rev | line source |
---|---|
6529 | 1 ;;; easymenu.el --- support the easymenu interface for defining a menu. |
2 | |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
3 ;; Copyright (C) 1994, 1996, 1998 Free Software Foundation, Inc. |
6600
f75ac1f3d99c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6542
diff
changeset
|
4 |
6529 | 5 ;; Keywords: emulations |
6600
f75ac1f3d99c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6542
diff
changeset
|
6 ;; Author: rms |
6529 | 7 |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs 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) | |
13 ;; any later version. | |
14 | |
15 ;; GNU Emacs 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. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
14169 | 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. | |
6529 | 24 |
14169 | 25 ;;; Commentary: |
26 | |
27 ;; This is compatible with easymenu.el by Per Abrahamsen | |
28 ;; but it is much simpler as it doesn't try to support other Emacs versions. | |
29 ;; The code was mostly derived from lmenu.el. | |
6529 | 30 |
31 ;;; Code: | |
32 | |
6542
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
33 ;;;###autoload |
6600
f75ac1f3d99c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6542
diff
changeset
|
34 (defmacro easy-menu-define (symbol maps doc menu) |
6529 | 35 "Define a menu bar submenu in maps MAPS, according to MENU. |
11512
a196f05240a9
(easy-menu-define): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
10415
diff
changeset
|
36 The menu keymap is stored in symbol SYMBOL, both as its value |
a196f05240a9
(easy-menu-define): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
10415
diff
changeset
|
37 and as its function definition. DOC is used as the doc string for SYMBOL. |
6529 | 38 |
39 The first element of MENU must be a string. It is the menu bar item name. | |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
40 It may be followed by the keyword argument pair |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
41 :filter FUNCTION |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
42 FUNCTION is a function with one argument, the menu. It returns the actual |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
43 menu displayed. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
44 |
6529 | 45 The rest of the elements are menu items. |
46 | |
6600
f75ac1f3d99c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6542
diff
changeset
|
47 A menu item is usually a vector of three elements: [NAME CALLBACK ENABLE] |
6529 | 48 |
6542
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
49 NAME is a string--the menu item name. |
6529 | 50 |
6542
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
51 CALLBACK is a command to run when the item is chosen, |
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
52 or a list to evaluate when the item is chosen. |
6529 | 53 |
8541
39e8d792604f
(easy-menu-define): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8085
diff
changeset
|
54 ENABLE is an expression; the item is enabled for selection |
39e8d792604f
(easy-menu-define): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8085
diff
changeset
|
55 whenever this expression's value is non-nil. |
6600
f75ac1f3d99c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6542
diff
changeset
|
56 |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
57 Alternatively, a menu item may have the form: |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
58 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
59 [ NAME CALLBACK [ KEYWORD ARG ] ... ] |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
60 |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
61 Where KEYWORD is one of the symbols defined below. |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
62 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
63 :keys KEYS |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
64 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
65 KEYS is a string; a complex keyboard equivalent to this menu item. |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
66 This is normally not needed because keyboard equivalents are usually |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
67 computed automatically. |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
68 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
69 :active ENABLE |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
70 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
71 ENABLE is an expression; the item is enabled for selection |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
72 whenever this expression's value is non-nil. |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
73 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
74 :suffix NAME |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
75 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
76 NAME is a string; the name of an argument to CALLBACK. |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
77 |
14108 | 78 :style STYLE |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
79 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
80 STYLE is a symbol describing the type of menu item. The following are |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
81 defined: |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
82 |
16812
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
83 toggle: A checkbox. |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
84 Prepend the name with '(*) ' or '( ) ' depending on if selected or not. |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
85 radio: A radio button. |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
86 Prepend the name with '[X] ' or '[ ] ' depending on if selected or not. |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
87 nil: An ordinary menu item. |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
88 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
89 :selected SELECTED |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
90 |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
91 SELECTED is an expression; the checkbox or radio button is selected |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
92 whenever this expression's value is non-nil. |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
93 |
6542
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
94 A menu item can be a string. Then that string appears in the menu as |
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
95 unselectable text. A string consisting solely of hyphens is displayed |
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
96 as a solid horizontal line. |
6529 | 97 |
6542
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
98 A menu item can be a list. It is treated as a submenu. |
6529 | 99 The first element should be the submenu name. That's used as the |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
100 menu item name in the top-level menu. It may be followed by the :filter |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
101 FUNCTION keyword argument pair. The rest of the submenu list are menu items, |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
102 as above." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
103 `(progn |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
104 (defvar ,symbol nil ,doc) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
105 (easy-menu-do-define (quote ,symbol) ,maps ,doc ,menu))) |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
106 |
11860
0c39d1945e5e
(easy-menu-do-define): Add autoload cookie.
Karl Heuer <kwzh@gnu.org>
parents:
11833
diff
changeset
|
107 ;;;###autoload |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
108 (defun easy-menu-do-define (symbol maps doc menu) |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
109 ;; We can't do anything that might differ between Emacs dialects in |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
110 ;; `easy-menu-define' in order to make byte compiled files |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
111 ;; compatible. Therefore everything interesting is done in this |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
112 ;; function. |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
113 (set symbol (easy-menu-create-menu (car menu) (cdr menu))) |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
114 (fset symbol (` (lambda (event) (, doc) (interactive "@e") |
16160
9acae440fe98
(easy-menu-do-define): Use `x-popup-menu' instead of
Richard M. Stallman <rms@gnu.org>
parents:
15429
diff
changeset
|
115 (x-popup-menu event (, symbol))))) |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
116 (mapcar (function (lambda (map) |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
117 (define-key map (vector 'menu-bar (intern (car menu))) |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
118 (cons (car menu) (symbol-value symbol))))) |
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
119 (if (keymapp maps) (list maps) maps))) |
6542
1d9da8160357
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6529
diff
changeset
|
120 |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
121 (defun easy-menu-filter-return (menu) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
122 "Convert MENU to the right thing to return from a menu filter. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
123 MENU is a menu as computed by `easy-menu-define' or `easy-menu-create-menu' or |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
124 a symbol whose value is such a menu. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
125 In Emacs a menu filter must return a menu (a keymap), in XEmacs a filter must |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
126 return a menu items list (without menu name and keywords). This function |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
127 returns the right thing in the two cases." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
128 (easy-menu-get-map menu nil)) ; Get past indirections. |
6529 | 129 |
9586
bada2dc32adc
(easy-menu-create-keymaps): Add autoload cookie.
Richard M. Stallman <rms@gnu.org>
parents:
8541
diff
changeset
|
130 ;;;###autoload |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
131 (defun easy-menu-create-menu (menu-name menu-items) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
132 "Create a menu called MENU-NAME with items described in MENU-ITEMS. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
133 MENU-NAME is a string, the name of the menu. MENU-ITEMS is a list of items |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
134 possibly preceded by keyword pairs as described in `easy-menu-define'." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
135 (let ((menu (make-sparse-keymap menu-name)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
136 keyword filter have-buttons) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
137 ;; Look for keywords. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
138 (while (and menu-items (cdr menu-items) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
139 (symbolp (setq keyword (car menu-items))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
140 (= ?: (aref (symbol-name keyword) 0))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
141 (if (eq keyword ':filter) (setq filter (cadr menu-items))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
142 (setq menu-items (cddr menu-items))) |
6529 | 143 ;; Process items in reverse order, |
144 ;; since the define-key loop reverses them again. | |
145 (setq menu-items (reverse menu-items)) | |
146 (while menu-items | |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
147 (setq have-buttons |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
148 (easy-menu-do-add-item menu (car menu-items) have-buttons)) |
6529 | 149 (setq menu-items (cdr menu-items))) |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
150 (when filter |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
151 (setq menu (easy-menu-make-symbol menu nil)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
152 (put menu 'menu-enable |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
153 `(easy-menu-filter (quote ,menu) (quote ,filter)))) |
6529 | 154 menu)) |
155 | |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
156 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
157 ;; Button prefixes. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
158 (defvar easy-menu-button-prefix |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
159 '((radio ?* . "( ) ") (toggle ?X . "[ ] "))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
160 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
161 (defun easy-menu-do-add-item (menu item have-buttons &optional prev top) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
162 ;; Parse an item description and add the item to a keymap. This is |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
163 ;; the function that is used for item definition by the other easy-menu |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
164 ;; functions. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
165 ;; MENU is a sparse keymap. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
166 ;; ITEM defines an item as in `easy-menu-define'. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
167 ;; HAVE-BUTTONS is a string or nil. If not nil, use as item prefix for |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
168 ;; items that are not toggle or radio buttons to compensate for the |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
169 ;; button prefix. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
170 ;; PREV is nil or a tail in MENU. If PREV is not nil put item after |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
171 ;; PREV in MENU, otherwise put it first in MENU. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
172 ;; If TOP is true, this is an item in the menu bar itself so |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
173 ;; don't use prefix. In this case HAVE-BUTTONS will be nil. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
174 (let (command name item-string is-button) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
175 (cond |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
176 ((stringp item) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
177 (setq item |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
178 (if (string-match ; If an XEmacs separator |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
179 "^\\(-+\\|\ |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
180 --:\\(\\(no\\|\\(sing\\|doub\\)le\\(Dashed\\)?\\)Line\\|\ |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
181 shadow\\(Double\\)?Etched\\(In\\|Out\\)\\(Dash\\)?\\)\\)$" |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
182 item) "" ; use a single line separator. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
183 (concat have-buttons item))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
184 ;; Handle inactive strings specially, |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
185 ;; allow any number of identical ones. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
186 (cond |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
187 (prev (setq menu prev)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
188 ((and (consp (cdr menu)) (stringp (cadr menu))) (setq menu (cdr menu)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
189 (setcdr menu (cons (list nil item) (cdr menu)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
190 ((consp item) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
191 (setq name (setq item-string (car item))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
192 (setq command (if (keymapp (setq item (cdr item))) item |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
193 (easy-menu-create-menu name item)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
194 ((vectorp item) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
195 (setq name (setq item-string (aref item 0))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
196 (setq command (easy-menu-make-symbol (aref item 1) t)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
197 (let ((active (aref item 2)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
198 (count 2) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
199 style selected) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
200 (if (and (symbolp active) (= ?: (aref (symbol-name active) 0))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
201 (let ((count 2) keyword arg suffix keys) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
202 (setq active nil) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
203 (while (> (length item) count) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
204 (setq keyword (aref item count)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
205 (setq arg (aref item (1+ count))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
206 (setq count (+ 2 count)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
207 (cond |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
208 ((eq keyword ':keys) (setq keys arg)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
209 ((eq keyword ':active) (setq active arg)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
210 ((eq keyword ':suffix) (setq suffix arg)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
211 ((eq keyword ':style) (setq style arg)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
212 ((eq keyword ':selected) (setq selected arg)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
213 (if suffix (setq item-string (concat item-string " " suffix))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
214 (if keys |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
215 (setq item-string (concat item-string " (" keys ")"))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
216 (when (and selected |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
217 (setq style (assq style easy-menu-button-prefix))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
218 ;; Simulate checkboxes and radio buttons. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
219 (setq item-string (concat (cddr style) item-string)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
220 (put command 'menu-enable |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
221 `(easy-menu-update-button ,item-string |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
222 ,(cadr style) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
223 ,selected |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
224 ,(or active t))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
225 (setq is-button t) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
226 (setq active nil) ; Already taken care of active. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
227 (when (not (or have-buttons top)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
228 (setq have-buttons " ") |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
229 ;; Add prefix to menu items defined so far. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
230 (easy-menu-change-prefix menu t))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
231 (if active (put command 'menu-enable active))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
232 (when name |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
233 (and (not is-button) have-buttons |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
234 (setq item-string (concat have-buttons item-string))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
235 (setq item (cons item-string command)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
236 (setq name (vector (intern name))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
237 (if prev (define-key-after menu name item (vector (caar prev))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
238 (define-key menu name item))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
239 have-buttons)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
240 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
241 (defvar easy-menu-item-count 0) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
242 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
243 (defun easy-menu-make-symbol (callback call) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
244 ;; Return a unique symbol with CALLBACK as function value. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
245 ;; If CALL is false then this is a keymap, not a function. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
246 ;; Else if CALLBACK is a symbol, avoid the indirection when looking for |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
247 ;; key-bindings in menu. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
248 ;; Else make a lambda expression of CALLBACK. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
249 (let ((command |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
250 (make-symbol (format "menu-function-%d" easy-menu-item-count)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
251 (setq easy-menu-item-count (1+ easy-menu-item-count)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
252 (fset command |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
253 (cond |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
254 ((not call) callback) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
255 ((symbolp callback) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
256 ;; Try find key-bindings for callback instead of for command |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
257 (put command 'menu-alias t) ; when displaying menu. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
258 callback) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
259 (t `(lambda () (interactive) ,callback)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
260 command)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
261 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
262 (defun easy-menu-filter (name filter) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
263 "Used as menu-enable property to filter menus. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
264 A call to this function is used as the menu-enable property for a menu with |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
265 a filter function. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
266 NAME is a symbol with a keymap as function value. Call the function FILTER |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
267 with this keymap as argument. FILTER must return a keymap which becomes the |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
268 new function value for NAME. Use `easy-menu-filter-return' to return the |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
269 correct value in a way portable to XEmacs. If the new keymap is `eq' the old, |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
270 then the menu is not updated." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
271 (let* ((old (symbol-function name)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
272 (new (funcall filter old))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
273 (or (eq old new) ; No change |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
274 (and (fset name new) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
275 ;; Make sure the menu gets updated by returning a |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
276 ;; different value than last time to cheat the cache. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
277 (random))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
278 |
16812
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
279 (defun easy-menu-update-button (item ch selected active) |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
280 "Used as menu-enable property to update buttons. |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
281 A call to this function is used as the menu-enable property for buttons. |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
282 ITEM is the item-string into which CH or ` ' is inserted depending on if |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
283 SELECTED is true or not. The menu entry in enabled iff ACTIVE is true." |
16812
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
284 (let ((new (if selected ch ? )) |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
285 (old (aref item 1))) |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
286 (if (eq new old) |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
287 ;; No change, just use the active value. |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
288 active |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
289 ;; It has changed. Update the entry. |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
290 (aset item 1 new) |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
291 ;; If the entry is active, make sure the menu gets updated by |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
292 ;; returning a different value than last time to cheat the cache. |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
293 (and active |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
294 (random))))) |
af96712b7f5d
(easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents:
16160
diff
changeset
|
295 |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
296 (defun easy-menu-change (path name items &optional before) |
8085
c7eb887a1e78
(easy-menu-change): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7614
diff
changeset
|
297 "Change menu found at PATH as item NAME to contain ITEMS. |
c7eb887a1e78
(easy-menu-change): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7614
diff
changeset
|
298 PATH is a list of strings for locating the menu containing NAME in the |
c7eb887a1e78
(easy-menu-change): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7614
diff
changeset
|
299 menu bar. ITEMS is a list of menu items, as in `easy-menu-define'. |
c7eb887a1e78
(easy-menu-change): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7614
diff
changeset
|
300 These items entirely replace the previous items in that map. |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
301 If NAME is not present in the menu located by PATH, then add item NAME to |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
302 that menu. If the optional argument BEFORE is present add NAME in menu |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
303 just before BEFORE, otherwise add at end of menu. |
8085
c7eb887a1e78
(easy-menu-change): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7614
diff
changeset
|
304 |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
305 Either call this from `menu-bar-update-hook' or use a menu filter, |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
306 to implement dynamic menus." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
307 (easy-menu-add-item nil path (cons name items) before)) |
8085
c7eb887a1e78
(easy-menu-change): New function.
Richard M. Stallman <rms@gnu.org>
parents:
7614
diff
changeset
|
308 |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
309 ;; XEmacs needs the following two functions to add and remove menus. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
310 ;; In Emacs this is done automatically when switching keymaps, so |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
311 ;; here these functions are noops. |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
312 (defun easy-menu-remove (menu)) |
6600
f75ac1f3d99c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6542
diff
changeset
|
313 |
9733
a721dbc48e10
(easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents:
9586
diff
changeset
|
314 (defun easy-menu-add (menu &optional map)) |
6600
f75ac1f3d99c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
6542
diff
changeset
|
315 |
20791
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
316 (defun easy-menu-add-item (menu path item &optional before) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
317 "At the end of the submenu of MENU with path PATH add ITEM. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
318 If ITEM is already present in this submenu, then this item will be changed. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
319 otherwise ITEM will be added at the end of the submenu, unless the optional |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
320 argument BEFORE is present, in which case ITEM will instead be added |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
321 before the item named BEFORE. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
322 MENU is either a symbol, which have earlier been used as the first |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
323 argument in a call to `easy-menu-define', or the value of such a symbol |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
324 i.e. a menu, or nil which stands for the menu-bar itself. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
325 PATH is a list of strings for locating the submenu where ITEM is to be |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
326 added. If PATH is nil, MENU itself is used. Otherwise, the first |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
327 element should be the name of a submenu directly under MENU. This |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
328 submenu is then traversed recursively with the remaining elements of PATH. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
329 ITEM is either defined as in `easy-menu-define' or a menu defined earlier |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
330 by `easy-menu-define' or `easy-menu-create-menu'." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
331 (let ((top (not (or menu path))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
332 tmp prev next) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
333 (setq menu (easy-menu-get-map menu path)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
334 (or (lookup-key menu (vector (intern (elt item 0)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
335 (and menu (keymapp (cdr menu))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
336 (setq tmp (cdr menu))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
337 (while (and tmp (not (keymapp tmp)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
338 (not (and (consp (car tmp)) (symbolp (caar tmp))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
339 (setq tmp (cdr tmp))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
340 (and before (setq before (intern before))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
341 (if (or (null tmp) (keymapp tmp) (eq (setq prev (caar tmp)) before)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
342 (setq prev nil) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
343 (while (and tmp (not (keymapp tmp)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
344 (not (and (consp (car tmp)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
345 (eq (caar (setq next tmp)) before)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
346 (if next (setq prev next)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
347 (setq next nil) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
348 (setq tmp (cdr tmp)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
349 (when (or (keymapp item) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
350 (and (symbolp item) (keymapp (symbol-value item)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
351 ;; Item is a keymap, find the prompt string and use as item name. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
352 (setq next (easy-menu-get-map item nil)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
353 (if (not (keymapp item)) (setq item next)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
354 (setq tmp nil) ; No item name yet. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
355 (while (and (null tmp) (consp (setq next (cdr next))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
356 (not (keymapp next))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
357 (if (stringp (car next)) (setq tmp (car next)) ; Got a name. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
358 (setq next (cdr next)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
359 (setq item (cons tmp item))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
360 (easy-menu-do-add-item menu item |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
361 (and (not top) (easy-menu-have-button menu) " ") |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
362 prev top))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
363 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
364 (defun easy-menu-item-present-p (menu path name) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
365 "In submenu of MENU with path PATH, return true iff item NAME is present. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
366 MENU and PATH are defined as in `easy-menu-add-item'. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
367 NAME should be a string, the name of the element to be looked for." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
368 (lookup-key (easy-menu-get-map menu path) (vector (intern name)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
369 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
370 (defun easy-menu-remove-item (menu path name) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
371 "From submenu of MENU with path PATH remove item NAME. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
372 MENU and PATH are defined as in `easy-menu-add-item'. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
373 NAME should be a string, the name of the element to be removed." |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
374 (let ((item (vector (intern name))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
375 (top (not (or menu path))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
376 tmp) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
377 (setq menu (easy-menu-get-map menu path)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
378 (when (setq tmp (lookup-key menu item)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
379 (define-key menu item nil) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
380 (and (not top) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
381 (easy-menu-is-button tmp) ; Removed item was a button and |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
382 (not (easy-menu-have-button menu)) ; no buttons left then |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
383 ;; remove prefix from items in menu |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
384 (easy-menu-change-prefix menu nil))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
385 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
386 (defun easy-menu-get-map (menu path) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
387 ;; Return a sparse keymap in which to add or remove an item. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
388 ;; MENU and PATH are as defined in `easy-menu-remove-item'. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
389 (if (null menu) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
390 (setq menu (key-binding (vconcat '(menu-bar) (mapcar 'intern path)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
391 (if (and (symbolp menu) (not (keymapp menu))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
392 (setq menu (symbol-value menu))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
393 (if path (setq menu (lookup-key menu (vconcat (mapcar 'intern path)))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
394 (while (and (symbolp menu) (keymapp menu)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
395 (setq menu (symbol-function menu))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
396 (or (keymapp menu) (error "Malformed menu in easy-menu: (%s)" menu)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
397 menu) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
398 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
399 (defun easy-menu-is-button (val) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
400 ;; VAL is a real menu binding. Return true iff it is a toggle or |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
401 ;; radio button. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
402 (and (symbolp val) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
403 (consp (setq val (get val 'menu-enable))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
404 (eq (car val) 'easy-menu-update-button))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
405 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
406 (defun easy-menu-have-button (map) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
407 ;; MAP is a sparse keymap. Return true iff there is any toggle or radio |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
408 ;; button in MAP. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
409 (let ((have nil) tmp) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
410 (while (and (consp map) (not have)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
411 (and (consp (setq tmp (car map))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
412 (consp (setq tmp (cdr tmp))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
413 (stringp (car tmp)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
414 (setq have (easy-menu-is-button (easy-menu-real-binding tmp)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
415 (setq map (cdr map))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
416 have)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
417 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
418 (defun easy-menu-real-binding (val) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
419 ;; Val is a menu keymap binding. Skip item string. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
420 ;; Also skip a possible help string and/or key-binding cache. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
421 (if (and (consp (setq val (cdr val))) (stringp (car val))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
422 (setq val (cdr val))) ; Skip help string. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
423 (if (and (consp val) (consp (car val)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
424 (or (null (caar val)) (vectorp (caar val)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
425 (setq val (cdr val))) ; Skip key-binding cache. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
426 val) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
427 |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
428 (defun easy-menu-change-prefix (map add) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
429 ;; MAP is a sparse keymap. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
430 ;; If ADD is true add a button compensating prefix to each menu item in MAP. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
431 ;; Else remove prefix instead. |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
432 (let (tmp val) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
433 (while (consp map) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
434 (when (and (consp (setq tmp (car map))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
435 (consp (setq tmp (cdr tmp))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
436 (stringp (car tmp))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
437 (cond |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
438 (add (setcar tmp (concat " " (car tmp)))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
439 ((string-match "$ " (car tmp)) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
440 (setcar tmp (substring (car tmp) (match-end 0)))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
441 (setq map (cdr map))))) |
0c51c56d0a4f
easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents:
19761
diff
changeset
|
442 |
6529 | 443 (provide 'easymenu) |
444 | |
445 ;;; easymenu.el ends here |