diff options
author | Vaxry <[email protected]> | 2024-09-18 18:47:53 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2024-09-18 18:47:53 +0100 |
commit | e6cf643f5ab1c1545fb858ab1fd9d7538ef9e0f3 (patch) | |
tree | f604ad091c30a72ffefccdf948d466628a931292 | |
parent | 94140e886ea8c4ac34478d290c212f0f5454ab2e (diff) | |
download | Hyprland-e6cf643f5ab1c1545fb858ab1fd9d7538ef9e0f3.tar.gz Hyprland-e6cf643f5ab1c1545fb858ab1fd9d7538ef9e0f3.zip |
pointermgr: Hide hardware cursor on leave (#7806)
-rw-r--r-- | src/managers/PointerManager.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/managers/PointerManager.cpp b/src/managers/PointerManager.cpp index 5a192e13..3dcee431 100644 --- a/src/managers/PointerManager.cpp +++ b/src/managers/PointerManager.cpp @@ -208,9 +208,8 @@ void CPointerManager::recheckEnteredOutputs() { // if we are using hw cursors, prevent // the cursor from being stuck at the last point. - // if we are leaving it, move it to narnia. if (!s->hardwareFailed && (s->monitor->output->getBackend()->capabilities() & Aquamarine::IBackendImplementation::eBackendCapabilities::AQ_BACKEND_CAPABILITY_POINTER)) - s->monitor->output->moveCursor({-1337, -420}); + setHWCursorBuffer(s, nullptr); if (!currentCursorImage.surface) continue; @@ -269,6 +268,8 @@ void CPointerManager::resetCursorImage(bool apply) { void CPointerManager::updateCursorBackend() { static auto PNOHW = CConfigValue<Hyprlang::INT>("cursor:no_hardware_cursors"); + const auto CURSORBOX = getCursorBoxGlobal(); + for (auto const& m : g_pCompositor->m_vMonitors) { auto state = stateFor(m); @@ -277,6 +278,15 @@ void CPointerManager::updateCursorBackend() { continue; } + auto CROSSES = !m->logicalBox().intersection(CURSORBOX).empty(); + + if (!CROSSES) { + if (state->cursorFrontBuffer) + setHWCursorBuffer(state, nullptr); + + continue; + } + if (state->softwareLocks > 0 || *PNOHW || !attemptHardwareCursor(state)) { Debug::log(TRACE, "Output {} rejected hardware cursors, falling back to sw", m->szName); state->box = getCursorBoxLogicalForMonitor(state->monitor.lock()); @@ -297,17 +307,34 @@ void CPointerManager::onCursorMoved() { if (!hasCursor()) return; + const auto CURSORBOX = getCursorBoxGlobal(); + bool recalc = false; + for (auto const& m : g_pCompositor->m_vMonitors) { auto state = stateFor(m); state->box = getCursorBoxLogicalForMonitor(state->monitor.lock()); + auto CROSSES = !m->logicalBox().intersection(CURSORBOX).empty(); + + if (!CROSSES && state->cursorFrontBuffer) { + Debug::log(TRACE, "onCursorMoved for output {}: cursor left the viewport, removing it from the backend", m->szName); + setHWCursorBuffer(state, nullptr); + continue; + } else if (CROSSES && !state->cursorFrontBuffer) { + Debug::log(TRACE, "onCursorMoved for output {}: cursor entered the output, but no front buffer, forcing recalc", m->szName); + recalc = true; + } + if (state->hardwareFailed || !state->entered) continue; const auto CURSORPOS = getCursorPosForMonitor(m); m->output->moveCursor(CURSORPOS); } + + if (recalc) + updateCursorBackend(); } bool CPointerManager::attemptHardwareCursor(SP<CPointerManager::SMonitorPointerState> state) { |