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

SP<CVirtualKeyboard> CVirtualKeyboard::create(SP<CVirtualKeyboardV1Resource> keeb) {
    SP<CVirtualKeyboard> pKeeb = SP<CVirtualKeyboard>(new CVirtualKeyboard(keeb));

    pKeeb->self = pKeeb;

    return pKeeb;
}

CVirtualKeyboard::CVirtualKeyboard(SP<CVirtualKeyboardV1Resource> keeb_) : keyboard(keeb_) {
    if (!keeb_)
        return;

    auto keeb = keeb_->wlr();

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

    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, "CVirtualKeyboard");

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

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

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

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

bool CVirtualKeyboard::isVirtual() {
    return true;
}

wlr_keyboard* CVirtualKeyboard::wlr() {
    return keyboard.lock()->wlr();
}

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

wl_client* CVirtualKeyboard::getClient() {
    return keyboard.lock()->client();
}