# HG changeset patch # User Chong Yidong # Date 1212899821 0 # Node ID 946366db5ee68cb40de1c6da93043ab8b7bee04a # Parent 0f6a0e86ee2459a945e4dfe9c0617dc2f8e5ec6b Relocate platform-independent menu definitions from xmenu.c. diff -r 0f6a0e86ee24 -r 946366db5ee6 src/keyboard.h --- a/src/keyboard.h Sun Jun 08 04:36:46 2008 +0000 +++ b/src/keyboard.h Sun Jun 08 04:37:01 2008 +0000 @@ -18,6 +18,7 @@ along with GNU Emacs. If not, see . */ #include "systime.h" /* for EMACS_TIME */ +#include "coding.h" /* for ENCODE_UTF_8 and ENCODE_SYSTEM */ /* Length of echobuf field in each KBOARD. */ @@ -194,9 +195,6 @@ #define single_kboard 1 #endif -extern Lisp_Object Vlucid_menu_bar_dirty_flag; -extern Lisp_Object Qrecompute_lucid_menubar, Qactivate_menubar_hook; - /* Total number of times read_char has returned. */ extern int num_input_events; @@ -220,6 +218,11 @@ generated by the next character. */ extern Lisp_Object internal_last_event_frame; +/* Menu items. */ + +extern Lisp_Object Vlucid_menu_bar_dirty_flag; +extern Lisp_Object Qrecompute_lucid_menubar, Qactivate_menubar_hook; + /* This holds a Lisp vector that holds the properties of a single menu item while decoding it in parse_menu_item. Using a Lisp vector to hold this information while we decode it @@ -249,6 +252,82 @@ /* Last property. */ /* Not nil if item is enabled. */ #define ITEM_PROPERTY_ENABLE 8 + +#ifdef HAVE_X_WINDOWS + +/* This holds a Lisp vector that holds the results of decoding + the keymaps or alist-of-alists that specify a menu. + + It describes the panes and items within the panes. + + Each pane is described by 3 elements in the vector: + t, the pane name, the pane's prefix key. + Then follow the pane's items, with 5 elements per item: + the item string, the enable flag, the item's value, + the definition, and the equivalent keyboard key's description string. + + In some cases, multiple levels of menus may be described. + A single vector slot containing nil indicates the start of a submenu. + A single vector slot containing lambda indicates the end of a submenu. + The submenu follows a menu item which is the way to reach the submenu. + + A single vector slot containing quote indicates that the + following items should appear on the right of a dialog box. + + Using a Lisp vector to hold this information while we decode it + takes care of protecting all the data from GC. */ +extern Lisp_Object menu_items; + +/* If non-nil, means that the global vars defined here are already in use. + Used to detect cases where we try to re-enter this non-reentrant code. */ +extern Lisp_Object menu_items_inuse; + +/* Number of slots currently allocated in menu_items. */ +extern int menu_items_allocated; + +/* This is the index in menu_items of the first empty slot. */ +extern int menu_items_used; + +/* The number of panes currently recorded in menu_items, + excluding those within submenus. */ +extern int menu_items_n_panes; + +#define MENU_ITEMS_PANE_NAME 1 +#define MENU_ITEMS_PANE_PREFIX 2 +#define MENU_ITEMS_PANE_LENGTH 3 + +enum menu_item_idx +{ + MENU_ITEMS_ITEM_NAME = 0, + MENU_ITEMS_ITEM_ENABLE, + MENU_ITEMS_ITEM_VALUE, + MENU_ITEMS_ITEM_EQUIV_KEY, + MENU_ITEMS_ITEM_DEFINITION, + MENU_ITEMS_ITEM_TYPE, + MENU_ITEMS_ITEM_SELECTED, + MENU_ITEMS_ITEM_HELP, + MENU_ITEMS_ITEM_LENGTH +}; + +extern Lisp_Object unuse_menu_items P_ ((Lisp_Object dummy)); + +/* This is how to deal with multibyte text if HAVE_MULTILINGUAL_MENU + isn't defined. The use of HAVE_MULTILINGUAL_MENU could probably be + confined to an extended version of this with sections of code below + using it unconditionally. */ +#ifdef HAVE_X_WINDOWS +#ifdef USE_GTK +/* gtk just uses utf-8. */ +# define ENCODE_MENU_STRING(str) ENCODE_UTF_8 (str) +#elif defined HAVE_X_I18N +#define ENCODE_MENU_STRING(str) ENCODE_SYSTEM (str) +#else +#define ENCODE_MENU_STRING(str) string_make_unibyte (str) +#endif /* USE_GTK */ +#elif defined (HAVE_NTGUI) +#define ENCODE_MENU_STRING(str) (str) +#endif +#endif /* HAVE_X_WINDOWS */ /* Macros for dealing with lispy events. */