author | Masayuki Nakano <masayuki@d-toybox.com> |
Fri, 16 Sep 2016 18:38:53 +0900 | |
changeset 316361 | fd077161e636ef594f21b1c541f01c7a6701780b |
parent 316360 | 2e45f263fb199c054454f1c841160a7ff01c7173 |
child 316362 | adba65212c35be06d1fb6a46303f1583525fe9bd |
push id | 30770 |
push user | kwierso@gmail.com |
push date | Wed, 05 Oct 2016 00:00:48 +0000 |
treeherder | mozilla-central@3470e326025c [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | m_kato |
bugs | 1306549 |
milestone | 52.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
widget/windows/KeyboardLayout.cpp | file | annotate | diff | comparison | revisions | |
widget/windows/KeyboardLayout.h | file | annotate | diff | comparison | revisions |
--- a/widget/windows/KeyboardLayout.cpp +++ b/widget/windows/KeyboardLayout.cpp @@ -3634,21 +3634,23 @@ KeyboardLayout::InitNativeKey(NativeKey& aNativeKey.mKeyNameIndex = KEY_NAME_INDEX_USE_STRING; aNativeKey.mCommittedCharsAndModifiers. Append(ch, aModKeyState.GetModifiers()); return; } } uint8_t virtualKey = aNativeKey.mOriginalVirtualKeyCode; - int32_t virtualKeyIndex = GetKeyIndex(virtualKey); - - if (virtualKeyIndex < 0) { - // Does not produce any printable characters, but still preserves the - // dead-key state. + + // If the key is not a usual printable key, KeyboardLayout class assume that + // it's not cause dead char nor printable char. Therefore, there are nothing + // to do here fore such keys (e.g., function keys). + // However, this should keep dead key state even if non-printable key is + // pressed during a dead key sequence. + if (!IsPrintableCharKey(virtualKey)) { return; } MOZ_ASSERT(virtualKey != VK_PACKET, "At handling VK_PACKET, we shouldn't refer keyboard layout"); MOZ_ASSERT(aNativeKey.mKeyNameIndex == KEY_NAME_INDEX_USE_STRING, "Printable key's key name index must be KEY_NAME_INDEX_USE_STRING"); @@ -3660,17 +3662,17 @@ KeyboardLayout::InitNativeKey(NativeKey& // First dead key event doesn't generate characters. if (isKeyDown) { // Dead-key state activated at keydown. mActiveDeadKey = virtualKey; mDeadKeyShiftState = VirtualKey::ModifierKeyStateToShiftState(aModKeyState); } UniCharsAndModifiers deadChars = - mVirtualKeys[virtualKeyIndex].GetNativeUniChars(aModKeyState); + GetNativeUniCharsAndModifiers(virtualKey, aModKeyState); NS_ASSERTION(deadChars.mLength == 1, "dead key must generate only one character"); aNativeKey.mKeyNameIndex = KEY_NAME_INDEX_Dead; return; } // At keydown message handling, we need to forget the first dead key // because there is no guarantee coming WM_KEYUP for the second dead @@ -3795,16 +3797,30 @@ KeyboardLayout::GetUniCharsAndModifiers( UniCharsAndModifiers result; int32_t key = GetKeyIndex(aVirtualKey); if (key < 0) { return result; } return mVirtualKeys[key].GetUniChars(aShiftState); } +UniCharsAndModifiers +KeyboardLayout::GetNativeUniCharsAndModifiers( + uint8_t aVirtualKey, + const ModifierKeyState& aModKeyState) const +{ + int32_t key = GetKeyIndex(aVirtualKey); + if (key < 0) { + return UniCharsAndModifiers(); + } + VirtualKey::ShiftState shiftState = + VirtualKey::ModifierKeyStateToShiftState(aModKeyState); + return mVirtualKeys[key].GetNativeUniChars(shiftState); +} + void KeyboardLayout::LoadLayout(HKL aLayout) { mIsPendingToRestoreKeyboardLayout = false; if (mKeyboardLayout == aLayout) { return; }
--- a/widget/windows/KeyboardLayout.h +++ b/widget/windows/KeyboardLayout.h @@ -694,31 +694,41 @@ public: * proper composite character when dead key produces a composite character. * Otherwise, just returns false. */ bool MaybeInitNativeKeyWithCompositeChar( NativeKey& aNativeKey, const ModifierKeyState& aModKeyState); /** - * GetUniCharsAndModifiers() returns characters which is inputted by the + * GetUniCharsAndModifiers() returns characters which are inputted by * aVirtualKey with aModKeyState. This method isn't stateful. * Note that if the combination causes text input, the result's Ctrl and * Alt key state are never active. */ UniCharsAndModifiers GetUniCharsAndModifiers( uint8_t aVirtualKey, const ModifierKeyState& aModKeyState) const { VirtualKey::ShiftState shiftState = VirtualKey::ModifierKeyStateToShiftState(aModKeyState); return GetUniCharsAndModifiers(aVirtualKey, shiftState); } /** + * GetNativeUniCharsAndModifiers() returns characters which are inputted by + * aVirtualKey with aModKeyState. The method isn't stateful. + * Note that different from GetUniCharsAndModifiers(), this returns + * actual modifier state of Ctrl and Alt. + */ + UniCharsAndModifiers GetNativeUniCharsAndModifiers( + uint8_t aVirtualKey, + const ModifierKeyState& aModKeyState) const; + + /** * OnLayoutChange() must be called before the first keydown message is * received. LoadLayout() changes the keyboard state, that causes breaking * dead key state. Therefore, we need to load the layout before the first * keydown message. */ void OnLayoutChange(HKL aKeyboardLayout) { MOZ_ASSERT(!mIsOverridden);