diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/keyboard.c | 109 |
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 | |||
| 2982 | record_char (c) | 2982 | record_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 | ||
| 3061 | Lisp_Object | 3114 | Lisp_Object |