annotate src/menubar.c @ 872:79c6ff3eef26

[xemacs-hg @ 2002-06-20 21:18:01 by ben] font changes etc.; some 21.4 changes mule/mule-msw-init-late.el: Specify charset->windows-registry conversion. mule/mule-x-init.el: Delete extra mule font additions here. Put them in faces.c. cl-macs.el: Document better. font-lock.el: Move Lisp function regexp to lisp-mode.el. lisp-mode.el: Various indentation fixes: Handle flet functions better. Handle argument lists in defuns and flets. Handle quoted lists, e.g. property lists -- don't indent like function calls. Distinguish between lambdas and other lists. lisp-mode.el: Handle this form. faces.el, font-menu.el, font.el, gtk-faces.el, msw-faces.el, msw-font-menu.el, x-faces.el, x-init.el: Major overhaul of face-handling code: -- Fix lots of bogus code in msw-faces.el, msw-font-menu.el, font-menu.el that was "truenaming" font specs -- i.e. in the process of frobbing a particular field in a general user-specified font spec with wildcarded fields, sticking in particular values for all the remaining wildcarded fields. This bug was rampant everywhere except in x-faces.el (the oldest and only correctly written code). This also means that we need to work with font names at all times and not font instances, because a font instance is essentially a truenamed font. -- Total rewrite of extremely junky code in msw-faces.el. Work with names as well as font instances, and return names; stop truenaming when canonicalizing and frobbing; fix handling of the combined style field, i.e. weight/slant (also fixed in font.el). -- Totally rewrite the frobbing functions in faces.el. This time, we frob all the instantiators rather than just computing a single instance value and working backwards. That way, e.g., `bold' will work for all charsets that have bold available, rather than only for whatever charset was part of the computed font instance (another example of the truename virus). Also fix up code to look at the fallbacks (all of them) when no global value present, so we don't need to put something in the global value. Intelligently handle a request to frob a buffer locale, rather than signalling an error. When frobbing instantiators, try hard to figure out what device type is associated with them, and frob each according to its own proper device type. Correctly handle inheritance vectors given as instantiators. Preserve existing tags when putting back frobbed instantiators. Extract out general specifier-frobbing code into specifier.el. Document everything cleanly. Do lots of other things better, etc. -- Don't duplicatively set a global specification for the default font -- it's already in the fallback and we no longer need a default global specification present. Delete various code in x-faces.el and msw-faces.el that duplicated the lists of fonts in faces.c. -- init-global-faces was not being called at all under MS Windows! Major bogosity. That caused device-specific values to get stuck into all the fonts, making it very hard to change them -- setting global specs caused nothing to happen. -- Correct weight names in font.el. -- Lots more font fixups in objects*.c. Printer.el: Warning fix. specifier.el: Add more args to map-specifier. Add various "heuristic" specifier functions to aid in creation of specifier-munging code such as in faces.el. subr.el: New functions. lwlib.c: Fix warning. config.inc.samp: Clean up, add args to control fastcall (not yet supported! the changes needed are in another ws of mine), profile support, vc6 support, union-type. xemacs.dsp, xemacs.mak: Semi-major overhaul. Fix bug where dump-id was always getting recomputed, forcing a redump even when nothing changed. Add support for fastcall. Support edit-and-continue (on by default) with vc6. Use incremental linking when doing a debug compilation. Add support for profiling. Consolidate the various debug flags. Partial support for "batch-compiling" -- compiling many files on a single invocation of the compiler. Doesn't seem to help that much for me, so it's not finished or enabled by default. Remove HAVE_MSW_C_DIRED, we always do. Correct some sloppy use of directories. s/cygwin32.h: Allow pdump to work under Cygwin (mmap is broken, so need to undefine HAVE_MMAP). s/win32-common.h, s/windowsnt.h: Support for fastcall. Add WIN32_ANY for identifying all Win32 variants (Cygwin, native, MinGW). Both of these are properly used in another ws. alloc.c, balloon-x.c, buffer.c, bytecode.c, callint.c, cm.c, cmdloop.c, cmds.c, console-gtk.c, console-gtk.h, console-msw.c, console-msw.h, console-stream.c, console-stream.h, console-tty.c, console-tty.h, console-x.c, console-x.h, console.c, console.h, device-gtk.c, device-msw.c, device-tty.c, device-x.c, device.c, device.h, devslots.h, dialog-gtk.c, dialog-msw.c, dialog-x.c, dialog.c, dired-msw.c, editfns.c, emacs.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.c, extents.c, extents.h, faces.c, fileio.c, fns.c, frame-gtk.c, frame-msw.c, frame-tty.c, frame-x.c, frame.c, frame.h, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, glyphs.c, glyphs.h, gui-gtk.c, gui-msw.c, gui-x.c, gui.c, gutter.c, input-method-xlib.c, intl-encap-win32.c, intl-win32.c, keymap.c, lisp.h, macros.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, menubar.h, minibuf.c, mule-charset.c, nt.c, objects-gtk.c, objects-gtk.h, objects-msw.c, objects-msw.h, objects-tty.c, objects-tty.h, objects-x.c, objects-x.h, objects.c, objects.h, postgresql.c, print.c, process.h, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-tty.c, redisplay-x.c, redisplay.c, redisplay.h, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, select-gtk.c, select-msw.c, select-x.c, select.c, signal.c, sound.c, specifier.c, symbols.c, syntax.c, sysdep.c, syssignal.h, syswindows.h, toolbar-common.c, toolbar-gtk.c, toolbar-msw.c, toolbar-x.c, toolbar.c, unicode.c, window.c, window.h: The following are the major changes made: (1) Separation of various header files into an external and an internal version, similar to the existing separation of process.h and procimpl.h. Eventually this should be done for all Lisp objects. The external version has the same name as currently; the internal adds -impl. The external file has XFOO() macros for objects, but the structure is opaque and defined only in the internal file. It's now reasonable to move all prototypes in lisp.h into the appropriate external file, and this should be done. Currently, separation has been done on extents.h, objects*.h, console.h, device.h, frame.h, and window.h. For c/d/f/w, the most basic properties are available in the external header file, with the macros resolving to functions. In the internal header file, the macros are redefined to directly access the structure. Also, the global MARK_FOO_CHANGED macros have been made into functions so that they can be accessed without needing to include lots of -impl headers -- they are used in almost exclusively in non-time-critical functions, and take up enough time that the function overhead will be negligible. Similarly, the function overhead from making the basic properties mentioned above into functions is negligible, and code that does heavy accessing of c/d/f/w structures inevitably ends up needing the internal header files, anyway. (2) More face changes. -- Major rewrite of objects-msw.c. Now handles wildcard specs properly, rather than "truenaming" (or even worse, signalling an error, which previously happened with some of the fallbacks if you tried to use them in make-font-instance!). -- Split charset matching of fonts into two stages -- one to find a font specifically designed for a particular charset (by examining its registry), the second to find a Unicode font that can support the charset. This needs to proceed as two complete, separate instantiations in order to work properly (otherwise many of the fonts in the HELLO page look wrong). This should also make it easy to support iso10646 (Unicode) fonts under X. -- All default values for fonts are now completely specified in the fallbacks. Stuff from mule-x-init.el has all been moved here, merged with the existing specs, and totally rethought so you get sensible results. (HELLO now looks much better!). -- Generalize the "default X/GTK device" stuff into a per-device-type "default device". -- Add mswindows-{set-}charset-registry. In time, charset<->code-page conversion functions will be removed. -- Wrap protective code around calls to compute device specifier tags, and do this computation before calling the face initialization code because the latter may need these tags to be correctly updated. (3) Other changes. EmacsFrame.c, glyphs-msw.c, eval.c, gui-x.c, intl-encap-win32.c, search.c, signal.c, toolbar-msw.c, unicode.c: Warning fixes. config.h.in: #undefs meant to be frobbed by configure *MUST* go inside of #ifndef WIN32_NO_CONFIGURE, and everything else *MUST* go outside! eval.c: Let detailed backtraces be detailed. specifier.c: Don't override user's print-string-length/print-length settings. glyphs.c: New function image-instance-instantiator. config.h.in, sysdep.c: Changes for fastcall. sysdep.c, nt.c: Fix up a previous botched patch that tried to add support for both EEXIST and EACCES. IF THE BOTCHED PATCH WENT INTO 21.4, THIS FIXUP NEEDS TO GO IN, TOO. search.c: Fix *evil* crash due to incorrect synching of syntax-cache code with 21.1. THIS SHOULD GO INTO 21.4.
author ben
date Thu, 20 Jun 2002 21:19:10 +0000
parents 804517e16990
children cd0abfdb9e9d
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.
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
4 Copyright (C) 2001, 2002 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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
25 /* Authorship:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
26
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
27 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
28 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
29 Menu accelerators c. 1997? by ??. Moved here from event-stream.c.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
30 Much other work post-1996 by ??.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
31 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "buffer.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
37 #include "device-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
38 #include "frame-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "gui.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
40 #include "keymap.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "menubar.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include "redisplay.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 793
diff changeset
43 #include "specifier.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
44 #include "window-impl.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 int menubar_show_keybindings;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 Lisp_Object Vmenubar_configuration;
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 Qcurrent_menubar;
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 Qactivate_menubar_hook, Vactivate_menubar_hook;
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 Lisp_Object Vmenubar_visible_p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 static Lisp_Object Vcurrent_menubar; /* DO NOT ever reference this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Always go through Qcurrent_menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 See below. */
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 Lisp_Object Vblank_menubar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 int popup_menu_titles;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 Lisp_Object Vmenubar_pointer_glyph;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
65 /* prefix key(s) that must match in order to activate menu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
66 This is ugly. fix me.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
67 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
68 Lisp_Object Vmenu_accelerator_prefix;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
69
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
70 /* list of modifier keys to match accelerator for top level menus */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
71 Lisp_Object Vmenu_accelerator_modifiers;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
72
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
73 /* whether menu accelerators are enabled */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
74 Lisp_Object Vmenu_accelerator_enabled;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
75
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
76 /* keymap for auxiliary menu accelerator functions */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
77 Lisp_Object Vmenu_accelerator_map;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
78
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
79 Lisp_Object Qmenu_force;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
80 Lisp_Object Qmenu_fallback;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
81 Lisp_Object Qmenu_quit;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
82 Lisp_Object Qmenu_up;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
83 Lisp_Object Qmenu_down;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
84 Lisp_Object Qmenu_left;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
85 Lisp_Object Qmenu_right;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
86 Lisp_Object Qmenu_select;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
87 Lisp_Object Qmenu_escape;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
88
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 menubar_variable_changed (Lisp_Object sym, Lisp_Object *val,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 Lisp_Object in_object, int flags)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 MARK_MENUBAR_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 return 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 update_frame_menubars (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 if (f->menubar_changed || f->windows_changed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 MAYBE_FRAMEMETH (f, update_frame_menubars, (f));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 f->menubar_changed = 0;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 free_frame_menubars (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 /* If we had directly allocated any memory for the menubars instead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 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
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 MAYBE_FRAMEMETH (f, free_frame_menubars, (f));
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 menubar_visible_p_changed (Lisp_Object specifier, struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 Lisp_Object oldval)
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 menubar_visible_p_changed_in_frame (Lisp_Object specifier, struct frame *f,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 Lisp_Object oldval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 update_frame_menubars (f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 }
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 Lisp_Object
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
130 current_frame_menubar (const struct frame* f)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 struct window *w = XWINDOW (FRAME_LAST_NONMINIBUF_WINDOW (f));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 return symbol_value_in_buffer (Qcurrent_menubar, w->buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 }
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 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 menu_parse_submenu_keywords (Lisp_Object desc, Lisp_Object gui_item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
139 Lisp_Gui_Item *pgui_item = XGUI_ITEM (gui_item);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 /* Menu descriptor should be a list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 /* First element may be menu name, although can be omitted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 Let's think that if stuff begins with anything than a keyword
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 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
147 if (!KEYWORDP (XCAR (desc)) && !CONSP (XCAR (desc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 CHECK_STRING (XCAR (desc));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 pgui_item->name = XCAR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 desc = XCDR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 if (!NILP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 }
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 /* Walk along all key-value pairs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 while (!NILP(desc) && KEYWORDP (XCAR (desc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 Lisp_Object key, val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 key = XCAR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 desc = XCDR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 val = XCAR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 desc = XCDR (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 if (!NILP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 CHECK_CONS (desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 gui_item_add_keyval_pair (gui_item, key, val, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 }
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 /* Return the rest - supposed to be a list of items */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 return desc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 }
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 DEFUN ("menu-find-real-submenu", Fmenu_find_real_submenu, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 Find a submenu descriptor within DESC by following PATH.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 This function finds a submenu descriptor, either from the description
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 DESC or generated by a filter within DESC. The function regards :config
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 and :included keywords in the DESC, and expands submenus along the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 PATH using :filter functions. Return value is a descriptor for the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 submenu, NOT expanded and NOT checked against :config and :included.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 Also, individual menu items are not looked for, only submenus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 See also 'find-menu-item'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (desc, path))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 Lisp_Object path_entry, submenu_desc, submenu;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 EXTERNAL_LIST_LOOP (path_entry, path)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 /* Verify that DESC describes a menu, not single item */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 if (!CONSP (desc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 RETURN_UNGCPRO (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 /* Parse this menu */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 desc = menu_parse_submenu_keywords (desc, gui_item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 /* Check that this (sub)menu is active */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 if (!gui_item_active_p (gui_item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 RETURN_UNGCPRO (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 /* Apply :filter */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 if (!NILP (pgui_item->filter))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 desc = call1 (pgui_item->filter, desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 /* Find the next menu on the path inside this one */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 EXTERNAL_LIST_LOOP (submenu_desc, desc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 submenu = XCAR (submenu_desc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 if (CONSP (submenu)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 && STRINGP (XCAR (submenu))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 && !NILP (Fstring_equal (XCAR (submenu), XCAR (path_entry))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 desc = submenu;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 goto descend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 /* Submenu not found */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 RETURN_UNGCPRO (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 descend:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 /* Prepare for the next iteration */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 gui_item_init (gui_item);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 /* We have successfully descended down the end of the path */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 return desc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 DEFUN ("popup-menu", Fpopup_menu, 1, 2, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
237 Pop up the menu described by MENU-DESCRIPTION.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 A menu description is a list of menu items, strings, and submenus.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 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
241 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
242 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
243 itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 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
246 the menu as unselectable text.
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 consisting solely of hyphens, then that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 item will be presented as a solid horizontal line.
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 list, it is treated as a submenu. The name of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 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
253 item representing this menu on the parent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 Otherwise, the element must be a vector, which describes a menu item.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 A menu item can have any of the following forms:
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 [ "name" callback <active-p> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 [ "name" callback <active-p> <suffix> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 [ "name" callback :<keyword> <value> :<keyword> <value> ... ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 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
263 resource database, so it is possible for resources to override what string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 is actually displayed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 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
267 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
268 evaluated with `eval'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 The possible keywords are this:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 :active <form> Same as <active-p> in the first two forms: the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 expression is evaluated just before the menu is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 displayed, and the menu will be selectable only if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 the result is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 :suffix <form> Same as <suffix> in the second form: the expression
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 is evaluated just before the menu is displayed and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 resulting string is appended to the displayed name,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 providing a convenient way of adding the name of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 command's ``argument'' to the menu, like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 ``Kill Buffer NAME''.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 :keys "string" Normally, the keyboard equivalents of commands in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 menus are displayed when the `callback' is a symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 This can be used to specify keys for more complex menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 items. It is passed through `substitute-command-keys'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 :style <style> Specifies what kind of object this menu item is:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 nil A normal menu item.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 toggle A toggle button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 radio A radio button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 The only difference between toggle and radio buttons is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 how they are displayed. But for consistency, a toggle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 button should be used when there is one option whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 value can be turned on or off, and radio buttons should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 be used when there is a set of mutually exclusive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 options. When using a group of radio buttons, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 should arrange for no more than one to be marked as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 selected at a time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 :selected <form> Meaningful only when STYLE is `toggle' or `radio'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 This specifies whether the button will be in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 selected or unselected state.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 [ "Save As..." write-file t ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 [ "Revert Buffer" revert-buffer (buffer-modified-p) ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 [ "Read Only" toggle-read-only :style toggle :selected buffer-read-only ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 See menubar.el for many more examples.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
317 (menu_description, event))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
319 struct frame *f = decode_frame (Qnil);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
320 MAYBE_FRAMEMETH (f, popup_menu, (menu_description, event));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 DEFUN ("normalize-menu-item-name", Fnormalize_menu_item_name, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 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
326 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
327 This removes %_'s (accelerator indications) and converts %% to %.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (name, buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 struct buffer *buf = decode_buffer (buffer, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 Charcount end;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 int i;
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
334 Ibyte *name_data;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
335 Ibyte *string_result;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
336 Ibyte *string_result_ptr;
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
337 Ichar elt;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 int expecting_underscore = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 CHECK_STRING (name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341
826
6728e641994e [xemacs-hg @ 2002-05-05 11:30:15 by ben]
ben
parents: 800
diff changeset
342 end = string_char_length (name);
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
343 name_data = XSTRING_DATA (name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
345 string_result = (Ibyte *) ALLOCA (end * MAX_ICHAR_LEN);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 string_result_ptr = string_result;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 for (i = 0; i < end; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
349 elt = itext_ichar (name_data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 elt = DOWNCASE (buf, elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 if (expecting_underscore)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 expecting_underscore = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 switch (elt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 case '%':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 /* Allow `%%' to mean `%'. */
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
358 string_result_ptr += set_itext_ichar (string_result_ptr, '%');
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 case '_':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 default:
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
363 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
364 string_result_ptr += set_itext_ichar (string_result_ptr, elt);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 else if (elt == '%')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 expecting_underscore = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 else
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 851
diff changeset
370 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
371 INC_IBYTEPTR (name_data);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
374 if (string_result_ptr - string_result == XSTRING_LENGTH (name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
375 && !memcmp (string_result, XSTRING_DATA (name), XSTRING_LENGTH (name)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
376 return name;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
377
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 return make_string (string_result, string_result_ptr - string_result);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 syms_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
384 DEFSYMBOL (Qcurrent_menubar);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
385
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
386 DEFSYMBOL (Qmenu_force);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
387 DEFSYMBOL (Qmenu_fallback);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
388
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
389 DEFSYMBOL (Qmenu_quit);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
390 DEFSYMBOL (Qmenu_up);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
391 DEFSYMBOL (Qmenu_down);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
392 DEFSYMBOL (Qmenu_left);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
393 DEFSYMBOL (Qmenu_right);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
394 DEFSYMBOL (Qmenu_select);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
395 DEFSYMBOL (Qmenu_escape);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
396
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 DEFSUBR (Fpopup_menu);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 DEFSUBR (Fnormalize_menu_item_name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 DEFSUBR (Fmenu_find_real_submenu);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 vars_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
405 /* put in Vblank_menubar a menubar value which has no visible
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
406 * items. This is a bit tricky due to various quirks. We
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
407 * could use '(["" nil nil]), but this is apparently equivalent
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
408 * to '(nil), and a new frame created with this menubar will
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
409 * get a vertically-squished menubar. If we use " " as the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
410 * button title instead of "", we get an etched button border.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
411 * So we use
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
412 * '(("No active menubar" ["" nil nil]))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
413 * which creates a menu whose title is "No active menubar",
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
414 * and this works fine.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
415 */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
417 Vblank_menubar = list1 (list2 (build_msg_string ("No active menubar"),
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
418 vector3 (build_string (""), Qnil, Qnil)));
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
419 staticpro (&Vblank_menubar);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 DEFVAR_BOOL ("popup-menu-titles", &popup_menu_titles /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 If true, popup menus will have title bars at the top.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 popup_menu_titles = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 /* #### Replace current menubar with a specifier. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 /* All C code must access the menubar via Qcurrent_menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 because it can be buffer-local. Note that Vcurrent_menubar
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 doesn't need to exist at all, except for the magic function. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 DEFVAR_LISP_MAGIC ("current-menubar", &Vcurrent_menubar /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 The current menubar. This may be buffer-local.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 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
436 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
437 and `set-buffer-menubar'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 A menubar is a list of menus and menu-items.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 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
441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 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
443 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
444 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
445 itself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
447 Menu accelerators can be indicated in the string by putting the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
448 sequence "%_" before the character corresponding to the key that will
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
449 invoke the menu or menu item. Uppercase and lowercase accelerators
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
450 are equivalent. The sequence "%%" is also special, and is translated
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
451 into a single %.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
452
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
453 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
454 the first character has been tagged as an accelerator.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
455
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
456 Immediately following the name string of the menu, various optional
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
457 keyword-value pairs are permitted: currently, :filter, :active, :included,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
458 and :config. (See below.)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 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
461 presented as unselectable text.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 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
464 item will be presented as a solid horizontal line.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
466 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
467 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
468 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
469 currently work only under X Windows (with Lucid and Motif menubars);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
470 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
471 all hyphens.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
472
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
473 The possibilities are:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
474
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
475 "--:singleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
476 "--:doubleLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
477 "--:singleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
478 "--:doubleDashedLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
479 "--:noLine"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
480 "--:shadowEtchedIn"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
481 "--:shadowEtchedOut"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
482 "--:shadowEtchedInDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
483 "--:shadowEtchedOutDash"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
484 "--:shadowDoubleEtchedIn" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
485 "--:shadowDoubleEtchedOut" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
486 "--:shadowDoubleEtchedInDash" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
487 "--:shadowDoubleEtchedOutDash" (Lucid menubars only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
488
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 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
490 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
491 item representing this menu on the parent.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 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
494 division between the set of menubar-items which are flushleft and those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 which are flushright.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 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
498 A menu item is of the following form:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
499
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
500 [ "name" callback :<keyword> <value> :<keyword> <value> ... ]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
501
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
502 The following forms are also accepted for compatibility, but deprecated:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 [ "name" callback <active-p> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 [ "name" callback <active-p> <suffix> ]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 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
508 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
509 is actually displayed. Menu accelerator indicators (the sequence `%_') are
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
510 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
511 evaluated with `eval', and the result should be a string.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 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
514 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
515 evaluated with `eval'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
517 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
518 keyword, and <suffix> is equivalent to using the :suffix keyword.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
520 The possible keywords are:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
521
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
522 :active <form> The expression is evaluated just before the menu is
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 displayed, and the menu will be selectable only if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 the result is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
526 :suffix <form> The expression is evaluated just before the menu is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
527 displayed and the resulting string is appended to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
528 the displayed name, providing a convenient way of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
529 adding the name of a command's ``argument'' to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
530 menu, like ``Kill Buffer NAME''.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 :keys "string" Normally, the keyboard equivalents of commands in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 menus are displayed when the `callback' is a symbol.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 This can be used to specify keys for more complex menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 items. It is passed through `substitute-command-keys'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 first.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 :style <style> Specifies what kind of object this menu item is:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 nil A normal menu item.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 toggle A toggle button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 radio A radio button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 button A menubar button.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 The only difference between toggle and radio buttons is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 how they are displayed. But for consistency, a toggle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 button should be used when there is one option whose
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 value can be turned on or off, and radio buttons should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 be used when there is a set of mutually exclusive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 options. When using a group of radio buttons, you
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 should arrange for no more than one to be marked as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 selected at a time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 :selected <form> Meaningful only when STYLE is `toggle', `radio' or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 `button'. This specifies whether the button will be in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 the selected or unselected state.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 :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
559 menu item. The form is evaluated and the menu or menu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 item is only displayed if the result is non-nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 :config <symbol> This is an efficient shorthand for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 :included (memq symbol menubar-configuration)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 See the variable `menubar-configuration'.
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 :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
567 submenu description (i.e. not in a menu item itself).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 (Remember that most of the keywords can take evaluated
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569 expressions as well as constants.) The filter is used to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 incrementally create a submenu only when it is selected
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
571 by the user and not every time the menubar is activated.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
572 The filter function is passed the list of menu items in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
573 the submenu and must return the modified list to be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
574 actually used. The filter MUST NOT destructively modify
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
575 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
576 when the menu is about to be displayed, so other menus
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
577 may already be displayed. Vile and terrible things will
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
578 happen if a menu filter function changes the current
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
579 buffer, window, or frame. It also should not raise,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
580 lower, or iconify any frames. Basically, the filter
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
581 function should have no side-effects.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 :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
584 Ignored by XEmacs for easymenu.el compatibility.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
585 (XEmacs computes this information automatically.)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 For example:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
589 ("%_File"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 :filter file-menu-filter ; file-menu-filter is a function that takes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 ; one argument (a list of menu items) and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 ; returns a list of menu items
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
593 [ "Save %_As..." write-file t ]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
594 [ "%_Revert Buffer" revert-buffer (buffer-modified-p) ]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
595 [ "R%_ead Only" toggle-read-only :style toggle
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 :selected buffer-read-only ]
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
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
599 See menubar-items.el for many more examples.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 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
602 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
603 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
604 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
605 dynamically alter or sensitize menus. */, menubar_variable_changed);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 Vcurrent_menubar = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 DEFVAR_LISP ("activate-menubar-hook", &Vactivate_menubar_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 Function or functions called before a menubar menu is pulled down.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 These functions are called with no arguments, and should interrogate and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 modify the value of `current-menubar' as desired.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 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
615 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
616 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
617 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
618 the documentation of `current-menubar'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 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
621 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
622 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
623 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
624 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
625 the menubar will still be performed optimally.
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 Vactivate_menubar_hook = Qnil;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
628 DEFSYMBOL (Qactivate_menubar_hook);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 DEFVAR_BOOL ("menubar-show-keybindings", &menubar_show_keybindings /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 If true, the menubar will display keyboard equivalents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 If false, only the command names will be displayed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 menubar_show_keybindings = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 DEFVAR_LISP_MAGIC ("menubar-configuration", &Vmenubar_configuration /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 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
638 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
639 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
640 `menubar-configuration' list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 */ , menubar_variable_changed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 Vmenubar_configuration = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 DEFVAR_LISP ("menubar-pointer-glyph", &Vmenubar_pointer_glyph /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 *The shape of the mouse-pointer when over the menubar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 This is a glyph; use `set-glyph-image' to change it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 If unspecified in a particular domain, the window-system-provided
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 default pointer is used.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
651 DEFVAR_LISP ("menu-accelerator-prefix", &Vmenu_accelerator_prefix /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
652 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
653 Set this to a value acceptable by define-key.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
654
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
655 NOTE: This currently only has any effect under X Windows.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
656 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
657 Vmenu_accelerator_prefix = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
658
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
659 DEFVAR_LISP ("menu-accelerator-modifiers", &Vmenu_accelerator_modifiers /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
660 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
661 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
662 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
663 menu to become active.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
664
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
665 NOTE: This currently only has any effect under X Windows.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
666
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
667 See also menu-accelerator-enabled and menu-accelerator-prefix.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
668 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 Vmenu_accelerator_modifiers = list1 (Qmeta);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
670
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
671 DEFVAR_LISP ("menu-accelerator-enabled", &Vmenu_accelerator_enabled /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
672 Whether menu accelerator keys can cause the menubar to become active.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
673 If 'menu-force or 'menu-fallback, then menu accelerator keys can
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
674 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
675 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
676
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
677 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
678 precedence over bindings in the current keymap(s). menu-fallback means
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
679 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
680 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
681 keypress of Meta-t if menu-accelerator-enabled is menu-force.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
682 However, if menu-accelerator-enabled is menu-fallback, then
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
683 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
684 transpose-words, to which it is normally bound.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
685
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
686 See also menu-accelerator-modifiers and menu-accelerator-prefix.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
687 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
688 Vmenu_accelerator_enabled = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
689
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
690 DEFVAR_LISP ("menu-accelerator-map", &Vmenu_accelerator_map /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
691 Keymap for use when the menubar is active.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 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
693 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
694 NOTE: This currently only has any effect under X Windows.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
695
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
696 menu-quit Immediately deactivate the menubar and any open submenus without
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
697 selecting an item.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
698 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
699 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
700 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
701 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
702 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
703 into the selected menu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
704 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
705 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
706 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
707 around to the right edge.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 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
709 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
710 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
711 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
712 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
713 a submenu heading, then move the cursor into the submenu.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
714 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
715 parent menu. From the top level menu, this deactivates the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
716 menubar.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 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
719 menubar is deactivated and the corresponding command is executed.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721 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
722 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
723 */ );
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
724
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 Fprovide (intern ("menubar"));
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 450
diff changeset
726 Fprovide (intern ("menu-accelerator-support"));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 specifier_vars_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 DEFVAR_SPECIFIER ("menubar-visible-p", &Vmenubar_visible_p /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 *Whether the menubar is visible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 This is a specifier; use `set-specifier' to change it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 Vmenubar_visible_p = Fmake_specifier (Qboolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 set_specifier_fallback (Vmenubar_visible_p, list1 (Fcons (Qnil, Qt)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 set_specifier_caching (Vmenubar_visible_p,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
740 offsetof (struct window, menubar_visible_p),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 menubar_visible_p_changed,
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
742 offsetof (struct frame, menubar_visible_p),
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
743 menubar_visible_p_changed_in_frame, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 complex_vars_of_menubar (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 Vmenubar_pointer_glyph = Fmake_glyph_internal (Qpointer);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
750
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
751 Vmenu_accelerator_map = Fmake_keymap (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 }