From 5e6cec962c780956177e56355ffc1d64cc5f83ca Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Fri, 31 Oct 2025 00:14:08 +0000 Subject: cursor: refactor override handling (#12166) much cleaner and more reliable. Should fix https://github.com/hyprwm/Hyprland/issues/12088 --- .../cursor/CursorShapeOverrideController.hpp | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/managers/cursor/CursorShapeOverrideController.hpp (limited to 'src/managers/cursor/CursorShapeOverrideController.hpp') diff --git a/src/managers/cursor/CursorShapeOverrideController.hpp b/src/managers/cursor/CursorShapeOverrideController.hpp new file mode 100644 index 00000000..eca2ccf7 --- /dev/null +++ b/src/managers/cursor/CursorShapeOverrideController.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include "../../helpers/memory/Memory.hpp" +#include "../../helpers/signal/Signal.hpp" + +#include +#include + +namespace Cursor { + enum eCursorShapeOverrideGroup : uint8_t { + // unknown group - lowest priority + CURSOR_OVERRIDE_UNKNOWN = 0, + // window edges for resizing from edge + CURSOR_OVERRIDE_WINDOW_EDGE, + // Drag and drop + CURSOR_OVERRIDE_DND, + // special action: Interactive::CDrag, kill, etc. + CURSOR_OVERRIDE_SPECIAL_ACTION, + + // + CURSOR_OVERRIDE_END, + }; + + class CShapeOverrideController { + public: + CShapeOverrideController() = default; + ~CShapeOverrideController() = default; + + CShapeOverrideController(const CShapeOverrideController&) = delete; + CShapeOverrideController(CShapeOverrideController&) = delete; + CShapeOverrideController(CShapeOverrideController&&) = delete; + + void setOverride(const std::string& name, eCursorShapeOverrideGroup group); + void unsetOverride(eCursorShapeOverrideGroup group); + + struct { + // if string is empty, override was cleared + CSignalT overrideChanged; + } m_events; + + private: + void recheckOverridesResendIfChanged(); + + std::array m_overrides; + std::string m_overrideShape; + }; + + inline UP overrideController = makeUnique(); +}; \ No newline at end of file -- cgit v1.2.3