diff --git a/autotests/client/test_datadevice.cpp b/autotests/client/test_datadevice.cpp --- a/autotests/client/test_datadevice.cpp +++ b/autotests/client/test_datadevice.cpp @@ -191,6 +191,12 @@ QVERIFY(!deviceInterface->icon()); QVERIFY(!deviceInterface->selection()); QVERIFY(deviceInterface->parentResource()); + + // and destroy + QSignalSpy destroyedSpy(deviceInterface, &QObject::destroyed); + QVERIFY(destroyedSpy.isValid()); + dataDevice.reset(); + QVERIFY(destroyedSpy.wait()); } void TestDataDevice::testDrag() diff --git a/autotests/client/test_server_side_decoration.cpp b/autotests/client/test_server_side_decoration.cpp --- a/autotests/client/test_server_side_decoration.cpp +++ b/autotests/client/test_server_side_decoration.cpp @@ -201,6 +201,12 @@ QVERIFY(modeChangedSpy.wait()); QCOMPARE(modeChangedSpy.count(), 1); QTEST(serverSideDecoration->mode(), "clientMode"); + + // and destroy + QSignalSpy destroyedSpy(serverDeco, &QObject::destroyed); + QVERIFY(destroyedSpy.isValid()); + serverSideDecoration.reset(); + QVERIFY(destroyedSpy.wait()); } void TestServerSideDecoration::testRequest_data() diff --git a/autotests/client/test_wayland_blur.cpp b/autotests/client/test_wayland_blur.cpp --- a/autotests/client/test_wayland_blur.cpp +++ b/autotests/client/test_wayland_blur.cpp @@ -163,6 +163,12 @@ QVERIFY(blurChanged.wait()); QCOMPARE(serverSurface->blur()->region(), QRegion(0, 0, 10, 20)); + + // and destroy + QSignalSpy destroyedSpy(serverSurface->blur(), &QObject::destroyed); + QVERIFY(destroyedSpy.isValid()); + delete blur; + QVERIFY(destroyedSpy.wait()); } QTEST_GUILESS_MAIN(TestBlur) diff --git a/autotests/client/test_wayland_contrast.cpp b/autotests/client/test_wayland_contrast.cpp --- a/autotests/client/test_wayland_contrast.cpp +++ b/autotests/client/test_wayland_contrast.cpp @@ -174,6 +174,12 @@ QCOMPARE(wl_fixed_from_double(serverSurface->contrast()->contrast()), wl_fixed_from_double(0.2)); QCOMPARE(wl_fixed_from_double(serverSurface->contrast()->intensity()), wl_fixed_from_double(2.0)); QCOMPARE(wl_fixed_from_double(serverSurface->contrast()->saturation()), wl_fixed_from_double(1.7)); + + // and destroy + QSignalSpy destroyedSpy(serverSurface->contrast(), &QObject::destroyed); + QVERIFY(destroyedSpy.isValid()); + delete contrast; + QVERIFY(destroyedSpy.wait()); } QTEST_GUILESS_MAIN(TestContrast) diff --git a/src/server/blur_interface.cpp b/src/server/blur_interface.cpp --- a/src/server/blur_interface.cpp +++ b/src/server/blur_interface.cpp @@ -153,16 +153,15 @@ static void commitCallback(wl_client *client, wl_resource *resource); static void setRegionCallback(wl_client *client, wl_resource *resource, wl_resource *region); - static void releaseCallback(wl_client *client, wl_resource *resource); static const struct org_kde_kwin_blur_interface s_interface; }; #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct org_kde_kwin_blur_interface BlurInterface::Private::s_interface = { commitCallback, setRegionCallback, - releaseCallback + resourceDestroyedCallback }; #endif @@ -189,14 +188,6 @@ } } -void BlurInterface::Private::releaseCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client); - Private *p = reinterpret_cast(wl_resource_get_user_data(resource)); - wl_resource_destroy(resource); - p->q->deleteLater(); -} - BlurInterface::Private::Private(BlurInterface *q, BlurManagerInterface *c, wl_resource *parentResource) : Resource::Private(q, c, parentResource, &org_kde_kwin_blur_interface, &s_interface) { diff --git a/src/server/contrast_interface.cpp b/src/server/contrast_interface.cpp --- a/src/server/contrast_interface.cpp +++ b/src/server/contrast_interface.cpp @@ -162,7 +162,6 @@ static void setContrastCallback(wl_client *client, wl_resource *resource, wl_fixed_t contrast); static void setIntensityCallback(wl_client *client, wl_resource *resource, wl_fixed_t intensity); static void setSaturationCallback(wl_client *client, wl_resource *resource, wl_fixed_t saturation); - static void releaseCallback(wl_client *client, wl_resource *resource); static const struct org_kde_kwin_contrast_interface s_interface; }; @@ -174,7 +173,7 @@ setContrastCallback, setIntensityCallback, setSaturationCallback, - releaseCallback + resourceDestroyedCallback }; #endif @@ -225,14 +224,6 @@ p->pendingSaturation = wl_fixed_to_double(saturation); } -void ContrastInterface::Private::releaseCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client); - Private *p = reinterpret_cast(wl_resource_get_user_data(resource)); - wl_resource_destroy(resource); - p->q->deleteLater(); -} - ContrastInterface::Private::Private(ContrastInterface *q, ContrastManagerInterface *c, wl_resource *parentResource) : Resource::Private(q, c, parentResource, &org_kde_kwin_contrast_interface, &s_interface) { diff --git a/src/server/datadevice_interface.cpp b/src/server/datadevice_interface.cpp --- a/src/server/datadevice_interface.cpp +++ b/src/server/datadevice_interface.cpp @@ -65,16 +65,15 @@ void setSelection(DataSourceInterface *dataSource); static void startDragCallback(wl_client *client, wl_resource *resource, wl_resource *source, wl_resource *origin, wl_resource *icon, uint32_t serial); static void setSelectionCallback(wl_client *client, wl_resource *resource, wl_resource *source, uint32_t serial); - static void releaseCallback(wl_client *client, wl_resource *resource); static const struct wl_data_device_interface s_interface; }; #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct wl_data_device_interface DataDeviceInterface::Private::s_interface = { startDragCallback, setSelectionCallback, - releaseCallback + resourceDestroyedCallback }; #endif @@ -118,14 +117,6 @@ cast(resource)->setSelection(DataSourceInterface::get(source)); } -void DataDeviceInterface::Private::releaseCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client); - Private *p = reinterpret_cast(wl_resource_get_user_data(resource)); - wl_resource_destroy(resource); - p->q->deleteLater(); -} - void DataDeviceInterface::Private::setSelection(DataSourceInterface *dataSource) { Q_Q(DataDeviceInterface); diff --git a/src/server/dataoffer_interface.cpp b/src/server/dataoffer_interface.cpp --- a/src/server/dataoffer_interface.cpp +++ b/src/server/dataoffer_interface.cpp @@ -46,16 +46,15 @@ void receive(const QString &mimeType, qint32 fd); static void acceptCallback(wl_client *client, wl_resource *resource, uint32_t serial, const char *mimeType); static void receiveCallback(wl_client *client, wl_resource *resource, const char *mimeType, int32_t fd); - static void destroyCallback(wl_client *client, wl_resource *resource); static const struct wl_data_offer_interface s_interface; }; #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct wl_data_offer_interface DataOfferInterface::Private::s_interface = { acceptCallback, receiveCallback, - destroyCallback + resourceDestroyedCallback }; #endif @@ -80,12 +79,6 @@ p->source->accept(mimeType ? QString::fromUtf8(mimeType) : QString()); } -void DataOfferInterface::Private::destroyCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - wl_resource_destroy(resource); -} - void DataOfferInterface::Private::receiveCallback(wl_client *client, wl_resource *resource, const char *mimeType, int32_t fd) { Q_UNUSED(client) diff --git a/src/server/datasource_interface.cpp b/src/server/datasource_interface.cpp --- a/src/server/datasource_interface.cpp +++ b/src/server/datasource_interface.cpp @@ -47,15 +47,14 @@ void offer(const QString &mimeType); static void offerCallback(wl_client *client, wl_resource *resource, const char *mimeType); - static void destroyCallack(wl_client *client, wl_resource *resource); const static struct wl_data_source_interface s_interface; }; #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct wl_data_source_interface DataSourceInterface::Private::s_interface = { offerCallback, - destroyCallack + resourceDestroyedCallback }; #endif @@ -66,15 +65,6 @@ DataSourceInterface::Private::~Private() = default; -void DataSourceInterface::Private::destroyCallack(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - auto p = cast(resource); - wl_resource_destroy(resource); - p->resource = nullptr; - p->q->deleteLater(); -} - void DataSourceInterface::Private::offerCallback(wl_client *client, wl_resource *resource, const char *mimeType) { Q_UNUSED(client) diff --git a/src/server/dpms_interface.cpp b/src/server/dpms_interface.cpp --- a/src/server/dpms_interface.cpp +++ b/src/server/dpms_interface.cpp @@ -78,7 +78,7 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct org_kde_kwin_dpms_interface DpmsInterface::Private::s_interface = { setCallback, - releaseCallback + resourceDestroyedCallback }; #endif @@ -111,14 +111,6 @@ emit cast(resource)->output->dpmsModeRequested(dpmsMode); } -void DpmsInterface::Private::releaseCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - Private *p = reinterpret_cast(wl_resource_get_user_data(resource)); - wl_resource_destroy(resource); - p->q->deleteLater(); -} - DpmsInterface::DpmsInterface(OutputInterface *output, wl_resource *parentResource, DpmsManagerInterface *manager) : Resource(new Private(this, manager, parentResource, output)) { diff --git a/src/server/dpms_interface_p.h b/src/server/dpms_interface_p.h --- a/src/server/dpms_interface_p.h +++ b/src/server/dpms_interface_p.h @@ -75,7 +75,6 @@ private: static void setCallback(wl_client *client, wl_resource *resource, uint32_t mode); - static void releaseCallback(wl_client *client, wl_resource *resource); static const struct org_kde_kwin_dpms_interface s_interface; }; diff --git a/src/server/idle_interface.cpp b/src/server/idle_interface.cpp --- a/src/server/idle_interface.cpp +++ b/src/server/idle_interface.cpp @@ -63,7 +63,6 @@ QTimer *timer = nullptr; private: - static void releaseCallback(wl_client *client, wl_resource *resource); static void simulateUserActivityCallback(wl_client *client, wl_resource *resource); IdleTimeoutInterface *q_func() { return reinterpret_cast(q); @@ -126,7 +125,7 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct org_kde_kwin_idle_timeout_interface IdleTimeoutInterface::Private::s_interface = { - releaseCallback, + resourceDestroyedCallback, simulateUserActivityCallback }; #endif @@ -139,14 +138,6 @@ IdleTimeoutInterface::Private::~Private() = default; -void IdleTimeoutInterface::Private::releaseCallback(wl_client* client, wl_resource* resource) -{ - Q_UNUSED(client); - Private *p = reinterpret_cast(wl_resource_get_user_data(resource)); - wl_resource_destroy(resource); - p->q->deleteLater(); -} - void IdleTimeoutInterface::Private::simulateUserActivityCallback(wl_client *client, wl_resource *resource) { Q_UNUSED(client); diff --git a/src/server/plasmashell_interface.cpp b/src/server/plasmashell_interface.cpp --- a/src/server/plasmashell_interface.cpp +++ b/src/server/plasmashell_interface.cpp @@ -79,7 +79,6 @@ private: // interface callbacks - static void destroyCallback(wl_client *client, wl_resource *resource); static void setOutputCallback(wl_client *client, wl_resource *resource, wl_resource *output); static void setPositionCallback(wl_client *client, wl_resource *resource, int32_t x, int32_t y); static void setRoleCallback(wl_client *client, wl_resource *resource, uint32_t role); @@ -154,7 +153,7 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct org_kde_plasma_surface_interface PlasmaShellSurfaceInterface::Private::s_interface = { - destroyCallback, + resourceDestroyedCallback, setOutputCallback, setPositionCallback, setRoleCallback, @@ -185,12 +184,6 @@ return reinterpret_cast(d.data()); } -void PlasmaShellSurfaceInterface::Private::destroyCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - wl_resource_destroy(resource); -} - void PlasmaShellSurfaceInterface::Private::setOutputCallback(wl_client *client, wl_resource *resource, wl_resource *output) { Q_UNUSED(client) diff --git a/src/server/region_interface.cpp b/src/server/region_interface.cpp --- a/src/server/region_interface.cpp +++ b/src/server/region_interface.cpp @@ -42,16 +42,15 @@ void add(const QRect &rect); void subtract(const QRect &rect); - static void destroyCallback(wl_client *client, wl_resource *r); static void addCallback(wl_client *client, wl_resource *r, int32_t x, int32_t y, int32_t width, int32_t height); static void subtractCallback(wl_client *client, wl_resource *r, int32_t x, int32_t y, int32_t width, int32_t height); static const struct wl_region_interface s_interface; }; #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct wl_region_interface RegionInterface::Private::s_interface = { - destroyCallback, + resourceDestroyedCallback, addCallback, subtractCallback }; @@ -93,12 +92,6 @@ cast(r)->subtract(QRect(x, y, width, height)); } -void RegionInterface::Private::destroyCallback(wl_client *client, wl_resource *r) -{ - Q_UNUSED(client) - wl_resource_destroy(r); -} - RegionInterface::RegionInterface(CompositorInterface *parent, wl_resource *parentResource) : Resource(new Private(parent, this, parentResource)) { diff --git a/src/server/resource.cpp b/src/server/resource.cpp --- a/src/server/resource.cpp +++ b/src/server/resource.cpp @@ -67,6 +67,13 @@ p->q->deleteLater(); } + +void Resource::Private::resourceDestroyedCallback(wl_client *client, wl_resource *resource) +{ + Q_UNUSED(client) + wl_resource_destroy(resource); +} + Resource::Resource(Resource::Private *d, QObject *parent) : QObject(parent) , d(d) diff --git a/src/server/resource_p.h b/src/server/resource_p.h --- a/src/server/resource_p.h +++ b/src/server/resource_p.h @@ -79,6 +79,7 @@ return r ? reinterpret_cast(wl_resource_get_user_data(r)) : nullptr; } static void unbind(wl_resource *resource); + static void resourceDestroyedCallback(wl_client *client, wl_resource *resource); Resource *q; static QList s_allResources; diff --git a/src/server/server_decoration_interface.cpp b/src/server/server_decoration_interface.cpp --- a/src/server/server_decoration_interface.cpp +++ b/src/server/server_decoration_interface.cpp @@ -183,7 +183,6 @@ static ServerSideDecorationInterface *get(SurfaceInterface *s); private: - static void releaseCallback(wl_client *client, wl_resource *resource); static void requestModeCallback(wl_client *client, wl_resource *resource, uint32_t mode); ServerSideDecorationInterface *q_func() { @@ -196,20 +195,12 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct org_kde_kwin_server_decoration_interface ServerSideDecorationInterface::Private::s_interface = { - releaseCallback, + resourceDestroyedCallback, requestModeCallback }; QVector ServerSideDecorationInterface::Private::s_all; #endif -void ServerSideDecorationInterface::Private::releaseCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - Private *p = cast(resource); - wl_resource_destroy(resource); - p->q->deleteLater(); -} - void ServerSideDecorationInterface::Private::requestModeCallback(wl_client *client, wl_resource *resource, uint32_t mode) { Q_UNUSED(client) diff --git a/src/server/subcompositor_interface.cpp b/src/server/subcompositor_interface.cpp --- a/src/server/subcompositor_interface.cpp +++ b/src/server/subcompositor_interface.cpp @@ -129,7 +129,7 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct wl_subsurface_interface SubSurfaceInterface::Private::s_interface = { - destroyCallback, + resourceDestroyedCallback, setPositionCallback, placeAboveCallback, placeBelowCallback, @@ -204,12 +204,6 @@ } } -void SubSurfaceInterface::Private::destroyCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - wl_resource_destroy(resource); -} - void SubSurfaceInterface::Private::setPositionCallback(wl_client *client, wl_resource *resource, int32_t x, int32_t y) { Q_UNUSED(client) diff --git a/src/server/subsurface_interface_p.h b/src/server/subsurface_interface_p.h --- a/src/server/subsurface_interface_p.h +++ b/src/server/subsurface_interface_p.h @@ -58,7 +58,6 @@ void placeAbove(SurfaceInterface *sibling); void placeBelow(SurfaceInterface *sibling); - static void destroyCallback(wl_client *client, wl_resource *resource); static void setPositionCallback(wl_client *client, wl_resource *resource, int32_t x, int32_t y); static void placeAboveCallback(wl_client *client, wl_resource *resource, wl_resource *sibling); static void placeBelowCallback(wl_client *client, wl_resource *resource, wl_resource *sibling); diff --git a/src/server/surface_interface.cpp b/src/server/surface_interface.cpp --- a/src/server/surface_interface.cpp +++ b/src/server/surface_interface.cpp @@ -176,7 +176,7 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct wl_surface_interface SurfaceInterface::Private::s_interface = { - destroyCallback, + resourceDestroyedCallback, attachCallback, damageCallback, frameCallaback, @@ -490,12 +490,6 @@ s->subSurfacePending.callbacks.removeAll(r); } -void SurfaceInterface::Private::destroyCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - wl_resource_destroy(resource); -} - void SurfaceInterface::Private::attachCallback(wl_client *client, wl_resource *resource, wl_resource *buffer, int32_t sx, int32_t sy) { Q_UNUSED(client) diff --git a/src/server/surface_interface_p.h b/src/server/surface_interface_p.h --- a/src/server/surface_interface_p.h +++ b/src/server/surface_interface_p.h @@ -104,7 +104,6 @@ static void destroyFrameCallback(wl_resource *r); - static void destroyCallback(wl_client *client, wl_resource *resource); static void attachCallback(wl_client *client, wl_resource *resource, wl_resource *buffer, int32_t sx, int32_t sy); static void damageCallback(wl_client *client, wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height); static void frameCallaback(wl_client *client, wl_resource *resource, uint32_t callback); diff --git a/src/server/textinput_interface.cpp b/src/server/textinput_interface.cpp --- a/src/server/textinput_interface.cpp +++ b/src/server/textinput_interface.cpp @@ -34,12 +34,6 @@ namespace Server { -void TextInputInterface::Private::destroyCallback(wl_client *client, wl_resource *resource) -{ - Q_UNUSED(client) - wl_resource_destroy(resource); -} - void TextInputInterface::Private::activateCallback(wl_client *client, wl_resource *resource, wl_resource *seat, wl_resource *surface) { auto p = cast(resource); diff --git a/src/server/textinput_interface_p.h b/src/server/textinput_interface_p.h --- a/src/server/textinput_interface_p.h +++ b/src/server/textinput_interface_p.h @@ -86,7 +86,6 @@ protected: Private(TextInputInterface *q, Global *c, wl_resource *parentResource, const wl_interface *interface, const void *implementation); - static void destroyCallback(wl_client *client, wl_resource *resource); static void activateCallback(wl_client *client, wl_resource *resource, wl_resource * seat, wl_resource * surface); static void deactivateCallback(wl_client *client, wl_resource *resource, wl_resource * seat); static void enableCallback(wl_client *client, wl_resource *resource, wl_resource * surface); diff --git a/src/server/textinput_interface_v2.cpp b/src/server/textinput_interface_v2.cpp --- a/src/server/textinput_interface_v2.cpp +++ b/src/server/textinput_interface_v2.cpp @@ -65,7 +65,7 @@ #ifndef DOXYGEN_SHOULD_SKIP_THIS const struct zwp_text_input_v2_interface TextInputUnstableV2Interface::Private::s_interface = { - destroyCallback, + resourceDestroyedCallback, enableCallback, disableCallback, showInputPanelCallback,