Bug 1303273 part.6 Hide UniCharsAndModifiers::mModifiers r?m_kato
MozReview-Commit-ID: 9KKN5mlJadg
--- a/widget/windows/KeyboardLayout.cpp
+++ b/widget/windows/KeyboardLayout.cpp
@@ -622,28 +622,28 @@ ToString(const UniCharsAndModifiers& aUn
{
if (aUniCharsAndModifiers.IsEmpty()) {
return NS_LITERAL_CSTRING("{}");
}
nsAutoCString result;
result.AssignLiteral("{ ");
result.Append(GetCharacterCodeName(aUniCharsAndModifiers.CharAt(0)));
for (uint32_t i = 1; i < aUniCharsAndModifiers.mLength; ++i) {
- if (aUniCharsAndModifiers.mModifiers[i - 1] !=
- aUniCharsAndModifiers.mModifiers[i]) {
+ if (aUniCharsAndModifiers.ModifiersAt(i - 1) !=
+ aUniCharsAndModifiers.ModifiersAt(i)) {
result.AppendLiteral(" [");
- result.Append(GetModifiersName(aUniCharsAndModifiers.mModifiers[0]));
+ result.Append(GetModifiersName(aUniCharsAndModifiers.ModifiersAt(0)));
result.AppendLiteral("]");
}
result.AppendLiteral(", ");
result.Append(GetCharacterCodeName(aUniCharsAndModifiers.CharAt(i)));
}
result.AppendLiteral(" [");
uint32_t lastIndex = aUniCharsAndModifiers.mLength - 1;
- result.Append(GetModifiersName(aUniCharsAndModifiers.mModifiers[lastIndex]));
+ result.Append(GetModifiersName(aUniCharsAndModifiers.ModifiersAt(lastIndex)));
result.AppendLiteral("] }");
return result;
}
const nsCString
ToString(const ModifierKeyState& aModifierKeyState)
{
nsAutoCString result;
@@ -925,16 +925,28 @@ UniCharsAndModifiers::Append(char16_t aU
void
UniCharsAndModifiers::FillModifiers(Modifiers aModifiers)
{
for (uint32_t i = 0; i < mLength; i++) {
mModifiers[i] = aModifiers;
}
}
+void
+UniCharsAndModifiers::OverwriteModifiersIfBeginsWith(
+ const UniCharsAndModifiers& aOther)
+{
+ if (!BeginsWith(aOther)) {
+ return;
+ }
+ for (uint32_t i = 0; i < aOther.mLength; ++i) {
+ mModifiers[i] = aOther.mModifiers[i];
+ }
+}
+
bool
UniCharsAndModifiers::UniCharsEqual(const UniCharsAndModifiers& aOther) const
{
if (mLength != aOther.mLength) {
return false;
}
return !memcmp(mChars, aOther.mChars, mLength * sizeof(char16_t));
}
@@ -3312,17 +3324,17 @@ NativeKey::WillDispatchKeyboardEvent(Wid
}
}
// Set modifier state from mCommittedCharsAndModifiers because some of them
// might be different. For example, Shift key was pressed at inputting
// dead char but Shift key was released before inputting next character.
ModifierKeyState modKeyState(mModKeyState);
modKeyState.Unset(MODIFIER_SHIFT | MODIFIER_CONTROL | MODIFIER_ALT |
MODIFIER_ALTGRAPH | MODIFIER_CAPSLOCK);
- modKeyState.Set(mCommittedCharsAndModifiers.mModifiers[aIndex]);
+ modKeyState.Set(mCommittedCharsAndModifiers.ModifiersAt(aIndex));
modKeyState.InitInputEvent(aKeyboardEvent);
MOZ_LOG(sNativeKeyLogger, LogLevel::Info,
("%p NativeKey::WillDispatchKeyboardEvent(), "
"setting %uth modifier state to %s",
this, aIndex + 1, ToString(modKeyState).get()));
}
uint32_t longestLength =
std::max(mInputtingStringAndModifiers.mLength,
@@ -3365,17 +3377,17 @@ NativeKey::WillDispatchKeyboardEvent(Wid
// character than without them then do not report these flags
// because it is separate keyboard layout shift state. If dead-key
// and base character does not produce a valid composite character
// then both produced dead-key character and following base
// character may have different modifier flags, too.
modKeyState.Unset(MODIFIER_SHIFT | MODIFIER_CONTROL | MODIFIER_ALT |
MODIFIER_ALTGRAPH | MODIFIER_CAPSLOCK);
modKeyState.Set(
- mInputtingStringAndModifiers.mModifiers[aIndex - skipUniChars]);
+ mInputtingStringAndModifiers.ModifiersAt(aIndex - skipUniChars));
modKeyState.InitInputEvent(aKeyboardEvent);
MOZ_LOG(sNativeKeyLogger, LogLevel::Info,
("%p NativeKey::WillDispatchKeyboardEvent(), "
"setting %uth modifier state to %s",
this, aIndex + 1, ToString(modKeyState).get()));
}
uint16_t uniChar =
mInputtingStringAndModifiers.CharAt(aIndex - skipUniChars);
@@ -3564,17 +3576,17 @@ KeyboardLayout::IsSysKey(uint8_t aVirtua
UniCharsAndModifiers inputCharsAndModifiers =
GetUniCharsAndModifiers(aVirtualKey, aModKeyState);
if (inputCharsAndModifiers.IsEmpty()) {
return true;
}
// If the Alt key state isn't consumed, that means that the key with Alt
// doesn't cause text input. So, the combination is a system key.
- return !!(inputCharsAndModifiers.mModifiers[0] & MODIFIER_ALT);
+ return !!(inputCharsAndModifiers.ModifiersAt(0) & MODIFIER_ALT);
}
void
KeyboardLayout::InitNativeKey(NativeKey& aNativeKey,
const ModifierKeyState& aModKeyState)
{
if (mIsPendingToRestoreKeyboardLayout) {
LoadLayout(::GetKeyboardLayout(0));
@@ -3614,22 +3626,18 @@ KeyboardLayout::InitNativeKey(NativeKey&
return;
}
// If it's in dead key sequence and dead char is inputted as is, we need to
// set the previous modifier state which is stored when preceding dead key
// is pressed.
UniCharsAndModifiers deadChars =
GetUniCharsAndModifiers(mActiveDeadKey, mDeadKeyShiftState);
- if (aNativeKey.mCommittedCharsAndModifiers.BeginsWith(deadChars)) {
- for (uint32_t i = 0; i < deadChars.mLength; ++i) {
- aNativeKey.mCommittedCharsAndModifiers.mModifiers[i] =
- deadChars.mModifiers[i];
- }
- }
+ aNativeKey.mCommittedCharsAndModifiers.
+ OverwriteModifiersIfBeginsWith(deadChars);
// Finish the dead key sequence.
DeactivateDeadKeyState();
return;
}
// 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).
@@ -3793,17 +3801,17 @@ KeyboardLayout::MaybeInitNativeKeyWithCo
GetCompositeChar(mActiveDeadKey, mDeadKeyShiftState, baseChars.CharAt(0));
if (!compositeChar) {
return false;
}
// Active dead-key and base character does produce exactly one composite
// character.
aNativeKey.mCommittedCharsAndModifiers.Append(compositeChar,
- baseChars.mModifiers[0]);
+ baseChars.ModifiersAt(0));
if (aNativeKey.IsKeyDownMessage()) {
DeactivateDeadKeyState();
}
return true;
}
UniCharsAndModifiers
KeyboardLayout::GetUniCharsAndModifiers(
--- a/widget/windows/KeyboardLayout.h
+++ b/widget/windows/KeyboardLayout.h
@@ -55,18 +55,16 @@ static const uint32_t sModifierKeyMap[][
{ nsIWidget::ALT_R, VK_MENU, VK_RMENU }
};
class KeyboardLayout;
class UniCharsAndModifiers final
{
public:
- // Dead-key + up to 4 characters
- Modifiers mModifiers[5];
uint32_t mLength;
UniCharsAndModifiers() : mLength(0) {}
UniCharsAndModifiers operator+(const UniCharsAndModifiers& aOther) const;
UniCharsAndModifiers& operator+=(const UniCharsAndModifiers& aOther);
/**
* Append a pair of unicode character and the final modifier.
@@ -75,26 +73,38 @@ public:
void Clear() { mLength = 0; }
bool IsEmpty() const { return !mLength; }
char16_t CharAt(size_t aIndex) const
{
MOZ_ASSERT(aIndex < mLength);
return mChars[aIndex];
}
+ Modifiers ModifiersAt(size_t aIndex) const
+ {
+ MOZ_ASSERT(aIndex < mLength);
+ return mModifiers[aIndex];
+ }
void FillModifiers(Modifiers aModifiers);
+ /**
+ * OverwriteModifiersIfBeginsWith() assigns mModifiers with aOther between
+ * [0] and [aOther.mLength - 1] only when mChars begins with aOther.mChars.
+ */
+ void OverwriteModifiersIfBeginsWith(const UniCharsAndModifiers& aOther);
bool UniCharsEqual(const UniCharsAndModifiers& aOther) const;
bool UniCharsCaseInsensitiveEqual(const UniCharsAndModifiers& aOther) const;
bool BeginsWith(const UniCharsAndModifiers& aOther) const;
nsString ToString() const { return nsString(mChars, mLength); }
private:
+ // Dead-key + up to 4 characters
char16_t mChars[5];
+ Modifiers mModifiers[5];
};
struct DeadKeyEntry;
class DeadKeyTable;
class VirtualKey
{