summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIkalco <73481042+ikalco@users.noreply.github.com>2024-06-12 12:28:52 -0500
committerGitHub <noreply@github.com>2024-06-12 19:28:52 +0200
commit38132ffaf53c843a3ed03be5b305702fde8f5a49 (patch)
tree9b5662659d647e6221dd3cf4b43b417e7f744b76 /src
parenta99f314106cd2ae45e12e7c4012ab68026cf5522 (diff)
renderer: properly software lock cursors with zoom_factor (#6434)
Diffstat (limited to 'src')
-rw-r--r--src/managers/PointerManager.cpp14
-rw-r--r--src/managers/PointerManager.hpp2
-rw-r--r--src/render/Renderer.cpp16
3 files changed, 25 insertions, 7 deletions
diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp
index 80a7ee76..bf7b5d0a 100644
--- a/src/managers/PointerManager.cpp
+++ b/src/managers/PointerManager.cpp
@@ -150,6 +150,20 @@ CPointerManager::CPointerManager() {
});
}
+void CPointerManager::lockSoftwareAll() {
+ for (auto& state : monitorStates)
+ state->softwareLocks++;
+
+ updateCursorBackend();
+}
+
+void CPointerManager::unlockSoftwareAll() {
+ for (auto& state : monitorStates)
+ state->softwareLocks--;
+
+ updateCursorBackend();
+}
+
void CPointerManager::lockSoftwareForMonitor(SP<CMonitor> mon) {
auto state = stateFor(mon);
state->softwareLocks++;
diff --git a/src/managers/PointerManager.hpp b/src/managers/PointerManager.hpp
index b71a79c3..1e386797 100644
--- a/src/managers/PointerManager.hpp
+++ b/src/managers/PointerManager.hpp
@@ -43,6 +43,8 @@ class CPointerManager {
void lockSoftwareForMonitor(SP<CMonitor> pMonitor);
void unlockSoftwareForMonitor(SP<CMonitor> pMonitor);
+ void lockSoftwareAll();
+ void unlockSoftwareAll();
void renderSoftwareCursorsFor(SP<CMonitor> pMonitor, timespec* now, CRegion& damage /* logical */, std::optional<Vector2D> overridePos = {} /* monitor-local */);
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 8fac5869..48fa92a0 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -1253,6 +1253,15 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
TRACY_GPU_ZONE("Render");
+ static bool zoomLock = false;
+ if (zoomLock && *PZOOMFACTOR == 1.f) {
+ g_pPointerManager->unlockSoftwareAll();
+ zoomLock = false;
+ } else if (!zoomLock && *PZOOMFACTOR != 1.f) {
+ g_pPointerManager->lockSoftwareAll();
+ zoomLock = true;
+ }
+
if (pMonitor == g_pCompositor->getMonitorFromCursor())
g_pHyprOpenGL->m_RenderData.mouseZoomFactor = std::clamp(*PZOOMFACTOR, 1.f, INFINITY);
else
@@ -1265,10 +1274,6 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
pMonitor->forceFullFrames = 10;
}
- bool lockSoftware = pMonitor == g_pCompositor->getMonitorFromCursor() && *PZOOMFACTOR != 1.f;
- if (lockSoftware)
- g_pPointerManager->lockSoftwareForMonitor(pMonitor->self.lock());
-
CRegion damage, finalDamage;
if (!beginRender(pMonitor, damage, RENDER_MODE_NORMAL)) {
Debug::log(ERR, "renderer: couldn't beginRender()!");
@@ -1370,9 +1375,6 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) {
endRender();
- if (lockSoftware)
- g_pPointerManager->unlockSoftwareForMonitor(pMonitor->self.lock());
-
TRACY_GPU_COLLECT;
if (!pMonitor->mirrors.empty()) {