diff options
Diffstat (limited to 'src/render/Renderer.cpp')
| -rw-r--r-- | src/render/Renderer.cpp | 41 |
1 files changed, 40 insertions, 1 deletions
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<std::string_view, wpCursorShapeDeviceV1Shape> { + {"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<wpCursorShapeDeviceV1Shape>(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; |
