cursor: refactor override handling (#12166)
much cleaner and more reliable. Should fix https://github.com/hyprwm/Hyprland/issues/12088
This commit is contained in:
parent
6ade4d58ca
commit
5e6cec962c
6 changed files with 152 additions and 102 deletions
43
src/managers/cursor/CursorShapeOverrideController.cpp
Normal file
43
src/managers/cursor/CursorShapeOverrideController.cpp
Normal 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("");
|
||||
}
|
||||
49
src/managers/cursor/CursorShapeOverrideController.hpp
Normal file
49
src/managers/cursor/CursorShapeOverrideController.hpp
Normal 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>();
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue