aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/keyboard.c109
1 files changed, 81 insertions, 28 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index 93e8d26475f..96f8ec96830 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -2982,43 +2982,101 @@ static void
2982record_char (c) 2982record_char (c)
2983 Lisp_Object c; 2983 Lisp_Object c;
2984{ 2984{
2985 /* Don't record `help-echo' in recent_keys unless it shows some help 2985 int recorded = 0;
2986 message, and a different help than the previoiusly recorded 2986
2987 event. */ 2987 if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), Qmouse_movement)))
2988 if (CONSP (c) && EQ (XCAR (c), Qhelp_echo))
2989 { 2988 {
2990 Lisp_Object help; 2989 /* To avoid filling recent_keys with help-echo and mouse-movement
2990 events, we filter out repeated help-echo events, only store the
2991 first and last in a series of mouse-movement events, and don't
2992 store repeated help-echo events which are only separated by
2993 mouse-movement events. */
2991 2994
2992 help = Fcar (Fcdr (XCDR (c))); 2995 Lisp_Object ev1, ev2, ev3;
2993 if (STRINGP (help)) 2996 int ix1, ix2, ix3;
2997
2998 if ((ix1 = recent_keys_index - 1) < 0)
2999 ix1 = NUM_RECENT_KEYS - 1;
3000 ev1 = AREF (recent_keys, ix1);
3001
3002 if ((ix2 = ix1 - 1) < 0)
3003 ix2 = NUM_RECENT_KEYS - 1;
3004 ev2 = AREF (recent_keys, ix2);
3005
3006 if ((ix3 = ix2 - 1) < 0)
3007 ix3 = NUM_RECENT_KEYS - 1;
3008 ev3 = AREF (recent_keys, ix3);
3009
3010 if (EQ (XCAR (c), Qhelp_echo))
2994 { 3011 {
2995 int last_idx; 3012 /* Don't record `help-echo' in recent_keys unless it shows some help
2996 Lisp_Object last_c, last_help; 3013 message, and a different help than the previoiusly recorded
2997 3014 event. */
2998 last_idx = recent_keys_index - 1; 3015 Lisp_Object help, last_help;
2999 if (last_idx < 0) 3016
3000 last_idx = NUM_RECENT_KEYS - 1; 3017 help = Fcar_safe (Fcdr_safe (XCDR (c)));
3001 last_c = AREF (recent_keys, last_idx); 3018 if (!STRINGP (help))
3002 3019 recorded = 1;
3003 if (!CONSP (last_c) 3020 else if (CONSP (ev1) && EQ (XCAR (ev1), Qhelp_echo)
3004 || !EQ (XCAR (last_c), Qhelp_echo) 3021 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev1))), EQ (last_help, help)))
3005 || (last_help = Fcar (Fcdr (XCDR (last_c))), 3022 recorded = 1;
3006 !EQ (last_help, help))) 3023 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3024 && CONSP (ev2) && EQ (XCAR (ev2), Qhelp_echo)
3025 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev2))), EQ (last_help, help)))
3026 recorded = -1;
3027 else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3028 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3029 && CONSP (ev3) && EQ (XCAR (ev3), Qhelp_echo)
3030 && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev3))), EQ (last_help, help)))
3031 recorded = -2;
3032 }
3033 else if (EQ (XCAR (c), Qmouse_movement))
3034 {
3035 /* Only record one pair of `mouse-movement' on a window in recent_keys.
3036 So additional mouse movement events replace the last element. */
3037 Lisp_Object last_window, window;
3038
3039 window = Fcar_safe (Fcar_safe (XCDR (c)));
3040 if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
3041 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev1))), EQ (last_window, window))
3042 && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
3043 && (last_window = Fcar_safe (Fcar_safe (XCDR (ev2))), EQ (last_window, window)))
3007 { 3044 {
3008 total_keys++; 3045 ASET (recent_keys, ix1, c);
3009 ASET (recent_keys, recent_keys_index, c); 3046 recorded = 1;
3010 if (++recent_keys_index >= NUM_RECENT_KEYS)
3011 recent_keys_index = 0;
3012 } 3047 }
3013 } 3048 }
3014 } 3049 }
3015 else 3050 else
3051 store_kbd_macro_char (c);
3052
3053 if (!recorded)
3016 { 3054 {
3017 total_keys++; 3055 total_keys++;
3018 ASET (recent_keys, recent_keys_index, c); 3056 ASET (recent_keys, recent_keys_index, c);
3019 if (++recent_keys_index >= NUM_RECENT_KEYS) 3057 if (++recent_keys_index >= NUM_RECENT_KEYS)
3020 recent_keys_index = 0; 3058 recent_keys_index = 0;
3021 } 3059 }
3060 else if (recorded < 0)
3061 {
3062 /* We need to remove one or two events from recent_keys.
3063 To do this, we simply put nil at those events and move the
3064 recent_keys_index backwards over those events. Usually,
3065 users will never see those nil events, as they will be
3066 overwritten by the command keys entered to see recent_keys
3067 (e.g. C-h l). */
3068
3069 while (recorded++ < 0 && total_keys > 0)
3070 {
3071 if (total_keys < NUM_RECENT_KEYS)
3072 total_keys--;
3073 if (--recent_keys_index < 0)
3074 recent_keys_index = NUM_RECENT_KEYS - 1;
3075 ASET (recent_keys, recent_keys_index, Qnil);
3076 }
3077 }
3078
3079 num_nonmacro_input_events++;
3022 3080
3023 /* Write c to the dribble file. If c is a lispy event, write 3081 /* Write c to the dribble file. If c is a lispy event, write
3024 the event's symbol to the dribble file, in <brackets>. Bleaugh. 3082 the event's symbol to the dribble file, in <brackets>. Bleaugh.
@@ -3051,11 +3109,6 @@ record_char (c)
3051 3109
3052 fflush (dribble); 3110 fflush (dribble);
3053 } 3111 }
3054
3055 if (!CONSP (c) || !EQ (Qhelp_echo, XCAR (c)))
3056 store_kbd_macro_char (c);
3057
3058 num_nonmacro_input_events++;
3059} 3112}
3060 3113
3061Lisp_Object 3114Lisp_Object