From aabb9d7a2fc8bd0f24429d0b632ef11950a65fba Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Fri, 14 May 2021 13:23:12 +0000 Subject: [PATCH] Fix key recording bug when an input method is activated * src/keyboard.c (read_char): Do not record character again when an input method is activated (Bug#48042). (record_char): Partly revert 03e3440dbb. * lisp/international/quail.el (quail-start-translation, quail-start-conversion): Partly revert 03e3440dbb. --- lisp/international/quail.el | 20 ++++---------------- src/keyboard.c | 9 ++++++--- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/lisp/international/quail.el b/lisp/international/quail.el index fff06deee8..6c2088a95b 100644 --- a/lisp/international/quail.el +++ b/lisp/international/quail.el @@ -1385,13 +1385,12 @@ quail-start-translation ;; (generated-events nil) ;FIXME: What is this? (input-method-function nil) (modified-p (buffer-modified-p)) - last-command-event last-command this-command inhibit-record) + last-command-event last-command this-command) (setq quail-current-key "" quail-current-str "" quail-translating t) (if key - (setq unread-command-events (cons key unread-command-events) - inhibit-record t)) + (setq unread-command-events (cons key unread-command-events))) (while quail-translating (set-buffer-modified-p modified-p) (quail-show-guidance) @@ -1400,13 +1399,8 @@ quail-start-translation (or input-method-previous-message "") quail-current-str quail-guidance-str))) - ;; We inhibit record_char only for the first key, - ;; because it was already recorded before read_char - ;; called quail-input-method. - (inhibit--record-char inhibit-record) (keyseq (read-key-sequence prompt nil nil t)) (cmd (lookup-key (quail-translation-keymap) keyseq))) - (setq inhibit-record nil) (if (if key (and (commandp cmd) (not (eq cmd 'quail-other-command))) (eq cmd 'quail-self-insert-command)) @@ -1450,15 +1444,14 @@ quail-start-conversion ;; (generated-events nil) ;FIXME: What is this? (input-method-function nil) (modified-p (buffer-modified-p)) - last-command-event last-command this-command inhibit-record) + last-command-event last-command this-command) (setq quail-current-key "" quail-current-str "" quail-translating t quail-converting t quail-conversion-str "") (if key - (setq unread-command-events (cons key unread-command-events) - inhibit-record t)) + (setq unread-command-events (cons key unread-command-events))) (while quail-converting (set-buffer-modified-p modified-p) (or quail-translating @@ -1474,13 +1467,8 @@ quail-start-conversion quail-conversion-str quail-current-str quail-guidance-str))) - ;; We inhibit record_char only for the first key, - ;; because it was already recorded before read_char - ;; called quail-input-method. - (inhibit--record-char inhibit-record) (keyseq (read-key-sequence prompt nil nil t)) (cmd (lookup-key (quail-conversion-keymap) keyseq))) - (setq inhibit-record nil) (if (if key (commandp cmd) (eq cmd 'quail-self-insert-command)) (progn (setq last-command-event (aref keyseq (1- (length keyseq))) diff --git a/src/keyboard.c b/src/keyboard.c index 47b5e59024..6849229bb2 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -3097,8 +3097,12 @@ read_char (int commandflag, Lisp_Object map, } /* When we consume events from the various unread-*-events lists, we bypass the code that records input, so record these events now if - they were not recorded already. */ - if (!recorded) + they were not recorded already. + Don't record events when an input method is activated however, + quail.el puts keys back in unread-command-events to handle them + again, but the keys actually typed by the user have already been + recorded. */ + if (!recorded && NILP (Fsymbol_value (Qcurrent_input_method))) { record_char (c); recorded = true; @@ -3233,7 +3237,6 @@ help_char_p (Lisp_Object c) static void record_char (Lisp_Object c) { - /* quail.el binds this to avoid recording keys twice. */ if (inhibit_record_char) return; -- 2.30.2