summaryrefslogtreecommitdiff
path: root/src/w32fns.c
diff options
context:
space:
mode:
authorIlya Zakharevich <ilya@math.berkeley.edu>2016-04-21 19:08:16 +0300
committerEli Zaretskii <eliz@gnu.org>2016-04-21 19:08:16 +0300
commit401857eda39c57bd59a1e3a1dee57fd6420eeab5 (patch)
treee09af90e92b36939787b1f442f96abf1c94b1089 /src/w32fns.c
parenta77cf24ada2f89194c0ac64aae27bcdf7021e697 (diff)
downloademacs-401857eda39c57bd59a1e3a1dee57fd6420eeab5.tar.gz
emacs-401857eda39c57bd59a1e3a1dee57fd6420eeab5.tar.bz2
emacs-401857eda39c57bd59a1e3a1dee57fd6420eeab5.zip
Fix Alt-modified keys on some European MS-Windows keyboards
* src/w32fns.c (deliver_wm_chars): If the reported character is ASCII, AND Meta modifier is a candidate, behave as if Meta is present, i.e. fall back to the legacy code. (Bug#23251)
Diffstat (limited to 'src/w32fns.c')
-rw-r--r--src/w32fns.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/w32fns.c b/src/w32fns.c
index b9002bae770..c57b5a188b2 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -3154,9 +3154,45 @@ deliver_wm_chars (int do_translate, HWND hwnd, UINT msg, UINT wParam,
SHORT r = VkKeyScanW (*b), bitmap = 0x1FF;
FPRINTF_WM_CHARS((stderr, "VkKeyScanW %#06x %#04x\n", (int)r,
- wParam));
+ wParam));
if ((r & 0xFF) == wParam)
bitmap = r>>8; /* *b is reachable via simple interface */
+ else
+ {
+ /* VkKeyScanW() (essentially) returns the FIRST key with
+ the specified character; so here the pressed key is the
+ SECONDARY key producing the character.
+
+ Essentially, we have no information about the "role" of
+ modifiers on this key: which contribute into the
+ produced character (so "are consumed"), and which are
+ "extra" (must attache to bindable events).
+
+ The default above would consume ALL modifiers, so the
+ character is reported "as is". However, on many layouts
+ the ordering of the keys (in the layout table) is not
+ thought out well, so the "secondary" keys are often those
+ which the users would prefer to use with Alt-CHAR.
+ (Moreover - with e.g. Czech-QWERTY - the ASCII
+ punctuation is accessible from two equally [nu]preferable
+ AltGr-keys.)
+
+ SO: Heuristic: if the reported char is ASCII, AND Meta
+ modifier is a candidate, behave as if Meta is present
+ (fallback to the legacy branch; bug#23251).
+
+ (This would break layouts
+ - delivering ASCII characters
+ - on SECONDARY keys
+ - with not Shift/AltGr-like modifier combinations.
+ All 3 conditions together must be pretty exotic
+ cases - and a workaround exists: use "primary" keys!) */
+ if (*b < 0x80
+ && (wmsg.dwModifiers
+ & (alt_modifier | meta_modifier
+ | super_modifier | hyper_modifier)))
+ return 0;
+ }
if (*type_CtrlAlt == 'a') /* Simple Alt seen */
{
if ((bitmap & ~1) == 0) /* 1: KBDSHIFT */