mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-05 17:25:58 +01:00
1ed1ce9506
moves std::shared_ptrs to a new implementation Advantages: - you can dereference a weak_ptr directly. This will obviously segfault on a nullptr deref if it's expired. - this is useful to avoid the .lock() hell where we are 100% sure the pointer _should_ be valid. (and if it isn't, it should throw.) - weak_ptrs are still valid while the SP is being destroyed. - reasoning: while an object (e.g. CWindow) is being destroyed, its `weak_ptr self` should be accessible (the sp is still alive, and so is CWindow), but it's not because by stl it's already expired (to prevent resurrection) - this impl solves it differently. w_p is expired, but can still be dereferenced and used. Creating `s_p`s is not possible anymore, though. - this is useful in destructors and callbacks.
75 lines
2.2 KiB
C++
75 lines
2.2 KiB
C++
#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) {
|
|
disconnectCallbacks();
|
|
keyboard.reset();
|
|
events.destroy.emit();
|
|
}, 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() {
|
|
if (keyboard.expired())
|
|
return nullptr;
|
|
return keyboard->wlr();
|
|
}
|
|
|
|
void CVirtualKeyboard::disconnectCallbacks() {
|
|
hyprListener_destroy.removeCallback();
|
|
hyprListener_key.removeCallback();
|
|
hyprListener_keymap.removeCallback();
|
|
hyprListener_repeatInfo.removeCallback();
|
|
hyprListener_modifiers.removeCallback();
|
|
}
|
|
|
|
wl_client* CVirtualKeyboard::getClient() {
|
|
if (keyboard.expired())
|
|
return nullptr;
|
|
return keyboard->client();
|
|
}
|