From 86cbc9d216c724e6be5db27fb33df2ca0c7d9804 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 21 Nov 2020 10:14:55 +0200 Subject: [PATCH] Make ignoring modifiers on IME input optional By default, ignore modifier keys on IME input, but add a variable to get back old behavior. * src/w32fns.c (syms_of_w32fns): New variable w32-ignore-modifiers-on-IME-input. (w32_wnd_proc): Use it to ignore modifier keys when IME input is used. (Bug#44641) * etc/NEWS: Announce the change and the new variable. --- etc/NEWS | 9 ++++++++- src/w32fns.c | 14 +++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 61f9c0e1fe2..4855cd3b61d 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -48,7 +48,7 @@ skip leading or trailing empty lines of the buffer. ** Tramp -*** The user option 'tramp-completion-reread-directory-timeout' is made obsolete. +*** The user option 'tramp-completion-reread-directory-timeout' is now obsolete. * New Modes and Packages in Emacs 27.2 @@ -62,6 +62,13 @@ skip leading or trailing empty lines of the buffer. * Changes in Emacs 27.2 on Non-Free Operating Systems +** Emacs now ignores modifier keys when IME input is used. +By default, pressing Ctrl, Shift, and Alt keys while using IME input +will no longer apply the modifiers to the produced characters, as +there are IMEs which use keys with modifiers to input some +characters. Customize the variable 'w32-ignore-modifiers-on-IME-input' +to nil to get back the old behavior. + * Installation Changes in Emacs 27.1 diff --git a/src/w32fns.c b/src/w32fns.c index 96cf34430d4..fd13a958651 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -4576,7 +4576,10 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) int size, i; W32Msg wmsg; HIMC context = get_ime_context_fn (hwnd); - wmsg.dwModifiers = 0; + wmsg.dwModifiers = + w32_ignore_modifiers_on_IME_input + ? 0 + : w32_get_key_modifiers (wParam, lParam); /* Get buffer size. */ size = get_composition_string_fn (context, GCS_RESULTSTR, NULL, 0); buffer = alloca (size); @@ -10697,6 +10700,15 @@ tip frame. */); doc: /* Non-nil means don't display the abort dialog when aborting. */); w32_disable_abort_dialog = 0; + DEFVAR_BOOL ("w32-ignore-modifiers-on-IME-input", + w32_ignore_modifiers_on_IME_input, + doc: /* Whether to ignore modifier keys when processing input with IME. +Some MS-Windows input methods use modifier keys such as Ctrl or Alt to input +characters, in which case applying the modifiers will change the input. +The default value of this variable is therefore t, to ignore modifier +keys when IME input is received. */); + w32_ignore_modifiers_on_IME_input = true; + #if 0 /* TODO: Port to W32 */ defsubr (&Sx_change_window_property); defsubr (&Sx_delete_window_property); -- 2.39.2