summaryrefslogtreecommitdiff
path: root/src/managers/KeybindManager.hpp
blob: 689426f2e670145aa644677e6006b9431a298f06 (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
134
135
136
137
138
#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                                                              onSwitchOnEvent(const std::string&);
    void                                                              onSwitchOffEvent(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;

    std::list<SKeybind>                                               m_lKeybinds;

  private:
    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 fakeFullscreenActive(std::string);
    static void moveActiveToWorkspace(std::string);
    static void moveActiveToWorkspaceSilent(std::string);
    static void moveFocusTo(std::string);
    static void focusUrgentOrLast(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 renameWorkspace(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;