diff options
7 files changed, 80 insertions, 15 deletions
diff --git a/services/inputflinger/InputReaderBase.cpp b/services/inputflinger/InputReaderBase.cpp index f48a64551e..0e2a2e7f9e 100644 --- a/services/inputflinger/InputReaderBase.cpp +++ b/services/inputflinger/InputReaderBase.cpp @@ -99,6 +99,16 @@ std::optional<DisplayViewport> InputReaderConfiguration::getDisplayViewportByPor return std::nullopt; } +std::optional<DisplayViewport> InputReaderConfiguration::getDisplayViewportById( + int32_t displayId) const { + for (const DisplayViewport& currentViewport : mDisplays) { + if (currentViewport.displayId == displayId) { + return std::make_optional(currentViewport); + } + } + return std::nullopt; +} + void InputReaderConfiguration::setDisplayViewports(const std::vector<DisplayViewport>& viewports) { mDisplays = viewports; } @@ -125,4 +135,4 @@ void TouchAffineTransformation::applyTo(float& x, float& y) const { y = newY; } -} // namespace android
\ No newline at end of file +} // namespace android diff --git a/services/inputflinger/include/InputReaderBase.h b/services/inputflinger/include/InputReaderBase.h index 8ad5dd0785..86d91a92ce 100644 --- a/services/inputflinger/include/InputReaderBase.h +++ b/services/inputflinger/include/InputReaderBase.h @@ -172,6 +172,9 @@ struct InputReaderConfiguration { // Used to determine which DisplayViewport should be tied to which InputDevice. std::unordered_map<std::string, uint8_t> portAssociations; + // The suggested display ID to show the cursor. + int32_t defaultPointerDisplayId; + // Velocity control parameters for mouse pointer movements. VelocityControlParameters pointerVelocityControlParameters; @@ -274,6 +277,7 @@ struct InputReaderConfiguration { std::optional<DisplayViewport> getDisplayViewportByUniqueId(const std::string& uniqueDisplayId) const; std::optional<DisplayViewport> getDisplayViewportByPort(uint8_t physicalPort) const; + std::optional<DisplayViewport> getDisplayViewportById(int32_t displayId) const; void setDisplayViewports(const std::vector<DisplayViewport>& viewports); @@ -349,4 +353,4 @@ public: } // namespace android -#endif // _UI_INPUT_READER_COMMON_H
\ No newline at end of file +#endif // _UI_INPUT_READER_COMMON_H diff --git a/services/inputflinger/include/PointerControllerInterface.h b/services/inputflinger/include/PointerControllerInterface.h index 0ff28e4174..194c66547f 100644 --- a/services/inputflinger/include/PointerControllerInterface.h +++ b/services/inputflinger/include/PointerControllerInterface.h @@ -17,6 +17,7 @@ #ifndef _INPUTFLINGER_POINTER_CONTROLLER_INTERFACE_H #define _INPUTFLINGER_POINTER_CONTROLLER_INTERFACE_H +#include <input/DisplayViewport.h> #include <input/Input.h> #include <utils/BitSet.h> #include <utils/RefBase.h> @@ -101,6 +102,9 @@ public: /* Gets the id of the display where the pointer should be shown. */ virtual int32_t getDisplayId() const = 0; + + /* Sets the associated display of this pointer. Pointer should show on that display. */ + virtual void setDisplayViewport(const DisplayViewport& displayViewport) = 0; }; } // namespace android diff --git a/services/inputflinger/reader/mapper/CursorInputMapper.cpp b/services/inputflinger/reader/mapper/CursorInputMapper.cpp index da85fda0e9..239517718c 100644 --- a/services/inputflinger/reader/mapper/CursorInputMapper.cpp +++ b/services/inputflinger/reader/mapper/CursorInputMapper.cpp @@ -189,12 +189,32 @@ void CursorInputMapper::configure(nsecs_t when, const InputReaderConfiguration* // Update the PointerController if viewports changed. if (mParameters.mode == Parameters::MODE_POINTER) { - getPolicy()->obtainPointerController(getDeviceId()); + updatePointerControllerDisplayViewport(*config); } bumpGeneration(); } } +void CursorInputMapper::updatePointerControllerDisplayViewport( + const InputReaderConfiguration& config) { + std::optional<DisplayViewport> viewport = + config.getDisplayViewportById(config.defaultPointerDisplayId); + if (!viewport) { + ALOGW("Can't find the designated viewport with ID %" PRId32 " to update cursor input " + "mapper. Fall back to default display", + config.defaultPointerDisplayId); + viewport = config.getDisplayViewportById(ADISPLAY_ID_DEFAULT); + } + + if (!viewport) { + ALOGE("Still can't find a viable viewport to update cursor input mapper. Skip setting it to" + " PointerController."); + return; + } + + mPointerController->setDisplayViewport(*viewport); +} + void CursorInputMapper::configureParameters() { mParameters.mode = Parameters::MODE_POINTER; String8 cursorModeString; diff --git a/services/inputflinger/reader/mapper/CursorInputMapper.h b/services/inputflinger/reader/mapper/CursorInputMapper.h index eb2ad54c80..05b696789d 100644 --- a/services/inputflinger/reader/mapper/CursorInputMapper.h +++ b/services/inputflinger/reader/mapper/CursorInputMapper.h @@ -116,8 +116,9 @@ private: void dumpParameters(std::string& dump); void sync(nsecs_t when); + void updatePointerControllerDisplayViewport(const InputReaderConfiguration& config); }; } // namespace android -#endif // _UI_INPUTREADER_CURSOR_INPUT_MAPPER_H
\ No newline at end of file +#endif // _UI_INPUTREADER_CURSOR_INPUT_MAPPER_H diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index 32ed97bffe..b0711c767f 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -557,9 +557,10 @@ bool TouchInputMapper::hasExternalStylus() const { * Determine which DisplayViewport to use. * 1. If display port is specified, return the matching viewport. If matching viewport not * found, then return. - * 2. If a device has associated display, get the matching viewport by either unique id or by + * 2. Always use the suggested viewport from WindowManagerService for pointers. + * 3. If a device has associated display, get the matching viewport by either unique id or by * the display type (internal or external). - * 3. Otherwise, use a non-display viewport. + * 4. Otherwise, use a non-display viewport. */ std::optional<DisplayViewport> TouchInputMapper::findViewport() { if (mParameters.hasAssociatedDisplay) { @@ -575,6 +576,18 @@ std::optional<DisplayViewport> TouchInputMapper::findViewport() { return v; } + if (mDeviceMode == DEVICE_MODE_POINTER) { + std::optional<DisplayViewport> viewport = + mConfig.getDisplayViewportById(mConfig.defaultPointerDisplayId); + if (viewport) { + return viewport; + } else { + ALOGW("Can't find designated display viewport with ID %" PRId32 " for pointers.", + mConfig.defaultPointerDisplayId); + } + } + + // Check if uniqueDisplayId is specified in idc file. if (!mParameters.uniqueDisplayId.empty()) { return mConfig.getDisplayViewportByUniqueId(mParameters.uniqueDisplayId); } @@ -758,6 +771,7 @@ void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) { (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) { if (mPointerController == nullptr || viewportChanged) { mPointerController = getPolicy()->obtainPointerController(getDeviceId()); + mPointerController->setDisplayViewport(mViewport); } } else { mPointerController.clear(); diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index aeb4ad62a8..7442e68e17 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -85,10 +85,6 @@ public: mMaxY = maxY; } - void setDisplayId(int32_t displayId) { - mDisplayId = displayId; - } - virtual void setPosition(float x, float y) { mX = x; mY = y; @@ -111,6 +107,10 @@ public: return mDisplayId; } + virtual void setDisplayViewport(const DisplayViewport& viewport) { + mDisplayId = viewport.displayId; + } + const std::map<int32_t, std::vector<int32_t>>& getSpots() { return mSpotsByDisplay; } @@ -255,6 +255,10 @@ public: mConfig.showTouches = enabled; } + void setDefaultPointerDisplayId(int32_t pointerDisplayId) { + mConfig.defaultPointerDisplayId = pointerDisplayId; + } + private: DisplayViewport createDisplayViewport(int32_t displayId, int32_t width, int32_t height, int32_t orientation, const std::string& uniqueId, std::optional<uint8_t> physicalPort, @@ -3159,12 +3163,18 @@ TEST_F(CursorInputMapperTest, Process_ShouldHandleDisplayId) { CursorInputMapper* mapper = new CursorInputMapper(mDevice); addMapperAndConfigure(mapper); - // Setup PointerController for second display. + // Setup for second display. constexpr int32_t SECOND_DISPLAY_ID = 1; + const std::string SECOND_DISPLAY_UNIQUE_ID = "local:1"; + mFakePolicy->addDisplayViewport(SECOND_DISPLAY_ID, 800, 480, DISPLAY_ORIENTATION_0, + SECOND_DISPLAY_UNIQUE_ID, NO_PORT, + ViewportType::VIEWPORT_EXTERNAL); + mFakePolicy->setDefaultPointerDisplayId(SECOND_DISPLAY_ID); + configureDevice(InputReaderConfiguration::CHANGE_DISPLAY_INFO); + mFakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); mFakePointerController->setPosition(100, 200); mFakePointerController->setButtonState(0); - mFakePointerController->setDisplayId(SECOND_DISPLAY_ID); NotifyMotionArgs args; process(mapper, ARBITRARY_TIME, EV_REL, REL_X, 10); @@ -6329,14 +6339,16 @@ TEST_F(MultiTouchInputMapperTest, Viewports_Fallback) { } TEST_F(MultiTouchInputMapperTest, Process_Pointer_ShouldHandleDisplayId) { - // Setup PointerController for second display. + // Setup for second display. sp<FakePointerController> fakePointerController = new FakePointerController(); - fakePointerController->setBounds(0, 0, 800 - 1, 480 - 1); + fakePointerController->setBounds(0, 0, DISPLAY_WIDTH - 1, DISPLAY_HEIGHT - 1); fakePointerController->setPosition(100, 200); fakePointerController->setButtonState(0); - fakePointerController->setDisplayId(SECONDARY_DISPLAY_ID); mFakePolicy->setPointerController(mDevice->getId(), fakePointerController); + mFakePolicy->setDefaultPointerDisplayId(SECONDARY_DISPLAY_ID); + prepareSecondaryDisplay(ViewportType::VIEWPORT_EXTERNAL); + MultiTouchInputMapper* mapper = new MultiTouchInputMapper(mDevice); prepareDisplay(DISPLAY_ORIENTATION_0); prepareAxes(POSITION); |