summaryrefslogtreecommitdiffstats
path: root/gfx/layers/apz/src/KeyboardMap.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/layers/apz/src/KeyboardMap.h')
-rw-r--r--gfx/layers/apz/src/KeyboardMap.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/gfx/layers/apz/src/KeyboardMap.h b/gfx/layers/apz/src/KeyboardMap.h
new file mode 100644
index 0000000000..32ec8ea61d
--- /dev/null
+++ b/gfx/layers/apz/src/KeyboardMap.h
@@ -0,0 +1,118 @@
+/* -*- 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 <stdint.h> // 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 <xul:handler> 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<KeyboardShortcut>& 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 <xul:binding> for scrolling commands.
+ */
+class KeyboardMap final {
+ public:
+ KeyboardMap();
+ explicit KeyboardMap(nsTArray<KeyboardShortcut>&& aShortcuts);
+
+ const nsTArray<KeyboardShortcut>& Shortcuts() const { return mShortcuts; }
+
+ /**
+ * Search through the internal list of shortcuts for a match for the input
+ * event
+ */
+ Maybe<KeyboardShortcut> FindMatch(const KeyboardInput& aEvent) const;
+
+ private:
+ Maybe<KeyboardShortcut> FindMatchInternal(
+ const KeyboardInput& aEvent, const IgnoreModifierState& aIgnore,
+ uint32_t aOverrideCharCode = 0) const;
+
+ CopyableTArray<KeyboardShortcut> mShortcuts;
+};
+
+} // namespace layers
+} // namespace mozilla
+
+#endif // mozilla_layers_KeyboardMap_h