summaryrefslogtreecommitdiff
path: root/src/managers/KeybindManager.hpp
blob: bc9c243703969c575c9a9c0e074d6722f7c57ba6 (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
122
123
124
125
126
127
128
129
130
131
132
133
#pragma once

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

class CInputManager;
class CConfigManager;

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;
    bool        mouse   = 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                                                              onSwitchEvent(const std::string&);

    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;

    bool                      m_bIsMouseBindActive = false;

    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();
    bool                      ensureMouseBindState();

    // -------------- 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               centerWindow(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);
    static void               pinActive(std::string);
    static void               mouse(std::string);
    static void               bringActiveToTop(std::string);

    friend class CCompositor;
    friend class CInputManager;
    friend class CConfigManager;
};

inline std::unique_ptr<CKeybindManager> g_pKeybindManager;