From b9060fdb7478ef3257b4fa294c4646b792f7d850 Mon Sep 17 00:00:00 2001 From: Felix Salcher Date: Fri, 11 Jul 2025 13:27:49 +0200 Subject: [PATCH] add onPointerMove function --- src/core/hyprlock.cpp | 3 +++ src/renderer/widgets/IWidget.cpp | 4 ++++ src/renderer/widgets/IWidget.hpp | 1 + src/renderer/widgets/PasswordInputField.cpp | 18 +++++++++++++++--- src/renderer/widgets/PasswordInputField.hpp | 1 + 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/core/hyprlock.cpp b/src/core/hyprlock.cpp index 069f20f..1bd4486 100644 --- a/src/core/hyprlock.cpp +++ b/src/core/hyprlock.cpp @@ -738,7 +738,10 @@ void CHyprlock::onHover(const Vector2D& pos) { if (!HOVERED) { widget->setHover(true); widget->onHover(pos); + widget->onPointerMove(pos); outputNeedsRedraw = true; + } else { + outputNeedsRedraw |= widget->onPointerMove(pos); } if (!cursorChanged) diff --git a/src/renderer/widgets/IWidget.cpp b/src/renderer/widgets/IWidget.cpp index 321ca85..cc7ab28 100644 --- a/src/renderer/widgets/IWidget.cpp +++ b/src/renderer/widgets/IWidget.cpp @@ -275,6 +275,10 @@ bool IWidget::isHovered() const { return hovered; } +bool IWidget::onPointerMove(const Vector2D& pos) { + return false; +} + bool IWidget::containsPoint(const Vector2D& pos) const { return getBoundingBoxWl().containsPoint(pos); } diff --git a/src/renderer/widgets/IWidget.hpp b/src/renderer/widgets/IWidget.hpp index 2ef45b3..388287d 100644 --- a/src/renderer/widgets/IWidget.hpp +++ b/src/renderer/widgets/IWidget.hpp @@ -29,6 +29,7 @@ class IWidget { }; virtual void onClick(uint32_t button, bool down, const Vector2D& pos) {} virtual void onHover(const Vector2D& pos) {} + virtual bool onPointerMove(const Vector2D& pos); bool containsPoint(const Vector2D& pos) const; struct SFormatResult { diff --git a/src/renderer/widgets/PasswordInputField.cpp b/src/renderer/widgets/PasswordInputField.cpp index 14fe4be..36605df 100644 --- a/src/renderer/widgets/PasswordInputField.cpp +++ b/src/renderer/widgets/PasswordInputField.cpp @@ -645,14 +645,26 @@ CBox CPasswordInputField::getEyeBox() { CBox inputFieldBox = getBoundingBoxWl(); auto padding = (inputFieldBox.h - eyeSize.y) / 2.0; - auto eyePosition = - inputFieldBox.pos() + (password.eye.placement == "right" ? Vector2D{inputFieldBox.w - eyeSize.x - password.eye.margin - padding, padding} : Vector2D{padding, padding}); + auto eyePosition = inputFieldBox.pos() + (password.eye.placement == "right" ? Vector2D{inputFieldBox.w - eyeSize.x - padding, padding} : Vector2D{padding, padding}); return {eyePosition, eyeSize}; } void CPasswordInputField::onHover(const Vector2D& pos) { - g_pSeatManager->m_pCursorShape->setShape(WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_POINTER); + g_pSeatManager->m_pCursorShape->setShape(WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT); +} + +bool CPasswordInputField::onPointerMove(const Vector2D& pos) { + CBox eyeBox = getEyeBox(); + + if (eyeBox.containsPoint(pos)) { + g_pSeatManager->m_pCursorShape->setShape(WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_POINTER); + return true; + } else { + g_pSeatManager->m_pCursorShape->setShape(WP_CURSOR_SHAPE_DEVICE_V1_SHAPE_TEXT); + } + + return false; } void CPasswordInputField::onClick(uint32_t button, bool down, const Vector2D& pos) { diff --git a/src/renderer/widgets/PasswordInputField.hpp b/src/renderer/widgets/PasswordInputField.hpp index de376d9..d517fa8 100644 --- a/src/renderer/widgets/PasswordInputField.hpp +++ b/src/renderer/widgets/PasswordInputField.hpp @@ -24,6 +24,7 @@ class CPasswordInputField : public IWidget { virtual void configure(const std::unordered_map& prop, const SP& pOutput); virtual bool draw(const SRenderData& data); virtual void onHover(const Vector2D& pos); + virtual bool onPointerMove(const Vector2D& pos); virtual void onClick(uint32_t button, bool down, const Vector2D& pos); virtual CBox getBoundingBoxWl() const;