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_LAYOUT_MAP_H 185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#define _LIBINPUT_KEY_LAYOUT_MAP_H 195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <stdint.h> 215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Errors.h> 225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/KeyedVector.h> 235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Tokenizer.h> 245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/RefBase.h> 255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android { 275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownstruct AxisInfo { 295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown enum Mode { 305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Axis value is reported directly. 315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown MODE_NORMAL = 0, 325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Axis value should be inverted before reporting. 335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown MODE_INVERT = 1, 345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Axis value should be split into two axes 355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown MODE_SPLIT = 2, 365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Axis mode. 395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Mode mode; 405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Axis id. 425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // When split, this is the axis used for values smaller than the split position. 435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t axis; 445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // When split, this is the axis used for values after higher than the split position. 465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t highAxis; 475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // The split value, or 0 if not split. 495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t splitValue; 505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // The flat value, or -1 if none. 525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t flatOverride; 535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown AxisInfo() : mode(MODE_NORMAL), axis(-1), highAxis(-1), splitValue(0), flatOverride(-1) { 555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown } 565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/** 595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Describes a mapping from keyboard scan codes and joystick axes to Android key codes and axes. 605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * This object is immutable after it has been loaded. 625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass KeyLayoutMap : public RefBase { 645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownpublic: 655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown static status_t load(const String8& filename, sp<KeyLayoutMap>* outMap); 665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t mapKey(int32_t scanCode, int32_t usageCode, 685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t* outKeyCode, uint32_t* outFlags) const; 695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t findScanCodesForKey(int32_t keyCode, Vector<int32_t>* outScanCodes) const; 7074bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright status_t findScanCodeForLed(int32_t ledCode, int32_t* outScanCode) const; 7174bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright status_t findUsageCodeForLed(int32_t ledCode, int32_t* outUsageCode) const; 725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t mapAxis(int32_t scanCode, AxisInfo* outAxisInfo) const; 745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected: 765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown virtual ~KeyLayoutMap(); 775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprivate: 795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown struct Key { 805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown int32_t keyCode; 815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown uint32_t flags; 825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 8474bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright struct Led { 8574bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright int32_t ledCode; 8674bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright }; 8774bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright 8874bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright 895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown KeyedVector<int32_t, Key> mKeysByScanCode; 905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown KeyedVector<int32_t, Key> mKeysByUsageCode; 915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown KeyedVector<int32_t, AxisInfo> mAxes; 9274bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright KeyedVector<int32_t, Led> mLedsByScanCode; 9374bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright KeyedVector<int32_t, Led> mLedsByUsageCode; 945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown KeyLayoutMap(); 965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown const Key* getKey(int32_t scanCode, int32_t usageCode) const; 985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown class Parser { 1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown KeyLayoutMap* mMap; 1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Tokenizer* mTokenizer; 1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown public: 1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Parser(KeyLayoutMap* map, Tokenizer* tokenizer); 1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ~Parser(); 1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t parse(); 1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown private: 1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t parseKey(); 1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown status_t parseAxis(); 11174bdd2e7ceabd3c9e74ccf7c2e6bd3dae27ca497Michael Wright status_t parseLed(); 1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown }; 1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android 1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#endif // _LIBINPUT_KEY_LAYOUT_MAP_H 118