From d7fc00e637c7175ccffd3b748142e8d4225045a5 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Sun, 14 Jul 2024 12:48:24 +0300 Subject: [PATCH 01/10] avoid extra pointerFrame events --- src/events/Windows.cpp | 16 +++++++++++++--- src/managers/PointerManager.cpp | 5 ++++- src/managers/SeatManager.hpp | 3 +++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index a5511e17408..0565591dc20 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -733,8 +733,19 @@ void Events::listener_commitWindow(void* owner, void* data) { if (!PWINDOW->m_pWorkspace->m_bVisible) return; - g_pHyprRenderer->damageSurface(PWINDOW->m_pWLSurface->resource(), PWINDOW->m_vRealPosition.goal().x, PWINDOW->m_vRealPosition.goal().y, - PWINDOW->m_bIsX11 ? 1.0 / PWINDOW->m_fX11SurfaceScaledBy : 1.0); + const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID); + + if (g_pSeatManager->isPointerFrameCommit) { + g_pSeatManager->isPointerFrameSkipped = false; + g_pSeatManager->isPointerFrameCommit = false; + } else + g_pHyprRenderer->damageSurface(PWINDOW->m_pWLSurface->resource(), PWINDOW->m_vRealPosition.goal().x, PWINDOW->m_vRealPosition.goal().y, + PWINDOW->m_bIsX11 ? 1.0 / PWINDOW->m_fX11SurfaceScaledBy : 1.0); + + if (g_pSeatManager->isPointerFrameSkipped) { + g_pSeatManager->sendPointerFrame(); + g_pSeatManager->isPointerFrameCommit = true; + } if (!PWINDOW->m_bIsX11) { PWINDOW->m_pSubsurfaceHead->recheckDamageForSubsurfaces(); @@ -742,7 +753,6 @@ void Events::listener_commitWindow(void* owner, void* data) { } // tearing: if solitary, redraw it. This still might be a single surface window - const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID); if (PMONITOR && PMONITOR->solitaryClient.lock() == PWINDOW && PWINDOW->canBeTorn() && PMONITOR->tearingState.canTear && PWINDOW->m_pWLSurface->resource()->current.buffer) { CRegion damageBox{PWINDOW->m_pWLSurface->resource()->accumulateCurrentBufferDamage()}; diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 3b4256880f4..1276fa25155 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -760,7 +760,10 @@ void CPointerManager::attachPointer(SP pointer) { }); listener->frame = pointer->pointerEvents.frame.registerListener([this] (std::any e) { - g_pSeatManager->sendPointerFrame(); + auto PMONITOR = g_pCompositor->getMonitorFromCursor(); + g_pSeatManager->isPointerFrameSkipped = PMONITOR && PMONITOR->shouldSkipScheduleFrameOnMouseEvent(); + if (!g_pSeatManager->isPointerFrameSkipped) + g_pSeatManager->sendPointerFrame(); }); listener->swipeBegin = pointer->pointerEvents.swipeBegin.registerListener([this] (std::any e) { diff --git a/src/managers/SeatManager.hpp b/src/managers/SeatManager.hpp index 43ebe8b59fd..5e32e13dfbc 100644 --- a/src/managers/SeatManager.hpp +++ b/src/managers/SeatManager.hpp @@ -129,6 +129,9 @@ class CSeatManager { void setGrab(SP grab); // nullptr removes SP seatGrab; + bool isPointerFrameSkipped = false; + bool isPointerFrameCommit = false; + private: struct SSeatResourceContainer { SSeatResourceContainer(SP); From 6fa53cd980f4365eed73e5a10a1990afa207a165 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Mon, 15 Jul 2024 18:12:28 +0300 Subject: [PATCH 02/10] activate hack for locked cursor only & store mouse movements --- src/events/Windows.cpp | 2 ++ src/managers/PointerManager.cpp | 23 ++++++++++++++++++++++- src/managers/PointerManager.hpp | 6 ++++++ src/managers/input/InputManager.cpp | 13 +++++++++---- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 0565591dc20..2cd74d5449d 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -11,6 +11,7 @@ #include "../protocols/XDGShell.hpp" #include "../protocols/core/Compositor.hpp" #include "../xwayland/XSurface.hpp" +#include "managers/PointerManager.hpp" #include using namespace Hyprutils::String; @@ -743,6 +744,7 @@ void Events::listener_commitWindow(void* owner, void* data) { PWINDOW->m_bIsX11 ? 1.0 / PWINDOW->m_fX11SurfaceScaledBy : 1.0); if (g_pSeatManager->isPointerFrameSkipped) { + g_pPointerManager->sendStoredMovement(); g_pSeatManager->sendPointerFrame(); g_pSeatManager->isPointerFrameCommit = true; } diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 1276fa25155..1106dce83c7 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/core/Compositor.hpp" #include "eventLoop/EventLoopManager.hpp" @@ -761,7 +762,14 @@ void CPointerManager::attachPointer(SP pointer) { listener->frame = pointer->pointerEvents.frame.registerListener([this] (std::any e) { auto PMONITOR = g_pCompositor->getMonitorFromCursor(); - g_pSeatManager->isPointerFrameSkipped = PMONITOR && PMONITOR->shouldSkipScheduleFrameOnMouseEvent(); + bool shouldSkip = false; + if (PMONITOR && PMONITOR->shouldSkipScheduleFrameOnMouseEvent() && !g_pSeatManager->mouse.expired() && g_pInputManager->isConstrained()) { + const auto SURF = CWLSurface::fromResource(g_pCompositor->m_pLastFocus.lock()); + const auto CONSTRAINT = SURF ? SURF->constraint() : nullptr; + if (CONSTRAINT) + shouldSkip = CONSTRAINT->isLocked(); + } + g_pSeatManager->isPointerFrameSkipped = shouldSkip; if (!g_pSeatManager->isPointerFrameSkipped) g_pSeatManager->sendPointerFrame(); }); @@ -933,3 +941,16 @@ void CPointerManager::damageCursor(SP 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::sendStoredMovement() { + PROTO::relativePointer->sendRelativeMotion((uint64_t)storedTime * 1000, storedDelta, storedUnaccel); + storedTime = 0; + storedDelta = Vector2D{}; + storedUnaccel = Vector2D{}; +} diff --git a/src/managers/PointerManager.hpp b/src/managers/PointerManager.hpp index 4a4c4f61f0e..da0826fe227 100644 --- a/src/managers/PointerManager.hpp +++ b/src/managers/PointerManager.hpp @@ -61,6 +61,8 @@ class CPointerManager { // Vector2D position(); Vector2D cursorSizeLogical(); + void storeMovement(uint64_t time, const Vector2D& delta, const Vector2D& deltaUnaccel); + void sendStoredMovement(); void recheckEnteredOutputs(); @@ -154,6 +156,10 @@ class CPointerManager { Vector2D pointerPos = {0, 0}; + uint64_t storedTime = 0; + Vector2D storedDelta = {0, 0}; + Vector2D storedUnaccel = {0, 0}; + struct SMonitorPointerState { SMonitorPointerState(SP m) : monitor(m) {} ~SMonitorPointerState() {} diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index e2c6236760f..7a7c406339d 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -87,10 +87,15 @@ void CInputManager::onMouseMoved(IPointer::SMotionEvent e) { const auto DELTA = *PNOACCEL == 1 ? e.unaccel : e.delta; - if (*PSENSTORAW == 1) + if (*PSENSTORAW == 1) { + if (g_pSeatManager->isPointerFrameSkipped) + g_pPointerManager->storeMovement((uint64_t)e.timeMs, DELTA * *PSENS, e.unaccel * *PSENS); PROTO::relativePointer->sendRelativeMotion((uint64_t)e.timeMs * 1000, DELTA * *PSENS, e.unaccel * *PSENS); - else + } else { + if (g_pSeatManager->isPointerFrameSkipped) + g_pPointerManager->storeMovement((uint64_t)e.timeMs, DELTA, e.unaccel); PROTO::relativePointer->sendRelativeMotion((uint64_t)e.timeMs * 1000, DELTA, e.unaccel); + } g_pPointerManager->move(DELTA * *PSENS); @@ -208,9 +213,9 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { // constraints if (!g_pSeatManager->mouse.expired() && isConstrained()) { const auto SURF = CWLSurface::fromResource(g_pCompositor->m_pLastFocus.lock()); - const auto CONSTRAINT = SURF->constraint(); + const auto CONSTRAINT = SURF ? SURF->constraint() : nullptr; - if (SURF && CONSTRAINT) { + if (CONSTRAINT) { if (CONSTRAINT->isLocked()) { const auto HINT = CONSTRAINT->logicPositionHint(); g_pCompositor->warpCursorTo(HINT, true); From 507df67fa504522bd907ad1e899fefeb5364bdf3 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Wed, 17 Jul 2024 12:17:04 +0300 Subject: [PATCH 03/10] do not change z order if not needed --- src/Compositor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 36f483fdca1..2777552f3f8 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1,4 +1,5 @@ #include "Compositor.hpp" +#include "debug/Log.hpp" #include "helpers/Splashes.hpp" #include "config/ConfigValue.hpp" #include "managers/CursorManager.hpp" @@ -1346,6 +1347,9 @@ void CCompositor::changeWindowZOrder(PHLWINDOW pWindow, bool top) { if (!validMapped(pWindow)) return; + if (pWindow == (top ? m_vWindows.back() : m_vWindows.front())) + return; + auto moveToZ = [&](PHLWINDOW pw, bool top) -> void { if (top) { for (auto it = m_vWindows.begin(); it != m_vWindows.end(); ++it) { From 6fc7b2a95448431441c1786a8b9ae22c574a0f8b Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Wed, 17 Jul 2024 15:14:26 +0300 Subject: [PATCH 04/10] don't change monitor focus if cursor is locked --- src/managers/PointerManager.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 1106dce83c7..0d29efeb0fb 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -620,9 +620,18 @@ void CPointerManager::damageIfSoftware() { void CPointerManager::warpTo(const Vector2D& logical) { damageIfSoftware(); - pointerPos = closestValid(logical); - recheckEnteredOutputs(); - onCursorMoved(); + pointerPos = closestValid(logical); + bool shouldSkipMonitorFocusChecks = false; + if (g_pInputManager->isConstrained()) { + const auto SURF = CWLSurface::fromResource(g_pCompositor->m_pLastFocus.lock()); + const auto CONSTRAINT = SURF ? SURF->constraint() : nullptr; + shouldSkipMonitorFocusChecks = CONSTRAINT && CONSTRAINT->isLocked(); + } + + if (!shouldSkipMonitorFocusChecks) { + recheckEnteredOutputs(); + onCursorMoved(); + } damageIfSoftware(); } From 7fcca263a0a6ab266387cd31e6b9ec1b44656e33 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Wed, 17 Jul 2024 21:28:51 +0300 Subject: [PATCH 05/10] do not trust locked cursor position to get monitor --- src/managers/PointerManager.cpp | 19 +++++-------------- src/managers/input/InputManager.cpp | 12 +++++++++++- src/managers/input/InputManager.hpp | 1 + 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 0d29efeb0fb..a6d747dffe1 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -620,15 +620,9 @@ void CPointerManager::damageIfSoftware() { void CPointerManager::warpTo(const Vector2D& logical) { damageIfSoftware(); - pointerPos = closestValid(logical); - bool shouldSkipMonitorFocusChecks = false; - if (g_pInputManager->isConstrained()) { - const auto SURF = CWLSurface::fromResource(g_pCompositor->m_pLastFocus.lock()); - const auto CONSTRAINT = SURF ? SURF->constraint() : nullptr; - shouldSkipMonitorFocusChecks = CONSTRAINT && CONSTRAINT->isLocked(); - } + pointerPos = closestValid(logical); - if (!shouldSkipMonitorFocusChecks) { + if (!g_pInputManager->isLocked()) { recheckEnteredOutputs(); onCursorMoved(); } @@ -770,13 +764,10 @@ void CPointerManager::attachPointer(SP pointer) { }); listener->frame = pointer->pointerEvents.frame.registerListener([this] (std::any e) { - auto PMONITOR = g_pCompositor->getMonitorFromCursor(); bool shouldSkip = false; - if (PMONITOR && PMONITOR->shouldSkipScheduleFrameOnMouseEvent() && !g_pSeatManager->mouse.expired() && g_pInputManager->isConstrained()) { - const auto SURF = CWLSurface::fromResource(g_pCompositor->m_pLastFocus.lock()); - const auto CONSTRAINT = SURF ? SURF->constraint() : nullptr; - if (CONSTRAINT) - shouldSkip = CONSTRAINT->isLocked(); + 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) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 7a7c406339d..54c8100b122 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -185,7 +185,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { m_vLastCursorPosFloored = MOUSECOORDSFLOORED; - const auto PMONITOR = g_pCompositor->getMonitorFromCursor(); + const auto PMONITOR = isLocked() && g_pCompositor->m_pLastMonitor ? g_pCompositor->m_pLastMonitor.get() : g_pCompositor->getMonitorFromCursor(); // this can happen if there are no displays hooked up to Hyprland if (PMONITOR == nullptr) @@ -1424,6 +1424,16 @@ bool CInputManager::isConstrained() { return false; } +bool CInputManager::isLocked() { + if (!isConstrained()) + return false; + + const auto SURF = CWLSurface::fromResource(g_pCompositor->m_pLastFocus.lock()); + const auto CONSTRAINT = SURF ? SURF->constraint() : nullptr; + + return CONSTRAINT && CONSTRAINT->isLocked(); +} + void CInputManager::updateCapabilities() { uint32_t caps = 0; diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index ebf00b2dfa3..d5634796dc0 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -108,6 +108,7 @@ class CInputManager { void unconstrainMouse(); bool isConstrained(); + bool isLocked(); Vector2D getMouseCoordsInternal(); void refocus(); From a5f5e87ec692a393f7c6ba449dd094d070cc0a12 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Thu, 18 Jul 2024 19:13:18 +0300 Subject: [PATCH 06/10] store movement before the skip --- src/managers/PointerManager.cpp | 6 ++++++ src/managers/PointerManager.hpp | 1 + src/managers/input/InputManager.cpp | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index a6d747dffe1..c1be5e7c5aa 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -948,6 +948,12 @@ void CPointerManager::storeMovement(uint64_t time, const Vector2D& delta, const 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; diff --git a/src/managers/PointerManager.hpp b/src/managers/PointerManager.hpp index da0826fe227..6b89eb16079 100644 --- a/src/managers/PointerManager.hpp +++ b/src/managers/PointerManager.hpp @@ -62,6 +62,7 @@ class CPointerManager { Vector2D position(); Vector2D cursorSizeLogical(); void storeMovement(uint64_t time, const Vector2D& delta, const Vector2D& deltaUnaccel); + void setStoredMovement(uint64_t time, const Vector2D& delta, const Vector2D& deltaUnaccel); void sendStoredMovement(); void recheckEnteredOutputs(); diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 54c8100b122..50b6d4df800 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -90,10 +90,14 @@ void CInputManager::onMouseMoved(IPointer::SMotionEvent e) { if (*PSENSTORAW == 1) { if (g_pSeatManager->isPointerFrameSkipped) g_pPointerManager->storeMovement((uint64_t)e.timeMs, DELTA * *PSENS, e.unaccel * *PSENS); + else + g_pPointerManager->setStoredMovement((uint64_t)e.timeMs, DELTA * *PSENS, e.unaccel * *PSENS); PROTO::relativePointer->sendRelativeMotion((uint64_t)e.timeMs * 1000, DELTA * *PSENS, e.unaccel * *PSENS); } else { if (g_pSeatManager->isPointerFrameSkipped) g_pPointerManager->storeMovement((uint64_t)e.timeMs, DELTA, e.unaccel); + else + g_pPointerManager->setStoredMovement((uint64_t)e.timeMs, DELTA, e.unaccel); PROTO::relativePointer->sendRelativeMotion((uint64_t)e.timeMs * 1000, DELTA, e.unaccel); } From 737e3a076b657f5134b6f2b7c2124b6ab445c147 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Fri, 19 Jul 2024 12:55:30 +0300 Subject: [PATCH 07/10] more debug logging --- src/events/Windows.cpp | 1 + src/helpers/Monitor.cpp | 8 +++++++- src/helpers/Monitor.hpp | 2 ++ src/helpers/Timer.cpp | 5 +++-- src/helpers/Timer.hpp | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 2cd74d5449d..65d506fe996 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -736,6 +736,7 @@ void Events::listener_commitWindow(void* owner, void* data) { const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID); + PMONITOR->debugLastPresentation(g_pSeatManager->isPointerFrameCommit ? "listener_commitWindow skip" : "listener_commitWindow"); if (g_pSeatManager->isPointerFrameCommit) { g_pSeatManager->isPointerFrameSkipped = false; g_pSeatManager->isPointerFrameCommit = false; diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 635427d14a2..dc610b67afe 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -13,6 +13,7 @@ #include "../protocols/core/Compositor.hpp" #include "sync/SyncTimeline.hpp" #include +#include "debug/Log.hpp" #include using namespace Hyprutils::String; @@ -357,7 +358,7 @@ bool CMonitor::shouldSkipScheduleFrameOnMouseEvent() { *PNOBREAK && output->state->state().adaptiveSync && activeWorkspace && activeWorkspace->m_bHasFullscreenWindow && activeWorkspace->m_efFullscreenMode == FULLSCREEN_FULL; // keep requested minimum refresh rate - if (shouldSkip && *PMINRR && lastPresentationTimer.getMillis() > 1000 / *PMINRR) { + if (shouldSkip && *PMINRR && lastPresentationTimer.getMillis() > 1000.0f / *PMINRR) { // damage whole screen because some previous cursor box damages were skipped damage.damageEntire(); return false; @@ -835,6 +836,11 @@ bool CMonitor::attemptDirectScanout() { return true; } +void CMonitor::debugLastPresentation(const std::string& message) { + Debug::log(TRACE, "{} (last presentation {} - {} fps)", message, lastPresentationTimer.getMillis(), + lastPresentationTimer.getMillis() > 0 ? 1000.0f / lastPresentationTimer.getMillis() : 0.0f); +} + CMonitorState::CMonitorState(CMonitor* owner) { m_pOwner = owner; } diff --git a/src/helpers/Monitor.hpp b/src/helpers/Monitor.hpp index 32fc768a16f..fa39f9a744f 100644 --- a/src/helpers/Monitor.hpp +++ b/src/helpers/Monitor.hpp @@ -179,6 +179,8 @@ class CMonitor { void scheduleDone(); bool attemptDirectScanout(); + void debugLastPresentation(const std::string& message); + bool m_bEnabled = false; bool m_bRenderingInitPassed = false; diff --git a/src/helpers/Timer.cpp b/src/helpers/Timer.cpp index ec530df4d60..e00c5918f89 100644 --- a/src/helpers/Timer.cpp +++ b/src/helpers/Timer.cpp @@ -1,4 +1,5 @@ #include "Timer.hpp" +#include void CTimer::reset() { m_tpLastReset = std::chrono::steady_clock::now(); @@ -8,8 +9,8 @@ std::chrono::steady_clock::duration CTimer::getDuration() { return std::chrono::steady_clock::now() - m_tpLastReset; } -int CTimer::getMillis() { - return std::chrono::duration_cast(getDuration()).count(); +float CTimer::getMillis() { + return std::chrono::duration_cast(getDuration()).count() / 1000.f; } float CTimer::getSeconds() { diff --git a/src/helpers/Timer.hpp b/src/helpers/Timer.hpp index a6d1aeedaec..a58225d08cf 100644 --- a/src/helpers/Timer.hpp +++ b/src/helpers/Timer.hpp @@ -6,7 +6,7 @@ class CTimer { public: void reset(); float getSeconds(); - int getMillis(); + float getMillis(); const std::chrono::steady_clock::time_point& chrono() const; private: From 97222ddfb60a64533ae092e12235449623393825 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Sun, 21 Jul 2024 14:32:10 +0300 Subject: [PATCH 08/10] skip extra frames for hw cursors --- src/managers/AnimationManager.cpp | 2 +- src/managers/PointerManager.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index dcc7a45ff26..f552596c3b9 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -259,7 +259,7 @@ void CAnimationManager::tick() { // manually schedule a frame if (PMONITOR) - g_pCompositor->scheduleFrameForMonitor(PMONITOR, Aquamarine::IOutput::AQ_SCHEDULE_CURSOR_SHAPE); + g_pCompositor->scheduleFrameForMonitor(PMONITOR, Aquamarine::IOutput::AQ_SCHEDULE_ANIMATION); } // do it here, because if this alters the animation vars deque we would be in trouble above. diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index c1be5e7c5aa..150b7fb8b6e 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -299,7 +299,7 @@ void CPointerManager::onCursorMoved() { continue; const auto CURSORPOS = getCursorPosForMonitor(m); - m->output->moveCursor(CURSORPOS); + m->output->moveCursor(CURSORPOS, m->shouldSkipScheduleFrameOnMouseEvent()); } } @@ -310,7 +310,7 @@ bool CPointerManager::attemptHardwareCursor(SPmonitor.lock()); - state->monitor->output->moveCursor(CURSORPOS); + state->monitor->output->moveCursor(CURSORPOS, state->monitor->shouldSkipScheduleFrameOnMouseEvent()); auto texture = getCurrentCursorTexture(); @@ -353,7 +353,8 @@ bool CPointerManager::setHWCursorBuffer(SP state, SPcursorFrontBuffer = 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; } From 4f7963f7f22136fe9788475f03630c224db07e78 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Sun, 21 Jul 2024 14:59:00 +0300 Subject: [PATCH 09/10] Revert "skip extra frames for hw cursors" This reverts commit 93e46292bca4ae7cc71c943432433022df5516b7. --- src/managers/AnimationManager.cpp | 2 +- src/managers/PointerManager.cpp | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index f552596c3b9..dcc7a45ff26 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -259,7 +259,7 @@ void CAnimationManager::tick() { // manually schedule a frame if (PMONITOR) - g_pCompositor->scheduleFrameForMonitor(PMONITOR, Aquamarine::IOutput::AQ_SCHEDULE_ANIMATION); + g_pCompositor->scheduleFrameForMonitor(PMONITOR, Aquamarine::IOutput::AQ_SCHEDULE_CURSOR_SHAPE); } // do it here, because if this alters the animation vars deque we would be in trouble above. diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 150b7fb8b6e..c1be5e7c5aa 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -299,7 +299,7 @@ void CPointerManager::onCursorMoved() { continue; const auto CURSORPOS = getCursorPosForMonitor(m); - m->output->moveCursor(CURSORPOS, m->shouldSkipScheduleFrameOnMouseEvent()); + m->output->moveCursor(CURSORPOS); } } @@ -310,7 +310,7 @@ bool CPointerManager::attemptHardwareCursor(SPmonitor.lock()); - state->monitor->output->moveCursor(CURSORPOS, state->monitor->shouldSkipScheduleFrameOnMouseEvent()); + state->monitor->output->moveCursor(CURSORPOS); auto texture = getCurrentCursorTexture(); @@ -353,8 +353,7 @@ bool CPointerManager::setHWCursorBuffer(SP state, SPcursorFrontBuffer = buf; - if (!state->monitor->shouldSkipScheduleFrameOnMouseEvent()) - g_pCompositor->scheduleFrameForMonitor(state->monitor.get(), Aquamarine::IOutput::AQ_SCHEDULE_CURSOR_SHAPE); + g_pCompositor->scheduleFrameForMonitor(state->monitor.get(), Aquamarine::IOutput::AQ_SCHEDULE_CURSOR_SHAPE); return true; } From 3d3955f0720c8d18ba7be1ff92e919610c974019 Mon Sep 17 00:00:00 2001 From: UjinT34 Date: Sun, 21 Jul 2024 14:32:10 +0300 Subject: [PATCH 10/10] skip extra frames for hw cursors --- src/managers/AnimationManager.cpp | 2 +- src/managers/PointerManager.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index dcc7a45ff26..f552596c3b9 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -259,7 +259,7 @@ void CAnimationManager::tick() { // manually schedule a frame if (PMONITOR) - g_pCompositor->scheduleFrameForMonitor(PMONITOR, Aquamarine::IOutput::AQ_SCHEDULE_CURSOR_SHAPE); + g_pCompositor->scheduleFrameForMonitor(PMONITOR, Aquamarine::IOutput::AQ_SCHEDULE_ANIMATION); } // do it here, because if this alters the animation vars deque we would be in trouble above. diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index c1be5e7c5aa..150b7fb8b6e 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -299,7 +299,7 @@ void CPointerManager::onCursorMoved() { continue; const auto CURSORPOS = getCursorPosForMonitor(m); - m->output->moveCursor(CURSORPOS); + m->output->moveCursor(CURSORPOS, m->shouldSkipScheduleFrameOnMouseEvent()); } } @@ -310,7 +310,7 @@ bool CPointerManager::attemptHardwareCursor(SPmonitor.lock()); - state->monitor->output->moveCursor(CURSORPOS); + state->monitor->output->moveCursor(CURSORPOS, state->monitor->shouldSkipScheduleFrameOnMouseEvent()); auto texture = getCurrentCursorTexture(); @@ -353,7 +353,8 @@ bool CPointerManager::setHWCursorBuffer(SP state, SPcursorFrontBuffer = 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; }