committed by
Narr the Reg
10 changed files with 172 additions and 132 deletions
-
12src/input_common/CMakeLists.txt
-
142src/input_common/helpers/stick_from_buttons.cpp
-
8src/input_common/helpers/stick_from_buttons.h
-
70src/input_common/helpers/touch_from_buttons.cpp
-
7src/input_common/helpers/touch_from_buttons.h
-
2src/input_common/helpers/udp_protocol.cpp
-
0src/input_common/helpers/udp_protocol.h
-
8src/input_common/main.cpp
-
53src/input_common/touch_from_button.cpp
-
2src/input_common/udp/client.cpp
@ -0,0 +1,70 @@ |
|||||
|
// Copyright 2020 Citra Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <algorithm>
|
||||
|
#include "common/settings.h"
|
||||
|
#include "core/frontend/framebuffer_layout.h"
|
||||
|
#include "input_common/helpers/touch_from_buttons.h"
|
||||
|
|
||||
|
namespace InputCommon { |
||||
|
|
||||
|
class TouchFromButtonDevice final : public Input::InputDevice { |
||||
|
public: |
||||
|
using Button = std::unique_ptr<Input::InputDevice>; |
||||
|
TouchFromButtonDevice(Button button_, u32 touch_id_, float x_, float y_) |
||||
|
: button(std::move(button_)), touch_id(touch_id_), x(x_), y(y_) { |
||||
|
Input::InputCallback button_up_callback{ |
||||
|
[this](Input::CallbackStatus callback_) { UpdateButtonStatus(callback_); }}; |
||||
|
button->SetCallback(button_up_callback); |
||||
|
} |
||||
|
|
||||
|
Input::TouchStatus GetStatus(bool pressed) const { |
||||
|
const Input::ButtonStatus button_status{ |
||||
|
.value = pressed, |
||||
|
}; |
||||
|
Input::TouchStatus status{ |
||||
|
.pressed = button_status, |
||||
|
.x = {}, |
||||
|
.y = {}, |
||||
|
.id = touch_id, |
||||
|
}; |
||||
|
status.x.properties = properties; |
||||
|
status.y.properties = properties; |
||||
|
|
||||
|
if (!pressed) { |
||||
|
return status; |
||||
|
} |
||||
|
|
||||
|
status.x.raw_value = x; |
||||
|
status.y.raw_value = y; |
||||
|
return status; |
||||
|
} |
||||
|
|
||||
|
void UpdateButtonStatus(Input::CallbackStatus button_callback) { |
||||
|
const Input::CallbackStatus status{ |
||||
|
.type = Input::InputType::Touch, |
||||
|
.touch_status = GetStatus(button_callback.button_status.value), |
||||
|
}; |
||||
|
TriggerOnChange(status); |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
Button button; |
||||
|
const u32 touch_id; |
||||
|
const float x; |
||||
|
const float y; |
||||
|
const Input::AnalogProperties properties{0.0f, 1.0f, 0.5f, 0.0f, false}; |
||||
|
}; |
||||
|
|
||||
|
std::unique_ptr<Input::InputDevice> TouchFromButton::Create(const Common::ParamPackage& params) { |
||||
|
const std::string null_engine = Common::ParamPackage{{"engine", "null"}}.Serialize(); |
||||
|
auto button = |
||||
|
Input::CreateDeviceFromString<Input::InputDevice>(params.Get("button", null_engine)); |
||||
|
const auto touch_id = params.Get("touch_id", 0); |
||||
|
const float x = params.Get("x", 0.0f) / 1280.0f; |
||||
|
const float y = params.Get("y", 0.0f) / 720.0f; |
||||
|
return std::make_unique<TouchFromButtonDevice>(std::move(button), touch_id, x, y); |
||||
|
} |
||||
|
|
||||
|
} // namespace InputCommon
|
||||
@ -1,53 +0,0 @@ |
|||||
// Copyright 2020 Citra Emulator Project
|
|
||||
// Licensed under GPLv2 or any later version
|
|
||||
// Refer to the license.txt file included.
|
|
||||
|
|
||||
#include <algorithm>
|
|
||||
#include "common/settings.h"
|
|
||||
#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 = |
|
||||
static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue()); |
|
||||
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))); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
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(); |
|
||||
if (state) { |
|
||||
const float x = static_cast<float>(std::get<1>(map[id])) / |
|
||||
static_cast<int>(Layout::ScreenUndocked::Width); |
|
||||
const float y = static_cast<float>(std::get<2>(map[id])) / |
|
||||
static_cast<int>(Layout::ScreenUndocked::Height); |
|
||||
touch_status[id] = {x, y, true}; |
|
||||
} |
|
||||
} |
|
||||
return touch_status; |
|
||||
} |
|
||||
|
|
||||
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
|
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue