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:
Masayuki Nakano 2013-05-29 15:34:47 +09:00
Родитель 73367a9a5c
Коммит 529c849332
3 изменённых файлов: 50 добавлений и 12 удалений

Просмотреть файл

@ -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;