summaryrefslogtreecommitdiff
path: root/src/managers/PointerManager.cpp
diff options
context:
space:
mode:
authorUjinT34 <41110182+UjinT34@users.noreply.github.com>2024-10-12 03:29:51 +0300
committerGitHub <noreply@github.com>2024-10-12 01:29:51 +0100
commitee8116ac5dc412dce924a0163074ce7988dd0cfc (patch)
treed7c4785660a0d9112e57f20780d60e7542934117 /src/managers/PointerManager.cpp
parentf5db4839730643169b7e8b7fb6ae2fbb8743ebe9 (diff)
input: Fix VRR for constrained cursors (#6877)
Diffstat (limited to 'src/managers/PointerManager.cpp')
-rw-r--r--src/managers/PointerManager.cpp43
1 files changed, 37 insertions, 6 deletions
diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp
index cc9deec7..8c2a1bad 100644
--- a/src/managers/PointerManager.cpp
+++ b/src/managers/PointerManager.cpp
@@ -2,6 +2,7 @@
#include "../Compositor.hpp"
#include "../config/ConfigValue.hpp"
#include "../protocols/PointerGestures.hpp"
+#include "../protocols/RelativePointer.hpp"
#include "../protocols/FractionalScale.hpp"
#include "../protocols/IdleNotify.hpp"
#include "../protocols/core/Compositor.hpp"
@@ -328,7 +329,7 @@ void CPointerManager::onCursorMoved() {
continue;
const auto CURSORPOS = getCursorPosForMonitor(m);
- m->output->moveCursor(CURSORPOS);
+ m->output->moveCursor(CURSORPOS, m->shouldSkipScheduleFrameOnMouseEvent());
}
if (recalc)
@@ -342,7 +343,7 @@ bool CPointerManager::attemptHardwareCursor(SP<CPointerManager::SMonitorPointerS
return false;
const auto CURSORPOS = getCursorPosForMonitor(state->monitor.lock());
- state->monitor->output->moveCursor(CURSORPOS);
+ state->monitor->output->moveCursor(CURSORPOS, state->monitor->shouldSkipScheduleFrameOnMouseEvent());
auto texture = getCurrentCursorTexture();
@@ -385,7 +386,8 @@ bool CPointerManager::setHWCursorBuffer(SP<SMonitorPointerState> state, SP<Aquam
state->cursorFrontBuffer = buf;
- g_pCompositor->scheduleFrameForMonitor(state->monitor.get(), Aquamarine::IOutput::AQ_SCHEDULE_CURSOR_SHAPE);
+ if (!state->monitor->shouldSkipScheduleFrameOnMouseEvent())
+ g_pCompositor->scheduleFrameForMonitor(state->monitor.get(), Aquamarine::IOutput::AQ_SCHEDULE_CURSOR_SHAPE);
return true;
}
@@ -676,8 +678,11 @@ void CPointerManager::warpTo(const Vector2D& logical) {
damageIfSoftware();
pointerPos = closestValid(logical);
- recheckEnteredOutputs();
- onCursorMoved();
+
+ if (!g_pInputManager->isLocked()) {
+ recheckEnteredOutputs();
+ onCursorMoved();
+ }
damageIfSoftware();
}
@@ -859,7 +864,14 @@ void CPointerManager::attachPointer(SP<IPointer> pointer) {
});
listener->frame = pointer->pointerEvents.frame.registerListener([this] (std::any e) {
- g_pSeatManager->sendPointerFrame();
+ bool shouldSkip = false;
+ if (!g_pSeatManager->mouse.expired() && g_pInputManager->isLocked()) {
+ auto PMONITOR = g_pCompositor->m_pLastMonitor.get();
+ shouldSkip = PMONITOR && PMONITOR->shouldSkipScheduleFrameOnMouseEvent();
+ }
+ g_pSeatManager->isPointerFrameSkipped = shouldSkip;
+ if (!g_pSeatManager->isPointerFrameSkipped)
+ g_pSeatManager->sendPointerFrame();
});
listener->swipeBegin = pointer->pointerEvents.swipeBegin.registerListener([this] (std::any e) {
@@ -1080,3 +1092,22 @@ void CPointerManager::damageCursor(SP<CMonitor> pMonitor) {
Vector2D CPointerManager::cursorSizeLogical() {
return currentCursorImage.size / currentCursorImage.scale;
}
+
+void CPointerManager::storeMovement(uint64_t time, const Vector2D& delta, const Vector2D& deltaUnaccel) {
+ storedTime = time;
+ storedDelta += delta;
+ storedUnaccel += deltaUnaccel;
+}
+
+void CPointerManager::setStoredMovement(uint64_t time, const Vector2D& delta, const Vector2D& deltaUnaccel) {
+ storedTime = time;
+ storedDelta = delta;
+ storedUnaccel = deltaUnaccel;
+}
+
+void CPointerManager::sendStoredMovement() {
+ PROTO::relativePointer->sendRelativeMotion((uint64_t)storedTime * 1000, storedDelta, storedUnaccel);
+ storedTime = 0;
+ storedDelta = Vector2D{};
+ storedUnaccel = Vector2D{};
+}