Keyboard.h revision 5912f95d26f77d2b6df13e1f2672e48e3f9b871c
13399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi/*
23399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Copyright (C) 2010 The Android Open Source Project
33399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *
43399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Licensed under the Apache License, Version 2.0 (the "License");
53399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * you may not use this file except in compliance with the License.
63399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * You may obtain a copy of the License at
73399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *
83399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *      http://www.apache.org/licenses/LICENSE-2.0
93399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi *
103399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * Unless required by applicable law or agreed to in writing, software
113399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * distributed under the License is distributed on an "AS IS" BASIS,
123399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * See the License for the specific language governing permissions and
143399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi * limitations under the License.
153399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi */
163399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
17bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam#ifndef _LIBINPUT_KEYBOARD_H
180c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#define _LIBINPUT_KEYBOARD_H
193399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
203399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <input/Input.h>
213399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <input/InputDevice.h>
223399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi#include <utils/Errors.h>
230c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <utils/String8.h>
240c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#include <utils/PropertyMap.h>
253399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
2688c3c4acb13a93209b3572fecd585099defec184Mathias Agopiannamespace android {
2788c3c4acb13a93209b3572fecd585099defec184Mathias Agopian
281a2fafbaa36390a06cc9a066fcbe147c8c47ea77Pannag Sanketienum {
290c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    /* Device id of the built in keyboard. */
303399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    DEVICE_ID_BUILT_IN_KEYBOARD = 0,
313399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
321a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    /* Device id of a generic virtual keyboard with a full layout that can be used
33df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian     * to synthesize key events. */
34df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian    DEVICE_ID_VIRTUAL_KEYBOARD = -1,
35df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian};
363399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
373399b7267185646c69b04352211fca4fad9d7547Pannag Sanketiclass KeyLayoutMap;
383399b7267185646c69b04352211fca4fad9d7547Pannag Sanketiclass KeyCharacterMap;
393399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
40f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong/**
410c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Loads the key layout map and key character map for a keyboard device.
423399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi */
433399b7267185646c69b04352211fca4fad9d7547Pannag Sanketiclass KeyMap {
443399b7267185646c69b04352211fca4fad9d7547Pannag Sanketipublic:
453399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    String8 keyLayoutFile;
463399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    sp<KeyLayoutMap> keyLayoutMap;
473399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi
483399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    String8 keyCharacterMapFile;
493399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    sp<KeyCharacterMap> keyCharacterMap;
500c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
513399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    KeyMap();
523399b7267185646c69b04352211fca4fad9d7547Pannag Sanketi    ~KeyMap();
530c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
540c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    status_t load(const InputDeviceIdentifier& deviceIdenfier,
550c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            const PropertyMap* deviceConfiguration);
560c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
570c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    inline bool haveKeyLayout() const {
580c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return !keyLayoutFile.isEmpty();
590c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
600c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
610c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    inline bool haveKeyCharacterMap() const {
620c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return !keyCharacterMapFile.isEmpty();
633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    }
640c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
650c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    inline bool isComplete() const {
660c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        return haveKeyLayout() && haveKeyCharacterMap();
670c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    }
680c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
690c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiprivate:
700c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    bool probeKeyMap(const InputDeviceIdentifier& deviceIdentifier, const String8& name);
710c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    status_t loadKeyLayout(const InputDeviceIdentifier& deviceIdentifier, const String8& name);
720c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    status_t loadKeyCharacterMap(const InputDeviceIdentifier& deviceIdentifier,
730c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            const String8& name);
740c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi    String8 getPath(const InputDeviceIdentifier& deviceIdentifier,
750c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi            const String8& name, InputDeviceConfigurationFileType type);
760c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi};
770c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
780c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/**
790c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Returns true if the keyboard is eligible for use as a built-in keyboard.
800c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi */
810c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiextern bool isEligibleBuiltInKeyboard(const InputDeviceIdentifier& deviceIdentifier,
820c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi        const PropertyMap* deviceConfiguration, const KeyMap* keyMap);
830c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
840c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/**
850c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Gets a key code by its short form label, eg. "HOME".
860c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Returns 0 if unknown.
870c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi */
880c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiextern int32_t getKeyCodeByLabel(const char* label);
890c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
900c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/**
910c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Gets a key flag by its short form label, eg. "WAKE".
920c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Returns 0 if unknown.
930c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi */
940c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiextern uint32_t getKeyFlagByLabel(const char* label);
95a6195decfe4f9021bbbd7deb050495c33371366bJeff Brown
960c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/**
970c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Gets a axis by its short form label, eg. "X".
980c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Returns -1 if unknown.
990c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi */
1000c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiextern int32_t getAxisByLabel(const char* label);
1010c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1020c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/**
1030c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Gets a axis label by its id.
1040c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Returns NULL if unknown.
1050c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi */
1060c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiextern const char* getAxisLabel(int32_t axisId);
1070c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1080c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi/**
1090c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi * Updates a meta state field when a key is pressed or released.
1100c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi */
1113856b090cd04ba5dd4a59a12430ed724d5995909Steve Blockextern int32_t updateMetaState(int32_t keyCode, bool down, int32_t oldMetaState);
1128ba01021b573889802e67e029225a96f0dfa471aAndy McFadden
113bdddc659a941afdb7f4958f582c6901c07246097Daniel Lam/**
1141a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian * Returns true if a key is a meta key like ALT or CAPS_LOCK.
11521fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi */
1160c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketiextern bool isMetaKey(int32_t keyCode);
11721fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi
11821fcf0830c8b4fb544a09467bc96a8d0463ad966Pannag Sanketi} // namespace android
1190c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi
1200c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi#endif // _LIBINPUT_KEYBOARD_H
1210c5c7d2b119d2350c186ae9902919bcf28c3e277Pannag Sanketi