[arch-commits] Commit in qt5-wayland/trunk (2 files)
Jan Steffens
heftig at archlinux.org
Tue Dec 17 11:42:00 UTC 2019
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)" <jan.steffens at gmail.com>
+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() {
More information about the arch-commits
mailing list