From 3fa6320a391ed60779702e058f67649beb787962 Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Wed, 16 Apr 2025 10:49:01 -0500 Subject: [PATCH] desktop: Damage subsurface when position changes (#10094) --- src/desktop/Subsurface.cpp | 34 ++++++++++++---------------- src/desktop/Subsurface.hpp | 4 +++- src/protocols/core/Subcompositor.cpp | 4 +++- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/desktop/Subsurface.cpp b/src/desktop/Subsurface.cpp index 9846764cc..4e77f36f5 100644 --- a/src/desktop/Subsurface.cpp +++ b/src/desktop/Subsurface.cpp @@ -115,21 +115,10 @@ void CSubsurface::onCommit() { // I do not think this is correct, but it solves a lot of issues with some apps (e.g. firefox) checkSiblingDamage(); - if (m_vLastSize != m_pWLSurface->resource()->current.size) { - // TODO: fix this - // CBox box{COORDS, m_vLastSize}; - // g_pHyprRenderer->damageBox(box); - // m_vLastSize = m_pWLSurface->resource()->current.size; - // box = {COORDS, m_vLastSize}; - // g_pHyprRenderer->damageBox(box); - - CBox box; - if (m_pPopupParent && !m_pPopupParent->inert() && m_pPopupParent->m_pWLSurface) - box = m_pPopupParent->m_pWLSurface->getSurfaceBoxGlobal().value_or(CBox{}); - else if (m_pWindowParent) - box = m_pWindowParent->getWindowMainSurfaceBox(); - - g_pHyprRenderer->damageBox(box); + if (m_vLastSize != m_pWLSurface->resource()->current.size || m_vLastPosition != m_pSubsurface->position) { + damageLastArea(); + m_vLastSize = m_pWLSurface->resource()->current.size; + m_vLastPosition = m_pSubsurface->position; } } @@ -162,7 +151,8 @@ void CSubsurface::onNewSubsurface(SP pSubsurface) { } void CSubsurface::onMap() { - m_vLastSize = m_pWLSurface->resource()->current.size; + m_vLastSize = m_pWLSurface->resource()->current.size; + m_vLastPosition = m_pSubsurface->position; const auto COORDS = coordsGlobal(); CBox box{COORDS, m_vLastSize}; @@ -174,10 +164,7 @@ void CSubsurface::onMap() { } void CSubsurface::onUnmap() { - const auto COORDS = coordsGlobal(); - CBox box{COORDS, m_vLastSize}; - box.expand(4); - g_pHyprRenderer->damageBox(box); + damageLastArea(); if (m_pWLSurface->resource() == g_pCompositor->m_pLastFocus) g_pInputManager->releaseAllMouseButtons(); @@ -187,6 +174,13 @@ void CSubsurface::onUnmap() { // TODO: should this remove children? Currently it won't, only on .destroy } +void CSubsurface::damageLastArea() { + const auto COORDS = coordsGlobal() + m_vLastPosition - m_pSubsurface->position; + CBox box{COORDS, m_vLastSize}; + box.expand(4); + g_pHyprRenderer->damageBox(box); +} + Vector2D CSubsurface::coordsRelativeToParent() { if (!m_pSubsurface) return {}; diff --git a/src/desktop/Subsurface.hpp b/src/desktop/Subsurface.hpp index 2983c7c17..7b596337c 100644 --- a/src/desktop/Subsurface.hpp +++ b/src/desktop/Subsurface.hpp @@ -49,7 +49,8 @@ class CSubsurface { WP m_pSubsurface; SP m_pWLSurface; - Vector2D m_vLastSize = {}; + Vector2D m_vLastSize = {}; + Vector2D m_vLastPosition = {}; // if nullptr, means it's a dummy node WP m_pParent; @@ -64,4 +65,5 @@ class CSubsurface { void initSignals(); void initExistingSubsurfaces(SP pSurface); void checkSiblingDamage(); + void damageLastArea(); }; diff --git a/src/protocols/core/Subcompositor.cpp b/src/protocols/core/Subcompositor.cpp index 4edb07ff4..82f4aedb8 100644 --- a/src/protocols/core/Subcompositor.cpp +++ b/src/protocols/core/Subcompositor.cpp @@ -99,8 +99,10 @@ CWLSubsurfaceResource::~CWLSubsurfaceResource() { } void CWLSubsurfaceResource::destroy() { - if (surface && surface->mapped) + if (surface && surface->mapped) { + surface->events.unmap.emit(); surface->unmap(); + } events.destroy.emit(); PROTO::subcompositor->destroyResource(this); }