diff --git a/src/protocols/IdleInhibit.cpp b/src/protocols/IdleInhibit.cpp index 0b90e2840..0119755fa 100644 --- a/src/protocols/IdleInhibit.cpp +++ b/src/protocols/IdleInhibit.cpp @@ -6,7 +6,14 @@ CIdleInhibitor::CIdleInhibitor(SP resource_, wlr_surface CIdleInhibitorResource::CIdleInhibitorResource(SP resource_, wlr_surface* surface_) : resource(resource_), surface(surface_) { hyprListener_surfaceDestroy.initCallback( - &surface->events.destroy, [this](void* owner, void* data) { PROTO::idleInhibit->removeInhibitor(this); }, this, "CIdleInhibitorResource"); + &surface->events.destroy, + [this](void* owner, void* data) { + surface = nullptr; + hyprListener_surfaceDestroy.removeCallback(); + destroySent = true; + events.destroy.emit(); + }, + this, "CIdleInhibitorResource"); resource->setOnDestroy([this](CZwpIdleInhibitorV1* p) { PROTO::idleInhibit->removeInhibitor(this); }); resource->setDestroy([this](CZwpIdleInhibitorV1* p) { PROTO::idleInhibit->removeInhibitor(this); }); @@ -14,7 +21,8 @@ CIdleInhibitorResource::CIdleInhibitorResource(SP resource_ CIdleInhibitorResource::~CIdleInhibitorResource() { hyprListener_surfaceDestroy.removeCallback(); - events.destroy.emit(); + if (!destroySent) + events.destroy.emit(); } CIdleInhibitProtocol::CIdleInhibitProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) { diff --git a/src/protocols/IdleInhibit.hpp b/src/protocols/IdleInhibit.hpp index 3ea8f691a..b59e8789e 100644 --- a/src/protocols/IdleInhibit.hpp +++ b/src/protocols/IdleInhibit.hpp @@ -33,7 +33,8 @@ class CIdleInhibitorResource { private: SP resource; - wlr_surface* surface = nullptr; + wlr_surface* surface = nullptr; + bool destroySent = false; DYNLISTENER(surfaceDestroy); };