summaryrefslogtreecommitdiff
path: root/src/managers
diff options
context:
space:
mode:
authorIkalco <73481042+ikalco@users.noreply.github.com>2024-07-24 12:07:36 -0500
committerGitHub <noreply@github.com>2024-07-24 19:07:36 +0200
commit3e543d2ce8ba64abb4d226dbb88c4513474501cf (patch)
treed340935c65520e293a73623c148219993e38779b /src/managers
parent735e3c6c56d22059ee6340c0327e4b5a9154f013 (diff)
core: Properly shutdown wl display (#7018)
* correctly destroy wayland globals * properly shutdown and cleanup hyprland * appease the nitpick gods and some comments
Diffstat (limited to 'src/managers')
-rw-r--r--src/managers/KeybindManager.cpp2
-rw-r--r--src/managers/ProtocolManager.cpp54
-rw-r--r--src/managers/ProtocolManager.hpp1
-rw-r--r--src/managers/eventLoop/EventLoopManager.cpp6
4 files changed, 62 insertions, 1 deletions
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index fda27598..ed76575a 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -1662,7 +1662,7 @@ void CKeybindManager::renameWorkspace(std::string args) {
}
void CKeybindManager::exitHyprland(std::string argz) {
- g_pEventLoopManager->doLater([]() { g_pCompositor->cleanup(); });
+ g_pCompositor->stopCompositor();
}
void CKeybindManager::moveCurrentWorkspaceToMonitor(std::string args) {
diff --git a/src/managers/ProtocolManager.cpp b/src/managers/ProtocolManager.cpp
index 5a44680f..ef2260cc 100644
--- a/src/managers/ProtocolManager.cpp
+++ b/src/managers/ProtocolManager.cpp
@@ -166,3 +166,57 @@ CProtocolManager::CProtocolManager() {
m_pGlobalShortcutsProtocolManager = std::make_unique<CGlobalShortcutsProtocolManager>();
m_pScreencopyProtocolManager = std::make_unique<CScreencopyProtocolManager>();
}
+
+CProtocolManager::~CProtocolManager() {
+ // this is dumb but i don't want to replace all 600 PROTO with the right thing
+
+ // Output
+ PROTO::outputs.clear();
+
+ // Core
+ PROTO::seat.reset();
+ PROTO::data.reset();
+ PROTO::compositor.reset();
+ PROTO::subcompositor.reset();
+ PROTO::shm.reset();
+
+ // Extensions
+ PROTO::viewport.reset();
+ PROTO::tearing.reset();
+ PROTO::fractional.reset();
+ PROTO::xdgOutput.reset();
+ PROTO::cursorShape.reset();
+ PROTO::idleInhibit.reset();
+ PROTO::relativePointer.reset();
+ PROTO::xdgDecoration.reset();
+ PROTO::alphaModifier.reset();
+ PROTO::gamma.reset();
+ PROTO::foreignToplevel.reset();
+ PROTO::pointerGestures.reset();
+ PROTO::foreignToplevelWlr.reset();
+ PROTO::shortcutsInhibit.reset();
+ PROTO::textInputV3.reset();
+ PROTO::constraints.reset();
+ PROTO::outputPower.reset();
+ PROTO::activation.reset();
+ PROTO::idle.reset();
+ PROTO::sessionLock.reset();
+ PROTO::ime.reset();
+ PROTO::virtualKeyboard.reset();
+ PROTO::virtualPointer.reset();
+ PROTO::outputManagement.reset();
+ PROTO::serverDecorationKDE.reset();
+ PROTO::focusGrab.reset();
+ PROTO::tablet.reset();
+ PROTO::layerShell.reset();
+ PROTO::presentation.reset();
+ PROTO::xdgShell.reset();
+ PROTO::dataWlr.reset();
+ PROTO::primarySelection.reset();
+ PROTO::xwaylandShell.reset();
+
+ PROTO::lease.reset();
+ PROTO::sync.reset();
+ PROTO::mesaDRM.reset();
+ PROTO::linuxDma.reset();
+}
diff --git a/src/managers/ProtocolManager.hpp b/src/managers/ProtocolManager.hpp
index 91fb82a0..6a780bdc 100644
--- a/src/managers/ProtocolManager.hpp
+++ b/src/managers/ProtocolManager.hpp
@@ -12,6 +12,7 @@
class CProtocolManager {
public:
CProtocolManager();
+ ~CProtocolManager();
// TODO: rewrite to use the new protocol framework
std::unique_ptr<CToplevelExportProtocolManager> m_pToplevelExportProtocolManager;
diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp
index ed7a4f72..3131531a 100644
--- a/src/managers/eventLoop/EventLoopManager.cpp
+++ b/src/managers/eventLoop/EventLoopManager.cpp
@@ -19,8 +19,14 @@ CEventLoopManager::CEventLoopManager(wl_display* display, wl_event_loop* wlEvent
}
CEventLoopManager::~CEventLoopManager() {
+ for (auto& eventSource : m_sWayland.aqEventSources) {
+ wl_event_source_remove(eventSource);
+ }
+
if (m_sWayland.eventSource)
wl_event_source_remove(m_sWayland.eventSource);
+ if (m_sIdle.eventSource)
+ wl_event_source_remove(m_sIdle.eventSource);
}
static int timerWrite(int fd, uint32_t mask, void* data) {