/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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_layers_KeyboardMap_h #define mozilla_layers_KeyboardMap_h #include // for uint32_t #include "InputData.h" // for KeyboardInput #include "nsIScrollableFrame.h" // for nsIScrollableFrame::ScrollUnit #include "nsTArray.h" // for nsTArray #include "mozilla/Maybe.h" // for mozilla::Maybe #include "KeyboardScrollAction.h" // for KeyboardScrollAction namespace mozilla { struct IgnoreModifierState; namespace layers { class KeyboardMap; /** * This class is an off main-thread for scrolling commands. */ class KeyboardShortcut final { public: KeyboardShortcut(); /** * Create a keyboard shortcut that when matched can be handled by executing * the specified keyboard action. */ KeyboardShortcut(KeyboardInput::KeyboardEventType aEventType, uint32_t aKeyCode, uint32_t aCharCode, Modifiers aModifiers, Modifiers aModifiersMask, const KeyboardScrollAction& aAction); /** * Create a keyboard shortcut that when matched should be handled by ignoring * the keyboard event and dispatching it to content. */ KeyboardShortcut(KeyboardInput::KeyboardEventType aEventType, uint32_t aKeyCode, uint32_t aCharCode, Modifiers aModifiers, Modifiers aModifiersMask); /** * There are some default actions for keyboard inputs that are hardcoded in * EventStateManager instead of being represented as XBL handlers. This adds * keyboard shortcuts to match these inputs and dispatch them to content. */ static void AppendHardcodedShortcuts(nsTArray& aShortcuts); protected: friend mozilla::layers::KeyboardMap; bool Matches(const KeyboardInput& aInput, const IgnoreModifierState& aIgnore, uint32_t aOverrideCharCode = 0) const; private: bool MatchesKey(const KeyboardInput& aInput, uint32_t aOverrideCharCode) const; bool MatchesModifiers(const KeyboardInput& aInput, const IgnoreModifierState& aIgnore) const; public: // The action to perform when this shortcut is matched, // and not flagged to be dispatched to content KeyboardScrollAction mAction; // Only one of mKeyCode or mCharCode may be non-zero // whichever one is non-zero is the one to compare when matching uint32_t mKeyCode; uint32_t mCharCode; // The modifiers that must be active for this shortcut Modifiers mModifiers; // The modifiers to compare when matching this shortcut Modifiers mModifiersMask; // The type of keyboard event to match against KeyboardInput::KeyboardEventType mEventType; // Whether events matched by this must be dispatched to content bool mDispatchToContent; }; /** * A keyboard map is an off main-thread for scrolling commands. */ class KeyboardMap final { public: KeyboardMap(); explicit KeyboardMap(nsTArray&& aShortcuts); const nsTArray& Shortcuts() const { return mShortcuts; } /** * Search through the internal list of shortcuts for a match for the input * event */ Maybe FindMatch(const KeyboardInput& aEvent) const; private: Maybe FindMatchInternal( const KeyboardInput& aEvent, const IgnoreModifierState& aIgnore, uint32_t aOverrideCharCode = 0) const; CopyableTArray mShortcuts; }; } // namespace layers } // namespace mozilla #endif // mozilla_layers_KeyboardMap_h