annotate lisp/emacs-lisp/easymenu.el @ 21651:86fcccceba7b

*** empty log message ***
author Dan Nicolaescu <done@ece.arizona.edu>
date Sat, 18 Apr 1998 19:48:40 +0000
parents 517de9005275
children 95c0fe8d25a7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6529
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 ;;; easymenu.el --- support the easymenu interface for defining a menu.
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5 ;; Keywords: emulations
6600
f75ac1f3d99c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6542
diff changeset
6 ;; Author: rms
6529
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
8 ;; This file is part of GNU Emacs.
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 ;; it under the terms of the GNU General Public License as published by
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 ;; the Free Software Foundation; either version 2, or (at your option)
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 ;; any later version.
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15 ;; GNU Emacs is distributed in the hope that it will be useful,
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 ;; GNU General Public License for more details.
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
23 ;; Boston, MA 02111-1307, USA.
6529
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
25 ;;; Commentary:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
26
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
27 ;; This is compatible with easymenu.el by Per Abrahamsen
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
28 ;; but it is much simpler as it doesn't try to support other Emacs versions.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14108
diff changeset
29 ;; The code was mostly derived from lmenu.el.
6529
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 ;;; Code:
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 The rest of the elements are menu items.
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
cab8d383f10d (easy-menu-define): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 11860
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 (while menu-items
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
144 (setq have-buttons
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
145 (easy-menu-do-add-item menu (car menu-items) have-buttons))
6529
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 (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
147 (when filter
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
148 (setq menu (easy-menu-make-symbol menu))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
149 (put menu 'menu-enable
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
150 `(easy-menu-filter (quote ,menu) (quote ,filter))))
6529
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 menu))
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
153
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
154 ;; Button prefixes.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
155 (defvar easy-menu-button-prefix
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
156 '((radio ?* . "( ) ") (toggle ?X . "[ ] ")))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
157
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
158 (defun easy-menu-do-add-item (menu item have-buttons &optional before top)
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
159 ;; 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
160 ;; 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
161 ;; functions.
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
162 ;; MENU is a sparse keymap i.e. a list starting with the symbol `keymap'.
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
163 ;; 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
164 ;; 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
165 ;; 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
166 ;; button prefix.
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
167 ;; Optional argument BEFORE is nil or a symbol used as a key in MENU. If
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
168 ;; BEFORE is not nil put item before BEFORE in MENU, otherwise if item is
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
169 ;; already present in MENU, just change it, otherwise put it last in MENU.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
170 ;; If optional TOP is true, this is an item in the menu bar itself so
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
171 ;; don't use prefix. In this case HAVE-BUTTONS will be nil.
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
172 (let (command name item-string is-button done inserted)
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
173 (cond
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
174 ((stringp item)
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
175 (setq item-string
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
176 (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
177 "^\\(-+\\|\
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
178 --:\\(\\(no\\|\\(sing\\|doub\\)le\\(Dashed\\)?\\)Line\\|\
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
179 shadow\\(Double\\)?Etched\\(In\\|Out\\)\\(Dash\\)?\\)\\)$"
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
180 item) "" ; use a single line separator.
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
181 (concat have-buttons item))))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
182 ((consp item)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
183 (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
184 (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
185 (easy-menu-create-menu name item))))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
186 ((vectorp item)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
187 (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
188 (setq command (easy-menu-make-symbol (aref item 1) t))
21027
517de9005275 (easy-menu-change): Handle case of no keywords.
Richard M. Stallman <rms@gnu.org>
parents: 20801
diff changeset
189 (let ((active (if (> (length item) 2) (aref item 2) t))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
190 (count 2)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
191 style selected)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
192 (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
193 (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
194 (setq active nil)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
195 (while (> (length item) count)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
196 (setq keyword (aref item count))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
197 (setq arg (aref item (1+ count)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
198 (setq count (+ 2 count))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
199 (cond
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
200 ((eq keyword ':keys) (setq keys arg))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
201 ((eq keyword ':active) (setq active arg))
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
202 ((eq keyword ':suffix) (setq suffix (concat " " arg)))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
203 ((eq keyword ':style) (setq style arg))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
204 ((eq keyword ':selected) (setq selected arg))))
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
205 (if keys (setq suffix (concat suffix " (" keys ")")))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
206 (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
207 (when (and selected
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
208 (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
209 ;; Simulate checkboxes and radio buttons.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
210 (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
211 (put command 'menu-enable
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
212 `(easy-menu-update-button ,item-string
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
213 ,(cadr style)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
214 ,selected
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
215 ,(or active t)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
216 (setq is-button t)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
217 (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
218 (when (not (or have-buttons top))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
219 (setq have-buttons " ")
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
220 ;; 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
221 (easy-menu-change-prefix menu t)))))
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
222 (if active (put command 'menu-enable active))))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
223 (t "Illegal menu item in easy menu."))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
224 (when name
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
225 (and (not is-button) have-buttons
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
226 (setq item-string (concat have-buttons item-string)))
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
227 (setq name (intern name)))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
228 (setq item (cons item-string command))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
229 (if before (setq before (intern before)))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
230 ;; The following loop is simlar to `define-key-after'. It
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
231 ;; inserts (name . item) in keymap menu.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
232 ;; If name is not nil then delete any duplications.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
233 ;; If before is not nil, insert before before. Otherwise
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
234 ;; if name is not nil and it is found in menu, insert there, else
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
235 ;; insert at end.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
236 (while (not done)
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
237 (cond
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
238 ((or (setq done (or (null (cdr menu)) (keymapp (cdr menu))))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
239 (and before (eq (car-safe (cadr menu)) before)))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
240 ;; If name is nil, stop here, otherwise keep going past the
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
241 ;; inserted element so we can delete any duplications that come
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
242 ;; later.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
243 (if (null name) (setq done t))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
244 (unless inserted ; Don't insert more than once.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
245 (setcdr menu (cons (cons name item) (cdr menu)))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
246 (setq inserted t)
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
247 (setq menu (cdr menu))))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
248 ((and name (eq (car-safe (cadr menu)) name))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
249 (if (and before ; Wanted elsewere and
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
250 (not (setq done ; not the last in this keymap.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
251 (or (null (cddr menu)) (keymapp (cddr menu))))))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
252 (setcdr menu (cddr menu))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
253 (setcdr (cadr menu) item) ; Change item.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
254 (setq inserted t))))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
255 (setq menu (cdr menu)))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
256 have-buttons))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
257
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
258 (defvar easy-menu-item-count 0)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
259
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
260 (defun easy-menu-make-symbol (callback &optional call)
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
261 ;; 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
262 ;; 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
263 ;; 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
264 ;; key-bindings in menu.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
265 ;; 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
266 (let ((command
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
267 (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
268 (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
269 (fset command
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
270 (cond
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
271 ((not call) callback)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
272 ((symbolp callback)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
273 ;; 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
274 (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
275 callback)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
276 (t `(lambda () (interactive) ,callback))))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
277 command))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
278
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
279 (defun easy-menu-filter (name filter)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
280 "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
281 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
282 a filter function.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
283 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
284 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
285 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
286 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
287 then the menu is not updated."
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
288 (let* ((old (symbol-function name))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
289 (new (funcall filter old)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
290 (or (eq old new) ; No change
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
291 (and (fset name new)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
292 ;; 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
293 ;; 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
294 (random)))))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
295
16812
af96712b7f5d (easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents: 16160
diff changeset
296 (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
297 "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
298 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
299 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
300 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
301 (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
302 (old (aref item 1)))
af96712b7f5d (easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents: 16160
diff changeset
303 (if (eq new old)
af96712b7f5d (easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents: 16160
diff changeset
304 ;; 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
305 active
af96712b7f5d (easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents: 16160
diff changeset
306 ;; 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
307 (aset item 1 new)
af96712b7f5d (easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents: 16160
diff changeset
308 ;; 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
309 ;; 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
310 (and active
af96712b7f5d (easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents: 16160
diff changeset
311 (random)))))
af96712b7f5d (easy-menu-create-keymaps): Menu item STYLE toggle (checkbox)
Richard M. Stallman <rms@gnu.org>
parents: 16160
diff changeset
312
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
313 (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
314 "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
315 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
316 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
317 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
318 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
319 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
320 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
321
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
322 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
323 to implement dynamic menus."
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
324 (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
325
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
326 ;; 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
327 ;; 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
328 ;; 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
329 (defun easy-menu-remove (menu))
6600
f75ac1f3d99c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6542
diff changeset
330
9733
a721dbc48e10 (easy-menu-define): Call `easy-menu-do-define' to do
Richard M. Stallman <rms@gnu.org>
parents: 9586
diff changeset
331 (defun easy-menu-add (menu &optional map))
6600
f75ac1f3d99c *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 6542
diff changeset
332
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
333 (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
334 "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
335 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
336 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
337 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
338 before the item named BEFORE.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
339 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
340 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
341 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
342 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
343 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
344 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
345 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
346 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
347 by `easy-menu-define' or `easy-menu-create-menu'."
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
348 (let ((top (not (or menu path))))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
349 (setq menu (easy-menu-get-map menu path))
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
350 (if (or (keymapp item)
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
351 (and (symbolp item) (keymapp (symbol-value item))))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
352 ;; Item is a keymap, find the prompt string and use as item name.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
353 (let ((tail (easy-menu-get-map item nil)) name)
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
354 (if (not (keymapp item)) (setq item tail))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
355 (while (and (null name) (consp (setq tail (cdr tail)))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
356 (not (keymapp tail)))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
357 (if (stringp (car tail)) (setq name (car tail)) ; Got a name.
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
358 (setq tail (cdr tail))))
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
359 (setq item (cons name item))))
20791
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
20801
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
361 (and (not top) (easy-menu-have-button menu)
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
362 " ")
8aeddd528f57 (easy-menu-add-item); The BEFORE argument works
Richard M. Stallman <rms@gnu.org>
parents: 20791
diff changeset
363 before top)))
20791
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
364
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
365 (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
366 "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
367 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
368 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
369 (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
370
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
371 (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
372 "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
373 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
374 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
375 (let ((item (vector (intern name)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
376 (top (not (or menu path)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
377 tmp)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
378 (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
379 (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
380 (define-key menu item nil)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
381 (and (not top)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
382 (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
383 (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
384 ;; remove prefix from items in menu
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
385 (easy-menu-change-prefix menu nil)))))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
386
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
387 (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
388 ;; 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
389 ;; 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
390 (if (null menu)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
391 (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
392 (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
393 (setq menu (symbol-value menu)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
394 (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
395 (while (and (symbolp menu) (keymapp menu))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
396 (setq menu (symbol-function menu)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
397 (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
398 menu)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
399
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
400 (defun easy-menu-is-button (val)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
401 ;; 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
402 ;; radio button.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
403 (and (symbolp val)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
404 (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
405 (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
406
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
407 (defun easy-menu-have-button (map)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
408 ;; 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
409 ;; button in MAP.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
410 (let ((have nil) tmp)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
411 (while (and (consp map) (not have))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
412 (and (consp (setq tmp (car map)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
413 (consp (setq tmp (cdr tmp)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
414 (stringp (car tmp))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
415 (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
416 (setq map (cdr map)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
417 have))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
418
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
419 (defun easy-menu-real-binding (val)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
420 ;; 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
421 ;; 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
422 (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
423 (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
424 (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
425 (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
426 (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
427 val)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
428
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
429 (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
430 ;; MAP is a sparse keymap.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
431 ;; 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
432 ;; Else remove prefix instead.
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
433 (let (tmp val)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
434 (while (consp map)
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
435 (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
436 (consp (setq tmp (cdr tmp)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
437 (stringp (car tmp)))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
438 (cond
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
439 (add (setcar tmp (concat " " (car tmp))))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
440 ((string-match "$ " (car tmp))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
441 (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
442 (setq map (cdr map)))))
0c51c56d0a4f easy-menu-define): Use ` and , read-macros
Richard M. Stallman <rms@gnu.org>
parents: 19761
diff changeset
443
6529
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 (provide 'easymenu)
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445
79c305d1edcb Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 ;;; easymenu.el ends here