[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