mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-22 09:05:59 +01:00
renderer: adjust surface dimensions for oversized not-yet ackd surface sizes
supersedes #5104
This commit is contained in:
parent
72d78eff95
commit
38576d651a
1 changed files with 16 additions and 5 deletions
|
@ -75,23 +75,34 @@ static void renderSurface(struct wlr_surface* surface, int x, int y, void* data)
|
||||||
|
|
||||||
// however, if surface buffer w / h < box, we need to adjust them
|
// however, if surface buffer w / h < box, we need to adjust them
|
||||||
auto* const PSURFACE = CWLSurface::surfaceFromWlr(surface);
|
auto* const PSURFACE = CWLSurface::surfaceFromWlr(surface);
|
||||||
|
const auto PWINDOW = PSURFACE->getWindow();
|
||||||
|
|
||||||
if (PSURFACE && !PSURFACE->m_bFillIgnoreSmall && PSURFACE->small() /* guarantees m_pWindowOwner */) {
|
if (PSURFACE && !PSURFACE->m_bFillIgnoreSmall && PSURFACE->small() /* guarantees PWINDOW */) {
|
||||||
const auto CORRECT = PSURFACE->correctSmallVec();
|
const auto CORRECT = PSURFACE->correctSmallVec();
|
||||||
const auto SIZE = PSURFACE->getViewporterCorrectedSize();
|
const auto SIZE = PSURFACE->getViewporterCorrectedSize();
|
||||||
|
|
||||||
if (!INTERACTIVERESIZEINPROGRESS) {
|
if (!INTERACTIVERESIZEINPROGRESS) {
|
||||||
windowBox.x += CORRECT.x;
|
windowBox.translate(CORRECT);
|
||||||
windowBox.y += CORRECT.y;
|
|
||||||
|
|
||||||
windowBox.width = SIZE.x * (PSURFACE->getWindow()->m_vRealSize.value().x / PSURFACE->getWindow()->m_vReportedSize.x);
|
windowBox.width = SIZE.x * (PWINDOW->m_vRealSize.value().x / PWINDOW->m_vReportedSize.x);
|
||||||
windowBox.height = SIZE.y * (PSURFACE->getWindow()->m_vRealSize.value().y / PSURFACE->getWindow()->m_vReportedSize.y);
|
windowBox.height = SIZE.y * (PWINDOW->m_vRealSize.value().y / PWINDOW->m_vReportedSize.y);
|
||||||
} else {
|
} else {
|
||||||
windowBox.width = SIZE.x;
|
windowBox.width = SIZE.x;
|
||||||
windowBox.height = SIZE.y;
|
windowBox.height = SIZE.y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PSURFACE && PWINDOW && PWINDOW->m_vRealSize.goal() > PWINDOW->m_vReportedSize) {
|
||||||
|
Vector2D size =
|
||||||
|
Vector2D{windowBox.w * (PWINDOW->m_vReportedSize.x / PWINDOW->m_vRealSize.value().x), windowBox.h * (PWINDOW->m_vReportedSize.y / PWINDOW->m_vRealSize.value().y)};
|
||||||
|
Vector2D correct = Vector2D{windowBox.w, windowBox.h} - size;
|
||||||
|
|
||||||
|
windowBox.translate(correct / 2.0);
|
||||||
|
|
||||||
|
windowBox.w = size.x;
|
||||||
|
windowBox.h = size.y;
|
||||||
|
}
|
||||||
|
|
||||||
} else { // here we clamp to 2, these might be some tiny specks
|
} else { // here we clamp to 2, these might be some tiny specks
|
||||||
windowBox = {(int)outputX + RDATA->x + x, (int)outputY + RDATA->y + y, std::max(surface->current.width, 2), std::max(surface->current.height, 2)};
|
windowBox = {(int)outputX + RDATA->x + x, (int)outputY + RDATA->y + y, std::max(surface->current.width, 2), std::max(surface->current.height, 2)};
|
||||||
if (RDATA->pWindow && RDATA->pWindow->m_vRealSize.isBeingAnimated() && RDATA->surface && RDATA->surface != surface && RDATA->squishOversized /* subsurface */) {
|
if (RDATA->pWindow && RDATA->pWindow->m_vRealSize.isBeingAnimated() && RDATA->surface && RDATA->surface != surface && RDATA->squishOversized /* subsurface */) {
|
||||||
|
|
Loading…
Reference in a new issue