Various subsurface handling fixes

This commit is contained in:
vaxerski 2022-09-13 22:26:19 +02:00
parent a96acc8fa4
commit 8e0f7b9b11

View file

@ -3,9 +3,6 @@
#include "../Compositor.hpp" #include "../Compositor.hpp"
void addSurfaceGlobalOffset(SSurfaceTreeNode* node, int* lx, int* ly) { void addSurfaceGlobalOffset(SSurfaceTreeNode* node, int* lx, int* ly) {
if (!node->pSurface)
return; // ? how does this happen sometimes
*lx += node->pSurface->sx; *lx += node->pSurface->sx;
*ly += node->pSurface->sy; *ly += node->pSurface->sy;
@ -104,6 +101,14 @@ void SubsurfaceTree::destroySurfaceTree(SSurfaceTreeNode* pNode) {
g_pHyprRenderer->damageBox(&extents); g_pHyprRenderer->damageBox(&extents);
} }
// remove references to this node
for (auto& tn : surfaceTreeNodes) {
for (auto& cs : tn.childSubsurfaces) {
if (cs.pChild == pNode)
cs.pChild = nullptr;
}
}
surfaceTreeNodes.remove(*pNode); surfaceTreeNodes.remove(*pNode);
Debug::log(LOG, "SurfaceTree Node removed"); Debug::log(LOG, "SurfaceTree Node removed");
@ -157,6 +162,9 @@ void Events::listener_newSubsurfaceNode(void* owner, void* data) {
void Events::listener_mapSubsurface(void* owner, void* data) { void Events::listener_mapSubsurface(void* owner, void* data) {
SSubsurface* subsurface = (SSubsurface*)owner; SSubsurface* subsurface = (SSubsurface*)owner;
if (subsurface->pChild)
return;
Debug::log(LOG, "Subsurface %x mapped", subsurface->pSubsurface); Debug::log(LOG, "Subsurface %x mapped", subsurface->pSubsurface);
subsurface->pChild = createSubsurfaceNode(subsurface->pParent, subsurface, subsurface->pSubsurface->surface, subsurface->pWindowOwner); subsurface->pChild = createSubsurfaceNode(subsurface->pParent, subsurface, subsurface->pSubsurface->surface, subsurface->pWindowOwner);
@ -181,8 +189,8 @@ void Events::listener_unmapSubsurface(void* owner, void* data) {
g_pHyprRenderer->damageBox(&extents); g_pHyprRenderer->damageBox(&extents);
} }
SubsurfaceTree::destroySurfaceTree(subsurface->pChild); //SubsurfaceTree::destroySurfaceTree(subsurface->pChild);
subsurface->pChild = nullptr; //subsurface->pChild = nullptr;
} }
} }
@ -218,8 +226,9 @@ void Events::listener_commitSubsurface(void* owner, void* data) {
void Events::listener_destroySubsurface(void* owner, void* data) { void Events::listener_destroySubsurface(void* owner, void* data) {
SSubsurface* subsurface = (SSubsurface*)owner; SSubsurface* subsurface = (SSubsurface*)owner;
if (subsurface->pChild) if (subsurface->pChild) {
listener_destroySubsurfaceNode(subsurface->pChild, nullptr); SubsurfaceTree::destroySurfaceTree(subsurface->pChild);
}
Debug::log(LOG, "Subsurface %x destroyed", subsurface); Debug::log(LOG, "Subsurface %x destroyed", subsurface);