From 8dd94156c621f6b10cae91405545a8a91a2d15e3 Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Fri, 15 Jun 2012 18:52:50 +0900 Subject: [PATCH] Bug 757688 part.6 Add numpad keys to printable key table and remove KeyboardLayout::IsNumpadKey() r=jimm --- widget/windows/KeyboardLayout.cpp | 24 ++--- widget/windows/KeyboardLayout.h | 3 +- widget/windows/nsWindow.cpp | 156 ++++++++++++------------------ 3 files changed, 73 insertions(+), 110 deletions(-) diff --git a/widget/windows/KeyboardLayout.cpp b/widget/windows/KeyboardLayout.cpp index 5f7d03c093c9..d595364a0d0e 100644 --- a/widget/windows/KeyboardLayout.cpp +++ b/widget/windows/KeyboardLayout.cpp @@ -533,12 +533,6 @@ KeyboardLayout::IsPrintableCharKey(PRUint8 aVirtualKey) return GetKeyIndex(aVirtualKey) >= 0; } -bool -KeyboardLayout::IsNumpadKey(PRUint8 aVirtualKey) -{ - return VK_NUMPAD0 <= aVirtualKey && aVirtualKey <= VK_DIVIDE; -} - bool KeyboardLayout::IsDeadKey(PRUint8 aVirtualKey, const ModifierKeyState& aModKeyState) const @@ -724,11 +718,17 @@ KeyboardLayout::LoadLayout(HKL aLayout) inline PRInt32 KeyboardLayout::GetKeyIndex(PRUint8 aVirtualKey) { -// Currently these 54 (NS_NUM_OF_KEYS) virtual keys are assumed +// Currently these 68 (NS_NUM_OF_KEYS) virtual keys are assumed // to produce visible representation: // 0x20 - VK_SPACE ' ' // 0x30..0x39 '0'..'9' // 0x41..0x5A 'A'..'Z' +// 0x60..0x69 '0'..'9' on numpad +// 0x6A - VK_MULTIPLY '*' on numpad +// 0x6B - VK_ADD '+' on numpad +// 0x6D - VK_SUBTRACT '-' on numpad +// 0x6E - VK_DECIMAL '.' on numpad +// 0x6F - VK_DIVIDE '/' on numpad // 0x6E - VK_DECIMAL '.' // 0xBA - VK_OEM_1 ';:' for US // 0xBB - VK_OEM_PLUS '+' any country @@ -757,15 +757,15 @@ KeyboardLayout::GetKeyIndex(PRUint8 aVirtualKey) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, // 30 -1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 40 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, -1, -1, -1, -1, -1, // 50 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, // 60 + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, -1, 49, 50, 51, // 60 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 70 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 80 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 90 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // A0 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, 39, 40, 41, 42, 43, // B0 - 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // C0 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, 47, 48, 49, // D0 - -1, 50, 51, 52, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // E0 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, 53, 54, 55, 56, 57, // B0 + 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // C0 + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, 60, 61, 62, 63, // D0 + -1, 64, 65, 66, 67, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // E0 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // F0 }; diff --git a/widget/windows/KeyboardLayout.h b/widget/windows/KeyboardLayout.h index 939c0e4fab9e..4746412f6b41 100644 --- a/widget/windows/KeyboardLayout.h +++ b/widget/windows/KeyboardLayout.h @@ -10,7 +10,7 @@ #include "nsEvent.h" #include -#define NS_NUM_OF_KEYS 54 +#define NS_NUM_OF_KEYS 68 #define VK_OEM_1 0xBA // ';:' for US #define VK_OEM_PLUS 0xBB // '+' any country @@ -333,7 +333,6 @@ public: ~KeyboardLayout(); static bool IsPrintableCharKey(PRUint8 aVirtualKey); - static bool IsNumpadKey(PRUint8 aVirtualKey); /** * IsDeadKey() returns true if aVirtualKey is a dead key with aModKeyState. diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index 1d8de329a043..ac4698dbfc50 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -6386,9 +6386,7 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg, return result; } else if (!aModKeyState.IsControl() && !aModKeyState.IsAlt() && - (KeyboardLayout::IsPrintableCharKey(virtualKeyCode) || - KeyboardLayout::IsNumpadKey(virtualKeyCode))) - { + KeyboardLayout::IsPrintableCharKey(virtualKeyCode)) { // If this is simple KeyDown event but next message is not WM_CHAR, // this event may not input text, so we should ignore this event. // See bug 314130. @@ -6404,101 +6402,67 @@ LRESULT nsWindow::OnKeyDown(const MSG &aMsg, PRUint32 shiftedLatinChar = 0; PRUint32 unshiftedLatinChar = 0; - switch (virtualKeyCode) { - // keys to be sent as characters - case VK_ADD: - inputtingChars.Clear(); - inputtingChars.Append('+', aModKeyState.GetModifiers()); - break; - case VK_SUBTRACT: - inputtingChars.Clear(); - inputtingChars.Append('-', aModKeyState.GetModifiers()); - break; - case VK_DIVIDE: - inputtingChars.Clear(); - inputtingChars.Append('/', aModKeyState.GetModifiers()); - break; - case VK_MULTIPLY: - inputtingChars.Clear(); - inputtingChars.Append('*', aModKeyState.GetModifiers()); - break; - case VK_NUMPAD0: - case VK_NUMPAD1: - case VK_NUMPAD2: - case VK_NUMPAD3: - case VK_NUMPAD4: - case VK_NUMPAD5: - case VK_NUMPAD6: - case VK_NUMPAD7: - case VK_NUMPAD8: - case VK_NUMPAD9: - inputtingChars.Clear(); - inputtingChars.Append(virtualKeyCode - VK_NUMPAD0 + '0', - aModKeyState.GetModifiers()); - break; - default: - if (!KeyboardLayout::IsPrintableCharKey(virtualKeyCode)) { + if (!KeyboardLayout::IsPrintableCharKey(virtualKeyCode)) { + inputtingChars.Clear(); + } + + if (aModKeyState.IsControl() ^ aModKeyState.IsAlt()) { + widget::ModifierKeyState capsLockState( + aModKeyState.GetModifiers() & MODIFIER_CAPSLOCK); + unshiftedChars = + gKbdLayout.GetUniCharsAndModifiers(virtualKeyCode, capsLockState); + capsLockState.Set(MODIFIER_SHIFT); + shiftedChars = + gKbdLayout.GetUniCharsAndModifiers(virtualKeyCode, capsLockState); + + // The current keyboard cannot input alphabets or numerics, + // we should append them for Shortcut/Access keys. + // E.g., for Cyrillic keyboard layout. + capsLockState.Unset(MODIFIER_SHIFT); + WidgetUtils::GetLatinCharCodeForKeyCode(DOMKeyCode, + capsLockState.GetModifiers(), + &unshiftedLatinChar, + &shiftedLatinChar); + + // If the shiftedLatinChar isn't 0, the key code is NS_VK_[A-Z]. + if (shiftedLatinChar) { + // If the produced characters of the key on current keyboard layout + // are same as computed Latin characters, we shouldn't append the + // Latin characters to alternativeCharCode. + if (unshiftedLatinChar == unshiftedChars.mChars[0] && + shiftedLatinChar == shiftedChars.mChars[0]) { + shiftedLatinChar = unshiftedLatinChar = 0; + } + } else if (unshiftedLatinChar) { + // If the shiftedLatinChar is 0, the keyCode doesn't produce + // alphabet character. At that time, the character may be produced + // with Shift key. E.g., on French keyboard layout, NS_VK_PERCENT + // key produces LATIN SMALL LETTER U WITH GRAVE (U+00F9) without + // Shift key but with Shift key, it produces '%'. + // If the unshiftedLatinChar is produced by the key on current + // keyboard layout, we shouldn't append it to alternativeCharCode. + if (unshiftedLatinChar == unshiftedChars.mChars[0] || + unshiftedLatinChar == shiftedChars.mChars[0]) { + unshiftedLatinChar = 0; + } + } + + // If the charCode is not ASCII character, we should replace the + // charCode with ASCII character only when Ctrl is pressed. + // But don't replace the charCode when the charCode is not same as + // unmodified characters. In such case, Ctrl is sometimes used for a + // part of character inputting key combination like Shift. + if (aModKeyState.IsControl()) { + PRUint32 ch = + aModKeyState.IsShift() ? shiftedLatinChar : unshiftedLatinChar; + if (ch && + (!inputtingChars.mLength || + inputtingChars.UniCharsCaseInsensitiveEqual( + aModKeyState.IsShift() ? shiftedChars : unshiftedChars))) { inputtingChars.Clear(); + inputtingChars.Append(ch, aModKeyState.GetModifiers()); } - - if (aModKeyState.IsControl() ^ aModKeyState.IsAlt()) { - widget::ModifierKeyState capsLockState( - aModKeyState.GetModifiers() & MODIFIER_CAPSLOCK); - unshiftedChars = - gKbdLayout.GetUniCharsAndModifiers(virtualKeyCode, capsLockState); - capsLockState.Set(MODIFIER_SHIFT); - shiftedChars = - gKbdLayout.GetUniCharsAndModifiers(virtualKeyCode, capsLockState); - - // The current keyboard cannot input alphabets or numerics, - // we should append them for Shortcut/Access keys. - // E.g., for Cyrillic keyboard layout. - capsLockState.Unset(MODIFIER_SHIFT); - WidgetUtils::GetLatinCharCodeForKeyCode(DOMKeyCode, - capsLockState.GetModifiers(), - &unshiftedLatinChar, - &shiftedLatinChar); - - // If the shiftedLatinChar isn't 0, the key code is NS_VK_[A-Z]. - if (shiftedLatinChar) { - // If the produced characters of the key on current keyboard layout - // are same as computed Latin characters, we shouldn't append the - // Latin characters to alternativeCharCode. - if (unshiftedLatinChar == unshiftedChars.mChars[0] && - shiftedLatinChar == shiftedChars.mChars[0]) { - shiftedLatinChar = unshiftedLatinChar = 0; - } - } else if (unshiftedLatinChar) { - // If the shiftedLatinChar is 0, the keyCode doesn't produce - // alphabet character. At that time, the character may be produced - // with Shift key. E.g., on French keyboard layout, NS_VK_PERCENT - // key produces LATIN SMALL LETTER U WITH GRAVE (U+00F9) without - // Shift key but with Shift key, it produces '%'. - // If the unshiftedLatinChar is produced by the key on current - // keyboard layout, we shouldn't append it to alternativeCharCode. - if (unshiftedLatinChar == unshiftedChars.mChars[0] || - unshiftedLatinChar == shiftedChars.mChars[0]) { - unshiftedLatinChar = 0; - } - } - - // If the charCode is not ASCII character, we should replace the - // charCode with ASCII character only when Ctrl is pressed. - // But don't replace the charCode when the charCode is not same as - // unmodified characters. In such case, Ctrl is sometimes used for a - // part of character inputting key combination like Shift. - if (aModKeyState.IsControl()) { - PRUint32 ch = - aModKeyState.IsShift() ? shiftedLatinChar : unshiftedLatinChar; - if (ch && - (!inputtingChars.mLength || - inputtingChars.UniCharsCaseInsensitiveEqual( - aModKeyState.IsShift() ? shiftedChars : unshiftedChars))) { - inputtingChars.Clear(); - inputtingChars.Append(ch, aModKeyState.GetModifiers()); - } - } - } + } } if (inputtingChars.mLength ||