subsurfaces: damage window on subsurface size change

This commit is contained in:
Vaxry 2023-11-12 23:06:31 +00:00
parent 824ccd957b
commit ba5bc5871f
2 changed files with 11 additions and 1 deletions

View file

@ -220,6 +220,8 @@ void Events::listener_commitSubsurface(void* owner, void* data) {
// no damaging if it's not visible // no damaging if it's not visible
if (!g_pHyprRenderer->shouldRenderWindow(pNode->pWindowOwner)) { if (!g_pHyprRenderer->shouldRenderWindow(pNode->pWindowOwner)) {
pNode->lastSize = pNode->pSurface->exists() ? Vector2D{pNode->pSurface->wlr()->current.width, pNode->pSurface->wlr()->current.height} : Vector2D{};
static auto* const PLOGDAMAGE = &g_pConfigManager->getConfigValuePtr("debug:log_damage")->intValue; static auto* const PLOGDAMAGE = &g_pConfigManager->getConfigValuePtr("debug:log_damage")->intValue;
if (*PLOGDAMAGE) if (*PLOGDAMAGE)
Debug::log(LOG, "Refusing to commit damage from {} because it's invisible.", pNode->pWindowOwner); Debug::log(LOG, "Refusing to commit damage from {} because it's invisible.", pNode->pWindowOwner);
@ -244,9 +246,13 @@ void Events::listener_commitSubsurface(void* owner, void* data) {
} }
} }
if (pNode->pSurface && pNode->pSurface->exists()) if (pNode->pSurface && pNode->pSurface->exists()) {
g_pHyprRenderer->damageSurface(pNode->pSurface->wlr(), lx, ly, SCALE); g_pHyprRenderer->damageSurface(pNode->pSurface->wlr(), lx, ly, SCALE);
if (pNode->lastSize != Vector2D{pNode->pSurface->wlr()->current.width, pNode->pSurface->wlr()->current.height} && pNode->pWindowOwner)
g_pHyprRenderer->damageWindow(pNode->pWindowOwner);
}
if (pNode->pWindowOwner) { if (pNode->pWindowOwner) {
if (pNode->pWindowOwner->m_bIsX11) if (pNode->pWindowOwner->m_bIsX11)
pNode->pWindowOwner->m_vReportedSize = pNode->pWindowOwner->m_vPendingReportedSize; // apply pending size. We pinged, the window ponged. pNode->pWindowOwner->m_vReportedSize = pNode->pWindowOwner->m_vPendingReportedSize; // apply pending size. We pinged, the window ponged.
@ -269,6 +275,8 @@ void Events::listener_commitSubsurface(void* owner, void* data) {
} }
} }
} }
pNode->lastSize = pNode->pSurface->exists() ? Vector2D{pNode->pSurface->wlr()->current.width, pNode->pSurface->wlr()->current.height} : Vector2D{};
} }
void Events::listener_destroySubsurface(void* owner, void* data) { void Events::listener_destroySubsurface(void* owner, void* data) {

View file

@ -26,6 +26,8 @@ struct SSurfaceTreeNode {
void* globalOffsetData; void* globalOffsetData;
CWindow* pWindowOwner = nullptr; CWindow* pWindowOwner = nullptr;
Vector2D lastSize;
// //
bool operator==(const SSurfaceTreeNode& rhs) const { bool operator==(const SSurfaceTreeNode& rhs) const {
return pSurface == rhs.pSurface; return pSurface == rhs.pSurface;