diff --git a/src/server/resource.h b/src/server/resource.h --- a/src/server/resource.h +++ b/src/server/resource.h @@ -74,6 +74,14 @@ **/ quint32 id() const; +Q_SIGNALS: + /** + * This signal is emitted when the client unbound this Resource. + * The Resource will be deleted in the next event cycle after this event. + * @since 5.24 + **/ + void unbound(); + protected: class Private; explicit Resource(Private *d, QObject *parent = nullptr); diff --git a/src/server/resource.cpp b/src/server/resource.cpp --- a/src/server/resource.cpp +++ b/src/server/resource.cpp @@ -64,6 +64,7 @@ { Private *p = cast(r); p->resource = nullptr; + emit p->q->unbound(); p->q->deleteLater(); } diff --git a/src/server/seat_interface.cpp b/src/server/seat_interface.cpp --- a/src/server/seat_interface.cpp +++ b/src/server/seat_interface.cpp @@ -214,21 +214,21 @@ { Q_ASSERT(dataDevice->seat() == q); dataDevices << dataDevice; - QObject::connect(dataDevice, &QObject::destroyed, q, - [this, dataDevice] { - dataDevices.removeAt(dataDevices.indexOf(dataDevice)); - if (keys.focus.selection == dataDevice) { - keys.focus.selection = nullptr; - } - if (currentSelection == dataDevice) { - // current selection is cleared - currentSelection = nullptr; - if (keys.focus.selection) { - keys.focus.selection->sendClearSelection(); - } + auto dataDeviceCleanup = [this, dataDevice] { + dataDevices.removeOne(dataDevice); + if (keys.focus.selection == dataDevice) { + keys.focus.selection = nullptr; + } + if (currentSelection == dataDevice) { + // current selection is cleared + currentSelection = nullptr; + if (keys.focus.selection) { + keys.focus.selection->sendClearSelection(); } } - ); + }; + QObject::connect(dataDevice, &QObject::destroyed, q, dataDeviceCleanup); + QObject::connect(dataDevice, &Resource::unbound, q, dataDeviceCleanup); QObject::connect(dataDevice, &DataDeviceInterface::selectionChanged, q, [this, dataDevice] { updateSelection(dataDevice, true);