input.cpp revision 682674154e3fe88f6061245145f934f25f1a2eb8
1a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn/*
2a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * Copyright (C) 2009 The Android Open Source Project
3a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn *
4a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * you may not use this file except in compliance with the License.
6a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * You may obtain a copy of the License at
7a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn *
8a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn *
10a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * See the License for the specific language governing permissions and
14a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn * limitations under the License.
15a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn */
16a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
17a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#define LOG_TAG "input"
18a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <utils/Log.h>
19a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
20a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <android/input.h>
21a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <ui/Input.h>
22a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <ui/InputTransport.h>
23682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn#include <utils/PollLoop.h>
24a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
25a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn#include <poll.h>
26a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
27a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornusing android::InputEvent;
28a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornusing android::KeyEvent;
29a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackbornusing android::MotionEvent;
30a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
312e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AInputEvent_getType(const AInputEvent* event) {
32a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const InputEvent*>(event)->getType();
33a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
34a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
352e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AInputEvent_getDeviceId(const AInputEvent* event) {
36a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const InputEvent*>(event)->getDeviceId();
37a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
38a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
392e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AInputEvent_getNature(const AInputEvent* event) {
40a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const InputEvent*>(event)->getNature();
41a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
42a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
432e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AKeyEvent_getAction(const AInputEvent* key_event) {
44a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getAction();
45a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
46a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
472e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AKeyEvent_getFlags(const AInputEvent* key_event) {
48a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getFlags();
49a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
50a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
512e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AKeyEvent_getKeyCode(const AInputEvent* key_event) {
52a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getKeyCode();
53a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
54a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
552e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AKeyEvent_getScanCode(const AInputEvent* key_event) {
56a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getScanCode();
57a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
58a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
592e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AKeyEvent_getMetaState(const AInputEvent* key_event) {
60a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getMetaState();
61a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
622e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AKeyEvent_getRepeatCount(const AInputEvent* key_event) {
63a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getRepeatCount();
64a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
65a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
662e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint64_t AKeyEvent_getDownTime(const AInputEvent* key_event) {
67a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getDownTime();
68a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
69a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
702e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint64_t AKeyEvent_getEventTime(const AInputEvent* key_event) {
71a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const KeyEvent*>(key_event)->getEventTime();
72a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
73a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
742e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AMotionEvent_getAction(const AInputEvent* motion_event) {
75a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getAction();
76a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
77a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
782e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AMotionEvent_getMetaState(const AInputEvent* motion_event) {
79a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getMetaState();
80a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
81a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
822e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AMotionEvent_getEdgeFlags(const AInputEvent* motion_event) {
83a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return reinterpret_cast<const MotionEvent*>(motion_event)->getEdgeFlags();
84a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
85a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
862e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint64_t AMotionEvent_getDownTime(const AInputEvent* motion_event) {
87a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getDownTime();
88a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
89a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
902e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint64_t AMotionEvent_getEventTime(const AInputEvent* motion_event) {
91a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getEventTime();
92a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
93a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
942e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getXOffset(const AInputEvent* motion_event) {
95a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getXOffset();
96a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
97a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
982e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getYOffset(const AInputEvent* motion_event) {
99a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getYOffset();
100a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
101a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1022e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getXPrecision(const AInputEvent* motion_event) {
103a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getXPrecision();
104a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
105a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1062e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getYPrecision(const AInputEvent* motion_event) {
107a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getYPrecision();
108a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
109a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1102e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornsize_t AMotionEvent_getPointerCount(const AInputEvent* motion_event) {
111a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getPointerCount();
112a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
113a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1142e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AMotionEvent_getPointerId(const AInputEvent* motion_event, size_t pointer_index) {
115a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getPointerId(pointer_index);
116a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
117a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1182e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getRawX(const AInputEvent* motion_event, size_t pointer_index) {
119a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getRawX(pointer_index);
120a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
121a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1222e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getRawY(const AInputEvent* motion_event, size_t pointer_index) {
123a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getRawY(pointer_index);
124a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
125a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1262e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getX(const AInputEvent* motion_event, size_t pointer_index) {
127a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getX(pointer_index);
128a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
129a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1302e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getY(const AInputEvent* motion_event, size_t pointer_index) {
131a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getY(pointer_index);
132a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
133a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1342e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getPressure(const AInputEvent* motion_event, size_t pointer_index) {
135a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getPressure(pointer_index);
136a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
137a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1382e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getSize(const AInputEvent* motion_event, size_t pointer_index) {
139a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getSize(pointer_index);
140a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
141a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1422e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornsize_t AMotionEvent_getHistorySize(const AInputEvent* motion_event) {
143a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistorySize();
144a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
145a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1462e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint64_t AMotionEvent_getHistoricalEventTime(AInputEvent* motion_event,
147a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        size_t history_index) {
148a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistoricalEventTime(
149a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            history_index);
150a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
151a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1522e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getHistoricalRawX(AInputEvent* motion_event, size_t pointer_index,
153a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        size_t history_index) {
154a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawX(
155a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            pointer_index, history_index);
156a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
157a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1582e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getHistoricalRawY(AInputEvent* motion_event, size_t pointer_index,
159a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        size_t history_index) {
160a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistoricalRawY(
161a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            pointer_index, history_index);
162a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
163a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1642e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getHistoricalX(AInputEvent* motion_event, size_t pointer_index,
165a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        size_t history_index) {
166a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistoricalX(
167a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            pointer_index, history_index);
168a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
169a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1702e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getHistoricalY(AInputEvent* motion_event, size_t pointer_index,
171a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        size_t history_index) {
172a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistoricalY(
173a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            pointer_index, history_index);
174a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
175a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1762e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getHistoricalPressure(AInputEvent* motion_event, size_t pointer_index,
177a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        size_t history_index) {
178a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistoricalPressure(
179a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            pointer_index, history_index);
180a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
181a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
1822e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornfloat AMotionEvent_getHistoricalSize(AInputEvent* motion_event, size_t pointer_index,
183a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        size_t history_index) {
184a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return static_cast<const MotionEvent*>(motion_event)->getHistoricalSize(
185a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn            pointer_index, history_index);
186a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
187a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
188682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornvoid AInputQueue_attachLooper(AInputQueue* queue, ALooper* looper,
189682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn        ALooper_callbackFunc callback, void* data) {
190682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    queue->setPollLoop(static_cast<android::PollLoop*>(looper));
191682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    ALooper_setCallback(looper, queue->getConsumer().getChannel()->getReceivePipeFd(),
192682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn            POLLIN, callback, data);
193682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn}
194682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn
195682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackbornvoid AInputQueue_detachLooper(AInputQueue* queue) {
196682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn    queue->getPollLoop()->removeCallback(
197682674154e3fe88f6061245145f934f25f1a2eb8Dianne Hackborn            queue->getConsumer().getChannel()->getReceivePipeFd());
198a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
199a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
2002e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint AInputQueue_hasEvents(AInputQueue* queue) {
201a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    struct pollfd pfd;
202a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
203a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    pfd.fd = queue->getConsumer().getChannel()->getReceivePipeFd();
204a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    pfd.events = POLLIN;
205a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    pfd.revents = 0;
206a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
207a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    int nfd = poll(&pfd, 1, 0);
208a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (nfd <= 0) return nfd;
209a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return pfd.revents == POLLIN ? 1 : -1;
210a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
211a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
2122e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornint32_t AInputQueue_getEvent(AInputQueue* queue, AInputEvent** outEvent) {
213a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    *outEvent = NULL;
214a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
215a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    int32_t res = queue->getConsumer().receiveDispatchSignal();
216a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (res != android::OK) {
217a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        LOGE("channel '%s' ~ Failed to receive dispatch signal.  status=%d",
218a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                queue->getConsumer().getChannel()->getName().string(), res);
219a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        return -1;
220a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
221a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
222a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    InputEvent* myEvent = NULL;
223a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    res = queue->consume(&myEvent);
224a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (res != android::OK) {
225a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        LOGW("channel '%s' ~ Failed to consume input event.  status=%d",
226a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                queue->getConsumer().getChannel()->getName().string(), res);
227a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        queue->getConsumer().sendFinishedSignal();
228a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        return -1;
229a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
230a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
231a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    *outEvent = myEvent;
232a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    return 0;
233a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
234a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn
2352e9f93e8db509d5236229dc8540e0904c5dbb9f5Dianne Hackbornvoid AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event,
236a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        int handled) {
2373c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    if (!handled && ((InputEvent*)event)->getType() == INPUT_EVENT_TYPE_KEY
2383c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn            && ((KeyEvent*)event)->hasDefaultAction()) {
2393c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        // The app didn't handle this, but it may have a default action
2403c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        // associated with it.  We need to hand this back to Java to be
2413c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        // executed.
2423c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        queue->doDefaultKey((KeyEvent*)event);
2433c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        return;
2443c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
2453c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
246a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    int32_t res = queue->getConsumer().sendFinishedSignal();
247a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    if (res != android::OK) {
248a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn        LOGW("Failed to send finished signal on channel '%s'.  status=%d",
249a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn                queue->getConsumer().getChannel()->getName().string(), res);
250a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn    }
251a95e4cb62f3642cb190d032dbf7dc40d9ecc6973Dianne Hackborn}
252