summaryrefslogtreecommitdiff
path: root/src/devices/VirtualKeyboard.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-05-03 22:34:10 +0100
committerVaxry <vaxry@vaxry.net>2024-05-03 22:40:27 +0100
commit1237732b97fcf21a19aed16f2ef966118a3ca2aa (patch)
tree15a3a29377af7f0ce3dd428229587e476ce92db3 /src/devices/VirtualKeyboard.cpp
parent1d2acbe19355c8640d54a4b6cba225c6f4370c85 (diff)
input: Introduce basic hyprland HID classes
Implements an intermediary HID class for mice, keyboards and touch devices, removing the old structs from WLClasses.hpp Yes, virtual ones are duplicated a bit, but will likely be de-duped once wlr_input_device is not used anymore.
Diffstat (limited to 'src/devices/VirtualKeyboard.cpp')
-rw-r--r--src/devices/VirtualKeyboard.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/devices/VirtualKeyboard.cpp b/src/devices/VirtualKeyboard.cpp
new file mode 100644
index 00000000..ca6156b7
--- /dev/null
+++ b/src/devices/VirtualKeyboard.cpp
@@ -0,0 +1,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();
+}