15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2010 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_KEYBOARD_H
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define _LIBINPUT_KEYBOARD_H
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/Input.h>
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/InputDevice.h>
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Errors.h>
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/String8.h>
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/PropertyMap.h>
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Device id of the built in keyboard. */
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    DEVICE_ID_BUILT_IN_KEYBOARD = 0,
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Device id of a generic virtual keyboard with a full layout that can be used
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * to synthesize key events. */
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    DEVICE_ID_VIRTUAL_KEYBOARD = -1,
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyLayoutMap;
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyCharacterMap;
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Loads the key layout map and key character map for a keyboard device.
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyMap {
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    String8 keyLayoutFile;
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    sp<KeyLayoutMap> keyLayoutMap;
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    String8 keyCharacterMapFile;
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    sp<KeyCharacterMap> keyCharacterMap;
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyMap();
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ~KeyMap();
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t load(const InputDeviceIdentifier& deviceIdenfier,
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const PropertyMap* deviceConfiguration);
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool haveKeyLayout() const {
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return !keyLayoutFile.isEmpty();
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool haveKeyCharacterMap() const {
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return !keyCharacterMapFile.isEmpty();
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool isComplete() const {
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return haveKeyLayout() && haveKeyCharacterMap();
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool probeKeyMap(const InputDeviceIdentifier& deviceIdentifier, const String8& name);
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t loadKeyLayout(const InputDeviceIdentifier& deviceIdentifier, const String8& name);
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t loadKeyCharacterMap(const InputDeviceIdentifier& deviceIdentifier,
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const String8& name);
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    String8 getPath(const InputDeviceIdentifier& deviceIdentifier,
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const String8& name, InputDeviceConfigurationFileType type);
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns true if the keyboard is eligible for use as a built-in keyboard.
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern bool isEligibleBuiltInKeyboard(const InputDeviceIdentifier& deviceIdentifier,
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        const PropertyMap* deviceConfiguration, const KeyMap* keyMap);
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Gets a key code by its short form label, eg. "HOME".
865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns 0 if unknown.
875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern int32_t getKeyCodeByLabel(const char* label);
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Gets a key flag by its short form label, eg. "WAKE".
925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns 0 if unknown.
935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern uint32_t getKeyFlagByLabel(const char* label);
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Gets a axis by its short form label, eg. "X".
985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns -1 if unknown.
995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern int32_t getAxisByLabel(const char* label);
1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Gets a axis label by its id.
1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns NULL if unknown.
1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern const char* getAxisLabel(int32_t axisId);
1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Updates a meta state field when a key is pressed or released.
1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern int32_t updateMetaState(int32_t keyCode, bool down, int32_t oldMetaState);
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns true if a key is a meta key like ALT or CAPS_LOCK.
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern bool isMetaKey(int32_t keyCode);
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_KEYBOARD_H
121