mouse.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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_timing.h"
  7. #include "core/frontend/emu_window.h"
  8. #include "core/hle/service/hid/controllers/mouse.h"
  9. namespace Service::HID {
  10. constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3400;
  11. Controller_Mouse::Controller_Mouse(Core::System& system) : ControllerBase(system) {}
  12. Controller_Mouse::~Controller_Mouse() = default;
  13. void Controller_Mouse::OnInit() {}
  14. void Controller_Mouse::OnRelease() {}
  15. void Controller_Mouse::OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data,
  16. std::size_t size) {
  17. shared_memory.header.timestamp = core_timing.GetTicks();
  18. shared_memory.header.total_entry_count = 17;
  19. if (!IsControllerActivated()) {
  20. shared_memory.header.entry_count = 0;
  21. shared_memory.header.last_entry_index = 0;
  22. return;
  23. }
  24. shared_memory.header.entry_count = 16;
  25. auto& last_entry = shared_memory.mouse_states[shared_memory.header.last_entry_index];
  26. shared_memory.header.last_entry_index = (shared_memory.header.last_entry_index + 1) % 17;
  27. auto& cur_entry = shared_memory.mouse_states[shared_memory.header.last_entry_index];
  28. cur_entry.sampling_number = last_entry.sampling_number + 1;
  29. cur_entry.sampling_number2 = cur_entry.sampling_number;
  30. if (Settings::values.mouse_enabled) {
  31. const auto [px, py, sx, sy] = mouse_device->GetStatus();
  32. const auto x = static_cast<s32>(px * Layout::ScreenUndocked::Width);
  33. const auto y = static_cast<s32>(py * Layout::ScreenUndocked::Height);
  34. cur_entry.x = x;
  35. cur_entry.y = y;
  36. cur_entry.delta_x = x - last_entry.x;
  37. cur_entry.delta_y = y - last_entry.y;
  38. cur_entry.mouse_wheel_x = sx;
  39. cur_entry.mouse_wheel_y = sy;
  40. for (std::size_t i = 0; i < mouse_button_devices.size(); ++i) {
  41. cur_entry.button |= (mouse_button_devices[i]->GetStatus() << i);
  42. }
  43. }
  44. std::memcpy(data + SHARED_MEMORY_OFFSET, &shared_memory, sizeof(SharedMemory));
  45. }
  46. void Controller_Mouse::OnLoadInputDevices() {
  47. mouse_device = Input::CreateDevice<Input::MouseDevice>(Settings::values.mouse_device);
  48. std::transform(Settings::values.mouse_buttons.begin(), Settings::values.mouse_buttons.end(),
  49. mouse_button_devices.begin(), Input::CreateDevice<Input::ButtonDevice>);
  50. }
  51. } // namespace Service::HID