annotate src/menubar.c @ 5602:c9e5612f5424

Support the MP library on recent FreeBSD, have it pass relevant tests. src/ChangeLog addition: 2011-11-26 Aidan Kehoe <kehoea@parhasard.net> * number-mp.c (bignum_to_string): Don't overwrite the accumulator we've just set up for this function. * number-mp.c (BIGNUM_TO_TYPE): mp_itom() doesn't necessarily do what this code used to think with negative numbers, it can treat them as unsigned ints. Subtract numbers from bignum_zero instead of multiplying them by -1 to convert them to their negative equivalents. * number-mp.c (bignum_to_int): * number-mp.c (bignum_to_uint): * number-mp.c (bignum_to_long): * number-mp.c (bignum_to_ulong): * number-mp.c (bignum_to_double): Use the changed BIGNUM_TO_TYPE() in these functions. * number-mp.c (bignum_ceil): * number-mp.c (bignum_floor): In these functions, be more careful about rounding to positive and negative infinity, respectively. Don't use the sign of QUOTIENT when working out out whether to add or subtract one, rather use the sign QUOTIENT would have if arbitrary-precision division were done. * number-mp.h: * number-mp.h (MP_GCD): Wrap #include <mp.h> in BEGIN_C_DECLS/END_C_DECLS. * number.c (Fbigfloat_get_precision): * number.c (Fbigfloat_set_precision): Don't attempt to call XBIGFLOAT_GET_PREC if this build doesn't support big floats.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 26 Nov 2011 17:59:14 +0000
parents 56144c8593a8
children 68f8d295be49
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Implements an elisp-programmable menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1993, 1994 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1995 Tinker Systems and INS Engineering Corp.
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2545
diff changeset
4 Copyright (C) 2001, 2002, 2003, 2005 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4952
diff changeset
8 XEmacs is free software: you can redistribute it and/or modify it
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4952
diff changeset
10 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4952
diff changeset
11 option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4952
diff changeset
19 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
23 /* Authorship:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
24
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
25 Created by Ben Wing as part of device-abstraction work for 19.12.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
26 Menu filters and many other keywords added by Stig for 19.12.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
27 Menu accelerators c. 1997? by ??. Moved here from event-stream.c.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
28 Much other work post-1996 by ??.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
29 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "buffer.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
35 #include "device-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
36 #include "frame-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "gui.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
38 #include "keymap.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "menubar.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "redisplay.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
41 #include "specifier.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
42 #include "window-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 int menubar_show_keybindings;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 Lisp_Object Vmenubar_configuration;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 Lisp_Object Qcurrent_menubar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 Lisp_Object Qactivate_menubar_hook, Vactivate_menubar_hook;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 Lisp_Object Vmenubar_visible_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 static Lisp_Object Vcurrent_menubar; /* DO NOT ever reference this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Always go through Qcurrent_menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 See below. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Lisp_Object Vblank_menubar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 int popup_menu_titles;
1279
cd0abfdb9e9d [xemacs-hg @ 2003-02-09 09:33:42 by ben]
ben
parents: 872
diff changeset
60 int in_menu_callback;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 Lisp_Object Vmenubar_pointer_glyph;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
64 /* prefix key(s) that must match in order to activate menu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
65 This is ugly. fix me.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
66 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
67 Lisp_Object Vmenu_accelerator_prefix;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
68
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
69 /* list of modifier keys to match accelerator for top level menus */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
70 Lisp_Object Vmenu_accelerator_modifiers;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
71
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
72 /* whether menu accelerators are enabled */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
73 Lisp_Object Vmenu_accelerator_enabled;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
74
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
75 /* keymap for auxiliary menu accelerator functions */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
76 Lisp_Object Vmenu_accelerator_map;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
77
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
78 Lisp_Object Qmenu_force;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
79 Lisp_Object Qmenu_fallback;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
80 Lisp_Object Qmenu_quit;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
81 Lisp_Object Qmenu_up;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
82 Lisp_Object Qmenu_down;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
83 Lisp_Object Qmenu_left;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
84 Lisp_Object Qmenu_right;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
85 Lisp_Object Qmenu_select;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
86 Lisp_Object Qmenu_escape;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
87
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
89 menubar_variable_changed (Lisp_Object UNUSED (sym), Lisp_Object *UNUSED (val),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
90 Lisp_Object UNUSED (in_object), int UNUSED (flags))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 MARK_MENUBAR_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 update_frame_menubars (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 if (f->menubar_changed || f->windows_changed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 MAYBE_FRAMEMETH (f, update_frame_menubars, (f));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 f->menubar_changed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 free_frame_menubars (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 /* If we had directly allocated any memory for the menubars instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 of using all Lisp_Objects this is where we would now free it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 MAYBE_FRAMEMETH (f, free_frame_menubars, (f));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
115 menubar_visible_p_changed (Lisp_Object UNUSED (specifier),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
116 struct window *UNUSED (w),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
117 Lisp_Object UNUSED (oldval))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 MARK_MENUBAR_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
123 menubar_visible_p_changed_in_frame (Lisp_Object UNUSED (specifier),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
124 struct frame *f,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1913
diff changeset
125 Lisp_Object UNUSED (oldval))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 update_frame_menubars (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
131 current_frame_menubar (const struct frame* f)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 struct window *w = XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 return symbol_value_in_buffer (Qcurrent_menubar, w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 menu_parse_submenu_keywords (Lisp_Object desc, Lisp_Object gui_item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
140 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 /* Menu descriptor should be a list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 /* First element may be menu name, although can be omitted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 Let's think that if stuff begins with anything than a keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 or a list (submenu), this is a menu name, expected to be a string */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 if (!KEYWORDP (XCAR (desc)) && !CONSP (XCAR (desc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 CHECK_STRING (XCAR (desc));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 pgui_item->name = XCAR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 desc = XCDR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 if (!NILP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 /* Walk along all key-value pairs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 while (!NILP(desc) && KEYWORDP (XCAR (desc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 Lisp_Object key, val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 key = XCAR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 desc = XCDR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 val = XCAR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 desc = XCDR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 if (!NILP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 gui_item_add_keyval_pair (gui_item, key, val, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 /* Return the rest - supposed to be a list of items */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 return desc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 DEFUN ("menu-find-real-submenu", Fmenu_find_real_submenu, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 Find a submenu descriptor within DESC by following PATH.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 This function finds a submenu descriptor, either from the description
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 DESC or generated by a filter within DESC. The function regards :config
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 and :included keywords in the DESC, and expands submenus along the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 PATH using :filter functions. Return value is a descriptor for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 submenu, NOT expanded and NOT checked against :config and :included.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 Also, individual menu items are not looked for, only submenus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 See also 'find-menu-item'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 (desc, path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
188 struct gcpro gcpro1, gcpro2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 Lisp_Object gui_item = allocate_gui_item ();
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
190 Lisp_Gui_Item* pgui_item = XGUI_ITEM (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
192 GCPRO2 (gui_item, desc);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
194 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
195 EXTERNAL_LIST_LOOP_2 (elt, path)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
196 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
197 /* Verify that DESC describes a menu, not single item */
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
198 if (!CONSP (desc))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
199 RETURN_UNGCPRO (Qnil);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
200
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
201 /* Parse this menu */
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
202 desc = menu_parse_submenu_keywords (desc, gui_item);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
203
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
204 /* Check that this (sub)menu is active */
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
205 if (!gui_item_active_p (gui_item))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
206 RETURN_UNGCPRO (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
208 /* Apply :filter */
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
209 if (!NILP (pgui_item->filter))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
210 desc = call1 (pgui_item->filter, desc);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
212 /* Find the next menu on the path inside this one */
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
213 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
214 EXTERNAL_LIST_LOOP_2 (submenu, desc)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
215 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
216 if (CONSP (submenu)
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
217 && STRINGP (XCAR (submenu))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
218 && !NILP (Fstring_equal (XCAR (submenu), elt)))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
219 {
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
220 desc = submenu;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
221 goto descend;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
222 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
223 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
224 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
225 /* Submenu not found */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 RETURN_UNGCPRO (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
228 descend:
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
229 /* Prepare for the next iteration */
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
230 gui_item_init (gui_item);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
231 }
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
232 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 /* We have successfully descended down the end of the path */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 return desc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 DEFUN ("popup-menu", Fpopup_menu, 1, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
240 Pop up the menu described by MENU-DESCRIPTION.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 A menu description is a list of menu items, strings, and submenus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 The first element of a menu must be a string, which is the name of the menu.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 This is the string that will be displayed in the parent menu, if any. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 toplevel menus, it is ignored. This string is not displayed in the menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 If an element of a menu is a string, then that string will be presented in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 the menu as unselectable text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 If an element of a menu is a string consisting solely of hyphens, then that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 item will be presented as a solid horizontal line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 If an element of a menu is a list, it is treated as a submenu. The name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 that submenu (the first element in the list) will be used as the name of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 item representing this menu on the parent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 Otherwise, the element must be a vector, which describes a menu item.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 A menu item can have any of the following forms:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 [ "name" callback <active-p> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 [ "name" callback <active-p> <suffix> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 [ "name" callback :<keyword> <value> :<keyword> <value> ... ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 The name is the string to display on the menu; it is filtered through the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 resource database, so it is possible for resources to override what string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 is actually displayed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 If the `callback' of a menu item is a symbol, then it must name a command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 It will be invoked with `call-interactively'. If it is a list, then it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 evaluated with `eval'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 The possible keywords are this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 :active <form> Same as <active-p> in the first two forms: the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 expression is evaluated just before the menu is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 displayed, and the menu will be selectable only if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 the result is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 :suffix <form> Same as <suffix> in the second form: the expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 is evaluated just before the menu is displayed and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 resulting string is appended to the displayed name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 providing a convenient way of adding the name of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 command's ``argument'' to the menu, like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 ``Kill Buffer NAME''.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 :keys "string" Normally, the keyboard equivalents of commands in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 menus are displayed when the `callback' is a symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 This can be used to specify keys for more complex menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 items. It is passed through `substitute-command-keys'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 :style <style> Specifies what kind of object this menu item is:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 nil A normal menu item.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 toggle A toggle button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 radio A radio button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 The only difference between toggle and radio buttons is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 how they are displayed. But for consistency, a toggle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 button should be used when there is one option whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 value can be turned on or off, and radio buttons should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 be used when there is a set of mutually exclusive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 options. When using a group of radio buttons, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 should arrange for no more than one to be marked as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 selected at a time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 :selected <form> Meaningful only when STYLE is `toggle' or `radio'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 This specifies whether the button will be in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 selected or unselected state.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 [ "Save As..." write-file t ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 [ "Revert Buffer" revert-buffer (buffer-modified-p) ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 [ "Read Only" toggle-read-only :style toggle :selected buffer-read-only ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 See menubar.el for many more examples.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
320 (menu_description, event))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
322 struct frame *f = decode_frame (Qnil);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
323 MAYBE_FRAMEMETH (f, popup_menu, (menu_description, event));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
327 DEFUN ("compare-menu-text", Fcompare_menu_text, 2, 2, 0, /*
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
328 Compare the text of two menu items, ignoring accelerator specs and case.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
329 Also treat %% as a single %. Return < 0 if STRING1 is less than STRING2,
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
330 0 if equal, > 0 if STRING1 is greater than STRING2.
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
331 */
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
332 (string1, string2))
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
333 {
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
334 Ibyte *p;
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
335 Ibyte *q;
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
336
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
337 CHECK_STRING (string1);
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
338 CHECK_STRING (string2);
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
339
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
340 p = XSTRING_DATA (string1);
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
341 q = XSTRING_DATA (string2);
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
342
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
343 for (;;)
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
344 {
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
345 Ichar val;
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
346 if (*p == '%' && *(p + 1) == '%')
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
347 p++;
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
348 else if (*p == '%' && *(p + 1) == '_')
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
349 p += 2;
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
350 if (*q == '%' && *(q + 1) == '%')
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
351 q++;
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
352 else if (*q == '%' && *(q + 1) == '_')
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
353 q += 2;
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
354 if (!*p || !*q)
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
355 return make_fixnum (*p - *q);
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
356 val = DOWNCASE (0, itext_ichar (p)) - DOWNCASE (0, itext_ichar (q));
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
357 if (val)
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
358 return make_fixnum (val);
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
359 INC_IBYTEPTR (p);
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
360 INC_IBYTEPTR (q);
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
361 }
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
362 }
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
363
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
364 DEFUN ("normalize-menu-text", Fnormalize_menu_text, 1, 1, 0, /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 Convert a menu item name string into normal form, and return the new string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 Menu item names should be converted to normal form before being compared.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
367 This removes %_'s (accelerator indications) and converts %% to %.
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
368 The returned string may be the same string as the original.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 */
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
370 (name))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 Charcount end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 int i;
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
374 Ibyte *name_data;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
375 Ibyte *string_result;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
376 Ibyte *string_result_ptr;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
377 Ichar elt;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 int expecting_underscore = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 CHECK_STRING (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
382 end = string_char_length (name);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
383 name_data = XSTRING_DATA (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
385 string_result = alloca_ibytes (end * MAX_ICHAR_LEN);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 string_result_ptr = string_result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 for (i = 0; i < end; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
389 elt = itext_ichar (name_data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 if (expecting_underscore)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 expecting_underscore = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 switch (elt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 case '%':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 /* Allow `%%' to mean `%'. */
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
397 string_result_ptr += set_itext_ichar (string_result_ptr, '%');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 case '_':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 default:
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
402 string_result_ptr += set_itext_ichar (string_result_ptr, '%');
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
403 string_result_ptr += set_itext_ichar (string_result_ptr, elt);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 else if (elt == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 expecting_underscore = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 else
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
409 string_result_ptr += set_itext_ichar (string_result_ptr, elt);
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
410 INC_IBYTEPTR (name_data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
413 if (string_result_ptr - string_result == XSTRING_LENGTH (name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
414 && !memcmp (string_result, XSTRING_DATA (name), XSTRING_LENGTH (name)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
415 return name;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
416
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 return make_string (string_result, string_result_ptr - string_result);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 syms_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
423 DEFSYMBOL (Qcurrent_menubar);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
424
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
425 DEFSYMBOL (Qmenu_force);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
426 DEFSYMBOL (Qmenu_fallback);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
427
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
428 DEFSYMBOL (Qmenu_quit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
429 DEFSYMBOL (Qmenu_up);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
430 DEFSYMBOL (Qmenu_down);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
431 DEFSYMBOL (Qmenu_left);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
432 DEFSYMBOL (Qmenu_right);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
433 DEFSYMBOL (Qmenu_select);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
434 DEFSYMBOL (Qmenu_escape);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
435
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 DEFSUBR (Fpopup_menu);
2545
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
437 DEFSUBR (Fcompare_menu_text);
9caf26dd924f [xemacs-hg @ 2005-02-03 05:03:36 by ben]
ben
parents: 2367
diff changeset
438 DEFSUBR (Fnormalize_menu_text);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 DEFSUBR (Fmenu_find_real_submenu);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 vars_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
445 /* put in Vblank_menubar a menubar value which has no visible
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
446 * items. This is a bit tricky due to various quirks. We
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
447 * could use '(["" nil nil]), but this is apparently equivalent
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
448 * to '(nil), and a new frame created with this menubar will
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
449 * get a vertically-squished menubar. If we use " " as the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
450 * button title instead of "", we get an etched button border.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
451 * So we use
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
452 * '(("No active menubar" ["" nil nil]))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
453 * which creates a menu whose title is "No active menubar",
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
454 * and this works fine.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
455 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456
4952
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 3025
diff changeset
457 Vblank_menubar = list1 (list2 (build_defer_string ("No active menubar"),
19a72041c5ed Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents: 3025
diff changeset
458 vector3 (build_ascstring (""), Qnil, Qnil)));
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
459 staticpro (&Vblank_menubar);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 DEFVAR_BOOL ("popup-menu-titles", &popup_menu_titles /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 If true, popup menus will have title bars at the top.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 popup_menu_titles = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 /* #### Replace current menubar with a specifier. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 /* All C code must access the menubar via Qcurrent_menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 because it can be buffer-local. Note that Vcurrent_menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 doesn't need to exist at all, except for the magic function. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 DEFVAR_LISP_MAGIC ("current-menubar", &Vcurrent_menubar /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 The current menubar. This may be buffer-local.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 When the menubar is changed, the function `set-menubar-dirty-flag' has to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 be called for the menubar to be updated on the frame. See `set-menubar'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 and `set-buffer-menubar'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 A menubar is a list of menus and menu-items.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 A menu is a list of menu items, keyword-value pairs, strings, and submenus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 The first element of a menu must be a string, which is the name of the menu.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 This is the string that will be displayed in the parent menu, if any. For
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 toplevel menus, it is ignored. This string is not displayed in the menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
487 Menu accelerators can be indicated in the string by putting the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
488 sequence "%_" before the character corresponding to the key that will
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
489 invoke the menu or menu item. Uppercase and lowercase accelerators
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
490 are equivalent. The sequence "%%" is also special, and is translated
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
491 into a single %.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
492
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
493 If no menu accelerator is present in the string, XEmacs will act as if
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
494 the first character has been tagged as an accelerator.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
495
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
496 Immediately following the name string of the menu, various optional
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
497 keyword-value pairs are permitted: currently, :filter, :active, :included,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
498 and :config. (See below.)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 If an element of a menu (or menubar) is a string, then that string will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 presented as unselectable text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 If an element of a menu is a string consisting solely of hyphens, then that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 item will be presented as a solid horizontal line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
506 If an element of a menu is a string beginning with "--:", it will be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
507 presented as a line whose appearance is controlled by the rest of the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
508 text in the string. The allowed line specs are system-dependent, and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
509 currently work only under X Windows (with Lucid and Motif menubars);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
510 otherwise, a solid horizontal line is presented, as if the string were
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
511 all hyphens.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
512
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
513 The possibilities are:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
514
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
515 "--:singleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
516 "--:doubleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
517 "--:singleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
518 "--:doubleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
519 "--:noLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
520 "--:shadowEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
521 "--:shadowEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
522 "--:shadowEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
523 "--:shadowEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
524 "--:shadowDoubleEtchedIn" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
525 "--:shadowDoubleEtchedOut" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
526 "--:shadowDoubleEtchedInDash" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
527 "--:shadowDoubleEtchedOutDash" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
528
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 If an element of a menu is a list, it is treated as a submenu. The name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 that submenu (the first element in the list) will be used as the name of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 item representing this menu on the parent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 If an element of a menubar is `nil', then it is used to represent the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 division between the set of menubar-items which are flushleft and those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 which are flushright.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 Otherwise, the element must be a vector, which describes a menu item.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
538 A menu item is of the following form:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
539
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
540 [ "name" callback :<keyword> <value> :<keyword> <value> ... ]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
541
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
542 The following forms are also accepted for compatibility, but deprecated:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 [ "name" callback <active-p> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 [ "name" callback <active-p> <suffix> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 The name is the string to display on the menu; it is filtered through the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 resource database, so it is possible for resources to override what string
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
549 is actually displayed. Menu accelerator indicators (the sequence `%_') are
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
550 also processed; see above. If the name is not a string, it will be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
551 evaluated with `eval', and the result should be a string.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 If the `callback' of a menu item is a symbol, then it must name a command.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 It will be invoked with `call-interactively'. If it is a list, then it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 evaluated with `eval'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
557 In the deprecated forms, <active-p> is equivalent to using the :active
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
558 keyword, and <suffix> is equivalent to using the :suffix keyword.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
560 The possible keywords are:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
561
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
562 :active <form> The expression is evaluated just before the menu is
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 displayed, and the menu will be selectable only if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 the result is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
566 :suffix <form> The expression is evaluated just before the menu is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
567 displayed and the resulting string is appended to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 the displayed name, providing a convenient way of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569 adding the name of a command's ``argument'' to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 menu, like ``Kill Buffer NAME''.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 :keys "string" Normally, the keyboard equivalents of commands in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 menus are displayed when the `callback' is a symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 This can be used to specify keys for more complex menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 items. It is passed through `substitute-command-keys'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 :style <style> Specifies what kind of object this menu item is:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 nil A normal menu item.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 toggle A toggle button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 radio A radio button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 button A menubar button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 The only difference between toggle and radio buttons is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 how they are displayed. But for consistency, a toggle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 button should be used when there is one option whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 value can be turned on or off, and radio buttons should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 be used when there is a set of mutually exclusive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 options. When using a group of radio buttons, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 should arrange for no more than one to be marked as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 selected at a time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 :selected <form> Meaningful only when STYLE is `toggle', `radio' or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 `button'. This specifies whether the button will be in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 the selected or unselected state.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 :included <form> This can be used to control the visibility of a menu or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 menu item. The form is evaluated and the menu or menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 item is only displayed if the result is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 :config <symbol> This is an efficient shorthand for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 :included (memq symbol menubar-configuration)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 See the variable `menubar-configuration'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
606 :filter <function> A menu filter can only be used at the beginning of a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
607 submenu description (i.e. not in a menu item itself).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
608 (Remember that most of the keywords can take evaluated
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
609 expressions as well as constants.) The filter is used to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
610 incrementally create a submenu only when it is selected
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
611 by the user and not every time the menubar is activated.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
612 The filter function is passed the list of menu items in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613 the submenu and must return the modified list to be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
614 actually used. The filter MUST NOT destructively modify
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
615 the list of menu items passed to it. It is called only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
616 when the menu is about to be displayed, so other menus
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
617 may already be displayed. Vile and terrible things will
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
618 happen if a menu filter function changes the current
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
619 buffer, window, or frame. It also should not raise,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
620 lower, or iconify any frames. Basically, the filter
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
621 function should have no side-effects.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 :key-sequence keys Used in FSF Emacs as an hint to an equivalent keybinding.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
624 Ignored by XEmacs for easymenu.el compatibility.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
625 (XEmacs computes this information automatically.)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
629 ("%_File"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 :filter file-menu-filter ; file-menu-filter is a function that takes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 ; one argument (a list of menu items) and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 ; returns a list of menu items
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
633 [ "Save %_As..." write-file t ]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
634 [ "%_Revert Buffer" revert-buffer (buffer-modified-p) ]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
635 [ "R%_ead Only" toggle-read-only :style toggle
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 :selected buffer-read-only ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
639 See menubar-items.el for many more examples.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 After the menubar is clicked upon, but before any menus are popped up,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 the functions on the `activate-menubar-hook' are invoked to make top-level
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 changes to the menus and menubar. Note, however, that the use of menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 filters (using the :filter keyword) is usually a more efficient way to
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
645 dynamically alter or sensitize menus. */, menubar_variable_changed);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 Vcurrent_menubar = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 DEFVAR_LISP ("activate-menubar-hook", &Vactivate_menubar_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 Function or functions called before a menubar menu is pulled down.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 These functions are called with no arguments, and should interrogate and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 modify the value of `current-menubar' as desired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 The functions on this hook are invoked after the mouse goes down, but before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 the menu is mapped, and may be used to activate, deactivate, add, or delete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 items from the menus. However, it is probably the case that using a :filter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 keyword in a submenu would be a more efficient way of updating menus. See
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 the documentation of `current-menubar'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 These functions may return the symbol `t' to assert that they have made
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 no changes to the menubar. If any other value is returned, the menubar is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 recomputed. If `t' is returned but the menubar has been changed, then the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 changes may not show up right away. Returning `nil' when the menubar has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 not changed is not so bad; more computation will be done, but redisplay of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 the menubar will still be performed optimally.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 Vactivate_menubar_hook = Qnil;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
668 DEFSYMBOL (Qactivate_menubar_hook);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 DEFVAR_BOOL ("menubar-show-keybindings", &menubar_show_keybindings /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 If true, the menubar will display keyboard equivalents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 If false, only the command names will be displayed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 menubar_show_keybindings = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 DEFVAR_LISP_MAGIC ("menubar-configuration", &Vmenubar_configuration /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 A list of symbols, against which the value of the :config tag for each
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 menubar item will be compared. If a menubar item has a :config tag, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 it is omitted from the menubar if that tag is not a member of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 `menubar-configuration' list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 */ , menubar_variable_changed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 Vmenubar_configuration = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 DEFVAR_LISP ("menubar-pointer-glyph", &Vmenubar_pointer_glyph /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 *The shape of the mouse-pointer when over the menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 This is a glyph; use `set-glyph-image' to change it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 If unspecified in a particular domain, the window-system-provided
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 default pointer is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
691 DEFVAR_LISP ("menu-accelerator-prefix", &Vmenu_accelerator_prefix /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 Prefix key(s) that must be typed before menu accelerators will be activated.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
693 Set this to a value acceptable by define-key.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
694
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
695 NOTE: This currently only has any effect under X Windows.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
696 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
697 Vmenu_accelerator_prefix = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
698
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
699 DEFVAR_LISP ("menu-accelerator-modifiers", &Vmenu_accelerator_modifiers /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
700 Modifier keys which must be pressed to get to the top level menu accelerators.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
701 This is a list of modifier key symbols. All modifier keys must be held down
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
702 while a valid menu accelerator key is pressed in order for the top level
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
703 menu to become active.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
704
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
705 NOTE: This currently only has any effect under X Windows.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
706
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
707 See also menu-accelerator-enabled and menu-accelerator-prefix.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
709 Vmenu_accelerator_modifiers = list1 (Qmeta);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
710
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
711 DEFVAR_LISP ("menu-accelerator-enabled", &Vmenu_accelerator_enabled /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
712 Whether menu accelerator keys can cause the menubar to become active.
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2545
diff changeset
713 If `menu-force' or `menu-fallback', then menu accelerator keys can
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
714 be used to activate the top level menu. Once the menubar becomes active, the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
715 accelerator keys can be used regardless of the value of this variable.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
716
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717 menu-force is used to indicate that the menu accelerator key takes
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 precedence over bindings in the current keymap(s). menu-fallback means
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
719 that bindings in the current keymap take precedence over menu accelerator keys.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720 Thus a top level menu with an accelerator of "T" would be activated on a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721 keypress of Meta-t if menu-accelerator-enabled is menu-force.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722 However, if menu-accelerator-enabled is menu-fallback, then
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
723 Meta-t will not activate the menubar and will instead run the function
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
724 transpose-words, to which it is normally bound.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
725
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
726 See also menu-accelerator-modifiers and menu-accelerator-prefix.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
727 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
728 Vmenu_accelerator_enabled = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
729
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730 DEFVAR_LISP ("menu-accelerator-map", &Vmenu_accelerator_map /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
731 Keymap for use when the menubar is active.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
732 The actions menu-quit, menu-up, menu-down, menu-left, menu-right,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
733 menu-select and menu-escape can be mapped to keys in this map.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
734 NOTE: This currently only has any effect under X Windows.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
735
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
736 menu-quit Immediately deactivate the menubar and any open submenus without
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
737 selecting an item.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
738 menu-up Move the menu cursor up one row in the current menu. If the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
739 move extends past the top of the menu, wrap around to the bottom.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
740 menu-down Move the menu cursor down one row in the current menu. If the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
741 move extends past the bottom of the menu, wrap around to the top.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
742 If executed while the cursor is in the top level menu, move down
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
743 into the selected menu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
744 menu-left Move the cursor from a submenu into the parent menu. If executed
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
745 while the cursor is in the top level menu, move the cursor to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
746 left. If the move extends past the left edge of the menu, wrap
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
747 around to the right edge.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
748 menu-right Move the cursor into a submenu. If the cursor is located in the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
749 top level menu or is not currently on a submenu heading, then move
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
750 the cursor to the next top level menu entry. If the move extends
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
751 past the right edge of the menu, wrap around to the left edge.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
752 menu-select Activate the item under the cursor. If the cursor is located on
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
753 a submenu heading, then move the cursor into the submenu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
754 menu-escape Pop up to the next level of menus. Moves from a submenu into its
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
755 parent menu. From the top level menu, this deactivates the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
756 menubar.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
757
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
758 This keymap can also contain normal key-command bindings, in which case the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
759 menubar is deactivated and the corresponding command is executed.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
760
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
761 The action bindings used by the menu accelerator code are designed to mimic
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
762 the actions of menu traversal keys in a commonly used PC operating system.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
763 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
764
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 Fprovide (intern ("menubar"));
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 450
diff changeset
766 Fprovide (intern ("menu-accelerator-support"));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 specifier_vars_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 DEFVAR_SPECIFIER ("menubar-visible-p", &Vmenubar_visible_p /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 *Whether the menubar is visible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 This is a specifier; use `set-specifier' to change it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 Vmenubar_visible_p = Fmake_specifier (Qboolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 set_specifier_fallback (Vmenubar_visible_p, list1 (Fcons (Qnil, Qt)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 set_specifier_caching (Vmenubar_visible_p,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
780 offsetof (struct window, menubar_visible_p),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 menubar_visible_p_changed,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
782 offsetof (struct frame, menubar_visible_p),
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
783 menubar_visible_p_changed_in_frame, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 complex_vars_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 Vmenubar_pointer_glyph = Fmake_glyph_internal (Qpointer);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
790
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
791 Vmenu_accelerator_map = Fmake_keymap (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 }