Mark cursor as rendered after finishing compositing cycle

Otherwise animated cursors won't work. Hopefully, this will fix pointer
input test.

It would be great to refactor cursor handling so it's simpler, it can be
done later.
master
Vlad Zahorodnii 3 years ago committed by Xaver Hugl
parent 802d855785
commit f027b979bc

@ -651,6 +651,12 @@ void Compositor::composite(RenderLoop *renderLoop)
surface->frameRendered(frameTime.count());
}
}
if (!Cursors::self()->isCursorHidden()) {
Cursor *cursor = Cursors::self()->currentCursor();
if (cursor->geometry().intersects(output->geometry())) {
cursor->markAsRendered(frameTime);
}
}
}
}

@ -205,6 +205,11 @@ void Cursor::updateCursor(const QImage &image, const QPoint &hotspot)
Q_EMIT cursorChanged();
}
void Cursor::markAsRendered(std::chrono::milliseconds timestamp)
{
Q_EMIT rendered(timestamp);
}
xcb_cursor_t Cursor::x11Cursor(CursorShape shape)
{
return x11Cursor(shape.name());

@ -166,6 +166,7 @@ public:
QRect rect() const;
void updateCursor(const QImage &image, const QPoint &hotspot);
void markAsRendered(std::chrono::milliseconds timestamp);
Q_SIGNALS:
void posChanged(const QPoint& pos);
@ -182,6 +183,7 @@ Q_SIGNALS:
*/
void cursorChanged();
void themeChanged();
void rendered(std::chrono::milliseconds timestamp);
protected:
/**

@ -131,6 +131,7 @@ void PointerInputRedirection::init()
}
});
connect(Cursors::self()->mouse(), &Cursor::rendered, m_cursor, &CursorImage::markAsRendered);
connect(m_cursor, &CursorImage::changed, Cursors::self()->mouse(), [this] {
auto cursor = Cursors::self()->mouse();
cursor->updateCursor(m_cursor->image(), m_cursor->hotSpot());
@ -961,8 +962,6 @@ CursorImage::CursorImage(PointerInputRedirection *parent)
connect(workspace(), &Workspace::clientAdded, this, setupMoveResizeConnection);
loadThemeCursor(Qt::ArrowCursor, &m_fallbackCursor);
m_surfaceRenderedTimer.start();
connect(&m_waylandImage, &WaylandCursorImage::themeChanged, this, [this] {
loadThemeCursor(Qt::ArrowCursor, &m_fallbackCursor);
updateDecorationCursor();
@ -975,12 +974,12 @@ CursorImage::CursorImage(PointerInputRedirection *parent)
CursorImage::~CursorImage() = default;
void CursorImage::markAsRendered()
void CursorImage::markAsRendered(std::chrono::milliseconds timestamp)
{
if (m_currentSource == CursorSource::DragAndDrop) {
// always sending a frame rendered to the drag icon surface to not freeze QtWayland (see https://bugreports.qt.io/browse/QTBUG-51599 )
if (const KWaylandServer::DragAndDropIcon *icon = waylandServer()->seat()->dragIcon()) {
icon->surface()->frameRendered(m_surfaceRenderedTimer.elapsed());
icon->surface()->frameRendered(timestamp.count());
}
}
if (m_currentSource != CursorSource::LockScreen
@ -1000,7 +999,7 @@ void CursorImage::markAsRendered()
if (!cursorSurface) {
return;
}
cursorSurface->frameRendered(m_surfaceRenderedTimer.elapsed());
cursorSurface->frameRendered(timestamp.count());
}
void CursorImage::handlePointerChanged()

@ -213,7 +213,7 @@ public:
QImage image() const;
QPoint hotSpot() const;
void markAsRendered();
void markAsRendered(std::chrono::milliseconds timestamp);
Q_SIGNALS:
void changed();
@ -255,7 +255,6 @@ private:
WaylandCursorImage::Image m_fallbackCursor;
WaylandCursorImage::Image m_moveResizeCursor;
WaylandCursorImage::Image m_windowSelectionCursor;
QElapsedTimer m_surfaceRenderedTimer;
struct {
WaylandCursorImage::Image cursor;
QMetaObject::Connection connection;

Loading…
Cancel
Save