From ddfea3a29c9badf6dabe12be86e4c5ba6d5507ad Mon Sep 17 00:00:00 2001 From: Virt <41426325+VirtCode@users.noreply.github.com> Date: Thu, 19 Sep 2024 21:40:21 +0200 Subject: [PATCH] fix: hide hw cursor on leave like hl see https://github.com/hyprwm/Hyprland/commit/e6cf643f5ab1c1545fb858ab1fd9d7538ef9e0f3 --- src/cursor.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/cursor.cpp b/src/cursor.cpp index d66013e..e0663b6 100644 --- a/src/cursor.cpp +++ b/src/cursor.cpp @@ -328,11 +328,25 @@ void CDynamicCursors::onCursorMoved(CPointerManager* pointers) { if (!pointers->hasCursor()) return; + const auto CURSORBOX = pointers->getCursorBoxGlobal(); + bool recalc = false; + for (auto& m : g_pCompositor->m_vMonitors) { auto state = pointers->stateFor(m); state->box = pointers->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); + pointers->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; @@ -340,6 +354,9 @@ void CDynamicCursors::onCursorMoved(CPointerManager* pointers) { m->output->moveCursor(CURSORPOS); } + if (recalc) + pointers->updateCursorBackend(); + // ignore warp if (!isMove && **PIGNORE_WARPS) { auto mode = this->currentMode();