yuzu/src/input_common/touch_from_button.cpp

54 lines
2.1 KiB
C++
Raw Normal View History

2020-12-28 19:15:37 +04:00
// Copyright 2020 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
2021-06-24 14:06:24 +04:00
#include <algorithm>
2021-04-15 06:05:28 +04:00
#include "common/settings.h"
2020-12-28 19:15:37 +04:00
#include "core/frontend/framebuffer_layout.h"
#include "input_common/touch_from_button.h"
namespace InputCommon {
class TouchFromButtonDevice final : public Input::TouchDevice {
public:
TouchFromButtonDevice() {
const auto button_index =
2021-07-03 13:00:06 +04:00
static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue());
2020-12-28 19:15:37 +04:00
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<Input::ButtonDevice>(config_entry),
std::clamp(package.Get("x", 0), 0, static_cast<int>(Layout::ScreenUndocked::Width)),
std::clamp(package.Get("y", 0), 0,
static_cast<int>(Layout::ScreenUndocked::Height)));
}
}
2021-01-17 06:19:34 +04:00
Input::TouchStatus GetStatus() const override {
Input::TouchStatus touch_status{};
for (std::size_t id = 0; id < map.size() && id < touch_status.size(); ++id) {
const bool state = std::get<0>(map[id])->GetStatus();
2020-12-28 19:15:37 +04:00
if (state) {
2021-01-17 06:19:34 +04:00
const float x = static_cast<float>(std::get<1>(map[id])) /
2020-12-28 19:15:37 +04:00
static_cast<int>(Layout::ScreenUndocked::Width);
2021-01-17 06:19:34 +04:00
const float y = static_cast<float>(std::get<2>(map[id])) /
2020-12-28 19:15:37 +04:00
static_cast<int>(Layout::ScreenUndocked::Height);
2021-01-17 06:19:34 +04:00
touch_status[id] = {x, y, true};
2020-12-28 19:15:37 +04:00
}
}
2021-01-17 06:19:34 +04:00
return touch_status;
2020-12-28 19:15:37 +04:00
}
private:
// A vector of the mapped button, its x and its y-coordinate
std::vector<std::tuple<std::unique_ptr<Input::ButtonDevice>, int, int>> map;
};
std::unique_ptr<Input::TouchDevice> TouchFromButtonFactory::Create(const Common::ParamPackage&) {
return std::make_unique<TouchFromButtonDevice>();
}
} // namespace InputCommon