X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/e31331e5cb40d3e56e4160229b33f2dad9d5e4ab..5bdd4dd25d95a4d1b55b15ce126734c90e5e5cfd:/src/keyboard.h diff --git a/src/keyboard.h b/src/keyboard.h index 19a38ed744..efc0546192 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -1,13 +1,13 @@ /* Declarations useful when processing input. - Copyright (C) 1985, 1986, 1987, 1993, 2002, 2003, 2004, - 2005 Free Software Foundation, Inc. + Copyright (C) 1985, 1986, 1987, 1993, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,9 +15,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +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. */ @@ -78,13 +79,15 @@ struct kboard commands that set the prefix argument. */ Lisp_Object Vlast_command; - /* Normally same as last-command, but never modified by - other commands. */ + /* Normally same as last-command, but never modified by other commands. */ Lisp_Object Vreal_last_command; /* User-supplied table to translate input characters through. */ Lisp_Object Vkeyboard_translate_table; + /* Last command that may be repeated by `repeat'. */ + Lisp_Object Vlast_repeatable_command; + /* The prefix argument for the next command, in raw form. */ Lisp_Object Vprefix_arg; @@ -125,14 +128,18 @@ struct kboard /* Cache for modify_event_symbol. */ Lisp_Object system_key_syms; - /* Keymap mapping ASCII function key sequences onto their - preferred forms. Initialized by the terminal-specific lisp - files. See the DEFVAR for more documentation. */ + /* The kind of display: x, w32, ... */ + Lisp_Object Vwindow_system; + + /* Keymap mapping keys to alternative preferred forms. + See the DEFVAR for more documentation. */ Lisp_Object Vlocal_function_key_map; - /* Keymap of key translations that can override keymaps. */ - Lisp_Object Vlocal_key_translation_map; - + /* Keymap mapping ASCII function key sequences onto their preferred + forms. Initialized by the terminal-specific lisp files. See the + DEFVAR for more documentation. */ + Lisp_Object Vinput_decode_map; + /* Minibufferless frames on this display use this frame's minibuffer. */ Lisp_Object Vdefault_minibuffer_frame; @@ -164,7 +171,6 @@ struct kboard char echo_after_prompt; }; -#ifdef MULTI_KBOARD /* Temporarily used before a frame has been opened. */ extern KBOARD *initial_kboard; @@ -181,16 +187,7 @@ extern KBOARD *all_kboards; /* Nonzero in the single-kboard state, 0 in the any-kboard state. */ extern int single_kboard; -#else -extern KBOARD the_only_kboard; -#define current_kboard (&the_only_kboard) -#define all_kboards (&the_only_kboard) -#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; @@ -214,6 +211,11 @@ extern int this_command_key_count; 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 @@ -243,10 +245,135 @@ extern Lisp_Object item_properties; /* Last property. */ /* Not nil if item is enabled. */ #define ITEM_PROPERTY_ENABLE 8 + +/* 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. */ +#ifndef HAVE_NTGUI +#if defined (USE_GTK) || defined (HAVE_NS) +# 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 */ +#else /* HAVE_NTGUI */ +#define ENCODE_MENU_STRING(str) (str) +#endif + +#if defined (HAVE_NS) || defined (HAVE_NTGUI) + +typedef void * XtPointer; +typedef unsigned char Boolean; + +/* Definitions copied from lwlib.h */ + +enum button_type +{ + BUTTON_TYPE_NONE, + BUTTON_TYPE_TOGGLE, + BUTTON_TYPE_RADIO +}; + +/* This structure is based on the one in ../lwlib/lwlib.h, with unused portions + removed. No term uses these. */ +typedef struct _widget_value +{ + /* name of widget */ + Lisp_Object lname; + char* name; + /* value (meaning depend on widget type) */ + char* value; + /* keyboard equivalent. no implications for XtTranslations */ + Lisp_Object lkey; + char* key; + /* Help string or nil if none. + GC finds this string through the frame's menu_bar_vector + or through menu_items. */ + Lisp_Object help; + /* true if enabled */ + Boolean enabled; + /* true if selected */ + Boolean selected; + /* The type of a button. */ + enum button_type button_type; +#if defined (HAVE_NTGUI) + /* true if menu title */ + Boolean title; +#endif + /* Contents of the sub-widgets, also selected slot for checkbox */ + struct _widget_value* contents; + /* data passed to callback */ + XtPointer call_data; + /* next one in the list */ + struct _widget_value* next; +} widget_value; + +extern widget_value *xmalloc_widget_value P_ ((void)); +extern widget_value *digest_single_submenu P_ ((int, int, int)); +#endif /* HAVE_NS || HAVE_NTGUI */ + /* Macros for dealing with lispy events. */ -/* True iff EVENT has data fields describing it (i.e. a mouse click). */ +/* True if EVENT has data fields describing it (i.e. a mouse click). */ #define EVENT_HAS_PARAMETERS(event) (CONSP (event)) /* Extract the head from an event. @@ -305,11 +432,15 @@ struct input_event; extern Lisp_Object parse_modifiers P_ ((Lisp_Object)); extern Lisp_Object reorder_modifiers P_ ((Lisp_Object)); +extern Lisp_Object read_char P_ ((int, int, Lisp_Object *, Lisp_Object, + int *, EMACS_TIME *)); +extern int parse_solitary_modifier (Lisp_Object symbol); + /* Parent keymap of terminal-local function-key-map instances. */ extern Lisp_Object Vfunction_key_map; -/* Parent keymap of terminal-local key-translation-map instances. */ +/* Keymap of key translations that can override keymaps. */ extern Lisp_Object Vkey_translation_map; extern int parse_menu_item P_ ((Lisp_Object, int, int)); @@ -353,6 +484,7 @@ extern void gen_help_event P_ ((Lisp_Object, Lisp_Object, Lisp_Object, extern void kbd_buffer_store_help_event P_ ((Lisp_Object, Lisp_Object)); extern Lisp_Object menu_item_eval_property P_ ((Lisp_Object)); extern int kbd_buffer_events_waiting P_ ((int)); +extern void add_user_signals P_ ((int, const char *)); extern int tty_read_avail_input P_ ((struct terminal *, int, struct input_event *));