mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-09 16:05:58 +01:00
core: improve cleanup logic
This commit is contained in:
parent
9f20a15955
commit
5eeec8860e
8 changed files with 95 additions and 23 deletions
|
@ -81,26 +81,6 @@ CCompositor::CCompositor() {
|
||||||
|
|
||||||
CCompositor::~CCompositor() {
|
CCompositor::~CCompositor() {
|
||||||
cleanup();
|
cleanup();
|
||||||
g_pDecorationPositioner.reset();
|
|
||||||
g_pPluginSystem.reset();
|
|
||||||
g_pHyprNotificationOverlay.reset();
|
|
||||||
g_pDebugOverlay.reset();
|
|
||||||
g_pEventManager.reset();
|
|
||||||
g_pSessionLockManager.reset();
|
|
||||||
g_pProtocolManager.reset();
|
|
||||||
g_pXWaylandManager.reset();
|
|
||||||
g_pHyprRenderer.reset();
|
|
||||||
g_pHyprOpenGL.reset();
|
|
||||||
g_pInputManager.reset();
|
|
||||||
g_pThreadManager.reset();
|
|
||||||
g_pConfigManager.reset();
|
|
||||||
g_pLayoutManager.reset();
|
|
||||||
g_pHyprError.reset();
|
|
||||||
g_pConfigManager.reset();
|
|
||||||
g_pAnimationManager.reset();
|
|
||||||
g_pKeybindManager.reset();
|
|
||||||
g_pHookSystem.reset();
|
|
||||||
g_pWatchdog.reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CCompositor::setRandomSplash() {
|
void CCompositor::setRandomSplash() {
|
||||||
|
@ -332,6 +312,59 @@ void CCompositor::initAllSignals() {
|
||||||
addWLSignal(&m_sWLRSession->events.active, &Events::listen_sessionActive, m_sWLRSession, "Session");
|
addWLSignal(&m_sWLRSession->events.active, &Events::listen_sessionActive, m_sWLRSession, "Session");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CCompositor::removeAllSignals() {
|
||||||
|
removeWLSignal(&Events::listen_newOutput);
|
||||||
|
removeWLSignal(&Events::listen_newXDGToplevel);
|
||||||
|
removeWLSignal(&Events::listen_mouseMove);
|
||||||
|
removeWLSignal(&Events::listen_mouseMoveAbsolute);
|
||||||
|
removeWLSignal(&Events::listen_mouseButton);
|
||||||
|
removeWLSignal(&Events::listen_mouseAxis);
|
||||||
|
removeWLSignal(&Events::listen_mouseFrame);
|
||||||
|
removeWLSignal(&Events::listen_swipeBegin);
|
||||||
|
removeWLSignal(&Events::listen_swipeUpdate);
|
||||||
|
removeWLSignal(&Events::listen_swipeEnd);
|
||||||
|
removeWLSignal(&Events::listen_pinchBegin);
|
||||||
|
removeWLSignal(&Events::listen_pinchUpdate);
|
||||||
|
removeWLSignal(&Events::listen_pinchEnd);
|
||||||
|
removeWLSignal(&Events::listen_touchBegin);
|
||||||
|
removeWLSignal(&Events::listen_touchEnd);
|
||||||
|
removeWLSignal(&Events::listen_touchUpdate);
|
||||||
|
removeWLSignal(&Events::listen_touchFrame);
|
||||||
|
removeWLSignal(&Events::listen_holdBegin);
|
||||||
|
removeWLSignal(&Events::listen_holdEnd);
|
||||||
|
removeWLSignal(&Events::listen_newInput);
|
||||||
|
removeWLSignal(&Events::listen_requestMouse);
|
||||||
|
removeWLSignal(&Events::listen_requestSetSel);
|
||||||
|
removeWLSignal(&Events::listen_requestDrag);
|
||||||
|
removeWLSignal(&Events::listen_startDrag);
|
||||||
|
removeWLSignal(&Events::listen_requestSetSel);
|
||||||
|
removeWLSignal(&Events::listen_requestSetPrimarySel);
|
||||||
|
removeWLSignal(&Events::listen_newLayerSurface);
|
||||||
|
removeWLSignal(&Events::listen_change);
|
||||||
|
removeWLSignal(&Events::listen_outputMgrApply);
|
||||||
|
removeWLSignal(&Events::listen_outputMgrTest);
|
||||||
|
removeWLSignal(&Events::listen_newConstraint);
|
||||||
|
removeWLSignal(&Events::listen_NewXDGDeco);
|
||||||
|
removeWLSignal(&Events::listen_newVirtPtr);
|
||||||
|
removeWLSignal(&Events::listen_newVirtualKeyboard);
|
||||||
|
removeWLSignal(&Events::listen_RendererDestroy);
|
||||||
|
removeWLSignal(&Events::listen_newIdleInhibitor);
|
||||||
|
removeWLSignal(&Events::listen_powerMgrSetMode);
|
||||||
|
removeWLSignal(&Events::listen_newIME);
|
||||||
|
removeWLSignal(&Events::listen_newTextInput);
|
||||||
|
removeWLSignal(&Events::listen_activateXDG);
|
||||||
|
removeWLSignal(&Events::listen_newSessionLock);
|
||||||
|
removeWLSignal(&Events::listen_setGamma);
|
||||||
|
removeWLSignal(&Events::listen_setCursorShape);
|
||||||
|
removeWLSignal(&Events::listen_newTearingHint);
|
||||||
|
|
||||||
|
if (m_sWRLDRMLeaseMgr)
|
||||||
|
removeWLSignal(&Events::listen_leaseRequest);
|
||||||
|
|
||||||
|
if (m_sWLRSession)
|
||||||
|
removeWLSignal(&Events::listen_sessionActive);
|
||||||
|
}
|
||||||
|
|
||||||
void CCompositor::cleanup() {
|
void CCompositor::cleanup() {
|
||||||
if (!m_sWLDisplay || m_bIsShuttingDown)
|
if (!m_sWLDisplay || m_bIsShuttingDown)
|
||||||
return;
|
return;
|
||||||
|
@ -373,8 +406,31 @@ void CCompositor::cleanup() {
|
||||||
g_pXWaylandManager->m_sWLRXWayland = nullptr;
|
g_pXWaylandManager->m_sWLRXWayland = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
removeAllSignals();
|
||||||
|
|
||||||
wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
|
wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
|
||||||
|
|
||||||
|
g_pDecorationPositioner.reset();
|
||||||
|
g_pPluginSystem.reset();
|
||||||
|
g_pHyprNotificationOverlay.reset();
|
||||||
|
g_pDebugOverlay.reset();
|
||||||
|
g_pEventManager.reset();
|
||||||
|
g_pSessionLockManager.reset();
|
||||||
|
g_pProtocolManager.reset();
|
||||||
|
g_pHyprRenderer.reset();
|
||||||
|
g_pHyprOpenGL.reset();
|
||||||
|
g_pInputManager.reset();
|
||||||
|
g_pThreadManager.reset();
|
||||||
|
g_pConfigManager.reset();
|
||||||
|
g_pLayoutManager.reset();
|
||||||
|
g_pHyprError.reset();
|
||||||
|
g_pConfigManager.reset();
|
||||||
|
g_pAnimationManager.reset();
|
||||||
|
g_pKeybindManager.reset();
|
||||||
|
g_pHookSystem.reset();
|
||||||
|
g_pWatchdog.reset();
|
||||||
|
g_pXWaylandManager.reset();
|
||||||
|
|
||||||
wl_display_terminate(m_sWLDisplay);
|
wl_display_terminate(m_sWLDisplay);
|
||||||
|
|
||||||
m_sWLDisplay = nullptr;
|
m_sWLDisplay = nullptr;
|
||||||
|
|
|
@ -214,6 +214,7 @@ class CCompositor {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initAllSignals();
|
void initAllSignals();
|
||||||
|
void removeAllSignals();
|
||||||
void setRandomSplash();
|
void setRandomSplash();
|
||||||
void initManagers(eManagersInitStage stage);
|
void initManagers(eManagersInitStage stage);
|
||||||
void prepareFallbackOutput();
|
void prepareFallbackOutput();
|
||||||
|
|
|
@ -159,6 +159,13 @@ void addWLSignal(wl_signal* pSignal, wl_listener* pListener, void* pOwner, const
|
||||||
Debug::log(LOG, "Registered signal for owner {:x}: {:x} -> {:x} (owner: {})", (uintptr_t)pOwner, (uintptr_t)pSignal, (uintptr_t)pListener, ownerString);
|
Debug::log(LOG, "Registered signal for owner {:x}: {:x} -> {:x} (owner: {})", (uintptr_t)pOwner, (uintptr_t)pSignal, (uintptr_t)pListener, ownerString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void removeWLSignal(wl_listener* pListener) {
|
||||||
|
wl_list_remove(&pListener->link);
|
||||||
|
wl_list_init(&pListener->link);
|
||||||
|
|
||||||
|
Debug::log(LOG, "Removed listener {:x}", (uintptr_t)pListener);
|
||||||
|
}
|
||||||
|
|
||||||
void handleNoop(struct wl_listener* listener, void* data) {
|
void handleNoop(struct wl_listener* listener, void* data) {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ struct SCallstackFrameInfo {
|
||||||
|
|
||||||
std::string absolutePath(const std::string&, const std::string&);
|
std::string absolutePath(const std::string&, const std::string&);
|
||||||
void addWLSignal(wl_signal*, wl_listener*, void* pOwner, const std::string& ownerString);
|
void addWLSignal(wl_signal*, wl_listener*, void* pOwner, const std::string& ownerString);
|
||||||
|
void removeWLSignal(wl_listener*);
|
||||||
std::string escapeJSONStrings(const std::string& str);
|
std::string escapeJSONStrings(const std::string& str);
|
||||||
std::string removeBeginEndSpacesTabs(std::string);
|
std::string removeBeginEndSpacesTabs(std::string);
|
||||||
bool isNumber(const std::string&, bool allowfloat = false);
|
bool isNumber(const std::string&, bool allowfloat = false);
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
void handleWrapped(wl_listener* listener, void* data) {
|
void handleWrapped(wl_listener* listener, void* data) {
|
||||||
CHyprWLListener::SWrapper* pWrap = wl_container_of(listener, pWrap, m_sListener);
|
CHyprWLListener::SWrapper* pWrap = wl_container_of(listener, pWrap, m_sListener);
|
||||||
|
|
||||||
g_pWatchdog->startWatching();
|
if (g_pWatchdog)
|
||||||
|
g_pWatchdog->startWatching();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pWrap->m_pSelf->emit(data);
|
pWrap->m_pSelf->emit(data);
|
||||||
} catch (std::exception& e) { Debug::log(ERR, "Listener {} timed out and was killed by Watchdog!!!", (uintptr_t)listener); }
|
} catch (std::exception& e) { Debug::log(ERR, "Listener {} timed out and was killed by Watchdog!!!", (uintptr_t)listener); }
|
||||||
|
|
||||||
g_pWatchdog->endWatching();
|
if (g_pWatchdog)
|
||||||
|
g_pWatchdog->endWatching();
|
||||||
}
|
}
|
||||||
|
|
||||||
CHyprWLListener::CHyprWLListener(wl_signal* pSignal, std::function<void(void*, void*)> callback, void* pOwner) {
|
CHyprWLListener::CHyprWLListener(wl_signal* pSignal, std::function<void(void*, void*)> callback, void* pOwner) {
|
||||||
|
|
|
@ -1455,7 +1455,7 @@ void CKeybindManager::renameWorkspace(std::string args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CKeybindManager::exitHyprland(std::string argz) {
|
void CKeybindManager::exitHyprland(std::string argz) {
|
||||||
g_pCompositor->cleanup();
|
g_pInputManager->m_bExitTriggered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CKeybindManager::moveCurrentWorkspaceToMonitor(std::string args) {
|
void CKeybindManager::moveCurrentWorkspaceToMonitor(std::string args) {
|
||||||
|
|
|
@ -1185,6 +1185,9 @@ void CInputManager::onKeyboardKey(wlr_keyboard_key_event* e, SKeyboard* pKeyboar
|
||||||
|
|
||||||
updateKeyboardsLeds(pKeyboard->keyboard);
|
updateKeyboardsLeds(pKeyboard->keyboard);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_bExitTriggered)
|
||||||
|
g_pCompositor->cleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CInputManager::onKeyboardMod(void* data, SKeyboard* pKeyboard) {
|
void CInputManager::onKeyboardMod(void* data, SKeyboard* pKeyboard) {
|
||||||
|
|
|
@ -243,6 +243,8 @@ class CInputManager {
|
||||||
|
|
||||||
void restoreCursorIconToApp(); // no-op if restored
|
void restoreCursorIconToApp(); // no-op if restored
|
||||||
|
|
||||||
|
bool m_bExitTriggered = false; // for exit dispatcher
|
||||||
|
|
||||||
friend class CKeybindManager;
|
friend class CKeybindManager;
|
||||||
friend class CWLSurface;
|
friend class CWLSurface;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue