blob: 89d53e279057167ec856f34bd23309383db8c306 [file] [log] [blame]
Dianne Hackborna95e4cb2010-06-18 18:09:33 -07001/*
2 * Copyright (C) 2009 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#define LOG_TAG "input"
18#include <utils/Log.h>
19
20#include <android/input.h>
21#include <ui/Input.h>
22#include <ui/InputTransport.h>
Dianne Hackborn68267412010-07-02 18:52:01 -070023#include <utils/PollLoop.h>
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070024
25#include <poll.h>
26
27using android::InputEvent;
28using android::KeyEvent;
29using android::MotionEvent;
30
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070031int32_t AInputEvent_getType(const AInputEvent* event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070032 return static_cast<const InputEvent*>(event)->getType();
33}
34
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070035int32_t AInputEvent_getDeviceId(const AInputEvent* event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070036 return static_cast<const InputEvent*>(event)->getDeviceId();
37}
38
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070039int32_t AInputEvent_getNature(const AInputEvent* event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070040 return static_cast<const InputEvent*>(event)->getNature();
41}
42
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070043int32_t AKeyEvent_getAction(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070044 return static_cast<const KeyEvent*>(key_event)->getAction();
45}
46
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070047int32_t AKeyEvent_getFlags(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070048 return static_cast<const KeyEvent*>(key_event)->getFlags();
49}
50
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070051int32_t AKeyEvent_getKeyCode(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070052 return static_cast<const KeyEvent*>(key_event)->getKeyCode();
53}
54
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070055int32_t AKeyEvent_getScanCode(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070056 return static_cast<const KeyEvent*>(key_event)->getScanCode();
57}
58
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070059int32_t AKeyEvent_getMetaState(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070060 return static_cast<const KeyEvent*>(key_event)->getMetaState();
61}
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070062int32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070063 return static_cast<const KeyEvent*>(key_event)->getRepeatCount();
64}
65
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070066int64_t AKeyEvent_getDownTime(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070067 return static_cast<const KeyEvent*>(key_event)->getDownTime();
68}
69
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070070int64_t AKeyEvent_getEventTime(const AInputEvent* key_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070071 return static_cast<const KeyEvent*>(key_event)->getEventTime();
72}
73
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070074int32_t AMotionEvent_getAction(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070075 return static_cast<const MotionEvent*>(motion_event)->getAction();
76}
77
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070078int32_t AMotionEvent_getMetaState(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070079 return static_cast<const MotionEvent*>(motion_event)->getMetaState();
80}
81
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070082int32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070083 return reinterpret_cast<const MotionEvent*>(motion_event)->getEdgeFlags();
84}
85
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070086int64_t AMotionEvent_getDownTime(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070087 return static_cast<const MotionEvent*>(motion_event)->getDownTime();
88}
89
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070090int64_t AMotionEvent_getEventTime(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070091 return static_cast<const MotionEvent*>(motion_event)->getEventTime();
92}
93
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070094float AMotionEvent_getXOffset(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070095 return static_cast<const MotionEvent*>(motion_event)->getXOffset();
96}
97
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -070098float AMotionEvent_getYOffset(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -070099 return static_cast<const MotionEvent*>(motion_event)->getYOffset();
100}
101
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700102float AMotionEvent_getXPrecision(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700103 return static_cast<const MotionEvent*>(motion_event)->getXPrecision();
104}
105
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700106float AMotionEvent_getYPrecision(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700107 return static_cast<const MotionEvent*>(motion_event)->getYPrecision();
108}
109
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700110size_t AMotionEvent_getPointerCount(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700111 return static_cast<const MotionEvent*>(motion_event)->getPointerCount();
112}
113
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700114int32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700115 return static_cast<const MotionEvent*>(motion_event)->getPointerId(pointer_index);
116}
117
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700118float AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700119 return static_cast<const MotionEvent*>(motion_event)->getRawX(pointer_index);
120}
121
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700122float AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700123 return static_cast<const MotionEvent*>(motion_event)->getRawY(pointer_index);
124}
125
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700126float AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700127 return static_cast<const MotionEvent*>(motion_event)->getX(pointer_index);
128}
129
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700130float AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700131 return static_cast<const MotionEvent*>(motion_event)->getY(pointer_index);
132}
133
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700134float AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700135 return static_cast<const MotionEvent*>(motion_event)->getPressure(pointer_index);
136}
137
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700138float AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700139 return static_cast<const MotionEvent*>(motion_event)->getSize(pointer_index);
140}
141
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700142size_t AMotionEvent_getHistorySize(const AInputEvent* motion_event) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700143 return static_cast<const MotionEvent*>(motion_event)->getHistorySize();
144}
145
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700146int64_t AMotionEvent_getHistoricalEventTime(AInputEvent* motion_event,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700147 size_t history_index) {
148 return static_cast<const MotionEvent*>(motion_event)->getHistoricalEventTime(
149 history_index);
150}
151
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700152float AMotionEvent_getHistoricalRawX(AInputEvent* motion_event, size_t pointer_index,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700153 size_t history_index) {
154 return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawX(
155 pointer_index, history_index);
156}
157
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700158float AMotionEvent_getHistoricalRawY(AInputEvent* motion_event, size_t pointer_index,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700159 size_t history_index) {
160 return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawY(
161 pointer_index, history_index);
162}
163
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700164float AMotionEvent_getHistoricalX(AInputEvent* motion_event, size_t pointer_index,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700165 size_t history_index) {
166 return static_cast<const MotionEvent*>(motion_event)->getHistoricalX(
167 pointer_index, history_index);
168}
169
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700170float AMotionEvent_getHistoricalY(AInputEvent* motion_event, size_t pointer_index,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700171 size_t history_index) {
172 return static_cast<const MotionEvent*>(motion_event)->getHistoricalY(
173 pointer_index, history_index);
174}
175
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700176float AMotionEvent_getHistoricalPressure(AInputEvent* motion_event, size_t pointer_index,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700177 size_t history_index) {
178 return static_cast<const MotionEvent*>(motion_event)->getHistoricalPressure(
179 pointer_index, history_index);
180}
181
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700182float AMotionEvent_getHistoricalSize(AInputEvent* motion_event, size_t pointer_index,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700183 size_t history_index) {
184 return static_cast<const MotionEvent*>(motion_event)->getHistoricalSize(
185 pointer_index, history_index);
186}
187
Dianne Hackborn68267412010-07-02 18:52:01 -0700188void AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
Dianne Hackborn85448bb2010-07-07 14:27:31 -0700189 ALooper_callbackFunc* callback, void* data) {
Dianne Hackborn68267412010-07-02 18:52:01 -0700190 queue->setPollLoop(static_cast<android::PollLoop*>(looper));
Dianne Hackborn85448bb2010-07-07 14:27:31 -0700191 ALooper_addFd(looper, queue->getConsumer().getChannel()->getReceivePipeFd(),
Dianne Hackborn68267412010-07-02 18:52:01 -0700192 POLLIN, callback, data);
193}
194
195void AInputQueue_detachLooper(AInputQueue* queue) {
196 queue->getPollLoop()->removeCallback(
197 queue->getConsumer().getChannel()->getReceivePipeFd());
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700198}
199
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700200int AInputQueue_hasEvents(AInputQueue* queue) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700201 struct pollfd pfd;
202
203 pfd.fd = queue->getConsumer().getChannel()->getReceivePipeFd();
204 pfd.events = POLLIN;
205 pfd.revents = 0;
206
207 int nfd = poll(&pfd, 1, 0);
208 if (nfd <= 0) return nfd;
209 return pfd.revents == POLLIN ? 1 : -1;
210}
211
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700212int32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent) {
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700213 *outEvent = NULL;
214
215 int32_t res = queue->getConsumer().receiveDispatchSignal();
216 if (res != android::OK) {
217 LOGE("channel '%s' ~ Failed to receive dispatch signal. status=%d",
218 queue->getConsumer().getChannel()->getName().string(), res);
219 return -1;
220 }
221
222 InputEvent* myEvent = NULL;
223 res = queue->consume(&myEvent);
224 if (res != android::OK) {
225 LOGW("channel '%s' ~ Failed to consume input event. status=%d",
226 queue->getConsumer().getChannel()->getName().string(), res);
227 queue->getConsumer().sendFinishedSignal();
228 return -1;
229 }
230
231 *outEvent = myEvent;
232 return 0;
233}
234
Dianne Hackborn2e9f93e2010-06-28 15:27:30 -0700235void AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event,
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700236 int handled) {
Dianne Hackborn3c80a4a2010-06-29 19:20:40 -0700237 if (!handled && ((InputEvent*)event)->getType() == INPUT_EVENT_TYPE_KEY
238 && ((KeyEvent*)event)->hasDefaultAction()) {
239 // The app didn't handle this, but it may have a default action
240 // associated with it. We need to hand this back to Java to be
241 // executed.
242 queue->doDefaultKey((KeyEvent*)event);
243 return;
244 }
245
Dianne Hackborna95e4cb2010-06-18 18:09:33 -0700246 int32_t res = queue->getConsumer().sendFinishedSignal();
247 if (res != android::OK) {
248 LOGW("Failed to send finished signal on channel '%s'. status=%d",
249 queue->getConsumer().getChannel()->getName().string(), res);
250 }
251}