• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _UI_INPUTREADER_KEYBOARD_INPUT_MAPPER_H
18 #define _UI_INPUTREADER_KEYBOARD_INPUT_MAPPER_H
19 
20 #include "InputMapper.h"
21 
22 namespace android {
23 
24 class KeyboardInputMapper : public InputMapper {
25 public:
26     KeyboardInputMapper(InputDeviceContext& deviceContext, uint32_t source, int32_t keyboardType);
27     virtual ~KeyboardInputMapper();
28 
29     virtual uint32_t getSources() const override;
30     virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo) override;
31     virtual void dump(std::string& dump) override;
32     virtual void configure(nsecs_t when, const InputReaderConfiguration* config,
33                            uint32_t changes) override;
34     virtual void reset(nsecs_t when) override;
35     virtual void process(const RawEvent* rawEvent) override;
36 
37     virtual int32_t getKeyCodeState(uint32_t sourceMask, int32_t keyCode) override;
38     virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode) override;
39     virtual bool markSupportedKeyCodes(uint32_t sourceMask, size_t numCodes,
40                                        const int32_t* keyCodes, uint8_t* outFlags) override;
41     virtual int32_t getKeyCodeForKeyLocation(int32_t locationKeyCode) const override;
42 
43     virtual int32_t getMetaState() override;
44     virtual bool updateMetaState(int32_t keyCode) override;
45     virtual std::optional<int32_t> getAssociatedDisplayId() override;
46     virtual void updateLedState(bool reset);
47 
48 private:
49     // The current viewport.
50     std::optional<DisplayViewport> mViewport;
51 
52     struct KeyDown {
53         int32_t keyCode;
54         int32_t scanCode;
55     };
56 
57     uint32_t mSource;
58     int32_t mKeyboardType;
59 
60     std::vector<KeyDown> mKeyDowns; // keys that are down
61     int32_t mMetaState;
62     nsecs_t mDownTime; // time of most recent key down
63 
64     int32_t mCurrentHidUsage; // most recent HID usage seen this packet, or 0 if none
65 
66     struct LedState {
67         bool avail; // led is available
68         bool on;    // we think the led is currently on
69     };
70     LedState mCapsLockLedState;
71     LedState mNumLockLedState;
72     LedState mScrollLockLedState;
73 
74     // Immutable configuration parameters.
75     struct Parameters {
76         bool orientationAware;
77         bool handlesKeyRepeat;
78         bool doNotWakeByDefault;
79     } mParameters;
80 
81     void configureParameters();
82     void dumpParameters(std::string& dump);
83 
84     int32_t getOrientation();
85     int32_t getDisplayId();
86 
87     bool isKeyboardOrGamepadKey(int32_t scanCode);
88     bool isMediaKey(int32_t keyCode);
89 
90     void processKey(nsecs_t when, nsecs_t readTime, bool down, int32_t scanCode, int32_t usageCode);
91 
92     bool updateMetaStateIfNeeded(int32_t keyCode, bool down);
93 
94     ssize_t findKeyDown(int32_t scanCode);
95 
96     void resetLedState();
97     void initializeLedState(LedState& ledState, int32_t led);
98     void updateLedStateForModifier(LedState& ledState, int32_t led, int32_t modifier, bool reset);
99     std::optional<DisplayViewport> findViewport(nsecs_t when,
100                                                 const InputReaderConfiguration* config);
101 };
102 
103 } // namespace android
104 
105 #endif // _UI_INPUTREADER_KEYBOARD_INPUT_MAPPER_H