From 46dab01bcc47b2e29f36cd4d35d04091e4134a67 Mon Sep 17 00:00:00 2001 From: Mozzarella32 <143010987+Mozzarella32@users.noreply.github.com> Date: Mon, 20 Oct 2025 13:22:50 +0200 Subject: renderer: add more uniforms to the screen shader (#11986) These are: pointer_shape from the cursor-shape-v1 protocol prepared for v2, along with left_ptr...bottom_right_corner and killing (Hyprland specific) pointer_shape_previous with pointer_switch_time to blend between shapes pointer_size scaled size as used by the normal cursor pointer_pressed_positions[32] with pointer_pressed_times[32] and pointer_pressed_killed(32 bits) for click/touch animations and if they killed something pointer_inactive_timeout with pointer_last_active to smoothly fade the pointer out pointer_hidden to hide it when the cursor is hidden (excluding by cursor:invisible as this config value can be used to turn off the normal cursor, which is useful when drawing it with the screen shader) --- src/render/Renderer.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) (limited to 'src/render/Renderer.cpp') diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index e4b4bf5e..446c4bc4 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -26,6 +26,7 @@ #include "../hyprerror/HyprError.hpp" #include "../debug/HyprDebugOverlay.hpp" #include "../debug/HyprNotificationOverlay.hpp" +#include "helpers/CursorShapes.hpp" #include "helpers/Monitor.hpp" #include "pass/TexPassElement.hpp" #include "pass/ClearPassElement.hpp" @@ -2042,6 +2043,42 @@ void CHyprRenderer::setCursorFromName(const std::string& name, bool force) { return; m_lastCursorData.name = name; + + static auto getShapeOrDefault = [](std::string_view name) -> wpCursorShapeDeviceV1Shape { + const auto it = std::ranges::find(CURSOR_SHAPE_NAMES, name); + + if (it == CURSOR_SHAPE_NAMES.end()) { + // clang-format off + static const auto overrites = std::unordered_map { + {"top_side", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_N_RESIZE}, + {"bottom_side", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_S_RESIZE}, + {"left_side", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_W_RESIZE}, + {"right_side", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_E_RESIZE}, + {"top_left_corner", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NW_RESIZE}, + {"bottom_left_corner", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SW_RESIZE}, + {"top_right_corner", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_NE_RESIZE}, + {"bottom_right_corner", WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_SE_RESIZE}, + }; + // clang-format on + + if (overrites.contains(name)) + return overrites.at(name); + + return WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_DEFAULT; + } + + return sc(std::distance(CURSOR_SHAPE_NAMES.begin(), it)); + }; + + const auto newShape = getShapeOrDefault(name); + + if (newShape != m_lastCursorData.shape) { + m_lastCursorData.shapePrevious = m_lastCursorData.shape; + m_lastCursorData.switchedTimer.reset(); + } + + m_lastCursorData.shape = newShape; + m_lastCursorData.surf.reset(); if (m_cursorHidden && !force) @@ -2066,7 +2103,9 @@ void CHyprRenderer::ensureCursorRenderingMode() { if (*PCURSORTIMEOUT > 0) m_cursorHiddenConditions.hiddenOnTimeout = *PCURSORTIMEOUT < g_pInputManager->m_lastCursorMovement.getSeconds(); - const bool HIDE = m_cursorHiddenConditions.hiddenOnTimeout || m_cursorHiddenConditions.hiddenOnTouch || m_cursorHiddenConditions.hiddenOnKeyboard || (*PINVISIBLE != 0); + m_cursorHiddenByCondition = m_cursorHiddenConditions.hiddenOnTimeout || m_cursorHiddenConditions.hiddenOnTouch || m_cursorHiddenConditions.hiddenOnKeyboard; + + const bool HIDE = m_cursorHiddenByCondition || (*PINVISIBLE != 0); if (HIDE == m_cursorHidden) return; -- cgit v1.2.3