15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2008 The Android Open Source Project
35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License.
65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at
75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software
115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and
145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License.
155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#ifndef _LIBINPUT_KEY_CHARACTER_MAP_H
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define _LIBINPUT_KEY_CHARACTER_MAP_H
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <stdint.h>
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#if HAVE_ANDROID_OS
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <binder/IBinder.h>
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/Input.h>
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Errors.h>
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/KeyedVector.h>
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Tokenizer.h>
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/String8.h>
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Unicode.h>
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/RefBase.h>
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Describes a mapping from Android key codes to characters.
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Also specifies other functions of the keyboard such as the keyboard type
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * and key modifier semantics.
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * This object is immutable after it has been loaded.
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyCharacterMap : public RefBase {
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    enum KeyboardType {
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KEYBOARD_TYPE_UNKNOWN = 0,
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KEYBOARD_TYPE_NUMERIC = 1,
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KEYBOARD_TYPE_PREDICTIVE = 2,
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KEYBOARD_TYPE_ALPHA = 3,
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KEYBOARD_TYPE_FULL = 4,
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KEYBOARD_TYPE_SPECIAL_FUNCTION = 5,
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KEYBOARD_TYPE_OVERLAY = 6,
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    enum Format {
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // Base keyboard layout, may contain device-specific options, such as "type" declaration.
575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        FORMAT_BASE = 0,
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // Overlay keyboard layout, more restrictive, may be published by applications,
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // cannot override device-specific options.
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        FORMAT_OVERLAY = 1,
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        // Either base or overlay layout ok.
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        FORMAT_ANY = 2,
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    // Substitute key code and meta state for fallback action.
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    struct FallbackAction {
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t keyCode;
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t metaState;
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Loads a key character map from a file. */
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static status_t load(const String8& filename, Format format, sp<KeyCharacterMap>* outMap);
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Loads a key character map from its string contents. */
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static status_t loadContents(const String8& filename,
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const char* contents, Format format, sp<KeyCharacterMap>* outMap);
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Combines a base key character map and an overlay. */
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static sp<KeyCharacterMap> combine(const sp<KeyCharacterMap>& base,
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const sp<KeyCharacterMap>& overlay);
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Returns an empty key character map. */
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static sp<KeyCharacterMap> empty();
845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Gets the keyboard type. */
865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int32_t getKeyboardType() const;
875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Gets the primary character for this key as in the label physically printed on it.
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Returns 0 if none (eg. for non-printing keys). */
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    char16_t getDisplayLabel(int32_t keyCode) const;
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Gets the Unicode character for the number or symbol generated by the key
935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * when the keyboard is used as a dialing pad.
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Returns 0 if no number or symbol is generated.
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     */
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    char16_t getNumber(int32_t keyCode) const;
975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Gets the Unicode character generated by the key and meta key modifiers.
995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Returns 0 if no character is generated.
1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     */
1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    char16_t getCharacter(int32_t keyCode, int32_t metaState) const;
1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Gets the fallback action to use by default if the application does not
1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * handle the specified key.
1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Returns true if an action was available, false if none.
1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     */
1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool getFallbackAction(int32_t keyCode, int32_t metaState,
1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            FallbackAction* outFallbackAction) const;
1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Gets the first matching Unicode character that can be generated by the key,
1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * preferring the one with the specified meta key modifiers.
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * Returns 0 if no matching character is generated.
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     */
1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    char16_t getMatch(int32_t keyCode, const char16_t* chars,
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            size_t numChars, int32_t metaState) const;
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Gets a sequence of key events that could plausibly generate the specified
1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * character sequence.  Returns false if some of the characters cannot be generated.
1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     */
1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool getEvents(int32_t deviceId, const char16_t* chars, size_t numChars,
1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            Vector<KeyEvent>& outEvents) const;
1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Maps a scan code and usage code to a key code, in case this key map overrides
1245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * the mapping in some way. */
1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t mapKey(int32_t scanCode, int32_t usageCode, int32_t* outKeyCode) const;
1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#if HAVE_ANDROID_OS
1285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Reads a key map from a parcel. */
1295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static sp<KeyCharacterMap> readFromParcel(Parcel* parcel);
1305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Writes a key map to a parcel. */
1325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void writeToParcel(Parcel* parcel) const;
1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif
1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual ~KeyCharacterMap();
1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    struct Behavior {
1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Behavior();
1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Behavior(const Behavior& other);
1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        /* The next behavior in the list, or NULL if none. */
1445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Behavior* next;
1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        /* The meta key modifiers for this behavior. */
1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t metaState;
1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        /* The character to insert. */
1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        char16_t character;
1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        /* The fallback keycode if the key is not handled. */
1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t fallbackKeyCode;
1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    struct Key {
1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Key();
1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Key(const Key& other);
1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        ~Key();
1605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        /* The single character label printed on the key, or 0 if none. */
1625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        char16_t label;
1635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        /* The number or symbol character generated by the key, or 0 if none. */
1655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        char16_t number;
1665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        /* The list of key behaviors sorted from most specific to least specific
1685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown         * meta key binding. */
1695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Behavior* firstBehavior;
1705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
1715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    class Parser {
1735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        enum State {
1745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            STATE_TOP = 0,
1755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            STATE_KEY = 1,
1765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        };
1775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        enum {
1795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            PROPERTY_LABEL = 1,
1805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            PROPERTY_NUMBER = 2,
1815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            PROPERTY_META = 3,
1825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        };
1835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        struct Property {
1855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            inline Property(int32_t property = 0, int32_t metaState = 0) :
1865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                    property(property), metaState(metaState) { }
1875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t property;
1895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t metaState;
1905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        };
1915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        KeyCharacterMap* mMap;
1935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Tokenizer* mTokenizer;
1945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Format mFormat;
1955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        State mState;
1965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        int32_t mKeyCode;
1975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    public:
1995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        Parser(KeyCharacterMap* map, Tokenizer* tokenizer, Format format);
2005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        ~Parser();
2015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parse();
2025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    private:
2045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseType();
2055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseMap();
2065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseMapKey();
2075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseKey();
2085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseKeyProperty();
2095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t finishKey(Key* key);
2105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseModifier(const String8& token, int32_t* outMetaState);
2115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t parseCharacterLiteral(char16_t* outCharacter);
2125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    };
2135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static sp<KeyCharacterMap> sEmpty;
2155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyedVector<int32_t, Key*> mKeys;
2175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    int mType;
2185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyedVector<int32_t, int32_t> mKeysByScanCode;
2205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyedVector<int32_t, int32_t> mKeysByUsageCode;
2215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyCharacterMap();
2235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyCharacterMap(const KeyCharacterMap& other);
2245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool getKey(int32_t keyCode, const Key** outKey) const;
2265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool getKeyBehavior(int32_t keyCode, int32_t metaState,
2275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const Key** outKey, const Behavior** outBehavior) const;
2285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static bool matchesMetaState(int32_t eventMetaState, int32_t behaviorMetaState);
2295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool findKey(char16_t ch, int32_t* outKeyCode, int32_t* outMetaState) const;
2315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static status_t load(Tokenizer* tokenizer, Format format, sp<KeyCharacterMap>* outMap);
2335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static void addKey(Vector<KeyEvent>& outEvents,
2355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t deviceId, int32_t keyCode, int32_t metaState, bool down, nsecs_t time);
2365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static void addMetaKeys(Vector<KeyEvent>& outEvents,
2375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t deviceId, int32_t metaState, bool down, nsecs_t time,
2385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t* currentMetaState);
2395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static bool addSingleEphemeralMetaKey(Vector<KeyEvent>& outEvents,
2405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t deviceId, int32_t metaState, bool down, nsecs_t time,
2415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t keyCode, int32_t keyMetaState,
2425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t* currentMetaState);
2435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static void addDoubleEphemeralMetaKey(Vector<KeyEvent>& outEvents,
2445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t deviceId, int32_t metaState, bool down, nsecs_t time,
2455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t leftKeyCode, int32_t leftKeyMetaState,
2465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t rightKeyCode, int32_t rightKeyMetaState,
2475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t eitherKeyMetaState,
2485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t* currentMetaState);
2495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    static void addLockedMetaKey(Vector<KeyEvent>& outEvents,
2505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t deviceId, int32_t metaState, nsecs_t time,
2515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t keyCode, int32_t keyMetaState,
2525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            int32_t* currentMetaState);
2535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
2545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
2565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_KEY_CHARACTER_MAP_H
258