From 7e8bcd675de15ee2498f1aa15c5b335e9a9a55f0 Mon Sep 17 00:00:00 2001 From: Alessio Molinari Date: Sun, 18 Feb 2024 03:24:01 +0100 Subject: [PATCH] monitors: fix outputmgr nullptr crash (#4738) --- src/Compositor.cpp | 10 ++++++++++ src/Compositor.hpp | 1 + src/render/Renderer.cpp | 4 ++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 1c6b6561..8c4c453c 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -881,6 +881,16 @@ CMonitor* CCompositor::getMonitorFromOutput(wlr_output* out) { return nullptr; } +CMonitor* CCompositor::getRealMonitorFromOutput(wlr_output* out) { + for (auto& m : m_vRealMonitors) { + if (m->output == out) { + return m.get(); + } + } + + return nullptr; +} + void CCompositor::focusWindow(CWindow* pWindow, wlr_surface* pSurface) { static auto* const PFOLLOWMOUSE = &g_pConfigManager->getConfigValuePtr("input:follow_mouse")->intValue; diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 7d154735..de5677c9 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -142,6 +142,7 @@ class CCompositor { wlr_surface* vectorWindowToSurface(const Vector2D&, CWindow*, Vector2D& sl); Vector2D vectorToSurfaceLocal(const Vector2D&, CWindow*, wlr_surface*); CMonitor* getMonitorFromOutput(wlr_output*); + CMonitor* getRealMonitorFromOutput(wlr_output*); CWindow* getWindowForPopup(wlr_xdg_popup*); CWindow* getWindowFromSurface(wlr_surface*); CWindow* getWindowFromHandle(uint32_t); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 4032e8d7..6e3f92c1 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -1340,8 +1340,6 @@ void CHyprRenderer::outputMgrApplyTest(wlr_output_configuration_v1* config, bool std::string commandForCfg = ""; const auto OUTPUT = head->state.output; - const auto PMONITOR = g_pCompositor->getMonitorFromOutput(OUTPUT); - RASSERT(PMONITOR, "nullptr monitor in outputMgrApplyTest"); commandForCfg += std::string(OUTPUT->name) + ","; @@ -1352,6 +1350,8 @@ void CHyprRenderer::outputMgrApplyTest(wlr_output_configuration_v1* config, bool continue; } + const auto PMONITOR = g_pCompositor->getRealMonitorFromOutput(OUTPUT); + RASSERT(PMONITOR, "nullptr monitor in outputMgrApplyTest"); wlr_output_state_set_enabled(PMONITOR->state.wlr(), head->state.enabled); if (head->state.mode)