Просмотр исходного кода

Added missing start/end touch attributes to touchscreen

David Marcec 7 лет назад
Родитель
Сommit
0c3e7b7086

+ 7 - 0
src/core/hle/service/hid/controllers/touchscreen.cpp

@@ -41,7 +41,11 @@ void Controller_Touchscreen::OnUpdate(u8* data, std::size_t size) {
 
     const auto [x, y, pressed] = touch_device->GetStatus();
     auto& touch_entry = cur_entry.states[0];
+    touch_entry.attribute.raw = 0;
     if (pressed) {
+        if (cur_entry.entry_count == 0) {
+            touch_entry.attribute.start_touch.Assign(1);
+        }
         touch_entry.x = static_cast<u16>(x * Layout::ScreenUndocked::Width);
         touch_entry.y = static_cast<u16>(y * Layout::ScreenUndocked::Height);
         touch_entry.diameter_x = 15;
@@ -53,6 +57,9 @@ void Controller_Touchscreen::OnUpdate(u8* data, std::size_t size) {
         touch_entry.finger = 0;
         cur_entry.entry_count = 1;
     } else {
+        if (cur_entry.entry_count == 1) {
+            touch_entry.attribute.end_touch.Assign(1);
+        }
         cur_entry.entry_count = 0;
     }
 

+ 11 - 1
src/core/hle/service/hid/controllers/touchscreen.h

@@ -4,6 +4,7 @@
 
 #pragma once
 
+#include "common/bit_field.h"
 #include "common/common_funcs.h"
 #include "common/common_types.h"
 #include "common/swap.h"
@@ -29,9 +30,18 @@ public:
     void OnLoadInputDevices() override;
 
 private:
+    struct Attributes {
+        union {
+            u32 raw{};
+            BitField<0, 1, u32_le> start_touch;
+            BitField<1, 1, u32_le> end_touch;
+        };
+    };
+    static_assert(sizeof(Attributes) == 0x4, "Attributes is an invalid size");
+
     struct TouchState {
         u64_le delta_time;
-        u32_le attribute;
+        Attributes attribute;
         u32_le finger;
         u32_le x;
         u32_le y;