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>
22872db4f11e407accccba9d37c335ef7e3597eba4Michael Wright#include <input/InputEventLabels.h>
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Errors.h>
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/String8.h>
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/PropertyMap.h>
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownenum {
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Device id of the built in keyboard. */
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    DEVICE_ID_BUILT_IN_KEYBOARD = 0,
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    /* Device id of a generic virtual keyboard with a full layout that can be used
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown     * to synthesize key events. */
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    DEVICE_ID_VIRTUAL_KEYBOARD = -1,
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyLayoutMap;
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyCharacterMap;
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Loads the key layout map and key character map for a keyboard device.
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyMap {
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic:
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    String8 keyLayoutFile;
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    sp<KeyLayoutMap> keyLayoutMap;
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    String8 keyCharacterMapFile;
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    sp<KeyCharacterMap> keyCharacterMap;
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyMap();
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ~KeyMap();
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t load(const InputDeviceIdentifier& deviceIdenfier,
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const PropertyMap* deviceConfiguration);
575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool haveKeyLayout() const {
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return !keyLayoutFile.isEmpty();
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool haveKeyCharacterMap() const {
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return !keyCharacterMapFile.isEmpty();
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    inline bool isComplete() const {
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        return haveKeyLayout() && haveKeyCharacterMap();
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate:
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool probeKeyMap(const InputDeviceIdentifier& deviceIdentifier, const String8& name);
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t loadKeyLayout(const InputDeviceIdentifier& deviceIdentifier, const String8& name);
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t loadKeyCharacterMap(const InputDeviceIdentifier& deviceIdentifier,
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const String8& name);
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    String8 getPath(const InputDeviceIdentifier& deviceIdentifier,
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            const String8& name, InputDeviceConfigurationFileType type);
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns true if the keyboard is eligible for use as a built-in keyboard.
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern bool isEligibleBuiltInKeyboard(const InputDeviceIdentifier& deviceIdentifier,
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        const PropertyMap* deviceConfiguration, const KeyMap* keyMap);
845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Updates a meta state field when a key is pressed or released.
875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern int32_t updateMetaState(int32_t keyCode, bool down, int32_t oldMetaState);
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/**
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Returns true if a key is a meta key like ALT or CAPS_LOCK.
925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownextern bool isMetaKey(int32_t keyCode);
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_KEYBOARD_H
98