X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/9b75c1e26efe96f0ed327ee06b0e046a9e5724ed..ed20a012b845a6e6dc7b0c037e5cf0b8e54ab4d1:/src/keyboard.h diff --git a/src/keyboard.h b/src/keyboard.h index 6fe7636306..27fc0e5eb6 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -1,13 +1,13 @@ /* Declarations useful when processing input. Copyright (C) 1985, 1986, 1987, 1993, 2001, 2002, 2003, 2004, - 2005, 2006, 2007 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009, 2010 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,16 +15,16 @@ 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. */ -/* Each KBOARD represents one logical input stream from which Emacs gets input. - If we are using an ordinary terminal, it has one KBOARD object. +/* Each KBOARD represents one logical input stream from which Emacs + gets input. If we are using ordinary terminals, it has one KBOARD + object for each terminal device. Usually each X display screen has its own KBOARD, but when two of them are on the same X server, we assume they share a keyboard and give them one KBOARD in common. @@ -79,10 +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; @@ -123,6 +128,18 @@ struct kboard /* Cache for modify_event_symbol. */ Lisp_Object system_key_syms; + /* 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 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; @@ -154,8 +171,7 @@ struct kboard char echo_after_prompt; }; -#ifdef MULTI_KBOARD -/* Temporarily used before a frame has been opened, and for termcap frames */ +/* Temporarily used before a frame has been opened. */ extern KBOARD *initial_kboard; /* In the single-kboard state, this is the kboard @@ -171,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; @@ -190,10 +197,6 @@ extern EMACS_INT num_nonmacro_input_events; /* Nonzero means polling for input is temporarily suppressed. */ extern int poll_suppress_count; -/* Keymap mapping ASCII function key sequences onto their preferred forms. - Initialized by the terminal-specific lisp files. */ -extern Lisp_Object Vfunction_key_map; - /* Vector holding the key sequence that invoked the current command. It is reused for each command, and it may be longer than the current sequence; this_command_key_count indicates how many elements @@ -208,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 @@ -237,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. @@ -301,18 +434,25 @@ 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 *)); -/* User-supplied string to translate input characters through. */ -extern Lisp_Object Vkeyboard_translate_table; +extern int parse_solitary_modifier (Lisp_Object symbol); -extern int parse_menu_item P_ ((Lisp_Object, int, int)); + +/* Parent keymap of terminal-local function-key-map instances. */ +extern Lisp_Object Vfunction_key_map; + +/* Keymap of key translations that can override keymaps. */ +extern Lisp_Object Vkey_translation_map; + +extern int parse_menu_item (Lisp_Object, int); extern void echo_now P_ ((void)); extern void init_kboard P_ ((KBOARD *)); extern void delete_kboard P_ ((KBOARD *)); -extern void single_kboard_state P_ ((void)); extern void not_single_kboard_state P_ ((KBOARD *)); +extern void push_kboard P_ ((struct kboard *)); extern void push_frame_kboard P_ ((struct frame *)); -extern void pop_frame_kboard P_ ((void)); +extern void pop_kboard P_ ((void)); +extern void temporarily_switch_to_single_kboard P_ ((struct frame *)); extern void record_asynch_buffer_change P_ ((void)); extern SIGTYPE input_poll_signal P_ ((int)); extern void start_polling P_ ((void)); @@ -344,7 +484,11 @@ 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 void add_user_signal P_ ((int, const char *)); + +extern int tty_read_avail_input P_ ((struct terminal *, int, + struct input_event *)); +extern EMACS_TIME timer_check P_ ((int)); /* arch-tag: 769cbade-1ba9-4950-b886-db265b061aa3 (do not change this comment) */