зеркало из https://github.com/mozilla/gecko-dev.git
Bug 855975 part.2 Wrap MapVirtualKeyEx() API for converting native key event to VK or Unichar with widget::NativeKey r=jimm
This commit is contained in:
Родитель
73367a9a5c
Коммит
529c849332
|
@ -388,6 +388,7 @@ NativeKey::NativeKey(nsWindow* aWindow,
|
||||||
mVirtualKeyCode(0), mOriginalVirtualKeyCode(0)
|
mVirtualKeyCode(0), mOriginalVirtualKeyCode(0)
|
||||||
{
|
{
|
||||||
KeyboardLayout* keyboardLayout = KeyboardLayout::GetInstance();
|
KeyboardLayout* keyboardLayout = KeyboardLayout::GetInstance();
|
||||||
|
mKeyboardLayout = keyboardLayout->GetLayout();
|
||||||
mScanCode = WinUtils::GetScanCode(aKeyOrCharMessage.lParam);
|
mScanCode = WinUtils::GetScanCode(aKeyOrCharMessage.lParam);
|
||||||
mIsExtended = WinUtils::IsExtendedScanCode(aKeyOrCharMessage.lParam);
|
mIsExtended = WinUtils::IsExtendedScanCode(aKeyOrCharMessage.lParam);
|
||||||
// On WinXP and WinServer2003, we cannot compute the virtual keycode for
|
// On WinXP and WinServer2003, we cannot compute the virtual keycode for
|
||||||
|
@ -485,9 +486,7 @@ NativeKey::NativeKey(nsWindow* aWindow,
|
||||||
"mVirtualKeyCode has been computed already");
|
"mVirtualKeyCode has been computed already");
|
||||||
|
|
||||||
// Otherwise, compute the virtual keycode with MapVirtualKeyEx().
|
// Otherwise, compute the virtual keycode with MapVirtualKeyEx().
|
||||||
mVirtualKeyCode = static_cast<uint8_t>(
|
mVirtualKeyCode = ComputeVirtualKeyCodeFromScanCodeEx();
|
||||||
::MapVirtualKeyEx(GetScanCodeWithExtendedFlag(),
|
|
||||||
MAPVK_VSC_TO_VK_EX, keyboardLayout->GetLayout()));
|
|
||||||
|
|
||||||
// The result might be unexpected value due to the scan code is
|
// The result might be unexpected value due to the scan code is
|
||||||
// wrong. For example, any key messages can be generated by
|
// wrong. For example, any key messages can be generated by
|
||||||
|
@ -527,9 +526,8 @@ NativeKey::NativeKey(nsWindow* aWindow,
|
||||||
if (!canComputeVirtualKeyCodeFromScanCode) {
|
if (!canComputeVirtualKeyCodeFromScanCode) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mVirtualKeyCode = mOriginalVirtualKeyCode = static_cast<uint8_t>(
|
mVirtualKeyCode = mOriginalVirtualKeyCode =
|
||||||
::MapVirtualKeyEx(GetScanCodeWithExtendedFlag(),
|
ComputeVirtualKeyCodeFromScanCodeEx();
|
||||||
MAPVK_VSC_TO_VK_EX, keyboardLayout->GetLayout()));
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
MOZ_NOT_REACHED("Unsupported message");
|
MOZ_NOT_REACHED("Unsupported message");
|
||||||
|
@ -627,6 +625,34 @@ NativeKey::GetKeyLocation() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
NativeKey::ComputeVirtualKeyCodeFromScanCode() const
|
||||||
|
{
|
||||||
|
return static_cast<uint8_t>(
|
||||||
|
::MapVirtualKeyEx(mScanCode, MAPVK_VSC_TO_VK, mKeyboardLayout));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t
|
||||||
|
NativeKey::ComputeVirtualKeyCodeFromScanCodeEx() const
|
||||||
|
{
|
||||||
|
bool VistaOrLater =
|
||||||
|
(WinUtils::GetWindowsVersion() >= WinUtils::VISTA_VERSION);
|
||||||
|
// NOTE: WinXP doesn't support mapping scan code to virtual keycode of
|
||||||
|
// extended keys.
|
||||||
|
NS_ENSURE_TRUE(!mIsExtended || VistaOrLater, 0);
|
||||||
|
return static_cast<uint8_t>(
|
||||||
|
::MapVirtualKeyEx(GetScanCodeWithExtendedFlag(), MAPVK_VSC_TO_VK_EX,
|
||||||
|
mKeyboardLayout));
|
||||||
|
}
|
||||||
|
|
||||||
|
PRUnichar
|
||||||
|
NativeKey::ComputeUnicharFromScanCode() const
|
||||||
|
{
|
||||||
|
return static_cast<PRUnichar>(
|
||||||
|
::MapVirtualKeyEx(ComputeVirtualKeyCodeFromScanCode(),
|
||||||
|
MAPVK_VK_TO_CHAR, mKeyboardLayout));
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* mozilla::widget::KeyboardLayout
|
* mozilla::widget::KeyboardLayout
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
|
@ -299,7 +299,23 @@ public:
|
||||||
uint8_t GetVirtualKeyCode() const { return mVirtualKeyCode; }
|
uint8_t GetVirtualKeyCode() const { return mVirtualKeyCode; }
|
||||||
uint8_t GetOriginalVirtualKeyCode() const { return mOriginalVirtualKeyCode; }
|
uint8_t GetOriginalVirtualKeyCode() const { return mOriginalVirtualKeyCode; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps MapVirtualKeyEx() with MAPVK_VSC_TO_VK.
|
||||||
|
*/
|
||||||
|
uint8_t ComputeVirtualKeyCodeFromScanCode() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps MapVirtualKeyEx() with MAPVK_VSC_TO_VK_EX.
|
||||||
|
*/
|
||||||
|
uint8_t ComputeVirtualKeyCodeFromScanCodeEx() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps MapVirtualKeyEx() with MAPVK_VSC_TO_VK and MAPVK_VK_TO_CHAR.
|
||||||
|
*/
|
||||||
|
PRUnichar ComputeUnicharFromScanCode() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
HKL mKeyboardLayout;
|
||||||
uint32_t mDOMKeyCode;
|
uint32_t mDOMKeyCode;
|
||||||
KeyNameIndex mKeyNameIndex;
|
KeyNameIndex mKeyNameIndex;
|
||||||
|
|
||||||
|
|
|
@ -6892,14 +6892,10 @@ LRESULT nsWindow::OnChar(const MSG &aMsg,
|
||||||
// that numbers are always passed as such (among others: bugs 50255 and 351310)
|
// that numbers are always passed as such (among others: bugs 50255 and 351310)
|
||||||
if (uniChar && (modKeyState.IsControl() || modKeyState.IsAlt())) {
|
if (uniChar && (modKeyState.IsControl() || modKeyState.IsAlt())) {
|
||||||
KeyboardLayout* keyboardLayout = KeyboardLayout::GetInstance();
|
KeyboardLayout* keyboardLayout = KeyboardLayout::GetInstance();
|
||||||
UINT virtualKeyCode =
|
UINT virtualKeyCode = aNativeKey.ComputeVirtualKeyCodeFromScanCode();
|
||||||
::MapVirtualKeyEx(aNativeKey.GetScanCode(),
|
|
||||||
MAPVK_VSC_TO_VK, keyboardLayout->GetLayout());
|
|
||||||
UINT unshiftedCharCode =
|
UINT unshiftedCharCode =
|
||||||
virtualKeyCode >= '0' && virtualKeyCode <= '9' ? virtualKeyCode :
|
virtualKeyCode >= '0' && virtualKeyCode <= '9' ? virtualKeyCode :
|
||||||
modKeyState.IsShift() ?
|
modKeyState.IsShift() ? aNativeKey.ComputeUnicharFromScanCode() : 0;
|
||||||
::MapVirtualKeyEx(virtualKeyCode, MAPVK_VK_TO_CHAR,
|
|
||||||
keyboardLayout->GetLayout()) : 0;
|
|
||||||
// ignore diacritics (top bit set) and key mapping errors (char code 0)
|
// ignore diacritics (top bit set) and key mapping errors (char code 0)
|
||||||
if ((INT)unshiftedCharCode > 0)
|
if ((INT)unshiftedCharCode > 0)
|
||||||
uniChar = unshiftedCharCode;
|
uniChar = unshiftedCharCode;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче