Fixed handling of some non-ASCII but directly mapped characters
on win32. The o, a, and u with diaeresis in the german keyboard mapping are examples.
This commit is contained in:
parent
b949e108a0
commit
0325de2e12
|
@ -936,6 +936,10 @@ CMSWindowsSecondaryScreen::mapKey(Keystrokes& keys, UINT& virtualKey,
|
||||||
// from wide char to multibyte, then from multibyte to wide char
|
// from wide char to multibyte, then from multibyte to wide char
|
||||||
// forcing conversion to composite characters, then from wide
|
// forcing conversion to composite characters, then from wide
|
||||||
// char back to multibyte without making precomposed characters.
|
// char back to multibyte without making precomposed characters.
|
||||||
|
//
|
||||||
|
// after the first conversion to multibyte we see if we can map
|
||||||
|
// the key. if so then we don't bother trying to decompose dead
|
||||||
|
// keys.
|
||||||
BOOL error;
|
BOOL error;
|
||||||
char multiByte[2 * MB_LEN_MAX];
|
char multiByte[2 * MB_LEN_MAX];
|
||||||
wchar_t unicode[2];
|
wchar_t unicode[2];
|
||||||
|
@ -949,6 +953,11 @@ CMSWindowsSecondaryScreen::mapKey(Keystrokes& keys, UINT& virtualKey,
|
||||||
LOG((CLOG_DEBUG2 "KeyID 0x%08x not in code page", id));
|
LOG((CLOG_DEBUG2 "KeyID 0x%08x not in code page", id));
|
||||||
return m_mask;
|
return m_mask;
|
||||||
}
|
}
|
||||||
|
virtualKey = mapCharacter(keys, multiByte[0], hkl, m_mask, mask, action);
|
||||||
|
if (virtualKey != static_cast<UINT>(-1)) {
|
||||||
|
LOG((CLOG_DEBUG2 "KeyID 0x%08x maps to character %u", id, (unsigned char)multiByte[0]));
|
||||||
|
return m_mask;
|
||||||
|
}
|
||||||
nChars = MultiByteToWideChar(codePage,
|
nChars = MultiByteToWideChar(codePage,
|
||||||
MB_COMPOSITE | MB_ERR_INVALID_CHARS,
|
MB_COMPOSITE | MB_ERR_INVALID_CHARS,
|
||||||
multiByte, nChars,
|
multiByte, nChars,
|
||||||
|
@ -1040,6 +1049,10 @@ CMSWindowsSecondaryScreen::mapCharacter(Keystrokes& keys,
|
||||||
|
|
||||||
// get virtual key
|
// get virtual key
|
||||||
UINT virtualKey = LOBYTE(virtualKeyAndModifierState);
|
UINT virtualKey = LOBYTE(virtualKeyAndModifierState);
|
||||||
|
if (LOBYTE(virtualKeyAndModifierState) == 0xff) {
|
||||||
|
LOG((CLOG_DEBUG2 "cannot map character %d", static_cast<unsigned char>(c)));
|
||||||
|
return static_cast<UINT>(-1);
|
||||||
|
}
|
||||||
|
|
||||||
// get the required modifier state
|
// get the required modifier state
|
||||||
BYTE modifierState = HIBYTE(virtualKeyAndModifierState);
|
BYTE modifierState = HIBYTE(virtualKeyAndModifierState);
|
||||||
|
|
Loading…
Reference in New Issue