aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorVaxry <[email protected]>2024-08-24 16:04:31 +0200
committerVaxry <[email protected]>2024-10-05 00:50:10 +0100
commit8e7fe164196d1c69d60688c7744fc70e8af82499 (patch)
tree27d3fe2a93881e7400ab52a0a8650bbed8269426
parent2d714f2dc85ed5cdc8dedcf379b20bf409a24525 (diff)
downloadHyprland-8e7fe164196d1c69d60688c7744fc70e8af82499.tar.gz
Hyprland-8e7fe164196d1c69d60688c7744fc70e8af82499.zip
initial stuff to fix resizes
-rw-r--r--src/render/OpenGL.cpp3
-rw-r--r--src/render/Renderer.cpp23
2 files changed, 15 insertions, 11 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index 4f22d6aa..833e2ccb 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -1423,6 +1423,9 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(SP<CTexture> tex, CBox* pB
glActiveTexture(GL_TEXTURE0);
glBindTexture(tex->m_iTarget, tex->m_iTexID);
+ glTexParameteri(tex->m_iTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(tex->m_iTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
if (m_RenderData.useNearestNeighbor) {
glTexParameteri(tex->m_iTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(tex->m_iTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index b081fd81..7116f9d1 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -180,6 +180,7 @@ static void renderSurface(SP<CWLSurfaceResource> surface, int x, int y, void* da
// however, if surface buffer w / h < box, we need to adjust them
const auto PWINDOW = PSURFACE ? PSURFACE->getWindow() : nullptr;
+ // center the surface if it's smaller than the viewport we assign it
if (PSURFACE && !PSURFACE->m_bFillIgnoreSmall && PSURFACE->small() /* guarantees PWINDOW */) {
const auto CORRECT = PSURFACE->correctSmallVec();
const auto SIZE = PSURFACE->getViewporterCorrectedSize();
@@ -195,17 +196,6 @@ static void renderSurface(SP<CWLSurfaceResource> surface, int x, int y, void* da
}
}
- if (!INTERACTIVERESIZEINPROGRESS && PSURFACE && PWINDOW && PWINDOW->m_vRealSize.goal().floor() > PWINDOW->m_vReportedSize && PWINDOW->m_vReportedSize > Vector2D{1, 1}) {
- 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
windowBox = {(int)outputX + RDATA->x + x, (int)outputY + RDATA->y + y, std::max((float)surface->current.size.x, 2.F), std::max((float)surface->current.size.y, 2.F)};
if (RDATA->pWindow && RDATA->pWindow->m_vRealSize.isBeingAnimated() && RDATA->surface && RDATA->surface != surface && RDATA->squishOversized /* subsurface */) {
@@ -1115,6 +1105,17 @@ void CHyprRenderer::calculateUVForSurface(PHLWINDOW pWindow, SP<CWLSurfaceResour
g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft = uvTL;
g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight = uvBR;
+ // if the surface is smaller than our viewport, extend its edges.
+ // this will break if later on xdg geometry is hit, but we really try
+ // to let the apps know to NOT add CSD.
+ // there is no way to fix this if that's the case
+ if (pSurface && pSurface->current.bufferSize < projSize) {
+ // this will not work with shm AFAIK, idk why.
+ // NOTE: this math is wrong if the above is hit, but it will never be hit so fuck it
+ const auto FIX = projSize / pSurface->current.bufferSize;
+ uvBR = uvBR * FIX;
+ }
+
if (g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft == Vector2D() && g_pHyprOpenGL->m_RenderData.primarySurfaceUVBottomRight == Vector2D(1, 1)) {
// No special UV mods needed
g_pHyprOpenGL->m_RenderData.primarySurfaceUVTopLeft = Vector2D(-1, -1);