summaryrefslogtreecommitdiff
path: root/src/devices/Keyboard.cpp
blob: 11257a74ee2db4768648d4e87de26a1e9e7a206b (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
#include "Keyboard.hpp"
#include "../defines.hpp"

SP<CKeyboard> CKeyboard::create(wlr_keyboard* keeb) {
    SP<CKeyboard> pKeeb = SP<CKeyboard>(new CKeyboard(keeb));

    pKeeb->self = pKeeb;

    return pKeeb;
}

bool CKeyboard::isVirtual() {
    return false;
}

wlr_keyboard* CKeyboard::wlr() {
    return keyboard;
}

CKeyboard::CKeyboard(wlr_keyboard* keeb) : keyboard(keeb) {
    if (!keeb)
        return;

    // clang-format off
    hyprListener_destroy.initCallback(&keeb->base.events.destroy, [this] (void* owner, void* data) {
        events.destroy.emit();
        disconnectCallbacks();
        keyboard = nullptr;
    }, this, "CKeyboard");

    hyprListener_key.initCallback(&keeb->events.key, [this] (void* owner, void* data) {
        auto E = (wlr_keyboard_key_event*)data;

        keyboardEvents.key.emit(SKeyEvent{
            .timeMs     = E->time_msec,
            .keycode    = E->keycode,
            .updateMods = E->update_state,
            .state      = E->state,
        });
    }, this, "CKeyboard");

    hyprListener_keymap.initCallback(&keeb->events.keymap, [this] (void* owner, void* data) {
        keyboardEvents.keymap.emit();
    }, this, "CKeyboard");

    hyprListener_modifiers.initCallback(&keeb->events.modifiers, [this] (void* owner, void* data) {
        keyboardEvents.modifiers.emit();
    }, this, "CKeyboard");

    hyprListener_repeatInfo.initCallback(&keeb->events.repeat_info, [this] (void* owner, void* data) {
        keyboardEvents.repeatInfo.emit();
    }, this, "CKeyboard");
    // clang-format on

    deviceName = keeb->base.name ? keeb->base.name : "UNKNOWN";
}

void CKeyboard::disconnectCallbacks() {
    hyprListener_destroy.removeCallback();
    hyprListener_key.removeCallback();
    hyprListener_keymap.removeCallback();
    hyprListener_repeatInfo.removeCallback();
    hyprListener_modifiers.removeCallback();
}