summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/hid/controllers/gesture.h
diff options
context:
space:
mode:
authorMorph <39850852+Morph1984@users.noreply.github.com>2021-05-26 15:19:00 +0200
committerGitHub <noreply@github.com>2021-05-26 15:19:00 +0200
commit02169406bed62aa466da53487a27cd902b6aff0a (patch)
tree9af19b54bd8925bcb174729aacaefe1f2c0bab6d /src/core/hle/service/hid/controllers/gesture.h
parentMerge pull request #6339 from Morph1984/swkbd-queuedconnection (diff)
parenthid/gesture: Factor out last gesture retrieval into its own function (diff)
downloadyuzu-02169406bed62aa466da53487a27cd902b6aff0a.tar
yuzu-02169406bed62aa466da53487a27cd902b6aff0a.tar.gz
yuzu-02169406bed62aa466da53487a27cd902b6aff0a.tar.bz2
yuzu-02169406bed62aa466da53487a27cd902b6aff0a.tar.lz
yuzu-02169406bed62aa466da53487a27cd902b6aff0a.tar.xz
yuzu-02169406bed62aa466da53487a27cd902b6aff0a.tar.zst
yuzu-02169406bed62aa466da53487a27cd902b6aff0a.zip
Diffstat (limited to 'src/core/hle/service/hid/controllers/gesture.h')
-rw-r--r--src/core/hle/service/hid/controllers/gesture.h54
1 files changed, 36 insertions, 18 deletions
diff --git a/src/core/hle/service/hid/controllers/gesture.h b/src/core/hle/service/hid/controllers/gesture.h
index f46e29411..eecfeaad5 100644
--- a/src/core/hle/service/hid/controllers/gesture.h
+++ b/src/core/hle/service/hid/controllers/gesture.h
@@ -63,11 +63,28 @@ private:
};
static_assert(sizeof(Attribute) == 4, "Attribute is an invalid size");
- struct Points {
- s32_le x;
- s32_le y;
+ template <typename T>
+ struct Point {
+ T x{};
+ T y{};
+
+ friend Point operator+(const Point& lhs, const Point& rhs) {
+ return {
+ .x = lhs.x + rhs.x,
+ .y = lhs.y + rhs.y,
+ };
+ }
+
+ friend Point operator-(const Point& lhs, const Point& rhs) {
+ return {
+ .x = lhs.x - rhs.x,
+ .y = lhs.y - rhs.y,
+ };
+ }
+
+ friend bool operator==(const Point&, const Point&) = default;
};
- static_assert(sizeof(Points) == 8, "Points is an invalid size");
+ static_assert(sizeof(Point<s32_le>) == 8, "Point is an invalid size");
struct GestureState {
s64_le sampling_number;
@@ -75,17 +92,15 @@ private:
s64_le detection_count;
TouchType type;
Direction direction;
- s32_le x;
- s32_le y;
- s32_le delta_x;
- s32_le delta_y;
+ Point<s32_le> pos;
+ Point<s32_le> delta;
f32 vel_x;
f32 vel_y;
Attribute attributes;
f32 scale;
f32 rotation_angle;
s32_le point_count;
- std::array<Points, 4> points;
+ std::array<Point<s32_le>, 4> points;
};
static_assert(sizeof(GestureState) == 0x68, "GestureState is an invalid size");
@@ -96,15 +111,14 @@ private:
static_assert(sizeof(SharedMemory) == 0x708, "SharedMemory is an invalid size");
struct Finger {
- f32 x{};
- f32 y{};
+ Point<f32> pos{};
bool pressed{};
};
struct GestureProperties {
- std::array<Points, MAX_POINTS> points{};
+ std::array<Point<s32_le>, MAX_POINTS> points{};
std::size_t active_points{};
- Points mid_point{};
+ Point<s32_le> mid_point{};
s64_le detection_count{};
u64_le delta_time{};
f32 average_distance{};
@@ -148,7 +162,11 @@ private:
TouchType& type);
// Returns an unused finger id, if there is no fingers available std::nullopt is returned.
- std::optional<size_t> GetUnusedFingerID() const;
+ [[nodiscard]] std::optional<size_t> GetUnusedFingerID() const;
+
+ // Retrieves the last gesture entry, as indicated by shared memory indices.
+ [[nodiscard]] GestureState& GetLastGestureEntry();
+ [[nodiscard]] const GestureState& GetLastGestureEntry() const;
/**
* If the touch is new it tries to assign a new finger id, if there is no fingers available no
@@ -166,10 +184,10 @@ private:
std::unique_ptr<Input::TouchDevice> touch_mouse_device;
std::unique_ptr<Input::TouchDevice> touch_udp_device;
std::unique_ptr<Input::TouchDevice> touch_btn_device;
- std::array<size_t, MAX_FINGERS> mouse_finger_id;
- std::array<size_t, MAX_FINGERS> keyboard_finger_id;
- std::array<size_t, MAX_FINGERS> udp_finger_id;
- std::array<Finger, MAX_POINTS> fingers;
+ std::array<size_t, MAX_FINGERS> mouse_finger_id{};
+ std::array<size_t, MAX_FINGERS> keyboard_finger_id{};
+ std::array<size_t, MAX_FINGERS> udp_finger_id{};
+ std::array<Finger, MAX_POINTS> fingers{};
GestureProperties last_gesture{};
s64_le last_update_timestamp{};
s64_le last_tap_timestamp{};