diff options
Diffstat (limited to 'src/managers/cursor')
| -rw-r--r-- | src/managers/cursor/CursorShapeOverrideController.cpp | 43 | ||||
| -rw-r--r-- | src/managers/cursor/CursorShapeOverrideController.hpp | 49 |
2 files changed, 92 insertions, 0 deletions
diff --git a/src/managers/cursor/CursorShapeOverrideController.cpp b/src/managers/cursor/CursorShapeOverrideController.cpp new file mode 100644 index 00000000..45064277 --- /dev/null +++ b/src/managers/cursor/CursorShapeOverrideController.cpp @@ -0,0 +1,43 @@ +#include "CursorShapeOverrideController.hpp" + +#include <ranges> + +using namespace Cursor; + +void CShapeOverrideController::setOverride(const std::string& name, eCursorShapeOverrideGroup group) { + if (m_overrides[group] == name) + return; + + m_overrides[group] = name; + + recheckOverridesResendIfChanged(); +} + +void CShapeOverrideController::unsetOverride(eCursorShapeOverrideGroup group) { + if (m_overrides[group].empty()) + return; + + m_overrides[group] = ""; + + recheckOverridesResendIfChanged(); +} + +void CShapeOverrideController::recheckOverridesResendIfChanged() { + for (const auto& s : m_overrides | std::views::reverse) { + if (s.empty()) + continue; + + if (s == m_overrideShape) + return; + + m_overrideShape = s; + m_events.overrideChanged.emit(s); + return; + } + + if (m_overrideShape.empty()) + return; + + m_overrideShape = ""; + m_events.overrideChanged.emit(""); +} 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 <array> +#include <string> + +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<const std::string&> overrideChanged; + } m_events; + + private: + void recheckOverridesResendIfChanged(); + + std::array<std::string, CURSOR_OVERRIDE_END> m_overrides; + std::string m_overrideShape; + }; + + inline UP<CShapeOverrideController> overrideController = makeUnique<CShapeOverrideController>(); +};
\ No newline at end of file |
