summaryrefslogtreecommitdiff
path: root/src/protocols/ToplevelExport.cpp
diff options
context:
space:
mode:
authorIkalco <73481042+ikalco@users.noreply.github.com>2026-03-05 08:06:55 -0600
committerGitHub <noreply@github.com>2026-03-05 14:06:55 +0000
commit803e81ac398ff56816321fbe24f013671cfebc7f (patch)
tree9c3007c6b9f65f06d5969f03b2cf8c6c5e0f94fd /src/protocols/ToplevelExport.cpp
parent34c7cc7d38256f32f30a947f8b459df220149feb (diff)
screenshare: improve destroy logic of objects (#13554)
Diffstat (limited to 'src/protocols/ToplevelExport.cpp')
-rw-r--r--src/protocols/ToplevelExport.cpp20
1 files changed, 7 insertions, 13 deletions
diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp
index bf553a92..d7ba7519 100644
--- a/src/protocols/ToplevelExport.cpp
+++ b/src/protocols/ToplevelExport.cpp
@@ -13,10 +13,7 @@ CToplevelExportClient::CToplevelExportClient(SP<CHyprlandToplevelExportManagerV1
if UNLIKELY (!good())
return;
- m_resource->setOnDestroy([this](CHyprlandToplevelExportManagerV1* pMgr) {
- Screenshare::mgr()->destroyClientSessions(m_savedClient);
- PROTO::toplevelExport->destroyResource(this);
- });
+ m_resource->setOnDestroy([this](CHyprlandToplevelExportManagerV1* pMgr) { PROTO::toplevelExport->destroyResource(this); });
m_resource->setDestroy([this](CHyprlandToplevelExportManagerV1* pMgr) { PROTO::toplevelExport->destroyResource(this); });
m_resource->setCaptureToplevel([this](CHyprlandToplevelExportManagerV1* pMgr, uint32_t frame, int32_t overlayCursor, uint32_t handle) {
captureToplevel(frame, overlayCursor, g_pCompositor->getWindowFromHandle(handle));
@@ -28,10 +25,6 @@ CToplevelExportClient::CToplevelExportClient(SP<CHyprlandToplevelExportManagerV1
m_savedClient = m_resource->client();
}
-CToplevelExportClient::~CToplevelExportClient() {
- Screenshare::mgr()->destroyClientSessions(m_savedClient);
-}
-
void CToplevelExportClient::captureToplevel(uint32_t frame, int32_t overlayCursor_, PHLWINDOW handle) {
auto session = Screenshare::mgr()->getManagedSession(m_resource->client(), handle);
@@ -63,11 +56,6 @@ CToplevelExportFrame::CToplevelExportFrame(SP<CHyprlandToplevelExportFrameV1> re
m_resource->setDestroy([this](CHyprlandToplevelExportFrameV1* pFrame) { PROTO::toplevelExport->destroyResource(this); });
m_resource->setCopy([this](CHyprlandToplevelExportFrameV1* pFrame, wl_resource* res, int32_t ignoreDamage) { shareFrame(res, !!ignoreDamage); });
- m_listeners.stopped = m_session->m_events.stopped.listen([this]() {
- if (good())
- m_resource->sendFailed();
- });
-
m_frame = m_session->nextFrame(overlayCursor);
auto formats = m_session->allowedFormats();
@@ -100,6 +88,12 @@ void CToplevelExportFrame::shareFrame(wl_resource* buffer, bool ignoreDamage) {
return;
}
+ if UNLIKELY (m_session.expired() || !m_session->monitor()) {
+ LOGM(Log::ERR, "Session stopped for frame {:x}", (uintptr_t)this);
+ m_resource->sendFailed();
+ return;
+ }
+
if UNLIKELY (m_buffer) {
LOGM(Log::ERR, "Buffer used in {:x}", (uintptr_t)this);
m_resource->error(HYPRLAND_TOPLEVEL_EXPORT_FRAME_V1_ERROR_ALREADY_USED, "frame already used");