am ddcb543a: Merge "Fix native input dispatch in the emulator." into gingerbread
Merge commit 'ddcb543ac8d9615ea78fbf8341949f54d86e6fbc' into gingerbread-plus-aosp * commit 'ddcb543ac8d9615ea78fbf8341949f54d86e6fbc': Fix native input dispatch in the emulator.
This commit is contained in:
@@ -53,6 +53,8 @@ extern int32_t rotateKeyCode(int32_t keyCode, int32_t orientation);
|
|||||||
*/
|
*/
|
||||||
struct InputDevice {
|
struct InputDevice {
|
||||||
struct AbsoluteAxisInfo {
|
struct AbsoluteAxisInfo {
|
||||||
|
bool valid; // set to true if axis parameters are known, false otherwise
|
||||||
|
|
||||||
int32_t minValue; // minimum value
|
int32_t minValue; // minimum value
|
||||||
int32_t maxValue; // maximum value
|
int32_t maxValue; // maximum value
|
||||||
int32_t range; // range of values, equal to maxValue - minValue
|
int32_t range; // range of values, equal to maxValue - minValue
|
||||||
@@ -272,9 +274,16 @@ struct InputDevice {
|
|||||||
} jumpyTouchFilter;
|
} jumpyTouchFilter;
|
||||||
|
|
||||||
struct Precalculated {
|
struct Precalculated {
|
||||||
|
int32_t xOrigin;
|
||||||
float xScale;
|
float xScale;
|
||||||
|
|
||||||
|
int32_t yOrigin;
|
||||||
float yScale;
|
float yScale;
|
||||||
|
|
||||||
|
int32_t pressureOrigin;
|
||||||
float pressureScale;
|
float pressureScale;
|
||||||
|
|
||||||
|
int32_t sizeOrigin;
|
||||||
float sizeScale;
|
float sizeScale;
|
||||||
} precalculated;
|
} precalculated;
|
||||||
|
|
||||||
|
|||||||
@@ -232,6 +232,9 @@ void InputDispatcher::processConfigurationChangedLockedInterruptible(
|
|||||||
LOGD("processConfigurationChanged - eventTime=%lld", entry->eventTime);
|
LOGD("processConfigurationChanged - eventTime=%lld", entry->eventTime);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Reset key repeating in case a keyboard device was added or removed or something.
|
||||||
|
resetKeyRepeatLocked();
|
||||||
|
|
||||||
mLock.unlock();
|
mLock.unlock();
|
||||||
|
|
||||||
mPolicy->notifyConfigurationChanged(entry->eventTime);
|
mPolicy->notifyConfigurationChanged(entry->eventTime);
|
||||||
|
|||||||
@@ -387,6 +387,11 @@ void InputDevice::TouchScreenState::calculatePointerIds() {
|
|||||||
* points has moved more than a screen height from the last position,
|
* points has moved more than a screen height from the last position,
|
||||||
* then drop it. */
|
* then drop it. */
|
||||||
bool InputDevice::TouchScreenState::applyBadTouchFilter() {
|
bool InputDevice::TouchScreenState::applyBadTouchFilter() {
|
||||||
|
// This hack requires valid axis parameters.
|
||||||
|
if (! parameters.yAxis.valid) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t pointerCount = currentTouch.pointerCount;
|
uint32_t pointerCount = currentTouch.pointerCount;
|
||||||
|
|
||||||
// Nothing to do if there are no points.
|
// Nothing to do if there are no points.
|
||||||
@@ -466,6 +471,11 @@ bool InputDevice::TouchScreenState::applyBadTouchFilter() {
|
|||||||
* the coordinate value for one axis has jumped to the other pointer's location.
|
* the coordinate value for one axis has jumped to the other pointer's location.
|
||||||
*/
|
*/
|
||||||
bool InputDevice::TouchScreenState::applyJumpyTouchFilter() {
|
bool InputDevice::TouchScreenState::applyJumpyTouchFilter() {
|
||||||
|
// This hack requires valid axis parameters.
|
||||||
|
if (! parameters.yAxis.valid) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t pointerCount = currentTouch.pointerCount;
|
uint32_t pointerCount = currentTouch.pointerCount;
|
||||||
if (lastTouch.pointerCount != pointerCount) {
|
if (lastTouch.pointerCount != pointerCount) {
|
||||||
#if DEBUG_HACKS
|
#if DEBUG_HACKS
|
||||||
@@ -724,6 +734,12 @@ void InputDevice::TouchScreenState::applyAveragingTouchFilter() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool InputDevice::TouchScreenState::isPointInsideDisplay(int32_t x, int32_t y) const {
|
bool InputDevice::TouchScreenState::isPointInsideDisplay(int32_t x, int32_t y) const {
|
||||||
|
if (! parameters.xAxis.valid || ! parameters.yAxis.valid) {
|
||||||
|
// Assume all points on a touch screen without valid axis parameters are
|
||||||
|
// inside the display.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return x >= parameters.xAxis.minValue
|
return x >= parameters.xAxis.minValue
|
||||||
&& x <= parameters.xAxis.maxValue
|
&& x <= parameters.xAxis.maxValue
|
||||||
&& y >= parameters.yAxis.minValue
|
&& y >= parameters.yAxis.minValue
|
||||||
@@ -1435,6 +1451,9 @@ void InputReader::dispatchTouch(nsecs_t when, InputDevice* device, uint32_t poli
|
|||||||
int32_t pointerIds[MAX_POINTERS];
|
int32_t pointerIds[MAX_POINTERS];
|
||||||
PointerCoords pointerCoords[MAX_POINTERS];
|
PointerCoords pointerCoords[MAX_POINTERS];
|
||||||
|
|
||||||
|
const InputDevice::TouchScreenState::Precalculated& precalculated =
|
||||||
|
device->touchScreen.precalculated;
|
||||||
|
|
||||||
// Walk through the the active pointers and map touch screen coordinates (TouchData) into
|
// Walk through the the active pointers and map touch screen coordinates (TouchData) into
|
||||||
// display coordinates (PointerCoords) and adjust for display orientation.
|
// display coordinates (PointerCoords) and adjust for display orientation.
|
||||||
while (! idBits.isEmpty()) {
|
while (! idBits.isEmpty()) {
|
||||||
@@ -1442,18 +1461,14 @@ void InputReader::dispatchTouch(nsecs_t when, InputDevice* device, uint32_t poli
|
|||||||
idBits.clearBit(id);
|
idBits.clearBit(id);
|
||||||
uint32_t index = touch->idToIndex[id];
|
uint32_t index = touch->idToIndex[id];
|
||||||
|
|
||||||
float x = (float(touch->pointers[index].x)
|
float x = float(touch->pointers[index].x
|
||||||
- device->touchScreen.parameters.xAxis.minValue)
|
- precalculated.xOrigin) * precalculated.xScale;
|
||||||
* device->touchScreen.precalculated.xScale;
|
float y = float(touch->pointers[index].y
|
||||||
float y = (float(touch->pointers[index].y)
|
- precalculated.yOrigin) * precalculated.yScale;
|
||||||
- device->touchScreen.parameters.yAxis.minValue)
|
float pressure = float(touch->pointers[index].pressure
|
||||||
* device->touchScreen.precalculated.yScale;
|
- precalculated.pressureOrigin) * precalculated.pressureScale;
|
||||||
float pressure = (float(touch->pointers[index].pressure)
|
float size = float(touch->pointers[index].size
|
||||||
- device->touchScreen.parameters.pressureAxis.minValue)
|
- precalculated.sizeOrigin) * precalculated.sizeScale;
|
||||||
* device->touchScreen.precalculated.pressureScale;
|
|
||||||
float size = (float(touch->pointers[index].size)
|
|
||||||
- device->touchScreen.parameters.sizeAxis.minValue)
|
|
||||||
* device->touchScreen.precalculated.sizeScale;
|
|
||||||
|
|
||||||
switch (mDisplayOrientation) {
|
switch (mDisplayOrientation) {
|
||||||
case InputReaderPolicyInterface::ROTATION_90: {
|
case InputReaderPolicyInterface::ROTATION_90: {
|
||||||
@@ -1651,7 +1666,11 @@ bool InputReader::refreshDisplayProperties() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mDisplayOrientation = newOrientation;
|
if (newOrientation != mDisplayOrientation) {
|
||||||
|
LOGD("Display orientation changed to %d", mDisplayOrientation);
|
||||||
|
|
||||||
|
mDisplayOrientation = newOrientation;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
resetDisplayProperties();
|
resetDisplayProperties();
|
||||||
@@ -1740,10 +1759,25 @@ void InputReader::configureDevice(InputDevice* device) {
|
|||||||
device->touchScreen.parameters.useJumpyTouchFilter =
|
device->touchScreen.parameters.useJumpyTouchFilter =
|
||||||
mPolicy->filterJumpyTouchEvents();
|
mPolicy->filterJumpyTouchEvents();
|
||||||
|
|
||||||
device->touchScreen.precalculated.pressureScale =
|
if (device->touchScreen.parameters.pressureAxis.valid) {
|
||||||
1.0f / device->touchScreen.parameters.pressureAxis.range;
|
device->touchScreen.precalculated.pressureOrigin =
|
||||||
device->touchScreen.precalculated.sizeScale =
|
device->touchScreen.parameters.pressureAxis.minValue;
|
||||||
1.0f / device->touchScreen.parameters.sizeAxis.range;
|
device->touchScreen.precalculated.pressureScale =
|
||||||
|
1.0f / device->touchScreen.parameters.pressureAxis.range;
|
||||||
|
} else {
|
||||||
|
device->touchScreen.precalculated.pressureOrigin = 0;
|
||||||
|
device->touchScreen.precalculated.pressureScale = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (device->touchScreen.parameters.sizeAxis.valid) {
|
||||||
|
device->touchScreen.precalculated.sizeOrigin =
|
||||||
|
device->touchScreen.parameters.sizeAxis.minValue;
|
||||||
|
device->touchScreen.precalculated.sizeScale =
|
||||||
|
1.0f / device->touchScreen.parameters.sizeAxis.range;
|
||||||
|
} else {
|
||||||
|
device->touchScreen.precalculated.sizeOrigin = 0;
|
||||||
|
device->touchScreen.precalculated.sizeScale = 1.0f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (device->isTrackball()) {
|
if (device->isTrackball()) {
|
||||||
@@ -1758,22 +1792,42 @@ void InputReader::configureDevice(InputDevice* device) {
|
|||||||
|
|
||||||
void InputReader::configureDeviceForCurrentDisplaySize(InputDevice* device) {
|
void InputReader::configureDeviceForCurrentDisplaySize(InputDevice* device) {
|
||||||
if (device->isTouchScreen()) {
|
if (device->isTouchScreen()) {
|
||||||
if (mDisplayWidth < 0) {
|
if (device->touchScreen.parameters.xAxis.valid
|
||||||
LOGD("Skipping part of touch screen configuration since display size is unknown.");
|
&& device->touchScreen.parameters.yAxis.valid) {
|
||||||
} else {
|
device->touchScreen.precalculated.xOrigin =
|
||||||
LOGI("Device configured: id=0x%x, name=%s (display size was changed)", device->id,
|
device->touchScreen.parameters.xAxis.minValue;
|
||||||
device->name.string());
|
device->touchScreen.precalculated.yOrigin =
|
||||||
configureVirtualKeys(device);
|
device->touchScreen.parameters.yAxis.minValue;
|
||||||
|
|
||||||
device->touchScreen.precalculated.xScale =
|
if (mDisplayWidth < 0) {
|
||||||
float(mDisplayWidth) / device->touchScreen.parameters.xAxis.range;
|
LOGD("Skipping part of touch screen configuration since display size is unknown.");
|
||||||
device->touchScreen.precalculated.yScale =
|
|
||||||
float(mDisplayHeight) / device->touchScreen.parameters.yAxis.range;
|
device->touchScreen.precalculated.xScale = 1.0f;
|
||||||
|
device->touchScreen.precalculated.yScale = 1.0f;
|
||||||
|
} else {
|
||||||
|
LOGI("Device configured: id=0x%x, name=%s (display size was changed)", device->id,
|
||||||
|
device->name.string());
|
||||||
|
|
||||||
|
device->touchScreen.precalculated.xScale =
|
||||||
|
float(mDisplayWidth) / device->touchScreen.parameters.xAxis.range;
|
||||||
|
device->touchScreen.precalculated.yScale =
|
||||||
|
float(mDisplayHeight) / device->touchScreen.parameters.yAxis.range;
|
||||||
|
|
||||||
|
configureVirtualKeys(device);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
device->touchScreen.precalculated.xOrigin = 0;
|
||||||
|
device->touchScreen.precalculated.xScale = 1.0f;
|
||||||
|
device->touchScreen.precalculated.yOrigin = 0;
|
||||||
|
device->touchScreen.precalculated.yScale = 1.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputReader::configureVirtualKeys(InputDevice* device) {
|
void InputReader::configureVirtualKeys(InputDevice* device) {
|
||||||
|
assert(device->touchScreen.parameters.xAxis.valid
|
||||||
|
&& device->touchScreen.parameters.yAxis.valid);
|
||||||
|
|
||||||
device->touchScreen.virtualKeys.clear();
|
device->touchScreen.virtualKeys.clear();
|
||||||
|
|
||||||
Vector<InputReaderPolicyInterface::VirtualKeyDefinition> virtualKeyDefinitions;
|
Vector<InputReaderPolicyInterface::VirtualKeyDefinition> virtualKeyDefinitions;
|
||||||
@@ -1837,16 +1891,18 @@ void InputReader::configureAbsoluteAxisInfo(InputDevice* device,
|
|||||||
if (out->range != 0) {
|
if (out->range != 0) {
|
||||||
LOGI(" %s: min=%d max=%d flat=%d fuzz=%d",
|
LOGI(" %s: min=%d max=%d flat=%d fuzz=%d",
|
||||||
name, out->minValue, out->maxValue, out->flat, out->fuzz);
|
name, out->minValue, out->maxValue, out->flat, out->fuzz);
|
||||||
|
out->valid = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out->valid = false;
|
||||||
out->minValue = 0;
|
out->minValue = 0;
|
||||||
out->maxValue = 0;
|
out->maxValue = 0;
|
||||||
out->flat = 0;
|
out->flat = 0;
|
||||||
out->fuzz = 0;
|
out->fuzz = 0;
|
||||||
out->range = 0;
|
out->range = 0;
|
||||||
LOGI(" %s: unknown axis values, setting to zero", name);
|
LOGI(" %s: unknown axis values, marking as invalid", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputReader::configureExcludedDevices() {
|
void InputReader::configureExcludedDevices() {
|
||||||
|
|||||||
@@ -395,7 +395,7 @@ private:
|
|||||||
|
|
||||||
NativeInputManager::NativeInputManager(jobject callbacksObj) :
|
NativeInputManager::NativeInputManager(jobject callbacksObj) :
|
||||||
mFilterTouchEvents(-1), mFilterJumpyTouchEvents(-1),
|
mFilterTouchEvents(-1), mFilterJumpyTouchEvents(-1),
|
||||||
mDisplayWidth(-1), mDisplayHeight(-1), mDisplayOrientation(-1),
|
mDisplayWidth(-1), mDisplayHeight(-1), mDisplayOrientation(ROTATION_0),
|
||||||
mDispatchEnabled(true), mDispatchFrozen(false), mWindowsReady(true),
|
mDispatchEnabled(true), mDispatchFrozen(false), mWindowsReady(true),
|
||||||
mFocusedWindow(NULL), mTouchDown(false), mTouchedWindow(NULL),
|
mFocusedWindow(NULL), mTouchDown(false), mTouchedWindow(NULL),
|
||||||
mFocusedApplication(NULL) {
|
mFocusedApplication(NULL) {
|
||||||
|
|||||||
Reference in New Issue
Block a user