diff options
| author | Vaxry <vaxry@vaxry.net> | 2024-05-03 22:34:10 +0100 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2024-05-03 22:40:27 +0100 |
| commit | 1237732b97fcf21a19aed16f2ef966118a3ca2aa (patch) | |
| tree | 15a3a29377af7f0ce3dd428229587e476ce92db3 /src/devices/Mouse.cpp | |
| parent | 1d2acbe19355c8640d54a4b6cba225c6f4370c85 (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/Mouse.cpp')
| -rw-r--r-- | src/devices/Mouse.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/devices/Mouse.cpp b/src/devices/Mouse.cpp new file mode 100644 index 00000000..e2a6f4ed --- /dev/null +++ b/src/devices/Mouse.cpp @@ -0,0 +1,169 @@ +#include "Mouse.hpp" +#include "../defines.hpp" + +SP<CMouse> CMouse::create(wlr_pointer* mouse) { + SP<CMouse> pMouse = SP<CMouse>(new CMouse(mouse)); + + pMouse->self = pMouse; + + return pMouse; +} + +CMouse::CMouse(wlr_pointer* mouse_) : mouse(mouse_) { + if (!mouse) + return; + + // clang-format off + hyprListener_destroy.initCallback(&mouse->base.events.destroy, [this] (void* owner, void* data) { + disconnectCallbacks(); + mouse = nullptr; + events.destroy.emit(); + }, this, "CMouse"); + + hyprListener_motion.initCallback(&mouse->events.motion, [this] (void* owner, void* data) { + auto E = (wlr_pointer_motion_event*)data; + + pointerEvents.motion.emit(SMotionEvent{ + .timeMs = E->time_msec, + .delta = {E->delta_x, E->delta_y}, + .unaccel = {E->unaccel_dx, E->unaccel_dy}, + }); + }, this, "CMouse"); + + hyprListener_motionAbsolute.initCallback(&mouse->events.motion_absolute, [this] (void* owner, void* data) { + auto E = (wlr_pointer_motion_absolute_event*)data; + + pointerEvents.motionAbsolute.emit(SMotionAbsoluteEvent{ + .timeMs = E->time_msec, + .absolute = {E->x, E->y}, + }); + }, this, "CMouse"); + + hyprListener_button.initCallback(&mouse->events.button, [this] (void* owner, void* data) { + auto E = (wlr_pointer_button_event*)data; + + pointerEvents.button.emit(SButtonEvent{ + .timeMs = E->time_msec, + .button = E->button, + .state = (wl_pointer_button_state)E->state, + }); + }, this, "CMouse"); + + hyprListener_axis.initCallback(&mouse->events.axis, [this] (void* owner, void* data) { + auto E = (wlr_pointer_axis_event*)data; + + pointerEvents.axis.emit(SAxisEvent{ + .timeMs = E->time_msec, + .source = E->source, + .axis = E->orientation, + .relativeDirection = E->relative_direction, + .delta = E->delta, + .deltaDiscrete = E->delta_discrete, + }); + }, this, "CMouse"); + + hyprListener_swipeBegin.initCallback(&mouse->events.swipe_begin, [this] (void* owner, void* data) { + auto E = (wlr_pointer_swipe_begin_event*)data; + + pointerEvents.swipeBegin.emit(SSwipeBeginEvent{ + .timeMs = E->time_msec, + .fingers = E->fingers, + }); + }, this, "CMouse"); + + hyprListener_swipeEnd.initCallback(&mouse->events.swipe_end, [this] (void* owner, void* data) { + auto E = (wlr_pointer_swipe_end_event*)data; + + pointerEvents.swipeEnd.emit(SSwipeEndEvent{ + .timeMs = E->time_msec, + .cancelled = E->cancelled, + }); + }, this, "CMouse"); + + hyprListener_swipeUpdate.initCallback(&mouse->events.swipe_update, [this] (void* owner, void* data) { + auto E = (wlr_pointer_swipe_update_event*)data; + + pointerEvents.swipeUpdate.emit(SSwipeUpdateEvent{ + .timeMs = E->time_msec, + .fingers = E->fingers, + .delta = {E->dx, E->dy}, + }); + }, this, "CMouse"); + + hyprListener_pinchBegin.initCallback(&mouse->events.pinch_begin, [this] (void* owner, void* data) { + auto E = (wlr_pointer_pinch_begin_event*)data; + + pointerEvents.pinchBegin.emit(SPinchBeginEvent{ + .timeMs = E->time_msec, + .fingers = E->fingers, + }); + }, this, "CMouse"); + + hyprListener_pinchEnd.initCallback(&mouse->events.pinch_end, [this] (void* owner, void* data) { + auto E = (wlr_pointer_pinch_end_event*)data; + + pointerEvents.pinchEnd.emit(SPinchEndEvent{ + .timeMs = E->time_msec, + .cancelled = E->cancelled, + }); + }, this, "CMouse"); + + hyprListener_pinchUpdate.initCallback(&mouse->events.pinch_update, [this] (void* owner, void* data) { + auto E = (wlr_pointer_pinch_update_event*)data; + + pointerEvents.pinchUpdate.emit(SPinchUpdateEvent{ + .timeMs = E->time_msec, + .fingers = E->fingers, + .delta = {E->dx, E->dy}, + .scale = E->scale, + .rotation = E->rotation, + }); + }, this, "CMouse"); + + hyprListener_holdBegin.initCallback(&mouse->events.hold_begin, [this] (void* owner, void* data) { + auto E = (wlr_pointer_hold_begin_event*)data; + + pointerEvents.holdBegin.emit(SHoldBeginEvent{ + .timeMs = E->time_msec, + .fingers = E->fingers, + }); + }, this, "CMouse"); + + hyprListener_holdEnd.initCallback(&mouse->events.hold_end, [this] (void* owner, void* data) { + auto E = (wlr_pointer_hold_end_event*)data; + + pointerEvents.holdEnd.emit(SHoldEndEvent{ + .timeMs = E->time_msec, + .cancelled = E->cancelled, + }); + }, this, "CMouse"); + + // clang-format on + + deviceName = mouse->base.name ? mouse->base.name : "UNKNOWN"; +} + +void CMouse::disconnectCallbacks() { + hyprListener_destroy.removeCallback(); + hyprListener_motion.removeCallback(); + hyprListener_motionAbsolute.removeCallback(); + hyprListener_button.removeCallback(); + hyprListener_axis.removeCallback(); + hyprListener_frame.removeCallback(); + hyprListener_swipeBegin.removeCallback(); + hyprListener_swipeEnd.removeCallback(); + hyprListener_swipeUpdate.removeCallback(); + hyprListener_pinchBegin.removeCallback(); + hyprListener_pinchEnd.removeCallback(); + hyprListener_pinchUpdate.removeCallback(); + hyprListener_holdBegin.removeCallback(); + hyprListener_holdEnd.removeCallback(); +} + +bool CMouse::isVirtual() { + return false; +} + +wlr_pointer* CMouse::wlr() { + return mouse; +} |
