Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5d7b97b authored by Chris Tate's avatar Chris Tate Committed by Android (Google) Code Review
Browse files

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

parents 4f67b16b 4036f7f2
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -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;


+3 −0
Original line number Original line Diff line number Diff line
@@ -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);
+84 −28
Original line number Original line Diff line number Diff line
@@ -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() {
            }
            }
        }
        }


        if (newOrientation != mDisplayOrientation) {
            LOGD("Display orientation changed to %d", mDisplayOrientation);

            mDisplayOrientation = newOrientation;
            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();


        if (device->touchScreen.parameters.pressureAxis.valid) {
            device->touchScreen.precalculated.pressureOrigin =
                    device->touchScreen.parameters.pressureAxis.minValue;
            device->touchScreen.precalculated.pressureScale =
            device->touchScreen.precalculated.pressureScale =
                    1.0f / device->touchScreen.parameters.pressureAxis.range;
                    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 =
            device->touchScreen.precalculated.sizeScale =
                    1.0f / device->touchScreen.parameters.sizeAxis.range;
                    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 (device->touchScreen.parameters.xAxis.valid
                && device->touchScreen.parameters.yAxis.valid) {
            device->touchScreen.precalculated.xOrigin =
                    device->touchScreen.parameters.xAxis.minValue;
            device->touchScreen.precalculated.yOrigin =
                    device->touchScreen.parameters.yAxis.minValue;

            if (mDisplayWidth < 0) {
            if (mDisplayWidth < 0) {
                LOGD("Skipping part of touch screen configuration since display size is unknown.");
                LOGD("Skipping part of touch screen configuration since display size is unknown.");

                device->touchScreen.precalculated.xScale = 1.0f;
                device->touchScreen.precalculated.yScale = 1.0f;
            } else {
            } else {
                LOGI("Device configured: id=0x%x, name=%s (display size was changed)", device->id,
                LOGI("Device configured: id=0x%x, name=%s (display size was changed)", device->id,
                        device->name.string());
                        device->name.string());
            configureVirtualKeys(device);


                device->touchScreen.precalculated.xScale =
                device->touchScreen.precalculated.xScale =
                        float(mDisplayWidth) / device->touchScreen.parameters.xAxis.range;
                        float(mDisplayWidth) / device->touchScreen.parameters.xAxis.range;
                device->touchScreen.precalculated.yScale =
                device->touchScreen.precalculated.yScale =
                        float(mDisplayHeight) / device->touchScreen.parameters.yAxis.range;
                        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() {