Merge "Fix native input dispatch in the emulator." into gingerbread

This commit is contained in:
Chris Tate
2010-06-29 17:01:04 -07:00
committed by Android (Google) Code Review
4 changed files with 97 additions and 29 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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) {