Date: Tuesday, December 17, 2019 @ 11:42:00 Author: heftig Revision: 371595
backport more patches Added: qt5-wayland/trunk/0001-Drive-cursor-animation-with-a-timer.patch Modified: qt5-wayland/trunk/PKGBUILD ------------------------------------------------+ 0001-Drive-cursor-animation-with-a-timer.patch | 124 +++++++++++++++++++++++ PKGBUILD | 16 ++ 2 files changed, 138 insertions(+), 2 deletions(-) Added: 0001-Drive-cursor-animation-with-a-timer.patch =================================================================== --- 0001-Drive-cursor-animation-with-a-timer.patch (rev 0) +++ 0001-Drive-cursor-animation-with-a-timer.patch 2019-12-17 11:42:00 UTC (rev 371595) @@ -0,0 +1,124 @@ +From 78b7b39d408077ad139cba3087b54142533852bb Mon Sep 17 00:00:00 2001 +From: "Jan Alexander Steffens (heftig)" <[email protected]> +Date: Fri, 13 Dec 2019 22:15:32 +0100 +Subject: [PATCH] Drive cursor animation with a timer + +Using only wl_surface_frame callbacks to update the cursor does so much +more often than needed. In addition, at least GNOME and Weston fire the +callback for the cursor surface immediately, which ends up updating the +cursor at over 3000 Hz here. + +Use wl_cursor_frame_and_duration to drive a single shot timer. This +function is also guaranteed to return 0 for single frame cursors, so we +can avoid starting the timer at all. + +We wait for both the surface frame callback and the timer to fire before +updating the cursor for the next frame of animation. This reduces our +update rate to the frame rate of the cursor or the rate requested by the +compositor, whichever is lower. + +Change-Id: I10277460ebe9b547ebaf7f73424b9ef17614107f +--- + src/client/qwaylandinputdevice.cpp | 34 +++++++++++++++++++++++++++--- + src/client/qwaylandinputdevice_p.h | 5 +++++ + 2 files changed, 36 insertions(+), 3 deletions(-) + +diff --git a/src/client/qwaylandinputdevice.cpp b/src/client/qwaylandinputdevice.cpp +index d812918e..e740b9c2 100644 +--- a/src/client/qwaylandinputdevice.cpp ++++ b/src/client/qwaylandinputdevice.cpp +@@ -143,6 +143,12 @@ QWaylandWindow *QWaylandInputDevice::Keyboard::focusWindow() const + QWaylandInputDevice::Pointer::Pointer(QWaylandInputDevice *seat) + : mParent(seat) + { ++#if QT_CONFIG(cursor) ++ mCursor.frameTimer.setSingleShot(true); ++ mCursor.frameTimer.callOnTimeout([&]() { ++ cursorTimerCallback(); ++ }); ++#endif + } + + QWaylandInputDevice::Pointer::~Pointer() +@@ -224,7 +230,7 @@ public: + if (animated) { + m_frameCallback.reset(new WlCallback(frame(), [this](uint32_t time){ + Q_UNUSED(time); +- m_pointer->updateCursor(); ++ m_pointer->cursorFrameCallback(); + })); + } + commit(); +@@ -328,7 +334,8 @@ void QWaylandInputDevice::Pointer::updateCursor() + uint time = seat()->mCursor.animationTimer.elapsed(); + + if (struct ::wl_cursor *waylandCursor = mCursor.theme->cursor(shape)) { +- int frame = wl_cursor_frame(waylandCursor, time); ++ uint duration = 0; ++ int frame = wl_cursor_frame_and_duration(waylandCursor, time, &duration); + ::wl_cursor_image *image = waylandCursor->images[frame]; + + struct wl_buffer *buffer = wl_cursor_image_get_buffer(image); +@@ -339,7 +346,12 @@ void QWaylandInputDevice::Pointer::updateCursor() + int bufferScale = mCursor.themeBufferScale; + QPoint hotspot = QPoint(image->hotspot_x, image->hotspot_y) / bufferScale; + QSize size = QSize(image->width, image->height) / bufferScale; +- bool animated = waylandCursor->image_count > 1 && image->delay > 0; ++ bool animated = duration > 0; ++ if (animated) { ++ mCursor.gotFrameCallback = false; ++ mCursor.gotTimerCallback = false; ++ mCursor.frameTimer.start(duration); ++ } + getOrCreateCursorSurface()->update(buffer, hotspot, size, bufferScale, animated); + return; + } +@@ -354,6 +366,22 @@ CursorSurface *QWaylandInputDevice::Pointer::getOrCreateCursorSurface() + return mCursor.surface.get(); + } + ++void QWaylandInputDevice::Pointer::cursorTimerCallback() ++{ ++ mCursor.gotTimerCallback = true; ++ if (mCursor.gotFrameCallback) { ++ updateCursor(); ++ } ++} ++ ++void QWaylandInputDevice::Pointer::cursorFrameCallback() ++{ ++ mCursor.gotFrameCallback = true; ++ if (mCursor.gotTimerCallback) { ++ updateCursor(); ++ } ++} ++ + #endif // QT_CONFIG(cursor) + + QWaylandInputDevice::Touch::Touch(QWaylandInputDevice *p) +diff --git a/src/client/qwaylandinputdevice_p.h b/src/client/qwaylandinputdevice_p.h +index 60d6f2c1..a567c57b 100644 +--- a/src/client/qwaylandinputdevice_p.h ++++ b/src/client/qwaylandinputdevice_p.h +@@ -286,6 +286,8 @@ public: + int idealCursorScale() const; + void updateCursorTheme(); + void updateCursor(); ++ void cursorTimerCallback(); ++ void cursorFrameCallback(); + CursorSurface *getOrCreateCursorSurface(); + #endif + QWaylandInputDevice *seat() const { return mParent; } +@@ -325,6 +327,9 @@ public: + QWaylandCursorTheme *theme = nullptr; + int themeBufferScale = 0; + QScopedPointer<CursorSurface> surface; ++ QTimer frameTimer; ++ bool gotFrameCallback = false; ++ bool gotTimerCallback = false; + } mCursor; + #endif + QPointF mSurfacePos; +-- +2.24.1 + Modified: PKGBUILD =================================================================== --- PKGBUILD 2019-12-17 09:21:23 UTC (rev 371594) +++ PKGBUILD 2019-12-17 11:42:00 UTC (rev 371595) @@ -14,9 +14,17 @@ groups=('qt' 'qt5') _pkgfqn="${pkgname/5-/}-everywhere-src-${_qtver}" source=("https://download.qt.io/official_releases/qt/${pkgver%.*}/${_qtver}/submodules/${_pkgfqn}.tar.xz" - qt5-wayland-animate-cursor.patch::"https://code.qt.io/cgit/qt/qtwayland.git/patch/?id=36974955") + qt5-wayland-animate-cursor.patch::"https://code.qt.io/cgit/qt/qtwayland.git/patch/?id=36974955" + qt5-wayland-cursor-timer.patch::"https://code.qt.io/cgit/qt/qtwayland.git/patch/?id=ce158896" + qt5-wayland-linux-dmabuf.patch::"https://code.qt.io/cgit/qt/qtwayland.git/patch/?id=09861f00" + qt5-wayland-linux-dmabuf-2.patch::"https://code.qt.io/cgit/qt/qtwayland.git/patch/?id=a2be69d4" + qt5-wayland-libglvnd-egl.patch::"https://code.qt.io/cgit/qt/qtwayland.git/patch/?id=c2105d8b") sha256sums=('32d4fadb3a8dcee8953e6d92ee567927cd7649be6fc8dd378480664902c22610' - 'b04b021cf78bfe765616cc385e85ac00aae13c0e5d2b969e9ccf66a3763670fb') + 'b04b021cf78bfe765616cc385e85ac00aae13c0e5d2b969e9ccf66a3763670fb' + '5cf52ce4db458ca316c304ae5ad86158bd7cd5aec74d85fe66896ae27f953560' + '708daee5fdeea7b7e7a98706c93ac068ec1947d87126c2d7dbdf72e4e3ea0508' + 'd40de7d22445aaaa5a8741fc8aff13d33a79e926faa16e46239f64fd85db5c12' + 'e8dd89665619aa00874b4c39317366007a8e83bad81a2c3f404880e30591af83') prepare() { mkdir -p build @@ -23,6 +31,10 @@ cd $_pkgfqn patch -p1 -i ../qt5-wayland-animate-cursor.patch # Fix flickering and high CPU with wayland cursors + patch -p1 -i ../qt5-wayland-cursor-timer.patch # Also fix animated cursors + patch -p1 -i ../qt5-wayland-linux-dmabuf.patch # Fix for DMA-BUF support + patch -p1 -i ../qt5-wayland-linux-dmabuf-2.patch # More of the same + patch -p1 -i ../qt5-wayland-libglvnd-egl.patch # Fix compiling with libglvnd's headers } build() {
