[neon/qt6/qt6-wayland/Neon/release] debian/patches: use david's new patch for 6.8.0 and keep the old one commented out for 6.8.1

Carlos De Maine null at kde.org
Thu Nov 28 10:30:29 GMT 2024


Git commit 1a6631cb6a23f73feac7d645c2e20ec3df27265f by Carlos De Maine.
Committed on 28/11/2024 at 10:30.
Pushed by carlosdem into branch 'Neon/release'.

use david's new patch for 6.8.0 and keep the old one commented out for 6.8.1

A  +262  -0    debian/patches/0001-client-Redo-management-of-tablet-object-proxies.patch
M  +5    -1    debian/patches/series

https://invent.kde.org/neon/qt6/qt6-wayland/-/commit/1a6631cb6a23f73feac7d645c2e20ec3df27265f

diff --git a/debian/patches/0001-client-Redo-management-of-tablet-object-proxies.patch b/debian/patches/0001-client-Redo-management-of-tablet-object-proxies.patch
new file mode 100644
index 0000000..69b42ef
--- /dev/null
+++ b/debian/patches/0001-client-Redo-management-of-tablet-object-proxies.patch
@@ -0,0 +1,262 @@
+From 807c4504b6e8ccedcef907e6fd30946c4c23618c Mon Sep 17 00:00:00 2001
+From: David Redondo <qt at david-redondo.de>
+Date: Fri, 22 Nov 2024 10:56:41 +0100
+Subject: [PATCH] client: Redo management of tablet object proxies
+
+Since 5af836aea3bb91a9f388e565415dc33b2fde4577 tools and pads can sometimes
+be parented to tablets. When a tablet is unplugged sometimes the remove
+event for the tablet can be sent before the remove events for the pad.
+Deleting the tablet will also delete the pad but not the pad proxy,
+resulting in a crash when the pad remove event is received.
+This moves destruction of the wayland proxies which makes everything much
+simpler as not every location that deletes those objects needs to call
+destroy and fixes the described problem.
+
+Change-Id: I0aaeda3d3996251e411229b5e97aa1ce0bce43ac
+Reviewed-by: David Edmundson <davidedmundson at kde.org>
+(cherry picked from commit 1f76835d1805d9b1c25c136a19c1101f19cc2259)
+Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot at qt-project.org>
+---
+ src/client/qwaylandtabletv2.cpp             | 24 +++++----
+ src/client/qwaylandtabletv2_p.h             |  3 ++
+ tests/auto/client/tabletv2/tst_tabletv2.cpp | 60 +++++++++++++++++----
+ 3 files changed, 68 insertions(+), 19 deletions(-)
+
+diff --git a/src/client/qwaylandtabletv2.cpp b/src/client/qwaylandtabletv2.cpp
+index 1a05eb8b..a85dd87e 100644
+--- a/src/client/qwaylandtabletv2.cpp
++++ b/src/client/qwaylandtabletv2.cpp
+@@ -36,12 +36,6 @@ QWaylandTabletSeatV2::QWaylandTabletSeatV2(QWaylandTabletManagerV2 *manager, QWa
+ 
+ QWaylandTabletSeatV2::~QWaylandTabletSeatV2()
+ {
+-    for (auto *tablet : m_tablets)
+-        tablet->destroy();
+-    for (auto *tool : m_tools)
+-        tool->destroy();
+-    for (auto *pad : m_pads)
+-        pad->destroy();
+     qDeleteAll(m_tablets);
+     qDeleteAll(m_tools);
+     qDeleteAll(m_deadTools);
+@@ -103,6 +97,11 @@ QWaylandTabletV2::QWaylandTabletV2(::zwp_tablet_v2 *tablet, const QString &seatN
+     d->seatName = seatName;
+ }
+ 
++QWaylandTabletV2::~QWaylandTabletV2()
++{
++    destroy();
++}
++
+ void QWaylandTabletV2::zwp_tablet_v2_name(const QString &name)
+ {
+     QPointingDevicePrivate *d = QPointingDevicePrivate::get(this);
+@@ -135,7 +134,6 @@ void QWaylandTabletSeatV2::toolRemoved(QWaylandTabletToolV2 *tool)
+ 
+ void QWaylandTabletV2::zwp_tablet_v2_removed()
+ {
+-    destroy();
+     deleteLater();
+ }
+ 
+@@ -149,6 +147,11 @@ QWaylandTabletToolV2::QWaylandTabletToolV2(QWaylandTabletSeatV2 *tabletSeat, ::z
+     // TODO get the number of buttons somehow?
+ }
+ 
++QWaylandTabletToolV2::~QWaylandTabletToolV2()
++{
++    destroy();
++}
++
+ void QWaylandTabletToolV2::zwp_tablet_tool_v2_type(uint32_t tool_type)
+ {
+     QPointingDevicePrivate *d = QPointingDevicePrivate::get(this);
+@@ -241,7 +244,6 @@ void QWaylandTabletToolV2::zwp_tablet_tool_v2_done()
+ 
+ void QWaylandTabletToolV2::zwp_tablet_tool_v2_removed()
+ {
+-    destroy();
+     m_tabletSeat->toolRemoved(this);
+ }
+ 
+@@ -427,6 +429,11 @@ QWaylandTabletPadV2::QWaylandTabletPadV2(::zwp_tablet_pad_v2 *pad)
+ {
+ }
+ 
++QWaylandTabletPadV2::~QWaylandTabletPadV2()
++{
++    destroy();
++}
++
+ void QWaylandTabletPadV2::zwp_tablet_pad_v2_path(const QString &path)
+ {
+     QPointingDevicePrivate *d = QPointingDevicePrivate::get(this);
+@@ -446,7 +453,6 @@ void QWaylandTabletPadV2::zwp_tablet_pad_v2_done()
+ 
+ void QWaylandTabletPadV2::zwp_tablet_pad_v2_removed()
+ {
+-    destroy();
+     delete this;
+ }
+ 
+diff --git a/src/client/qwaylandtabletv2_p.h b/src/client/qwaylandtabletv2_p.h
+index b101826e..a4794b08 100644
+--- a/src/client/qwaylandtabletv2_p.h
++++ b/src/client/qwaylandtabletv2_p.h
+@@ -74,6 +74,7 @@ class Q_WAYLANDCLIENT_EXPORT QWaylandTabletV2 : public QPointingDevice, public Q
+     Q_OBJECT
+ public:
+     explicit QWaylandTabletV2(::zwp_tablet_v2 *tablet, const QString &seatName);
++    ~QWaylandTabletV2();
+ 
+ protected:
+     // callbacks which act as setters
+@@ -89,6 +90,7 @@ class Q_WAYLANDCLIENT_EXPORT QWaylandTabletToolV2 : public QPointingDevice, publ
+     Q_OBJECT
+ public:
+     QWaylandTabletToolV2(QWaylandTabletSeatV2 *tabletSeat, ::zwp_tablet_tool_v2 *tool);
++    ~QWaylandTabletToolV2();
+ 
+ protected:
+     void zwp_tablet_tool_v2_type(uint32_t tool_type) override;
+@@ -137,6 +139,7 @@ class Q_WAYLANDCLIENT_EXPORT QWaylandTabletPadV2 : public QPointingDevice, publi
+     Q_OBJECT
+ public:
+     explicit QWaylandTabletPadV2(::zwp_tablet_pad_v2 *pad);
++    ~QWaylandTabletPadV2();
+ 
+ protected:
+ //    void zwp_tablet_pad_v2_group(struct ::zwp_tablet_pad_group_v2 *pad_group) override;
+diff --git a/tests/auto/client/tabletv2/tst_tabletv2.cpp b/tests/auto/client/tabletv2/tst_tabletv2.cpp
+index 85df099f..d5c2ccb3 100644
+--- a/tests/auto/client/tabletv2/tst_tabletv2.cpp
++++ b/tests/auto/client/tabletv2/tst_tabletv2.cpp
+@@ -186,9 +186,9 @@ public:
+     QList<TabletV2 *> m_tablets;
+     QList<TabletV2 *> m_tabletsWaitingForDestroy;
+     QList<TabletToolV2 *> m_tools;
+-    QList<TabletToolV2 *> m_toolsWaitingForDestroy;
++    QList<TabletToolV2::Resource *> m_toolsWaitingForDestroy;
+     QList<TabletPadV2 *> m_pads;
+-    QList<TabletPadV2 *> m_padsWaitingForDestroy;
++    QList<TabletPadV2::Resource *> m_padsWaitingForDestroy;
+ 
+ protected:
+     void zwp_tablet_seat_v2_bind_resource(Resource *resource) override
+@@ -274,11 +274,12 @@ void TabletV2::zwp_tablet_v2_destroy(QtWaylandServer::zwp_tablet_v2::Resource *r
+ 
+ void TabletToolV2::sendRemoved()
+ {
+-    for (auto *resource : resourceMap())
++    for (auto *resource : resourceMap()) {
+         zwp_tablet_tool_v2_send_removed(resource->handle);
++        m_tabletSeat->m_toolsWaitingForDestroy.append(resource);
++    }
+     bool removed = m_tabletSeat->m_tools.removeOne(this);
+     QVERIFY(removed);
+-    m_tabletSeat->m_toolsWaitingForDestroy.append(this);
+ }
+ 
+ uint TabletToolV2::sendProximityIn(TabletV2 *tablet, Surface *surface)
+@@ -333,26 +334,25 @@ uint TabletToolV2::sendFrame()
+ void TabletToolV2::zwp_tablet_tool_v2_destroy(QtWaylandServer::zwp_tablet_tool_v2::Resource *resource)
+ {
+     if (m_tabletSeat) {
+-        bool removed = m_tabletSeat->m_toolsWaitingForDestroy.removeOne(this);
+-        QVERIFY(removed);
++        m_tabletSeat->m_toolsWaitingForDestroy.removeOne(resource);
+     }
+     wl_resource_destroy(resource->handle);
+ }
+ 
+ void TabletPadV2::sendRemoved()
+ {
+-    for (auto *resource : resourceMap())
++    for (auto *resource : resourceMap()) {
+         zwp_tablet_pad_v2_send_removed(resource->handle);
++        m_tabletSeat->m_padsWaitingForDestroy.append(resource);
++    }
+     bool removed = m_tabletSeat->m_pads.removeOne(this);
+     QVERIFY(removed);
+-    m_tabletSeat->m_padsWaitingForDestroy.append(this);
+ }
+ 
+ void TabletPadV2::zwp_tablet_pad_v2_destroy(QtWaylandServer::zwp_tablet_pad_v2::Resource *resource)
+ {
+     if (m_tabletSeat) {
+-        bool removed = m_tabletSeat->m_padsWaitingForDestroy.removeOne(this);
+-        QVERIFY(removed);
++        m_tabletSeat->m_padsWaitingForDestroy.removeOne(resource);
+     }
+     wl_resource_destroy(resource->handle);
+ }
+@@ -405,6 +405,8 @@ private slots:
+     void destroysTablet();
+     void destroysTool();
+     void destroysPad();
++    void removeTabletBeforeTool();
++    void removeTabletBeforePad();
+     void proximityEvents();
+     void moveEvent();
+     void pointerType_data();
+@@ -502,12 +504,14 @@ void tst_tabletv2::destroysTool()
+ {
+     QCOMPOSITOR_TRY_VERIFY(tabletSeat());
+     exec([&] {
++        tabletSeat()->addTablet();
+         tabletSeat()->addTool();
+     });
+     QCOMPOSITOR_TRY_VERIFY(tabletTool());
+ 
+     exec([&] {
+         tabletTool()->sendRemoved();
++        tablet()->sendRemoved();
+     });
+ 
+     QCOMPOSITOR_TRY_VERIFY(!tabletTool());
+@@ -530,6 +534,42 @@ void tst_tabletv2::destroysPad()
+     QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_padsWaitingForDestroy.empty());
+ }
+ 
++void tst_tabletv2::removeTabletBeforeTool()
++{
++    QCOMPOSITOR_TRY_VERIFY(tabletSeat());
++    exec([&] {
++        tabletSeat()->addTablet();
++        tabletSeat()->addTool();
++    });
++    QCOMPOSITOR_TRY_VERIFY(tablet());
++    QCOMPOSITOR_TRY_VERIFY(tabletTool());
++
++    exec([&] { tablet()->sendRemoved(); });
++    QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_tabletsWaitingForDestroy.empty());
++
++    exec([&] { tabletTool()->sendRemoved(); });
++    QCOMPOSITOR_TRY_VERIFY(!tabletTool());
++    QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_toolsWaitingForDestroy.empty());
++}
++
++void tst_tabletv2::removeTabletBeforePad()
++{
++    QCOMPOSITOR_TRY_VERIFY(tabletSeat());
++    exec([&] {
++        tabletSeat()->addTablet();
++        tabletSeat()->addPad();
++    });
++    QCOMPOSITOR_TRY_VERIFY(tablet());
++    QCOMPOSITOR_TRY_VERIFY(tabletPad());
++
++    exec([&] { tablet()->sendRemoved(); });
++    QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_tabletsWaitingForDestroy.empty());
++
++    exec([&] { tabletPad()->sendRemoved(); });
++    QCOMPOSITOR_TRY_VERIFY(!tabletPad());
++    QCOMPOSITOR_TRY_VERIFY(tabletSeat()->m_padsWaitingForDestroy.empty());
++}
++
+ void tst_tabletv2::proximityEvents()
+ {
+     ProximityFilter filter;
+-- 
+2.43.0
+
diff --git a/debian/patches/series b/debian/patches/series
index 027f89d..d50104b 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,6 @@
 c2f61bc47baacf2e6a44c6c3c4e4cbf0abfa4095.diff
-24002ac6cbd01dbde4944b63c1f7c87ed2bd72b5.diff
\ No newline at end of file
+
+# below are the same patchset but rebased against 6.8.0 and 6.8.1
+# so move to the next one when we roll out 6.8.1
+0001-client-Redo-management-of-tablet-object-proxies.patch ### for 6.8.0
+### 24002ac6cbd01dbde4944b63c1f7c87ed2bd72b5.diff ### for 6.8.1


More information about the Neon-commits mailing list