From 3d3bd4e77e71e96699589d642d8c6e903df6219b Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Sun, 23 Sep 2018 19:28:09 +0200 Subject: [PATCH] [WIN32K] Work around GCC builds inventing dead keys. CORE-14948 --- win32ss/user/ntuser/keyboard.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/win32ss/user/ntuser/keyboard.c b/win32ss/user/ntuser/keyboard.c index 6167f9d6fff..f72e275cf2d 100644 --- a/win32ss/user/ntuser/keyboard.c +++ b/win32ss/user/ntuser/keyboard.c @@ -467,18 +467,31 @@ IntToUnicodeEx(UINT wVirtKey, WCHAR wchFirst, wchSecond; TRACE("Previous dead char: %lc (%x)\n", wchDead, wchDead); - for (i = 0; pKbdTbl->pDeadKey[i].dwBoth; i++) + if (pKbdTbl->pDeadKey) { - wchFirst = pKbdTbl->pDeadKey[i].dwBoth >> 16; - wchSecond = pKbdTbl->pDeadKey[i].dwBoth & 0xFFFF; - if (wchFirst == wchDead && wchSecond == wchTranslatedChar) + for (i = 0; pKbdTbl->pDeadKey[i].dwBoth; i++) { - wchTranslatedChar = pKbdTbl->pDeadKey[i].wchComposed; - wchDead = 0; - bDead = FALSE; - break; + wchFirst = pKbdTbl->pDeadKey[i].dwBoth >> 16; + wchSecond = pKbdTbl->pDeadKey[i].dwBoth & 0xFFFF; + if (wchFirst == wchDead && wchSecond == wchTranslatedChar) + { + wchTranslatedChar = pKbdTbl->pDeadKey[i].wchComposed; + wchDead = 0; + bDead = FALSE; + break; + } } } + else + { +#if defined(__GNUC__) + if (wchDead == 0x8000) + { + ERR("GCC is inventing bits, ignoring fake dead key\n"); + wchDead = 0; + } +#endif + } TRACE("Final char: %lc (%x)\n", wchTranslatedChar, wchTranslatedChar); }