From 73663a8ba550977f2a6a2f82fefc8ca54af2a757 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Wed, 29 Jun 2022 12:36:50 +0200 Subject: [PATCH] fix incorrect snapshot calc for scaled outputs --- src/render/OpenGL.cpp | 4 ++-- src/render/Renderer.cpp | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 2111dca0..a56681d7 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -815,8 +815,8 @@ void CHyprOpenGLImpl::renderSnapshot(CWindow** pWindow) { windowBox.width = PMONITOR->vecPixelSize.x * scaleXY.x; windowBox.height = PMONITOR->vecPixelSize.y * scaleXY.y; - windowBox.x = (PWINDOW->m_vRealPosition.vec().x - PMONITOR->vecPosition.x) - ((PWINDOW->m_vOriginalClosedPos.x - PMONITOR->vecPosition.x) * scaleXY.x); - windowBox.y = (PWINDOW->m_vRealPosition.vec().y - PMONITOR->vecPosition.y) - ((PWINDOW->m_vOriginalClosedPos.y - PMONITOR->vecPosition.y) * scaleXY.y); + windowBox.x = (PWINDOW->m_vRealPosition.vec().x * PMONITOR->scale - PMONITOR->vecPosition.x) - ((PWINDOW->m_vOriginalClosedPos.x - PMONITOR->vecPosition.x) * scaleXY.x); + windowBox.y = (PWINDOW->m_vRealPosition.vec().y * PMONITOR->scale - PMONITOR->vecPosition.y) - ((PWINDOW->m_vOriginalClosedPos.y - PMONITOR->vecPosition.y) * scaleXY.y); pixman_region32_t fakeDamage; pixman_region32_init_rect(&fakeDamage, 0, 0, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y); diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 67f43ff5..e0891710 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -13,12 +13,15 @@ void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { wlr_box windowBox; if (RDATA->surface && surface == RDATA->surface) { - windowBox = {(int)outputX + RDATA->x + x, (int)outputY + RDATA->y + y, RDATA->w, RDATA->h}; + windowBox = {(int)RDATA->x + x, (int)RDATA->y + y, RDATA->w, RDATA->h}; } else { // here we clamp to 2, these might be some tiny specks - windowBox = {(int)outputX + RDATA->x + x, (int)outputY + RDATA->y + y, std::clamp(surface->current.width, 2, 1337420), std::clamp(surface->current.height, 2, 1337420)}; + windowBox = {(int)RDATA->x + x, (int)RDATA->y + y, std::clamp(surface->current.width, 2, 1337420), std::clamp(surface->current.height, 2, 1337420)}; } scaleBox(&windowBox, RDATA->output->scale); + windowBox.x += outputX; + windowBox.y += outputY; + static auto *const PROUNDING = &g_pConfigManager->getConfigValuePtr("decoration:rounding")->intValue; float rounding = RDATA->dontRound ? 0 : RDATA->rounding == -1 ? *PROUNDING : RDATA->rounding; @@ -578,9 +581,7 @@ void CHyprRenderer::damageSurface(wlr_surface* pSurface, double x, double y) { void CHyprRenderer::damageWindow(CWindow* pWindow) { wlr_box damageBox = pWindow->getFullWindowBoundingBox(); for (auto& m : g_pCompositor->m_lMonitors) { - wlr_box fixedDamageBox = damageBox; - fixedDamageBox.x -= m.vecPosition.x; - fixedDamageBox.y -= m.vecPosition.y; + wlr_box fixedDamageBox = {damageBox.x - m.vecPosition.x, damageBox.y - m.vecPosition.y, damageBox.width, damageBox.height}; scaleBox(&fixedDamageBox, m.scale); wlr_output_damage_add_box(m.damage, &fixedDamageBox); }