cursor: refactor override handling (#12166)

much cleaner and more reliable. Should fix https://github.com/hyprwm/Hyprland/issues/12088
This commit is contained in:
Vaxry 2025-10-31 00:14:08 +00:00 committed by GitHub
parent 6ade4d58ca
commit 5e6cec962c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 152 additions and 102 deletions

View file

@ -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("");
}

View file

@ -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>();
};