| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GARNET_BIN_UI_INPUT_INVERSE_KEYMAP_H_ |
| #define GARNET_BIN_UI_INPUT_INVERSE_KEYMAP_H_ |
| |
| #include <map> |
| #include <utility> |
| #include <vector> |
| |
| #include <fuchsia/ui/input/cpp/fidl.h> |
| #include <hid/hid.h> |
| #include <hid/usages.h> |
| |
| namespace input { |
| |
| struct Keystroke { |
| uint32_t usage; |
| enum class Shift { |
| kNo, |
| kYes, |
| kDontCare, |
| } shift; |
| }; |
| |
| // Lightweight utility for basic keymap conversion of chars to keystrokes. This |
| // is intended for end-to-end and input testing only; for production use cases |
| // and general testing, IME injection should be used instead. Generally a |
| // mapping exists only for printable ASCII characters; in particular neither \t |
| // nor \n is mapped in either of the standard zircon keymaps. Furthermore, IME |
| // implementations may themselves override the keymap in a way that invalidates |
| // this translation. |
| // |
| // This is an inverse of hid/hid.h:hid_map_key. |
| using InverseKeymap = std::map<char, Keystroke>; |
| using KeySequence = std::vector<fuchsia::ui::input::KeyboardReportPtr>; |
| |
| // Constructs an inverse keymap from a keymap with |KEYMAP_SIZE| entries. |
| InverseKeymap InvertKeymap(const keychar_t keymap[]); |
| |
| // Builds a key sequence representing the given string under the provided |
| // |InverseKeymap|. |
| // |
| // This is intended for end-to-end and input testing only; for production use |
| // cases and general testing, IME injection should be used instead. |
| // |
| // A translation from |text| to a sequence of keystrokes is not guaranteed to |
| // exist. If a translation does not exist, false is returned for the bool |
| // member of the pair. See |InverseKeymap| for details. |
| // |
| // The sequence does not contain pauses except between repeated keys or to clear |
| // a shift state, though the sequence does terminate with an empty report (no |
| // keys pressed). A shift key transition is sent in advance of each series of |
| // keys that needs it. |
| // |
| // Returns { key sequence, success }. |
| std::pair<KeySequence, bool> DeriveKeySequence( |
| const InverseKeymap& inverse_keymap, const std::string& text); |
| |
| } // namespace input |
| #endif // GARNET_BIN_UI_INPUT_INVERSE_KEYMAP_H_ |