From 0869f65b0b7e13b0d7f522decfc21244beb21c3a Mon Sep 17 00:00:00 2001 From: Vaxry Date: Thu, 28 Mar 2024 02:04:30 +0000 Subject: input: add misc:hide_cursor_on_key_press fixes #3045 --- src/render/Renderer.cpp | 77 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 17 deletions(-) (limited to 'src/render/Renderer.cpp') diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index c48bbdd4..960add70 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -11,8 +11,13 @@ extern "C" { #include } -CHyprRenderer::CHyprRenderer() { +static int cursorTicker(void* data) { + g_pHyprRenderer->ensureCursorRenderingMode(); + wl_event_source_timer_update(g_pHyprRenderer->m_pCursorTicker, 500); + return 0; +} +CHyprRenderer::CHyprRenderer() { if (g_pCompositor->m_sWLRSession) { wlr_device* dev; wl_list_for_each(dev, &g_pCompositor->m_sWLRSession->devices, link) { @@ -52,6 +57,30 @@ CHyprRenderer::CHyprRenderer() { if (m_bNvidia) Debug::log(WARN, "NVIDIA detected, please remember to follow nvidia instructions on the wiki"); + + // cursor hiding stuff + + g_pHookSystem->hookDynamic("keyPress", [&](void* self, SCallbackInfo& info, std::any param) { + if (m_sCursorHiddenConditions.hiddenOnKeyboard) + return; + + m_sCursorHiddenConditions.hiddenOnKeyboard = true; + ensureCursorRenderingMode(); + }); + + g_pHookSystem->hookDynamic("mouseMove", [&](void* self, SCallbackInfo& info, std::any param) { + if (!m_sCursorHiddenConditions.hiddenOnKeyboard && m_sCursorHiddenConditions.hiddenOnTouch == g_pInputManager->m_bLastInputTouch && + !m_sCursorHiddenConditions.hiddenOnTimeout) + return; + + m_sCursorHiddenConditions.hiddenOnKeyboard = false; + m_sCursorHiddenConditions.hiddenOnTimeout = false; + m_sCursorHiddenConditions.hiddenOnTouch = g_pInputManager->m_bLastInputTouch; + ensureCursorRenderingMode(); + }); + + m_pCursorTicker = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, cursorTicker, nullptr); + wl_event_source_timer_update(m_pCursorTicker, 500); } static void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { @@ -1090,8 +1119,6 @@ void CHyprRenderer::renderMonitor(CMonitor* pMonitor) { if (g_pConfigManager->m_bWantsMonitorReload) g_pConfigManager->performMonitorReload(); - - ensureCursorRenderingMode(); // so that the cursor gets hidden/shown if the user requested timeouts } // // @@ -2269,29 +2296,45 @@ void CHyprRenderer::setCursorFromName(const std::string& name, bool force) { void CHyprRenderer::ensureCursorRenderingMode() { static auto PCURSORTIMEOUT = CConfigValue("general:cursor_inactive_timeout"); static auto PHIDEONTOUCH = CConfigValue("misc:hide_cursor_on_touch"); + static auto PHIDEONKEY = CConfigValue("misc:hide_cursor_on_key_press"); - const auto PASSEDCURSORSECONDS = g_pInputManager->m_tmrLastCursorMovement.getSeconds(); - - if (*PCURSORTIMEOUT > 0 || *PHIDEONTOUCH) { - const bool HIDE = (*PCURSORTIMEOUT > 0 && *PCURSORTIMEOUT < PASSEDCURSORSECONDS) || (g_pInputManager->m_bLastInputTouch && *PHIDEONTOUCH); + if (*PCURSORTIMEOUT <= 0) + m_sCursorHiddenConditions.hiddenOnTimeout = false; + if (*PHIDEONTOUCH == 0) + m_sCursorHiddenConditions.hiddenOnTouch = false; + if (*PHIDEONKEY == 0) + m_sCursorHiddenConditions.hiddenOnKeyboard = false; - if (HIDE && !m_bCursorHidden) { - Debug::log(LOG, "Hiding the cursor (timeout)"); + if (*PCURSORTIMEOUT > 0) + m_sCursorHiddenConditions.hiddenOnTimeout = *PCURSORTIMEOUT < g_pInputManager->m_tmrLastCursorMovement.getSeconds(); - for (auto& m : g_pCompositor->m_vMonitors) - g_pHyprRenderer->damageMonitor(m.get()); // TODO: maybe just damage the cursor area? + const bool HIDE = m_sCursorHiddenConditions.hiddenOnTimeout || m_sCursorHiddenConditions.hiddenOnTouch || m_sCursorHiddenConditions.hiddenOnKeyboard; - setCursorHidden(true); + if (HIDE == m_bCursorHidden) + return; - } else if (!HIDE && m_bCursorHidden) { - Debug::log(LOG, "Showing the cursor (timeout)"); + if (HIDE) { + Debug::log(LOG, "Hiding the cursor (hl-mandated)"); - for (auto& m : g_pCompositor->m_vMonitors) - g_pHyprRenderer->damageMonitor(m.get()); // TODO: maybe just damage the cursor area? + for (auto& m : g_pCompositor->m_vMonitors) { + if (m->output->software_cursor_locks == 0) + continue; - setCursorHidden(false); + g_pHyprRenderer->damageMonitor(m.get()); // TODO: maybe just damage the cursor area? } + + setCursorHidden(true); + } else { + Debug::log(LOG, "Showing the cursor (hl-mandated)"); + + for (auto& m : g_pCompositor->m_vMonitors) { + if (m->output->software_cursor_locks == 0) + continue; + + g_pHyprRenderer->damageMonitor(m.get()); // TODO: maybe just damage the cursor area? + } + setCursorHidden(false); } } -- cgit v1.2.3