// Copyright 2020 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #include "core/frontend/framebuffer_layout.h" #include "core/settings.h" #include "input_common/touch_from_button.h" namespace InputCommon { class TouchFromButtonDevice final : public Input::TouchDevice { public: TouchFromButtonDevice() { const auto button_index = static_cast(Settings::values.touch_from_button_map_index); const auto& buttons = Settings::values.touch_from_button_maps[button_index].buttons; for (const auto& config_entry : buttons) { const Common::ParamPackage package{config_entry}; map.emplace_back( Input::CreateDevice(config_entry), std::clamp(package.Get("x", 0), 0, static_cast(Layout::ScreenUndocked::Width)), std::clamp(package.Get("y", 0), 0, static_cast(Layout::ScreenUndocked::Height))); } } std::tuple GetStatus() const override { for (const auto& m : map) { const bool state = std::get<0>(m)->GetStatus(); if (state) { const float x = static_cast(std::get<1>(m)) / static_cast(Layout::ScreenUndocked::Width); const float y = static_cast(std::get<2>(m)) / static_cast(Layout::ScreenUndocked::Height); return {x, y, true}; } } return {}; } private: // A vector of the mapped button, its x and its y-coordinate std::vector, int, int>> map; }; std::unique_ptr TouchFromButtonFactory::Create(const Common::ParamPackage&) { return std::make_unique(); } } // namespace InputCommon