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