X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/82de1de962caf50feac95fbf2c358ecef09bda99..d95ebe75a0471e700cfddecb68329f9970c128c4:/src/keyboard.c diff --git a/src/keyboard.c b/src/keyboard.c index 57646f1b0c..1aca012776 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -1,7 +1,7 @@ /* Keyboard and mouse input; editor command loop. Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, - 2005 Free Software Foundation, Inc. + 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -381,12 +381,15 @@ Lisp_Object real_this_command; command is stored in this-original-command. It is nil otherwise. */ Lisp_Object Vthis_original_command; -/* The value of point when the last command was executed. */ +/* The value of point when the last command was started. */ int last_point_position; /* The buffer that was current when the last command was started. */ Lisp_Object last_point_position_buffer; +/* The window that was selected when the last command was started. */ +Lisp_Object last_point_position_window; + /* The frame in which the last input event occurred, or Qmacro if the last event came from a macro. We use this to determine when to generate switch-frame events. This may be cleared by functions @@ -646,6 +649,11 @@ static EMACS_TIME timer_idleness_start_time; static EMACS_TIME timer_last_idleness_start_time; +/* If non-nil, events produced by disabled menu items and tool-bar + buttons are not ignored. Help functions bind this to allow help on + those items and buttons. */ +Lisp_Object Venable_disabled_menus_and_buttons; + /* Global variable declarations. */ @@ -787,6 +795,8 @@ echo_char (c) else echo_string = concat2 (echo_string, build_string (" ")); } + else if (STRINGP (echo_string)) + echo_string = concat2 (echo_string, build_string (" ")); current_kboard->echo_string = concat2 (echo_string, make_string (buffer, ptr - buffer)); @@ -817,16 +827,16 @@ echo_dash () /* Do nothing if we have already put a dash at the end. */ if (SCHARS (current_kboard->echo_string) > 1) { - Lisp_Object last_char, prev_char, idx; + Lisp_Object last_char, prev_char, idx; - idx = make_number (SCHARS (current_kboard->echo_string) - 2); - prev_char = Faref (current_kboard->echo_string, idx); + idx = make_number (SCHARS (current_kboard->echo_string) - 2); + prev_char = Faref (current_kboard->echo_string, idx); - idx = make_number (SCHARS (current_kboard->echo_string) - 1); - last_char = Faref (current_kboard->echo_string, idx); + idx = make_number (SCHARS (current_kboard->echo_string) - 1); + last_char = Faref (current_kboard->echo_string, idx); - if (XINT (last_char) == '-' && XINT (prev_char) != ' ') - return; + if (XINT (last_char) == '-' && XINT (prev_char) != ' ') + return; } /* Put a dash at the end of the buffer temporarily, @@ -1408,7 +1418,7 @@ command_loop_1 () Lisp_Object keybuf[30]; int i; int no_direct; - int prev_modiff; + int prev_modiff = 0; struct buffer *prev_buffer = NULL; #ifdef MULTI_KBOARD int was_locked = single_kboard; @@ -1581,6 +1591,7 @@ command_loop_1 () prev_buffer = current_buffer; prev_modiff = MODIFF; last_point_position = PT; + last_point_position_window = selected_window; XSETBUFFER (last_point_position_buffer, prev_buffer); /* By default, we adjust point to a boundary of a region that @@ -7265,7 +7276,9 @@ parse_menu_item (item, notreal, inmenubar) if (SYMBOLP (item)) { tem = Fget (item, Qmenu_enable); - if (!NILP (tem)) + if (!NILP (Venable_disabled_menus_and_buttons)) + AREF (item_properties, ITEM_PROPERTY_ENABLE) = Qt; + else if (!NILP (tem)) AREF (item_properties, ITEM_PROPERTY_ENABLE) = tem; } } @@ -7294,7 +7307,12 @@ parse_menu_item (item, notreal, inmenubar) item = XCDR (item); if (EQ (tem, QCenable)) - AREF (item_properties, ITEM_PROPERTY_ENABLE) = XCAR (item); + { + if (!NILP (Venable_disabled_menus_and_buttons)) + AREF (item_properties, ITEM_PROPERTY_ENABLE) = Qt; + else + AREF (item_properties, ITEM_PROPERTY_ENABLE) = XCAR (item); + } else if (EQ (tem, QCvisible) && !notreal) { /* If got a visible property and that evaluates to nil @@ -7563,7 +7581,7 @@ Lisp_Object QCimage; /* Function prototypes. */ static void init_tool_bar_items P_ ((Lisp_Object)); -static void process_tool_bar_item P_ ((Lisp_Object, Lisp_Object)); +static void process_tool_bar_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, void*)); static int parse_tool_bar_item P_ ((Lisp_Object, Lisp_Object)); static void append_tool_bar_item P_ ((void)); @@ -7641,17 +7659,7 @@ tool_bar_items (reuse, nitems) keymap = get_keymap (access_keymap (maps[i], Qtool_bar, 1, 0, 1), 0, 1); if (CONSP (keymap)) - { - Lisp_Object tail; - - /* KEYMAP is a list `(keymap (KEY . BINDING) ...)'. */ - for (tail = keymap; CONSP (tail); tail = XCDR (tail)) - { - Lisp_Object keydef = XCAR (tail); - if (CONSP (keydef)) - process_tool_bar_item (XCAR (keydef), XCDR (keydef)); - } - } + map_keymap (keymap, process_tool_bar_item, Qnil, NULL, 1); } Vinhibit_quit = oquit; @@ -7663,8 +7671,9 @@ tool_bar_items (reuse, nitems) /* Process the definition of KEY which is DEF. */ static void -process_tool_bar_item (key, def) - Lisp_Object key, def; +process_tool_bar_item (key, def, data, args) + Lisp_Object key, def, data; + void *args; { int i; extern Lisp_Object Qundefined; @@ -7814,8 +7823,13 @@ parse_tool_bar_item (key, item) value = XCAR (XCDR (item)); if (EQ (key, QCenable)) - /* `:enable FORM'. */ - PROP (TOOL_BAR_ITEM_ENABLED_P) = value; + { + /* `:enable FORM'. */ + if (!NILP (Venable_disabled_menus_and_buttons)) + PROP (TOOL_BAR_ITEM_ENABLED_P) = Qt; + else + PROP (TOOL_BAR_ITEM_ENABLED_P) = value; + } else if (EQ (key, QCvisible)) { /* `:visible FORM'. If got a visible property and that @@ -9465,6 +9479,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last, /* Don't downcase the last character if the caller says don't. Don't downcase it if the result is undefined, either. */ if ((dont_downcase_last || first_binding >= nmaps) + && t > 0 && t - 1 == original_uppercase_position) keybuf[t - 1] = original_uppercase; @@ -9694,7 +9709,7 @@ a special event, so ignore the prefix argument and don't clear it. */) while (1) { - final = Findirect_function (cmd); + final = Findirect_function (cmd, Qnil); if (CONSP (final) && (tem = Fcar (final), EQ (tem, Qautoload))) { @@ -10985,6 +11000,7 @@ syms_of_keyboard () Fset (Qinput_method_use_echo_area, Qnil); last_point_position_buffer = Qnil; + last_point_position_window = Qnil; { struct event_head *p; @@ -11464,6 +11480,14 @@ If the value is not a number, such messages don't time out. */); The value of that variable is passed to `quit-flag' and later causes a peculiar kind of quitting. */); Vthrow_on_input = Qnil; + + DEFVAR_LISP ("enable-disabled-menus-and-buttons", + &Venable_disabled_menus_and_buttons, + doc: /* If non-nil, don't ignore events produced by disabled menu items and tool-bar. + +Help functions bind this to allow help on disabled menu items +and tool-bar buttons. */); + Venable_disabled_menus_and_buttons = Qnil; } void