summaryrefslogtreecommitdiff
path: root/src/managers/XCursorManager.hpp
blob: 1f3c24db59b5e341a9b69d2bab19fd14920e8051 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma once
#include <string>
#include <vector>
#include <unordered_set>
#include <array>
#include <cstdint>
#include <hyprutils/math/Vector2D.hpp>
#include "helpers/memory/Memory.hpp"

extern "C" {
#include <X11/Xcursor/Xcursor.h>
}

// gangsta bootleg XCursor impl. adidas balkanized
struct SXCursorImage {
    Vector2D              size;
    Vector2D              hotspot;
    std::vector<uint32_t> pixels; // XPixel is a u32
    uint32_t              delay;  // animation delay to next frame (ms)
};

struct SXCursors {
    std::vector<SXCursorImage> images;
    std::string                shape;
};

class CXCursorManager {
  public:
    CXCursorManager();
    ~CXCursorManager() = default;

    void          loadTheme(const std::string& name, int size, float scale);
    SP<SXCursors> getShape(std::string const& shape, int size, float scale);
    void          syncGsettings();

  private:
    SP<SXCursors>                   createCursor(std::string const& shape, XcursorImages* xImages);
    std::unordered_set<std::string> themePaths(std::string const& theme);
    std::string                     getLegacyShapeName(std::string const& shape);
    std::vector<SP<SXCursors>>      loadStandardCursors(std::string const& name, int size);
    std::vector<SP<SXCursors>>      loadAllFromDir(std::string const& path, int size);

    int                             lastLoadSize  = 0;
    float                           lastLoadScale = 0;
    std::string                     themeName     = "";
    SP<SXCursors>                   defaultCursor;
    SP<SXCursors>                   hyprCursor;
    std::vector<SP<SXCursors>>      cursors;
};