summaryrefslogtreecommitdiff
path: root/src/managers/KeybindManager.hpp
blob: 2431d2f915946ae1b27352216587c402a60bd085 (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#pragma once

#include "../defines.hpp"
#include <deque>
#include "../Compositor.hpp"
#include <unordered_map>
#include <functional>

class CInputManager;

struct SKeybind {
    std::string       key = "";
    int               keycode = -1;
    uint32_t          modmask = 0;
    std::string       handler = "";
    std::string       arg = "";
    bool              locked = false;
    std::string       submap = "";
    bool              release = false;
    bool              repeat = false;

    // DO NOT INITIALIZE
    bool              shadowed = false;
};

enum eFocusWindowMode {
    MODE_CLASS_REGEX = 0,
    MODE_TITLE_REGEX,
    MODE_ADDRESS,
    MODE_PID
};

class CKeybindManager {
public:
    CKeybindManager();

    bool                onKeyEvent(wlr_keyboard_key_event*, SKeyboard*);
    bool                onAxisEvent(wlr_pointer_axis_event*);
    bool                onMouseEvent(wlr_pointer_button_event*);
    
    void                addKeybind(SKeybind);
    void                removeKeybind(uint32_t, const std::string&);
    uint32_t            stringToModMask(std::string);
    void                clearKeybinds();
    void                shadowKeybinds(const xkb_keysym_t& doesntHave = 0, const int& doesntHaveCode = 0);

    std::unordered_map<std::string, std::function<void(std::string)>> m_mDispatchers;

    wl_event_source*    m_pActiveKeybindEventSource = nullptr;

private:
    std::list<SKeybind> m_lKeybinds;
    std::deque<xkb_keysym_t> m_dPressedKeysyms;
    std::deque<int>     m_dPressedKeycodes;

    inline static std::string m_szCurrentSelectedSubmap = "";

    xkb_keysym_t        m_kHeldBack = 0;

    SKeybind*           m_pActiveKeybind = nullptr;

    uint32_t            m_uTimeLastMs = 0;
    uint32_t            m_uLastCode = 0;
    uint32_t            m_uLastMouseCode = 0;

    int                 m_iPassPressed = -1; // used for pass

    CTimer              m_tScrollTimer;

    bool                handleKeybinds(const uint32_t&, const std::string&, const xkb_keysym_t&, const int&, bool, uint32_t);

    bool                handleInternalKeybinds(xkb_keysym_t);
    bool                handleVT(xkb_keysym_t);

    xkb_state*          m_pXKBTranslationState = nullptr;

    void                updateXKBTranslationState();

    // -------------- Dispatchers -------------- //
    static void         killActive(std::string);
    static void         kill(std::string);
    static void         spawn(std::string);
    static void         toggleActiveFloating(std::string);
    static void         toggleActivePseudo(std::string);
    static void         changeworkspace(std::string);
    static void         fullscreenActive(std::string);
    static void         moveActiveToWorkspace(std::string);
    static void         moveActiveToWorkspaceSilent(std::string);
    static void         moveFocusTo(std::string);
    static void         moveActiveTo(std::string);
    static void         toggleGroup(std::string);
    static void         changeGroupActive(std::string);
    static void         alterSplitRatio(std::string);
    static void         focusMonitor(std::string);
    static void         toggleSplit(std::string);
    static void         moveCursorToCorner(std::string);
    static void         workspaceOpt(std::string);
    static void         exitHyprland(std::string);
    static void         moveCurrentWorkspaceToMonitor(std::string);
    static void         moveWorkspaceToMonitor(std::string);
    static void         toggleSpecialWorkspace(std::string);
    static void         forceRendererReload(std::string);
    static void         resizeActive(std::string);
    static void         moveActive(std::string);
    static void         moveWindow(std::string);
    static void         resizeWindow(std::string);
    static void         circleNext(std::string);
    static void         focusWindow(std::string);
    static void         setSubmap(std::string);
    static void         pass(std::string);
    static void         layoutmsg(std::string);
    static void         toggleOpaque(std::string);
    static void         dpms(std::string);
    static void         swapnext(std::string);
    static void         swapActiveWorkspaces(std::string);

    friend class CCompositor;
    friend class CInputManager;
};

inline std::unique_ptr<CKeybindManager> g_pKeybindManager;