diff --git a/autotests/client/test_wayland_seat.cpp b/autotests/client/test_wayland_seat.cpp --- a/autotests/client/test_wayland_seat.cpp +++ b/autotests/client/test_wayland_seat.cpp @@ -296,8 +296,13 @@ SurfaceInterface *serverSurface = surfaceCreatedSpy.first().first().value(); QVERIFY(serverSurface); + QSignalSpy focusedPointerChangedSpy(m_seatInterface, &SeatInterface::focusedPointerChanged); + QVERIFY(focusedPointerChangedSpy.isValid()); + m_seatInterface->setPointerPos(QPoint(20, 18)); m_seatInterface->setFocusedPointerSurface(serverSurface, QPoint(10, 15)); + QCOMPARE(focusedPointerChangedSpy.count(), 1); + QVERIFY(!focusedPointerChangedSpy.first().first().value()); // no pointer yet QVERIFY(m_seatInterface->focusedPointerSurface()); QVERIFY(!m_seatInterface->focusedPointer()); @@ -311,8 +316,12 @@ QVERIFY(pointerCreatedSpy.wait()); QVERIFY(m_seatInterface->focusedPointer()); QCOMPARE(pointerCreatedSpy.first().first().value(), m_seatInterface->focusedPointer()); + QCOMPARE(focusedPointerChangedSpy.count(), 2); + QCOMPARE(focusedPointerChangedSpy.last().first().value(), m_seatInterface->focusedPointer()); m_seatInterface->setFocusedPointerSurface(nullptr); + QCOMPARE(focusedPointerChangedSpy.count(), 3); + QVERIFY(!focusedPointerChangedSpy.last().first().value()); serverSurface->client()->flush(); QTest::qWait(100); @@ -342,6 +351,8 @@ QVERIFY(serverPointer); QCOMPARE(p->enteredSurface(), s); QCOMPARE(cp.enteredSurface(), s); + QCOMPARE(focusedPointerChangedSpy.count(), 4); + QCOMPARE(focusedPointerChangedSpy.last().first().value(), serverPointer); // test motion m_seatInterface->setTimestamp(1); @@ -411,20 +422,23 @@ // leave the surface m_seatInterface->setFocusedPointerSurface(nullptr); + QCOMPARE(focusedPointerChangedSpy.count(), 5); QVERIFY(leftSpy.wait()); QCOMPARE(leftSpy.first().first().value(), m_display->serial()); QVERIFY(!p->enteredSurface()); QVERIFY(!cp.enteredSurface()); // enter it again m_seatInterface->setFocusedPointerSurface(serverSurface, QPoint(0, 0)); + QCOMPARE(focusedPointerChangedSpy.count(), 6); QVERIFY(enteredSpy.wait()); QCOMPARE(p->enteredSurface(), s); QCOMPARE(cp.enteredSurface(), s); delete s; wl_display_flush(m_connection->display()); - QTest::qWait(100); + QVERIFY(focusedPointerChangedSpy.wait()); + QCOMPARE(focusedPointerChangedSpy.count(), 7); QVERIFY(!m_seatInterface->focusedPointerSurface()); } diff --git a/src/server/seat_interface.h b/src/server/seat_interface.h --- a/src/server/seat_interface.h +++ b/src/server/seat_interface.h @@ -373,6 +373,12 @@ void keyboardCreated(KWayland::Server::KeyboardInterface*); void touchCreated(KWayland::Server::TouchInterface*); + /** + * Emitted whenever the focused pointer changes + * @since 5.6 + **/ + void focusedPointerChanged(KWayland::Server::PointerInterface*); + private: friend class Display; friend class DataDeviceManagerInterface; diff --git a/src/server/seat_interface.cpp b/src/server/seat_interface.cpp --- a/src/server/seat_interface.cpp +++ b/src/server/seat_interface.cpp @@ -322,13 +322,15 @@ if (!globalPointer.focus.pointer) { globalPointer.focus.pointer = pointer; pointer->setFocusedSurface(globalPointer.focus.surface, globalPointer.focus.serial); + emit q->focusedPointerChanged(pointer); } } QObject::connect(pointer, &QObject::destroyed, q, [pointer,this] { pointers.removeAt(pointers.indexOf(pointer)); if (globalPointer.focus.pointer == pointer) { globalPointer.focus.pointer = nullptr; + emit q->focusedPointerChanged(nullptr); } } ); @@ -514,12 +516,14 @@ [this] { Q_D(); d->globalPointer.focus = Private::Pointer::Focus(); + emit focusedPointerChanged(nullptr); } ); d->globalPointer.focus.offset = QPointF(); d->globalPointer.focus.transformation = transformation; d->globalPointer.focus.serial = serial; } + emit focusedPointerChanged(p); if (!p) { return; }