diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2018-03-27 15:26:02 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2018-03-27 15:26:02 -0400 |
commit | c13cd74322be25293e78412b8957fe639f560c54 (patch) | |
tree | fcaea52366789077323b9f6a20101d75728b78a8 /src/keyboard.c | |
parent | 7eac1a57ce680b0523503e99e719e9fa2f7f400a (diff) | |
download | emacs-c13cd74322be25293e78412b8957fe639f560c54.tar.gz emacs-c13cd74322be25293e78412b8957fe639f560c54.tar.bz2 emacs-c13cd74322be25293e78412b8957fe639f560c54.zip |
(read_key_sewuence): Use POSN in second event when needed (bug#30955)
* src/keyboard.c (active_maps): Add arg 'second_event'.
(read_key_sequence): Pass it.
* lisp/mouse.el (mouse--click-1-maybe-follows-link): Modify event in place.
Diffstat (limited to 'src/keyboard.c')
-rw-r--r-- | src/keyboard.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/keyboard.c b/src/keyboard.c index 9b8d275d0fd..044e3fac693 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -8701,10 +8701,19 @@ follow_key (Lisp_Object keymap, Lisp_Object key) } static Lisp_Object -active_maps (Lisp_Object first_event) +active_maps (Lisp_Object first_event, Lisp_Object second_event) { Lisp_Object position - = CONSP (first_event) ? CAR_SAFE (XCDR (first_event)) : Qnil; + = EVENT_HAS_PARAMETERS (first_event) ? EVENT_START (first_event) : Qnil; + /* The position of a click can be in the second event if the first event + is a fake_prefixed_key like `header-line` or `mode-line`. */ + if (SYMBOLP (first_event) + && EVENT_HAS_PARAMETERS (second_event) + && EQ (first_event, POSN_POSN (EVENT_START (second_event)))) + { + eassert (NILP (position)); + position = EVENT_START (second_event); + } return Fcons (Qkeymap, Fcurrent_active_maps (Qt, position)); } @@ -9016,13 +9025,14 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, starting_buffer = current_buffer; first_unbound = bufsize + 1; Lisp_Object first_event = mock_input > 0 ? keybuf[0] : Qnil; + Lisp_Object second_event = mock_input > 1 ? keybuf[1] : Qnil; /* Build our list of keymaps. If we recognize a function key and replace its escape sequence in keybuf with its symbol, or if the sequence starts with a mouse click and we need to switch buffers, we jump back here to rebuild the initial keymaps from the current buffer. */ - current_binding = active_maps (first_event); + current_binding = active_maps (first_event, second_event); /* Start from the beginning in keybuf. */ t = 0; @@ -9282,7 +9292,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, && (XBUFFER (XWINDOW (selected_window)->contents) != current_buffer)) Fset_buffer (XWINDOW (selected_window)->contents); - current_binding = active_maps (first_event); + current_binding = active_maps (first_event, Qnil); } GROW_RAW_KEYBUF; |