summaryrefslogtreecommitdiff
path: root/src/render/Renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/Renderer.cpp')
-rw-r--r--src/render/Renderer.cpp41
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;