f4a4ec2063
Added more tests. Fixed a regression in Vector. Fixed bugs in pointer tracking. Fixed a starvation issue in PollLoop when setting or removing callbacks. Fixed a couple of policy nits. Modified the internal representation of MotionEvent to be more efficient and more consistent. Added code to skip/cancel virtual key processing when there are multiple pointers down. This helps to better disambiguate virtual key presses from stray touches (such as cheek presses). Change-Id: I2a7d2cce0195afb9125b23378baa94fd2fc6671c
254 lines
8.2 KiB
C++
254 lines
8.2 KiB
C++
//
|
|
// Copyright 2010 The Android Open Source Project
|
|
//
|
|
// Provides a pipe-based transport for native events in the NDK.
|
|
//
|
|
#define LOG_TAG "Input"
|
|
|
|
//#define LOG_NDEBUG 0
|
|
|
|
#include <ui/Input.h>
|
|
|
|
namespace android {
|
|
|
|
// class InputEvent
|
|
|
|
void InputEvent::initialize(int32_t deviceId, int32_t nature) {
|
|
mDeviceId = deviceId;
|
|
mNature = nature;
|
|
}
|
|
|
|
// class KeyEvent
|
|
|
|
void KeyEvent::initialize(
|
|
int32_t deviceId,
|
|
int32_t nature,
|
|
int32_t action,
|
|
int32_t flags,
|
|
int32_t keyCode,
|
|
int32_t scanCode,
|
|
int32_t metaState,
|
|
int32_t repeatCount,
|
|
nsecs_t downTime,
|
|
nsecs_t eventTime) {
|
|
InputEvent::initialize(deviceId, nature);
|
|
mAction = action;
|
|
mFlags = flags;
|
|
mKeyCode = keyCode;
|
|
mScanCode = scanCode;
|
|
mMetaState = metaState;
|
|
mRepeatCount = repeatCount;
|
|
mDownTime = downTime;
|
|
mEventTime = eventTime;
|
|
}
|
|
|
|
// class MotionEvent
|
|
|
|
void MotionEvent::initialize(
|
|
int32_t deviceId,
|
|
int32_t nature,
|
|
int32_t action,
|
|
int32_t edgeFlags,
|
|
int32_t metaState,
|
|
float xOffset,
|
|
float yOffset,
|
|
float xPrecision,
|
|
float yPrecision,
|
|
nsecs_t downTime,
|
|
nsecs_t eventTime,
|
|
size_t pointerCount,
|
|
const int32_t* pointerIds,
|
|
const PointerCoords* pointerCoords) {
|
|
InputEvent::initialize(deviceId, nature);
|
|
mAction = action;
|
|
mEdgeFlags = edgeFlags;
|
|
mMetaState = metaState;
|
|
mXOffset = xOffset;
|
|
mYOffset = yOffset;
|
|
mXPrecision = xPrecision;
|
|
mYPrecision = yPrecision;
|
|
mDownTime = downTime;
|
|
mPointerIds.clear();
|
|
mPointerIds.appendArray(pointerIds, pointerCount);
|
|
mSampleEventTimes.clear();
|
|
mSamplePointerCoords.clear();
|
|
addSample(eventTime, pointerCoords);
|
|
}
|
|
|
|
void MotionEvent::addSample(
|
|
int64_t eventTime,
|
|
const PointerCoords* pointerCoords) {
|
|
mSampleEventTimes.push(eventTime);
|
|
mSamplePointerCoords.appendArray(pointerCoords, getPointerCount());
|
|
}
|
|
|
|
void MotionEvent::offsetLocation(float xOffset, float yOffset) {
|
|
mXOffset += xOffset;
|
|
mYOffset += yOffset;
|
|
}
|
|
|
|
} // namespace android
|
|
|
|
// NDK APIs
|
|
|
|
using android::InputEvent;
|
|
using android::KeyEvent;
|
|
using android::MotionEvent;
|
|
|
|
int32_t input_event_get_type(const input_event_t* event) {
|
|
return reinterpret_cast<const InputEvent*>(event)->getType();
|
|
}
|
|
|
|
int32_t input_event_get_device_id(const input_event_t* event) {
|
|
return reinterpret_cast<const InputEvent*>(event)->getDeviceId();
|
|
}
|
|
|
|
int32_t input_event_get_nature(const input_event_t* event) {
|
|
return reinterpret_cast<const InputEvent*>(event)->getNature();
|
|
}
|
|
|
|
int32_t key_event_get_action(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getAction();
|
|
}
|
|
|
|
int32_t key_event_get_flags(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getFlags();
|
|
}
|
|
|
|
int32_t key_event_get_key_code(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getKeyCode();
|
|
}
|
|
|
|
int32_t key_event_get_scan_code(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getScanCode();
|
|
}
|
|
|
|
int32_t key_event_get_meta_state(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getMetaState();
|
|
}
|
|
int32_t key_event_get_repeat_count(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getRepeatCount();
|
|
}
|
|
|
|
int64_t key_event_get_down_time(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getDownTime();
|
|
}
|
|
|
|
int64_t key_event_get_event_time(const input_event_t* key_event) {
|
|
return reinterpret_cast<const KeyEvent*>(key_event)->getEventTime();
|
|
}
|
|
|
|
int32_t motion_event_get_action(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getAction();
|
|
}
|
|
|
|
int32_t motion_event_get_meta_state(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getMetaState();
|
|
}
|
|
|
|
int32_t motion_event_get_edge_flags(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getEdgeFlags();
|
|
}
|
|
|
|
int64_t motion_event_get_down_time(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getDownTime();
|
|
}
|
|
|
|
int64_t motion_event_get_event_time(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getEventTime();
|
|
}
|
|
|
|
float motion_event_get_x_offset(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getXOffset();
|
|
}
|
|
|
|
float motion_event_get_y_offset(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getYOffset();
|
|
}
|
|
|
|
float motion_event_get_x_precision(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getXPrecision();
|
|
}
|
|
|
|
float motion_event_get_y_precision(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getYPrecision();
|
|
}
|
|
|
|
size_t motion_event_get_pointer_count(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getPointerCount();
|
|
}
|
|
|
|
int32_t motion_event_get_pointer_id(const input_event_t* motion_event, size_t pointer_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getPointerId(pointer_index);
|
|
}
|
|
|
|
float motion_event_get_raw_x(const input_event_t* motion_event, size_t pointer_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getRawX(pointer_index);
|
|
}
|
|
|
|
float motion_event_get_raw_y(const input_event_t* motion_event, size_t pointer_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getRawY(pointer_index);
|
|
}
|
|
|
|
float motion_event_get_x(const input_event_t* motion_event, size_t pointer_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getX(pointer_index);
|
|
}
|
|
|
|
float motion_event_get_y(const input_event_t* motion_event, size_t pointer_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getY(pointer_index);
|
|
}
|
|
|
|
float motion_event_get_pressure(const input_event_t* motion_event, size_t pointer_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getPressure(pointer_index);
|
|
}
|
|
|
|
float motion_event_get_size(const input_event_t* motion_event, size_t pointer_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getSize(pointer_index);
|
|
}
|
|
|
|
size_t motion_event_get_history_size(const input_event_t* motion_event) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistorySize();
|
|
}
|
|
|
|
int64_t motion_event_get_historical_event_time(input_event_t* motion_event,
|
|
size_t history_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistoricalEventTime(
|
|
history_index);
|
|
}
|
|
|
|
float motion_event_get_historical_raw_x(input_event_t* motion_event, size_t pointer_index,
|
|
size_t history_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistoricalRawX(
|
|
pointer_index, history_index);
|
|
}
|
|
|
|
float motion_event_get_historical_raw_y(input_event_t* motion_event, size_t pointer_index,
|
|
size_t history_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistoricalRawY(
|
|
pointer_index, history_index);
|
|
}
|
|
|
|
float motion_event_get_historical_x(input_event_t* motion_event, size_t pointer_index,
|
|
size_t history_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistoricalX(
|
|
pointer_index, history_index);
|
|
}
|
|
|
|
float motion_event_get_historical_y(input_event_t* motion_event, size_t pointer_index,
|
|
size_t history_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistoricalY(
|
|
pointer_index, history_index);
|
|
}
|
|
|
|
float motion_event_get_historical_pressure(input_event_t* motion_event, size_t pointer_index,
|
|
size_t history_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistoricalPressure(
|
|
pointer_index, history_index);
|
|
}
|
|
|
|
float motion_event_get_historical_size(input_event_t* motion_event, size_t pointer_index,
|
|
size_t history_index) {
|
|
return reinterpret_cast<const MotionEvent*>(motion_event)->getHistoricalSize(
|
|
pointer_index, history_index);
|
|
}
|