From 8a8e89ac9b13976a801019a11eeb5cd30ebbd982 Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Sat, 9 Apr 2016 15:45:06 +0900 Subject: [PATCH] Bug 1257759 part.3 ModifierKeyState should be available in plugin module r=jimm Before posting native key message from PluginInstanceChild, we need to check if the key combination could be a shortcut key, i.e., we need to check if Ctrl or Alt key is pressed. ModifierKeyState is a good class for checking it but it should be defined in an independent header file. This patch separates the definition of ModifierKeyState to mozilla/widget/WinModifierKeyState.h and implement MaybeMatchShortcutKey() for PluginInstanceChild. MozReview-Commit-ID: ZjLnJx02Ou --HG-- rename : widget/windows/KeyboardLayout.h => widget/windows/WinModifierKeyState.h extra : rebase_source : 66e9351a36dfa88f080ea78972ac0cb347bb174d --- widget/windows/KeyboardLayout.cpp | 20 ++++++++++ widget/windows/KeyboardLayout.h | 38 +----------------- widget/windows/WinModifierKeyState.h | 58 ++++++++++++++++++++++++++++ widget/windows/moz.build | 1 + 4 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 widget/windows/WinModifierKeyState.h diff --git a/widget/windows/KeyboardLayout.cpp b/widget/windows/KeyboardLayout.cpp index 2bb188cd8f46..b0a41e581139 100644 --- a/widget/windows/KeyboardLayout.cpp +++ b/widget/windows/KeyboardLayout.cpp @@ -344,6 +344,26 @@ ModifierKeyState::IsWin() const return (mModifiers & MODIFIER_OS) != 0; } +bool +ModifierKeyState::MaybeMatchShortcutKey() const +{ + // If Windows key is pressed, even if both Ctrl key and Alt key are pressed, + // it's possible to match a shortcut key. + if (IsWin()) { + return true; + } + // Otherwise, when both Ctrl key and Alt key are pressed, it shouldn't be + // a shortcut key for Windows since it means pressing AltGr key on + // some keyboard layouts. + if (IsControl() ^ IsAlt()) { + return true; + } + // If no modifier key is active except a lockable modifier nor Shift key, + // the key shouldn't match any shortcut keys (there are Space and + // Shift+Space, though, let's ignore these special case...). + return false; +} + bool ModifierKeyState::IsCapsLocked() const { diff --git a/widget/windows/KeyboardLayout.h b/widget/windows/KeyboardLayout.h index bbd5a0fa3ab2..68422648d532 100644 --- a/widget/windows/KeyboardLayout.h +++ b/widget/windows/KeyboardLayout.h @@ -14,6 +14,7 @@ #include "mozilla/Attributes.h" #include "mozilla/EventForwards.h" #include "mozilla/TextEventDispatcher.h" +#include "mozilla/widget/WinModifierKeyState.h" #include #define NS_NUM_OF_KEYS 70 @@ -55,43 +56,6 @@ static const uint32_t sModifierKeyMap[][3] = { class KeyboardLayout; -class ModifierKeyState -{ -public: - ModifierKeyState(); - ModifierKeyState(bool aIsShiftDown, bool aIsControlDown, bool aIsAltDown); - ModifierKeyState(Modifiers aModifiers); - - void Update(); - - void Unset(Modifiers aRemovingModifiers); - void Set(Modifiers aAddingModifiers); - - void InitInputEvent(WidgetInputEvent& aInputEvent) const; - - bool IsShift() const; - bool IsControl() const; - bool IsAlt() const; - bool IsAltGr() const; - bool IsWin() const; - - bool IsCapsLocked() const; - bool IsNumLocked() const; - bool IsScrollLocked() const; - - MOZ_ALWAYS_INLINE Modifiers GetModifiers() const - { - return mModifiers; - } - -private: - Modifiers mModifiers; - - MOZ_ALWAYS_INLINE void EnsureAltGr(); - - void InitMouseEvent(WidgetInputEvent& aMouseEvent) const; -}; - struct UniCharsAndModifiers { // Dead-key + up to 4 characters diff --git a/widget/windows/WinModifierKeyState.h b/widget/windows/WinModifierKeyState.h new file mode 100644 index 000000000000..d1e7bdbaeacc --- /dev/null +++ b/widget/windows/WinModifierKeyState.h @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_widget_WinModifierKeyState_h_ +#define mozilla_widget_WinModifierKeyState_h_ + +#include "mozilla/RefPtr.h" +#include "mozilla/EventForwards.h" +#include + +namespace mozilla { +namespace widget { + +class MOZ_STACK_CLASS ModifierKeyState final +{ +public: + ModifierKeyState(); + ModifierKeyState(bool aIsShiftDown, bool aIsControlDown, bool aIsAltDown); + ModifierKeyState(Modifiers aModifiers); + + void Update(); + + void Unset(Modifiers aRemovingModifiers); + void Set(Modifiers aAddingModifiers); + + void InitInputEvent(WidgetInputEvent& aInputEvent) const; + + bool IsShift() const; + bool IsControl() const; + bool IsAlt() const; + bool IsAltGr() const; + bool IsWin() const; + + bool MaybeMatchShortcutKey() const; + + bool IsCapsLocked() const; + bool IsNumLocked() const; + bool IsScrollLocked() const; + + MOZ_ALWAYS_INLINE Modifiers GetModifiers() const + { + return mModifiers; + } + +private: + Modifiers mModifiers; + + MOZ_ALWAYS_INLINE void EnsureAltGr(); + + void InitMouseEvent(WidgetInputEvent& aMouseEvent) const; +}; + +} // namespace widget +} // namespace mozilla + +#endif // #ifndef mozilla_widget_WinModifierKeyState_h_ diff --git a/widget/windows/moz.build b/widget/windows/moz.build index 3c1b276fece2..2de2af3b1cd8 100644 --- a/widget/windows/moz.build +++ b/widget/windows/moz.build @@ -15,6 +15,7 @@ EXPORTS += [ EXPORTS.mozilla.widget += [ 'AudioSession.h', 'WinMessages.h', + 'WinModifierKeyState.h', ] UNIFIED_SOURCES += [