summaryrefslogtreecommitdiff
path: root/src/render/OpenGL.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2023-04-16 14:48:38 +0100
committervaxerski <43317083+vaxerski@users.noreply.github.com>2023-04-16 14:48:38 +0100
commitb05ff89c76b2c9454c76daf2120f4ccb076a018d (patch)
tree14067692ffc6a25ac24f43680bbb880d96c0d76c /src/render/OpenGL.cpp
parent28dfe215844fe33d425bda33c677a0fae835082b (diff)
Render: add cursor_zoom
Diffstat (limited to 'src/render/OpenGL.cpp')
-rw-r--r--src/render/OpenGL.cpp43
1 files changed, 36 insertions, 7 deletions
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index 93bb774a..c1cd0a7d 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -145,6 +145,8 @@ void CHyprOpenGLImpl::begin(CMonitor* pMonitor, pixman_region32_t* pDamage, bool
}
void CHyprOpenGLImpl::end() {
+ static auto* const PZOOMRIGID = &g_pConfigManager->getConfigValuePtr("misc:cursor_zoom_rigid")->intValue;
+
// end the render, copy the data to the WLR framebuffer
if (!m_bFakeFrame) {
pixman_region32_copy(m_RenderData.pDamage, &m_rOriginalDamageRegion);
@@ -155,20 +157,41 @@ void CHyprOpenGLImpl::end() {
glBindFramebuffer(GL_FRAMEBUFFER, m_iWLROutputFb);
wlr_box monbox = {0, 0, m_RenderData.pMonitor->vecTransformedSize.x, m_RenderData.pMonitor->vecTransformedSize.y};
+ if (m_RenderData.mouseZoomFactor != 1.f) {
+ const auto MOUSEPOS = g_pInputManager->getMouseCoordsInternal() - m_RenderData.pMonitor->vecPosition;
+ monbox.x -= MOUSEPOS.x;
+ monbox.y -= MOUSEPOS.y;
+ scaleBox(&monbox, m_RenderData.mouseZoomFactor);
+ monbox.x += *PZOOMRIGID ? m_RenderData.pMonitor->vecTransformedSize.x / 2 : MOUSEPOS.x;
+ monbox.y += *PZOOMRIGID ? m_RenderData.pMonitor->vecTransformedSize.y / 2 : MOUSEPOS.y;
+
+ if (monbox.x > 0)
+ monbox.x = 0;
+ if (monbox.y > 0)
+ monbox.y = 0;
+ if (monbox.x + monbox.width < m_RenderData.pMonitor->vecTransformedSize.x)
+ monbox.x = m_RenderData.pMonitor->vecTransformedSize.x - monbox.width;
+ if (monbox.y + monbox.height < m_RenderData.pMonitor->vecTransformedSize.y)
+ monbox.y = m_RenderData.pMonitor->vecTransformedSize.y - monbox.height;
+ }
+
clear(CColor(11.0 / 255.0, 11.0 / 255.0, 11.0 / 255.0, 1.0));
- m_bEndFrame = true;
- m_bApplyFinalShader = true;
+ m_bEndFrame = true;
+ m_bApplyFinalShader = true;
+ m_RenderData.useNearestNeighbor = true;
renderTexture(m_RenderData.pCurrentMonData->primaryFB.m_cTex, &monbox, 1.f, 0);
- m_bApplyFinalShader = false;
- m_bEndFrame = false;
+ m_RenderData.useNearestNeighbor = false;
+ m_bApplyFinalShader = false;
+ m_bEndFrame = false;
}
// reset our data
- m_RenderData.pMonitor = nullptr;
- m_iWLROutputFb = 0;
+ m_RenderData.pMonitor = nullptr;
+ m_iWLROutputFb = 0;
+ m_RenderData.mouseZoomFactor = 1.f;
}
void CHyprOpenGLImpl::initShaders() {
@@ -554,7 +577,13 @@ void CHyprOpenGLImpl::renderTextureInternalWithDamage(const CTexture& tex, wlr_b
glActiveTexture(GL_TEXTURE0);
glBindTexture(tex.m_iTarget, tex.m_iTexID);
- glTexParameteri(tex.m_iTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ if (m_RenderData.useNearestNeighbor) {
+ glTexParameteri(tex.m_iTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(tex.m_iTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ } else {
+ glTexParameteri(tex.m_iTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(tex.m_iTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ }
glUseProgram(shader->program);