[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