mouse.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <cstring>
  5. #include "common/common_types.h"
  6. #include "core/core.h"
  7. #include "core/core_timing.h"
  8. #include "core/frontend/emu_window.h"
  9. #include "core/hid/hid_core.h"
  10. #include "core/hle/service/hid/controllers/mouse.h"
  11. namespace Service::HID {
  12. constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3400;
  13. Controller_Mouse::Controller_Mouse(Core::System& system_) : ControllerBase{system_} {
  14. emulated_devices = system.HIDCore().GetEmulatedDevices();
  15. }
  16. Controller_Mouse::~Controller_Mouse() = default;
  17. void Controller_Mouse::OnInit() {}
  18. void Controller_Mouse::OnRelease() {}
  19. void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
  20. std::size_t size) {
  21. mouse_lifo.timestamp = core_timing.GetCPUTicks();
  22. if (!IsControllerActivated()) {
  23. mouse_lifo.entry_count = 0;
  24. mouse_lifo.last_entry_index = 0;
  25. std::memcpy(data, &mouse_lifo, sizeof(mouse_lifo));
  26. return;
  27. }
  28. const auto& last_entry = mouse_lifo.ReadCurrentEntry().state;
  29. next_state.sampling_number = last_entry.sampling_number + 1;
  30. next_state.attribute.raw = 0;
  31. if (Settings::values.mouse_enabled) {
  32. const auto& mouse_button_state = emulated_devices->GetMouseButtons();
  33. const auto& mouse_position_state = emulated_devices->GetMousePosition();
  34. next_state.attribute.is_connected.Assign(1);
  35. next_state.x = mouse_position_state.x;
  36. next_state.y = mouse_position_state.y;
  37. next_state.delta_x = next_state.x - last_entry.x;
  38. next_state.delta_y = next_state.y - last_entry.y;
  39. next_state.delta_wheel_x = mouse_position_state.delta_wheel_x;
  40. next_state.delta_wheel_y = mouse_position_state.delta_wheel_y;
  41. next_state.button = mouse_button_state;
  42. }
  43. mouse_lifo.WriteNextEntry(next_state);
  44. std::memcpy(data + SHARED_MEMORY_OFFSET, &mouse_lifo, sizeof(mouse_lifo));
  45. }
  46. } // namespace Service::HID