summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-07-22 16:56:51 +0200
committerVaxry <vaxry@vaxry.net>2024-07-22 16:56:51 +0200
commit5bae7f150b228d3bf677d09fd0c320328b0d0ff0 (patch)
tree4713f93b61411378071abc08117e2caae137b2ab /src
parent83a5395eaa99fecef777827fff1de486c06b6180 (diff)
wayland/output: avoid sending events to dead outputs
ref #6835
Diffstat (limited to 'src')
-rw-r--r--src/managers/ProtocolManager.cpp8
-rw-r--r--src/protocols/core/Output.cpp5
-rw-r--r--src/protocols/core/Output.hpp6
3 files changed, 12 insertions, 7 deletions
diff --git a/src/managers/ProtocolManager.cpp b/src/managers/ProtocolManager.cpp
index 387cac8f..5a44680f 100644
--- a/src/managers/ProtocolManager.cpp
+++ b/src/managers/ProtocolManager.cpp
@@ -66,8 +66,7 @@ void CProtocolManager::onMonitorModeChange(CMonitor* pMonitor) {
else if (!ISMIRROR && (!PROTO::outputs.contains(pMonitor->szName) || PROTO::outputs.at(pMonitor->szName)->isDefunct())) {
if (PROTO::outputs.contains(pMonitor->szName))
PROTO::outputs.erase(pMonitor->szName);
- PROTO::outputs.emplace(pMonitor->szName,
- std::make_unique<CWLOutputProtocol>(&wl_output_interface, 4, std::format("WLOutput ({})", pMonitor->szName), pMonitor->self.lock()));
+ PROTO::outputs.emplace(pMonitor->szName, makeShared<CWLOutputProtocol>(&wl_output_interface, 4, std::format("WLOutput ({})", pMonitor->szName), pMonitor->self.lock()));
}
}
@@ -86,7 +85,10 @@ CProtocolManager::CProtocolManager() {
if (PROTO::outputs.contains(M->szName))
PROTO::outputs.erase(M->szName);
- PROTO::outputs.emplace(M->szName, std::make_unique<CWLOutputProtocol>(&wl_output_interface, 4, std::format("WLOutput ({})", M->szName), M->self.lock()));
+
+ auto ref = makeShared<CWLOutputProtocol>(&wl_output_interface, 4, std::format("WLOutput ({})", M->szName), M->self.lock());
+ PROTO::outputs.emplace(M->szName, ref);
+ ref->self = ref;
m_mModeChangeListeners[M->szName] = M->events.modeChanged.registerListener([M, this](std::any d) { onMonitorModeChange(M); });
});
diff --git a/src/protocols/core/Output.cpp b/src/protocols/core/Output.cpp
index 4ba23cbe..878d1484 100644
--- a/src/protocols/core/Output.cpp
+++ b/src/protocols/core/Output.cpp
@@ -49,7 +49,7 @@ SP<CWlOutput> CWLOutputResource::getResource() {
}
void CWLOutputResource::updateState() {
- if (!monitor)
+ if (!monitor || (owner && owner->defunct))
return;
if (resource->version() >= 2)
@@ -83,7 +83,8 @@ void CWLOutputProtocol::bindManager(wl_client* client, void* data, uint32_t ver,
return;
}
- RESOURCE->self = RESOURCE;
+ RESOURCE->self = RESOURCE;
+ RESOURCE->owner = self;
}
void CWLOutputProtocol::destroyResource(CWLOutputResource* resource) {
diff --git a/src/protocols/core/Output.hpp b/src/protocols/core/Output.hpp
index 46e4057b..49c32ec1 100644
--- a/src/protocols/core/Output.hpp
+++ b/src/protocols/core/Output.hpp
@@ -8,6 +8,7 @@
#include "../../helpers/signal/Signal.hpp"
class CMonitor;
+class CWLOutputProtocol;
class CWLOutputResource {
public:
@@ -20,7 +21,7 @@ class CWLOutputResource {
void updateState();
WP<CMonitor> monitor;
-
+ WP<CWLOutputProtocol> owner;
WP<CWLOutputResource> self;
private:
@@ -40,6 +41,7 @@ class CWLOutputProtocol : public IWaylandProtocol {
void sendDone();
WP<CMonitor> monitor;
+ WP<CWLOutputProtocol> self;
// will mark the protocol for removal, will be removed when no. of bound outputs is 0 (or when overwritten by a new global)
void remove();
@@ -61,5 +63,5 @@ class CWLOutputProtocol : public IWaylandProtocol {
};
namespace PROTO {
- inline std::unordered_map<std::string, UP<CWLOutputProtocol>> outputs;
+ inline std::unordered_map<std::string, SP<CWLOutputProtocol>> outputs;
};