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