mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-07-31 20:21:54 -07:00
desktop: Damage subsurface when position changes (#10094)
This commit is contained in:
@@ -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)
|
// I do not think this is correct, but it solves a lot of issues with some apps (e.g. firefox)
|
||||||
checkSiblingDamage();
|
checkSiblingDamage();
|
||||||
|
|
||||||
if (m_vLastSize != m_pWLSurface->resource()->current.size) {
|
if (m_vLastSize != m_pWLSurface->resource()->current.size || m_vLastPosition != m_pSubsurface->position) {
|
||||||
// TODO: fix this
|
damageLastArea();
|
||||||
// CBox box{COORDS, m_vLastSize};
|
m_vLastSize = m_pWLSurface->resource()->current.size;
|
||||||
// g_pHyprRenderer->damageBox(box);
|
m_vLastPosition = m_pSubsurface->position;
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,7 +151,8 @@ void CSubsurface::onNewSubsurface(SP<CWLSubsurfaceResource> pSubsurface) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CSubsurface::onMap() {
|
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();
|
const auto COORDS = coordsGlobal();
|
||||||
CBox box{COORDS, m_vLastSize};
|
CBox box{COORDS, m_vLastSize};
|
||||||
@@ -174,10 +164,7 @@ void CSubsurface::onMap() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CSubsurface::onUnmap() {
|
void CSubsurface::onUnmap() {
|
||||||
const auto COORDS = coordsGlobal();
|
damageLastArea();
|
||||||
CBox box{COORDS, m_vLastSize};
|
|
||||||
box.expand(4);
|
|
||||||
g_pHyprRenderer->damageBox(box);
|
|
||||||
|
|
||||||
if (m_pWLSurface->resource() == g_pCompositor->m_pLastFocus)
|
if (m_pWLSurface->resource() == g_pCompositor->m_pLastFocus)
|
||||||
g_pInputManager->releaseAllMouseButtons();
|
g_pInputManager->releaseAllMouseButtons();
|
||||||
@@ -187,6 +174,13 @@ void CSubsurface::onUnmap() {
|
|||||||
// TODO: should this remove children? Currently it won't, only on .destroy
|
// 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() {
|
Vector2D CSubsurface::coordsRelativeToParent() {
|
||||||
if (!m_pSubsurface)
|
if (!m_pSubsurface)
|
||||||
return {};
|
return {};
|
||||||
|
@@ -49,7 +49,8 @@ class CSubsurface {
|
|||||||
|
|
||||||
WP<CWLSubsurfaceResource> m_pSubsurface;
|
WP<CWLSubsurfaceResource> m_pSubsurface;
|
||||||
SP<CWLSurface> m_pWLSurface;
|
SP<CWLSurface> m_pWLSurface;
|
||||||
Vector2D m_vLastSize = {};
|
Vector2D m_vLastSize = {};
|
||||||
|
Vector2D m_vLastPosition = {};
|
||||||
|
|
||||||
// if nullptr, means it's a dummy node
|
// if nullptr, means it's a dummy node
|
||||||
WP<CSubsurface> m_pParent;
|
WP<CSubsurface> m_pParent;
|
||||||
@@ -64,4 +65,5 @@ class CSubsurface {
|
|||||||
void initSignals();
|
void initSignals();
|
||||||
void initExistingSubsurfaces(SP<CWLSurfaceResource> pSurface);
|
void initExistingSubsurfaces(SP<CWLSurfaceResource> pSurface);
|
||||||
void checkSiblingDamage();
|
void checkSiblingDamage();
|
||||||
|
void damageLastArea();
|
||||||
};
|
};
|
||||||
|
@@ -99,8 +99,10 @@ CWLSubsurfaceResource::~CWLSubsurfaceResource() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CWLSubsurfaceResource::destroy() {
|
void CWLSubsurfaceResource::destroy() {
|
||||||
if (surface && surface->mapped)
|
if (surface && surface->mapped) {
|
||||||
|
surface->events.unmap.emit();
|
||||||
surface->unmap();
|
surface->unmap();
|
||||||
|
}
|
||||||
events.destroy.emit();
|
events.destroy.emit();
|
||||||
PROTO::subcompositor->destroyResource(this);
|
PROTO::subcompositor->destroyResource(this);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user