touch_from_buttons.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2020 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include "common/settings.h"
  6. #include "core/frontend/framebuffer_layout.h"
  7. #include "input_common/helpers/touch_from_buttons.h"
  8. namespace InputCommon {
  9. class TouchFromButtonDevice final : public Common::Input::InputDevice {
  10. public:
  11. using Button = std::unique_ptr<Common::Input::InputDevice>;
  12. TouchFromButtonDevice(Button button_, u32 touch_id_, float x_, float y_)
  13. : button(std::move(button_)), touch_id(touch_id_), x(x_), y(y_) {
  14. Common::Input::InputCallback button_up_callback{
  15. [this](Common::Input::CallbackStatus callback_) { UpdateButtonStatus(callback_); }};
  16. button->SetCallback(button_up_callback);
  17. button->ForceUpdate();
  18. }
  19. Common::Input::TouchStatus GetStatus(bool pressed) const {
  20. const Common::Input::ButtonStatus button_status{
  21. .value = pressed,
  22. };
  23. Common::Input::TouchStatus status{
  24. .pressed = button_status,
  25. .x = {},
  26. .y = {},
  27. .id = touch_id,
  28. };
  29. status.x.properties = properties;
  30. status.y.properties = properties;
  31. if (!pressed) {
  32. return status;
  33. }
  34. status.x.raw_value = x;
  35. status.y.raw_value = y;
  36. return status;
  37. }
  38. void UpdateButtonStatus(Common::Input::CallbackStatus button_callback) {
  39. const Common::Input::CallbackStatus status{
  40. .type = Common::Input::InputType::Touch,
  41. .touch_status = GetStatus(button_callback.button_status.value),
  42. };
  43. TriggerOnChange(status);
  44. }
  45. private:
  46. Button button;
  47. const u32 touch_id;
  48. const float x;
  49. const float y;
  50. const Common::Input::AnalogProperties properties{0.0f, 1.0f, 0.5f, 0.0f, false};
  51. };
  52. std::unique_ptr<Common::Input::InputDevice> TouchFromButton::Create(
  53. const Common::ParamPackage& params) {
  54. const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize();
  55. auto button = Common::Input::CreateDeviceFromString<Common::Input::InputDevice>(
  56. params.Get("button", null_engine));
  57. const auto touch_id = params.Get("touch_id", 0);
  58. const float x = params.Get("x", 0.0f) / 1280.0f;
  59. const float y = params.Get("y", 0.0f) / 720.0f;
  60. return std::make_unique<TouchFromButtonDevice>(std::move(button), touch_id, x, y);
  61. }
  62. } // namespace InputCommon