summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2023-10-25 22:05:04 +0100
committerVaxry <vaxry@vaxry.net>2023-10-25 22:05:04 +0100
commit8991be671fb231ebe268352fe9cc883911b066c2 (patch)
treed6b60255760431ea66357e260ca9766e55f96b76 /src
parent6650e4ba85568a687b1de79eb7375cabfa68e848 (diff)
renderer: respect viewporter dest on base surfaces
Diffstat (limited to 'src')
-rw-r--r--src/helpers/WLSurface.cpp13
-rw-r--r--src/helpers/WLSurface.hpp1
-rw-r--r--src/render/Renderer.cpp9
3 files changed, 17 insertions, 6 deletions
diff --git a/src/helpers/WLSurface.cpp b/src/helpers/WLSurface.cpp
index a34c77a1..3d3800cb 100644
--- a/src/helpers/WLSurface.cpp
+++ b/src/helpers/WLSurface.cpp
@@ -38,11 +38,20 @@ Vector2D CWLSurface::correctSmallVec() const {
if (!m_pOwner || !exists() || !small() || m_bFillIgnoreSmall)
return {};
- return Vector2D{(m_pOwner->m_vReportedSize.x - m_pWLRSurface->current.buffer_width) / 2, (m_pOwner->m_vReportedSize.y - m_pWLRSurface->current.buffer_height) / 2}.clamp(
- {}, {INFINITY, INFINITY}) *
+ const auto SIZE = getViewporterCorrectedSize();
+
+ return Vector2D{(m_pOwner->m_vReportedSize.x - SIZE.x) / 2, (m_pOwner->m_vReportedSize.y - SIZE.y) / 2}.clamp({}, {INFINITY, INFINITY}) *
(m_pOwner->m_vRealSize.vec() / m_pOwner->m_vReportedSize);
}
+Vector2D CWLSurface::getViewporterCorrectedSize() const {
+ if (!exists())
+ return {};
+
+ return m_pWLRSurface->current.viewport.has_dst ? Vector2D{m_pWLRSurface->current.viewport.dst_width, m_pWLRSurface->current.viewport.dst_height} :
+ Vector2D{m_pWLRSurface->current.buffer_width, m_pWLRSurface->current.buffer_height};
+}
+
void CWLSurface::destroy() {
if (!m_pWLRSurface)
return;
diff --git a/src/helpers/WLSurface.hpp b/src/helpers/WLSurface.hpp
index ee6574de..8b4ef835 100644
--- a/src/helpers/WLSurface.hpp
+++ b/src/helpers/WLSurface.hpp
@@ -22,6 +22,7 @@ class CWLSurface {
bool exists() const;
bool small() const; // means surface is smaller than the requested size
Vector2D correctSmallVec() const; // returns a corrective vector for small() surfaces
+ Vector2D getViewporterCorrectedSize() const;
// allow stretching. Useful for plugins.
bool m_bFillIgnoreSmall = false;
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 4326b89f..f5a79bdf 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -31,17 +31,18 @@ void renderSurface(struct wlr_surface* surface, int x, int y, void* data) {
if (PSURFACE && !PSURFACE->m_bFillIgnoreSmall && PSURFACE->small() /* guarantees m_pOwner */) {
const auto CORRECT = PSURFACE->correctSmallVec();
+ const auto SIZE = PSURFACE->getViewporterCorrectedSize();
const auto INTERACTIVERESIZEINPROGRESS = g_pInputManager->currentlyDraggedWindow == PSURFACE->m_pOwner && g_pInputManager->dragMode == MBIND_RESIZE;
if (!INTERACTIVERESIZEINPROGRESS) {
windowBox.x += CORRECT.x;
windowBox.y += CORRECT.y;
- windowBox.width = (double)surface->current.buffer_width * (PSURFACE->m_pOwner->m_vRealSize.vec().x / PSURFACE->m_pOwner->m_vReportedSize.x);
- windowBox.height = (double)surface->current.buffer_height * (PSURFACE->m_pOwner->m_vRealSize.vec().y / PSURFACE->m_pOwner->m_vReportedSize.y);
+ windowBox.width = SIZE.x * (PSURFACE->m_pOwner->m_vRealSize.vec().x / PSURFACE->m_pOwner->m_vReportedSize.x);
+ windowBox.height = SIZE.y * (PSURFACE->m_pOwner->m_vRealSize.vec().y / PSURFACE->m_pOwner->m_vReportedSize.y);
} else {
- windowBox.width = (double)surface->current.buffer_width;
- windowBox.height = (double)surface->current.buffer_height;
+ windowBox.width = SIZE.x;
+ windowBox.height = SIZE.y;
}
}