Compare commits
3 Commits
android-13
...
android-13
Author | SHA1 | Date | |
---|---|---|---|
ca25d1cb9e | |||
5ca8629bb2 | |||
c3e377a701 |
@ -1,8 +1,7 @@
|
|||||||
| Pull Request | Commit | Title | Author | Merged? |
|
| Pull Request | Commit | Title | Author | Merged? |
|
||||||
|----|----|----|----|----|
|
|----|----|----|----|----|
|
||||||
| [11535](https://github.com/yuzu-emu/yuzu//pull/11535) | [`50bcfa5fb`](https://github.com/yuzu-emu/yuzu//pull/11535/files) | renderer_vulkan: Introduce separate cmd buffer for uploads | [GPUCode](https://github.com/GPUCode/) | Yes |
|
| [11535](https://github.com/yuzu-emu/yuzu//pull/11535) | [`50bcfa5fb`](https://github.com/yuzu-emu/yuzu//pull/11535/files) | renderer_vulkan: Introduce separate cmd buffer for uploads | [GPUCode](https://github.com/GPUCode/) | Yes |
|
||||||
| [11889](https://github.com/yuzu-emu/yuzu//pull/11889) | [`44fa74715`](https://github.com/yuzu-emu/yuzu//pull/11889/files) | configuration: Unify config handling across frontends | [t895](https://github.com/t895/) | Yes |
|
| [11889](https://github.com/yuzu-emu/yuzu//pull/11889) | [`a249b3018`](https://github.com/yuzu-emu/yuzu//pull/11889/files) | configuration: Unify config handling across frontends | [t895](https://github.com/t895/) | Yes |
|
||||||
| [12036](https://github.com/yuzu-emu/yuzu//pull/12036) | [`c9437e524`](https://github.com/yuzu-emu/yuzu//pull/12036/files) | Query Cache: Disable write syncing on Android | [FernandoS27](https://github.com/FernandoS27/) | Yes |
|
|
||||||
|
|
||||||
|
|
||||||
End of merge log. You can find the original README.md below the break.
|
End of merge log. You can find the original README.md below the break.
|
||||||
|
@ -13,7 +13,7 @@ struct Values {
|
|||||||
Settings::Linkage linkage;
|
Settings::Linkage linkage;
|
||||||
|
|
||||||
// Android
|
// Android
|
||||||
Settings::Setting<bool> picture_in_picture{linkage, false, "picture_in_picture",
|
Settings::Setting<bool> picture_in_picture{linkage, true, "picture_in_picture",
|
||||||
Settings::Category::Android};
|
Settings::Category::Android};
|
||||||
Settings::Setting<s32> screen_layout{linkage,
|
Settings::Setting<s32> screen_layout{linkage,
|
||||||
5,
|
5,
|
||||||
|
@ -6,11 +6,10 @@
|
|||||||
namespace Settings {
|
namespace Settings {
|
||||||
namespace NativeButton {
|
namespace NativeButton {
|
||||||
const std::array<const char*, NumButtons> mapping = {{
|
const std::array<const char*, NumButtons> mapping = {{
|
||||||
"button_a", "button_b", "button_x", "button_y", "button_lstick",
|
"button_a", "button_b", "button_x", "button_y", "button_lstick",
|
||||||
"button_rstick", "button_l", "button_r", "button_zl", "button_zr",
|
"button_rstick", "button_l", "button_r", "button_zl", "button_zr",
|
||||||
"button_plus", "button_minus", "button_dleft", "button_dup", "button_dright",
|
"button_plus", "button_minus", "button_dleft", "button_dup", "button_dright",
|
||||||
"button_ddown", "button_slleft", "button_srleft", "button_home", "button_screenshot",
|
"button_ddown", "button_sl", "button_sr", "button_home", "button_screenshot",
|
||||||
"button_slright", "button_srright",
|
|
||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,15 +29,12 @@ enum Values : int {
|
|||||||
DRight,
|
DRight,
|
||||||
DDown,
|
DDown,
|
||||||
|
|
||||||
SLLeft,
|
SL,
|
||||||
SRLeft,
|
SR,
|
||||||
|
|
||||||
Home,
|
Home,
|
||||||
Screenshot,
|
Screenshot,
|
||||||
|
|
||||||
SLRight,
|
|
||||||
SRRight,
|
|
||||||
|
|
||||||
NumButtons,
|
NumButtons,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -521,19 +521,11 @@ add_library(core STATIC
|
|||||||
hle/service/grc/grc.h
|
hle/service/grc/grc.h
|
||||||
hle/service/hid/hid.cpp
|
hle/service/hid/hid.cpp
|
||||||
hle/service/hid/hid.h
|
hle/service/hid/hid.h
|
||||||
hle/service/hid/hid_debug_server.cpp
|
|
||||||
hle/service/hid/hid_debug_server.h
|
|
||||||
hle/service/hid/hid_server.cpp
|
|
||||||
hle/service/hid/hid_server.h
|
|
||||||
hle/service/hid/hid_system_server.cpp
|
|
||||||
hle/service/hid/hid_system_server.h
|
|
||||||
hle/service/hid/hidbus.cpp
|
hle/service/hid/hidbus.cpp
|
||||||
hle/service/hid/hidbus.h
|
hle/service/hid/hidbus.h
|
||||||
hle/service/hid/irs.cpp
|
hle/service/hid/irs.cpp
|
||||||
hle/service/hid/irs.h
|
hle/service/hid/irs.h
|
||||||
hle/service/hid/irs_ring_lifo.h
|
hle/service/hid/irs_ring_lifo.h
|
||||||
hle/service/hid/resource_manager.cpp
|
|
||||||
hle/service/hid/resource_manager.h
|
|
||||||
hle/service/hid/ring_lifo.h
|
hle/service/hid/ring_lifo.h
|
||||||
hle/service/hid/xcd.cpp
|
hle/service/hid/xcd.cpp
|
||||||
hle/service/hid/xcd.h
|
hle/service/hid/xcd.h
|
||||||
|
@ -38,6 +38,14 @@ using TouchParams = std::array<Common::ParamPackage, MaxTouchDevices>;
|
|||||||
using ConsoleMotionValues = ConsoleMotionInfo;
|
using ConsoleMotionValues = ConsoleMotionInfo;
|
||||||
using TouchValues = std::array<Common::Input::TouchStatus, MaxTouchDevices>;
|
using TouchValues = std::array<Common::Input::TouchStatus, MaxTouchDevices>;
|
||||||
|
|
||||||
|
struct TouchFinger {
|
||||||
|
u64 last_touch{};
|
||||||
|
Common::Point<float> position{};
|
||||||
|
u32 id{};
|
||||||
|
TouchAttribute attribute{};
|
||||||
|
bool pressed{};
|
||||||
|
};
|
||||||
|
|
||||||
// Contains all motion related data that is used on the services
|
// Contains all motion related data that is used on the services
|
||||||
struct ConsoleMotion {
|
struct ConsoleMotion {
|
||||||
Common::Vec3f accel{};
|
Common::Vec3f accel{};
|
||||||
|
@ -243,12 +243,10 @@ void EmulatedController::LoadTASParams() {
|
|||||||
tas_button_params[Settings::NativeButton::DUp].Set("button", 13);
|
tas_button_params[Settings::NativeButton::DUp].Set("button", 13);
|
||||||
tas_button_params[Settings::NativeButton::DRight].Set("button", 14);
|
tas_button_params[Settings::NativeButton::DRight].Set("button", 14);
|
||||||
tas_button_params[Settings::NativeButton::DDown].Set("button", 15);
|
tas_button_params[Settings::NativeButton::DDown].Set("button", 15);
|
||||||
tas_button_params[Settings::NativeButton::SLLeft].Set("button", 16);
|
tas_button_params[Settings::NativeButton::SL].Set("button", 16);
|
||||||
tas_button_params[Settings::NativeButton::SRLeft].Set("button", 17);
|
tas_button_params[Settings::NativeButton::SR].Set("button", 17);
|
||||||
tas_button_params[Settings::NativeButton::Home].Set("button", 18);
|
tas_button_params[Settings::NativeButton::Home].Set("button", 18);
|
||||||
tas_button_params[Settings::NativeButton::Screenshot].Set("button", 19);
|
tas_button_params[Settings::NativeButton::Screenshot].Set("button", 19);
|
||||||
tas_button_params[Settings::NativeButton::SLRight].Set("button", 20);
|
|
||||||
tas_button_params[Settings::NativeButton::SRRight].Set("button", 21);
|
|
||||||
|
|
||||||
tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
|
tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
|
||||||
tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
|
tas_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
|
||||||
@ -298,12 +296,10 @@ void EmulatedController::LoadVirtualGamepadParams() {
|
|||||||
virtual_button_params[Settings::NativeButton::DUp].Set("button", 13);
|
virtual_button_params[Settings::NativeButton::DUp].Set("button", 13);
|
||||||
virtual_button_params[Settings::NativeButton::DRight].Set("button", 14);
|
virtual_button_params[Settings::NativeButton::DRight].Set("button", 14);
|
||||||
virtual_button_params[Settings::NativeButton::DDown].Set("button", 15);
|
virtual_button_params[Settings::NativeButton::DDown].Set("button", 15);
|
||||||
virtual_button_params[Settings::NativeButton::SLLeft].Set("button", 16);
|
virtual_button_params[Settings::NativeButton::SL].Set("button", 16);
|
||||||
virtual_button_params[Settings::NativeButton::SRLeft].Set("button", 17);
|
virtual_button_params[Settings::NativeButton::SR].Set("button", 17);
|
||||||
virtual_button_params[Settings::NativeButton::Home].Set("button", 18);
|
virtual_button_params[Settings::NativeButton::Home].Set("button", 18);
|
||||||
virtual_button_params[Settings::NativeButton::Screenshot].Set("button", 19);
|
virtual_button_params[Settings::NativeButton::Screenshot].Set("button", 19);
|
||||||
virtual_button_params[Settings::NativeButton::SLRight].Set("button", 20);
|
|
||||||
virtual_button_params[Settings::NativeButton::SRRight].Set("button", 21);
|
|
||||||
|
|
||||||
virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
|
virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_x", 0);
|
||||||
virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
|
virtual_stick_params[Settings::NativeAnalog::LStick].Set("axis_y", 1);
|
||||||
@ -871,16 +867,12 @@ void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback
|
|||||||
controller.npad_button_state.down.Assign(current_status.value);
|
controller.npad_button_state.down.Assign(current_status.value);
|
||||||
controller.debug_pad_button_state.d_down.Assign(current_status.value);
|
controller.debug_pad_button_state.d_down.Assign(current_status.value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeButton::SLLeft:
|
case Settings::NativeButton::SL:
|
||||||
controller.npad_button_state.left_sl.Assign(current_status.value);
|
controller.npad_button_state.left_sl.Assign(current_status.value);
|
||||||
break;
|
|
||||||
case Settings::NativeButton::SLRight:
|
|
||||||
controller.npad_button_state.right_sl.Assign(current_status.value);
|
controller.npad_button_state.right_sl.Assign(current_status.value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeButton::SRLeft:
|
case Settings::NativeButton::SR:
|
||||||
controller.npad_button_state.left_sr.Assign(current_status.value);
|
controller.npad_button_state.left_sr.Assign(current_status.value);
|
||||||
break;
|
|
||||||
case Settings::NativeButton::SRRight:
|
|
||||||
controller.npad_button_state.right_sr.Assign(current_status.value);
|
controller.npad_button_state.right_sr.Assign(current_status.value);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeButton::Home:
|
case Settings::NativeButton::Home:
|
||||||
@ -1898,16 +1890,12 @@ NpadButton EmulatedController::GetTurboButtonMask() const {
|
|||||||
case Settings::NativeButton::DDown:
|
case Settings::NativeButton::DDown:
|
||||||
button_mask.down.Assign(1);
|
button_mask.down.Assign(1);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeButton::SLLeft:
|
case Settings::NativeButton::SL:
|
||||||
button_mask.left_sl.Assign(1);
|
button_mask.left_sl.Assign(1);
|
||||||
break;
|
|
||||||
case Settings::NativeButton::SLRight:
|
|
||||||
button_mask.right_sl.Assign(1);
|
button_mask.right_sl.Assign(1);
|
||||||
break;
|
break;
|
||||||
case Settings::NativeButton::SRLeft:
|
case Settings::NativeButton::SR:
|
||||||
button_mask.left_sr.Assign(1);
|
button_mask.left_sr.Assign(1);
|
||||||
break;
|
|
||||||
case Settings::NativeButton::SRRight:
|
|
||||||
button_mask.right_sr.Assign(1);
|
button_mask.right_sr.Assign(1);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -356,14 +356,6 @@ struct TouchState {
|
|||||||
};
|
};
|
||||||
static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size");
|
static_assert(sizeof(TouchState) == 0x28, "Touchstate is an invalid size");
|
||||||
|
|
||||||
struct TouchFinger {
|
|
||||||
u64 last_touch{};
|
|
||||||
Common::Point<float> position{};
|
|
||||||
u32 id{};
|
|
||||||
TouchAttribute attribute{};
|
|
||||||
bool pressed{};
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is nn::hid::TouchScreenConfigurationForNx
|
// This is nn::hid::TouchScreenConfigurationForNx
|
||||||
struct TouchScreenConfigurationForNx {
|
struct TouchScreenConfigurationForNx {
|
||||||
TouchScreenModeForNx mode{TouchScreenModeForNx::UseSystemSetting};
|
TouchScreenModeForNx mode{TouchScreenModeForNx::UseSystemSetting};
|
||||||
|
@ -5,14 +5,13 @@
|
|||||||
#include "core/hid/hid_types.h"
|
#include "core/hid/hid_types.h"
|
||||||
#include "core/hid/input_interpreter.h"
|
#include "core/hid/input_interpreter.h"
|
||||||
#include "core/hle/service/hid/controllers/npad.h"
|
#include "core/hle/service/hid/controllers/npad.h"
|
||||||
#include "core/hle/service/hid/hid_server.h"
|
#include "core/hle/service/hid/hid.h"
|
||||||
#include "core/hle/service/hid/resource_manager.h"
|
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
|
||||||
InputInterpreter::InputInterpreter(Core::System& system)
|
InputInterpreter::InputInterpreter(Core::System& system)
|
||||||
: npad{system.ServiceManager()
|
: npad{system.ServiceManager()
|
||||||
.GetService<Service::HID::IHidServer>("hid")
|
.GetService<Service::HID::Hid>("hid")
|
||||||
->GetResourceManager()
|
->GetAppletResource()
|
||||||
->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)} {
|
->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad)} {
|
||||||
ResetButtonStates();
|
ResetButtonStates();
|
||||||
}
|
}
|
||||||
|
@ -457,14 +457,12 @@ void Controller_NPad::RequestPadStateUpdate(Core::HID::NpadIdType npad_id) {
|
|||||||
pad_entry.l_stick = stick_state.left;
|
pad_entry.l_stick = stick_state.left;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (controller_type == Core::HID::NpadStyleIndex::JoyconLeft ||
|
if (controller_type == Core::HID::NpadStyleIndex::JoyconLeft) {
|
||||||
controller_type == Core::HID::NpadStyleIndex::JoyconDual) {
|
|
||||||
pad_entry.npad_buttons.left_sl.Assign(button_state.left_sl);
|
pad_entry.npad_buttons.left_sl.Assign(button_state.left_sl);
|
||||||
pad_entry.npad_buttons.left_sr.Assign(button_state.left_sr);
|
pad_entry.npad_buttons.left_sr.Assign(button_state.left_sr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (controller_type == Core::HID::NpadStyleIndex::JoyconRight ||
|
if (controller_type == Core::HID::NpadStyleIndex::JoyconRight) {
|
||||||
controller_type == Core::HID::NpadStyleIndex::JoyconDual) {
|
|
||||||
pad_entry.npad_buttons.right_sl.Assign(button_state.right_sl);
|
pad_entry.npad_buttons.right_sl.Assign(button_state.right_sl);
|
||||||
pad_entry.npad_buttons.right_sr.Assign(button_state.right_sr);
|
pad_entry.npad_buttons.right_sr.Assign(button_state.right_sr);
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -3,12 +3,220 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace Core {
|
#include <chrono>
|
||||||
class System;
|
|
||||||
|
#include "core/hle/service/hid/controllers/controller_base.h"
|
||||||
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Core::Timing {
|
||||||
|
struct EventType;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Service::SM {
|
||||||
|
class ServiceManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Service::HID {
|
namespace Service::HID {
|
||||||
|
|
||||||
|
enum class HidController : std::size_t {
|
||||||
|
DebugPad,
|
||||||
|
Touchscreen,
|
||||||
|
Mouse,
|
||||||
|
Keyboard,
|
||||||
|
XPad,
|
||||||
|
HomeButton,
|
||||||
|
SleepButton,
|
||||||
|
CaptureButton,
|
||||||
|
InputDetector,
|
||||||
|
UniquePad,
|
||||||
|
NPad,
|
||||||
|
Gesture,
|
||||||
|
ConsoleSixAxisSensor,
|
||||||
|
DebugMouse,
|
||||||
|
Palma,
|
||||||
|
|
||||||
|
MaxControllers,
|
||||||
|
};
|
||||||
|
|
||||||
|
class IAppletResource final : public ServiceFramework<IAppletResource> {
|
||||||
|
public:
|
||||||
|
explicit IAppletResource(Core::System& system_,
|
||||||
|
KernelHelpers::ServiceContext& service_context_);
|
||||||
|
~IAppletResource() override;
|
||||||
|
|
||||||
|
void ActivateController(HidController controller);
|
||||||
|
void DeactivateController(HidController controller);
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T& GetController(HidController controller) {
|
||||||
|
return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
const T& GetController(HidController controller) const {
|
||||||
|
return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <typename T>
|
||||||
|
void MakeController(HidController controller, u8* shared_memory) {
|
||||||
|
if constexpr (std::is_constructible_v<T, Core::System&, u8*>) {
|
||||||
|
controllers[static_cast<std::size_t>(controller)] =
|
||||||
|
std::make_unique<T>(system, shared_memory);
|
||||||
|
} else {
|
||||||
|
controllers[static_cast<std::size_t>(controller)] =
|
||||||
|
std::make_unique<T>(system.HIDCore(), shared_memory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) {
|
||||||
|
controllers[static_cast<std::size_t>(controller)] =
|
||||||
|
std::make_unique<T>(system.HIDCore(), shared_memory, service_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetSharedMemoryHandle(HLERequestContext& ctx);
|
||||||
|
void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
||||||
|
void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
||||||
|
void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
||||||
|
void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
||||||
|
|
||||||
|
KernelHelpers::ServiceContext& service_context;
|
||||||
|
|
||||||
|
std::shared_ptr<Core::Timing::EventType> npad_update_event;
|
||||||
|
std::shared_ptr<Core::Timing::EventType> default_update_event;
|
||||||
|
std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event;
|
||||||
|
std::shared_ptr<Core::Timing::EventType> motion_update_event;
|
||||||
|
|
||||||
|
std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
|
||||||
|
controllers{};
|
||||||
|
};
|
||||||
|
|
||||||
|
class Hid final : public ServiceFramework<Hid> {
|
||||||
|
public:
|
||||||
|
explicit Hid(Core::System& system_, std::shared_ptr<IAppletResource> applet_resource_);
|
||||||
|
~Hid() override;
|
||||||
|
|
||||||
|
std::shared_ptr<IAppletResource> GetAppletResource();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CreateAppletResource(HLERequestContext& ctx);
|
||||||
|
void ActivateDebugPad(HLERequestContext& ctx);
|
||||||
|
void ActivateTouchScreen(HLERequestContext& ctx);
|
||||||
|
void ActivateMouse(HLERequestContext& ctx);
|
||||||
|
void ActivateKeyboard(HLERequestContext& ctx);
|
||||||
|
void SendKeyboardLockKeyEvent(HLERequestContext& ctx);
|
||||||
|
void ActivateXpad(HLERequestContext& ctx);
|
||||||
|
void GetXpadIDs(HLERequestContext& ctx);
|
||||||
|
void ActivateSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void DeactivateSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void StartSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void StopSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void IsSixAxisSensorFusionEnabled(HLERequestContext& ctx);
|
||||||
|
void EnableSixAxisSensorFusion(HLERequestContext& ctx);
|
||||||
|
void SetSixAxisSensorFusionParameters(HLERequestContext& ctx);
|
||||||
|
void GetSixAxisSensorFusionParameters(HLERequestContext& ctx);
|
||||||
|
void ResetSixAxisSensorFusionParameters(HLERequestContext& ctx);
|
||||||
|
void SetGyroscopeZeroDriftMode(HLERequestContext& ctx);
|
||||||
|
void GetGyroscopeZeroDriftMode(HLERequestContext& ctx);
|
||||||
|
void ResetGyroscopeZeroDriftMode(HLERequestContext& ctx);
|
||||||
|
void IsSixAxisSensorAtRest(HLERequestContext& ctx);
|
||||||
|
void IsFirmwareUpdateAvailableForSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void EnableSixAxisSensorUnalteredPassthrough(HLERequestContext& ctx);
|
||||||
|
void IsSixAxisSensorUnalteredPassthroughEnabled(HLERequestContext& ctx);
|
||||||
|
void LoadSixAxisSensorCalibrationParameter(HLERequestContext& ctx);
|
||||||
|
void GetSixAxisSensorIcInformation(HLERequestContext& ctx);
|
||||||
|
void ResetIsSixAxisSensorDeviceNewlyAssigned(HLERequestContext& ctx);
|
||||||
|
void ActivateGesture(HLERequestContext& ctx);
|
||||||
|
void SetSupportedNpadStyleSet(HLERequestContext& ctx);
|
||||||
|
void GetSupportedNpadStyleSet(HLERequestContext& ctx);
|
||||||
|
void SetSupportedNpadIdType(HLERequestContext& ctx);
|
||||||
|
void ActivateNpad(HLERequestContext& ctx);
|
||||||
|
void DeactivateNpad(HLERequestContext& ctx);
|
||||||
|
void AcquireNpadStyleSetUpdateEventHandle(HLERequestContext& ctx);
|
||||||
|
void DisconnectNpad(HLERequestContext& ctx);
|
||||||
|
void GetPlayerLedPattern(HLERequestContext& ctx);
|
||||||
|
void ActivateNpadWithRevision(HLERequestContext& ctx);
|
||||||
|
void SetNpadJoyHoldType(HLERequestContext& ctx);
|
||||||
|
void GetNpadJoyHoldType(HLERequestContext& ctx);
|
||||||
|
void SetNpadJoyAssignmentModeSingleByDefault(HLERequestContext& ctx);
|
||||||
|
void SetNpadJoyAssignmentModeSingle(HLERequestContext& ctx);
|
||||||
|
void SetNpadJoyAssignmentModeDual(HLERequestContext& ctx);
|
||||||
|
void MergeSingleJoyAsDualJoy(HLERequestContext& ctx);
|
||||||
|
void StartLrAssignmentMode(HLERequestContext& ctx);
|
||||||
|
void StopLrAssignmentMode(HLERequestContext& ctx);
|
||||||
|
void SetNpadHandheldActivationMode(HLERequestContext& ctx);
|
||||||
|
void GetNpadHandheldActivationMode(HLERequestContext& ctx);
|
||||||
|
void SwapNpadAssignment(HLERequestContext& ctx);
|
||||||
|
void IsUnintendedHomeButtonInputProtectionEnabled(HLERequestContext& ctx);
|
||||||
|
void EnableUnintendedHomeButtonInputProtection(HLERequestContext& ctx);
|
||||||
|
void SetNpadJoyAssignmentModeSingleWithDestination(HLERequestContext& ctx);
|
||||||
|
void SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx);
|
||||||
|
void SetNpadCaptureButtonAssignment(HLERequestContext& ctx);
|
||||||
|
void ClearNpadCaptureButtonAssignment(HLERequestContext& ctx);
|
||||||
|
void GetVibrationDeviceInfo(HLERequestContext& ctx);
|
||||||
|
void SendVibrationValue(HLERequestContext& ctx);
|
||||||
|
void GetActualVibrationValue(HLERequestContext& ctx);
|
||||||
|
void CreateActiveVibrationDeviceList(HLERequestContext& ctx);
|
||||||
|
void PermitVibration(HLERequestContext& ctx);
|
||||||
|
void IsVibrationPermitted(HLERequestContext& ctx);
|
||||||
|
void SendVibrationValues(HLERequestContext& ctx);
|
||||||
|
void SendVibrationGcErmCommand(HLERequestContext& ctx);
|
||||||
|
void GetActualVibrationGcErmCommand(HLERequestContext& ctx);
|
||||||
|
void BeginPermitVibrationSession(HLERequestContext& ctx);
|
||||||
|
void EndPermitVibrationSession(HLERequestContext& ctx);
|
||||||
|
void IsVibrationDeviceMounted(HLERequestContext& ctx);
|
||||||
|
void ActivateConsoleSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void StartConsoleSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void StopConsoleSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void ActivateSevenSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void StartSevenSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void StopSevenSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void InitializeSevenSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void FinalizeSevenSixAxisSensor(HLERequestContext& ctx);
|
||||||
|
void ResetSevenSixAxisSensorTimestamp(HLERequestContext& ctx);
|
||||||
|
void IsUsbFullKeyControllerEnabled(HLERequestContext& ctx);
|
||||||
|
void GetPalmaConnectionHandle(HLERequestContext& ctx);
|
||||||
|
void InitializePalma(HLERequestContext& ctx);
|
||||||
|
void AcquirePalmaOperationCompleteEvent(HLERequestContext& ctx);
|
||||||
|
void GetPalmaOperationInfo(HLERequestContext& ctx);
|
||||||
|
void PlayPalmaActivity(HLERequestContext& ctx);
|
||||||
|
void SetPalmaFrModeType(HLERequestContext& ctx);
|
||||||
|
void ReadPalmaStep(HLERequestContext& ctx);
|
||||||
|
void EnablePalmaStep(HLERequestContext& ctx);
|
||||||
|
void ResetPalmaStep(HLERequestContext& ctx);
|
||||||
|
void ReadPalmaApplicationSection(HLERequestContext& ctx);
|
||||||
|
void WritePalmaApplicationSection(HLERequestContext& ctx);
|
||||||
|
void ReadPalmaUniqueCode(HLERequestContext& ctx);
|
||||||
|
void SetPalmaUniqueCodeInvalid(HLERequestContext& ctx);
|
||||||
|
void WritePalmaActivityEntry(HLERequestContext& ctx);
|
||||||
|
void WritePalmaRgbLedPatternEntry(HLERequestContext& ctx);
|
||||||
|
void WritePalmaWaveEntry(HLERequestContext& ctx);
|
||||||
|
void SetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx);
|
||||||
|
void GetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx);
|
||||||
|
void SuspendPalmaFeature(HLERequestContext& ctx);
|
||||||
|
void GetPalmaOperationResult(HLERequestContext& ctx);
|
||||||
|
void ReadPalmaPlayLog(HLERequestContext& ctx);
|
||||||
|
void ResetPalmaPlayLog(HLERequestContext& ctx);
|
||||||
|
void SetIsPalmaAllConnectable(HLERequestContext& ctx);
|
||||||
|
void SetIsPalmaPairedConnectable(HLERequestContext& ctx);
|
||||||
|
void PairPalma(HLERequestContext& ctx);
|
||||||
|
void SetPalmaBoostMode(HLERequestContext& ctx);
|
||||||
|
void CancelWritePalmaWaveEntry(HLERequestContext& ctx);
|
||||||
|
void EnablePalmaBoostMode(HLERequestContext& ctx);
|
||||||
|
void GetPalmaBluetoothAddress(HLERequestContext& ctx);
|
||||||
|
void SetDisallowedPalmaConnection(HLERequestContext& ctx);
|
||||||
|
void SetNpadCommunicationMode(HLERequestContext& ctx);
|
||||||
|
void GetNpadCommunicationMode(HLERequestContext& ctx);
|
||||||
|
void SetTouchScreenConfiguration(HLERequestContext& ctx);
|
||||||
|
void IsFirmwareUpdateNeededForNotification(HLERequestContext& ctx);
|
||||||
|
|
||||||
|
std::shared_ptr<IAppletResource> applet_resource;
|
||||||
|
|
||||||
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
};
|
||||||
|
|
||||||
void LoopProcess(Core::System& system);
|
void LoopProcess(Core::System& system);
|
||||||
|
|
||||||
} // namespace Service::HID
|
} // namespace Service::HID
|
||||||
|
@ -1,159 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include "core/hle/service/hid/hid_debug_server.h"
|
|
||||||
#include "core/hle/service/hid/resource_manager.h"
|
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
|
||||||
|
|
||||||
namespace Service::HID {
|
|
||||||
|
|
||||||
IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource)
|
|
||||||
: ServiceFramework{system_, "hid:dbg"}, resource_manager{resource} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, nullptr, "DeactivateDebugPad"},
|
|
||||||
{1, nullptr, "SetDebugPadAutoPilotState"},
|
|
||||||
{2, nullptr, "UnsetDebugPadAutoPilotState"},
|
|
||||||
{10, nullptr, "DeactivateTouchScreen"},
|
|
||||||
{11, nullptr, "SetTouchScreenAutoPilotState"},
|
|
||||||
{12, nullptr, "UnsetTouchScreenAutoPilotState"},
|
|
||||||
{13, nullptr, "GetTouchScreenConfiguration"},
|
|
||||||
{14, nullptr, "ProcessTouchScreenAutoTune"},
|
|
||||||
{15, nullptr, "ForceStopTouchScreenManagement"},
|
|
||||||
{16, nullptr, "ForceRestartTouchScreenManagement"},
|
|
||||||
{17, nullptr, "IsTouchScreenManaged"},
|
|
||||||
{20, nullptr, "DeactivateMouse"},
|
|
||||||
{21, nullptr, "SetMouseAutoPilotState"},
|
|
||||||
{22, nullptr, "UnsetMouseAutoPilotState"},
|
|
||||||
{25, nullptr, "SetDebugMouseAutoPilotState"},
|
|
||||||
{26, nullptr, "UnsetDebugMouseAutoPilotState"},
|
|
||||||
{30, nullptr, "DeactivateKeyboard"},
|
|
||||||
{31, nullptr, "SetKeyboardAutoPilotState"},
|
|
||||||
{32, nullptr, "UnsetKeyboardAutoPilotState"},
|
|
||||||
{50, nullptr, "DeactivateXpad"},
|
|
||||||
{51, nullptr, "SetXpadAutoPilotState"},
|
|
||||||
{52, nullptr, "UnsetXpadAutoPilotState"},
|
|
||||||
{53, nullptr, "DeactivateJoyXpad"},
|
|
||||||
{60, nullptr, "ClearNpadSystemCommonPolicy"},
|
|
||||||
{61, nullptr, "DeactivateNpad"},
|
|
||||||
{62, nullptr, "ForceDisconnectNpad"},
|
|
||||||
{91, nullptr, "DeactivateGesture"},
|
|
||||||
{110, nullptr, "DeactivateHomeButton"},
|
|
||||||
{111, nullptr, "SetHomeButtonAutoPilotState"},
|
|
||||||
{112, nullptr, "UnsetHomeButtonAutoPilotState"},
|
|
||||||
{120, nullptr, "DeactivateSleepButton"},
|
|
||||||
{121, nullptr, "SetSleepButtonAutoPilotState"},
|
|
||||||
{122, nullptr, "UnsetSleepButtonAutoPilotState"},
|
|
||||||
{123, nullptr, "DeactivateInputDetector"},
|
|
||||||
{130, nullptr, "DeactivateCaptureButton"},
|
|
||||||
{131, nullptr, "SetCaptureButtonAutoPilotState"},
|
|
||||||
{132, nullptr, "UnsetCaptureButtonAutoPilotState"},
|
|
||||||
{133, nullptr, "SetShiftAccelerometerCalibrationValue"},
|
|
||||||
{134, nullptr, "GetShiftAccelerometerCalibrationValue"},
|
|
||||||
{135, nullptr, "SetShiftGyroscopeCalibrationValue"},
|
|
||||||
{136, nullptr, "GetShiftGyroscopeCalibrationValue"},
|
|
||||||
{140, nullptr, "DeactivateConsoleSixAxisSensor"},
|
|
||||||
{141, nullptr, "GetConsoleSixAxisSensorSamplingFrequency"},
|
|
||||||
{142, nullptr, "DeactivateSevenSixAxisSensor"},
|
|
||||||
{143, nullptr, "GetConsoleSixAxisSensorCountStates"},
|
|
||||||
{144, nullptr, "GetAccelerometerFsr"},
|
|
||||||
{145, nullptr, "SetAccelerometerFsr"},
|
|
||||||
{146, nullptr, "GetAccelerometerOdr"},
|
|
||||||
{147, nullptr, "SetAccelerometerOdr"},
|
|
||||||
{148, nullptr, "GetGyroscopeFsr"},
|
|
||||||
{149, nullptr, "SetGyroscopeFsr"},
|
|
||||||
{150, nullptr, "GetGyroscopeOdr"},
|
|
||||||
{151, nullptr, "SetGyroscopeOdr"},
|
|
||||||
{152, nullptr, "GetWhoAmI"},
|
|
||||||
{201, nullptr, "ActivateFirmwareUpdate"},
|
|
||||||
{202, nullptr, "DeactivateFirmwareUpdate"},
|
|
||||||
{203, nullptr, "StartFirmwareUpdate"},
|
|
||||||
{204, nullptr, "GetFirmwareUpdateStage"},
|
|
||||||
{205, nullptr, "GetFirmwareVersion"},
|
|
||||||
{206, nullptr, "GetDestinationFirmwareVersion"},
|
|
||||||
{207, nullptr, "DiscardFirmwareInfoCacheForRevert"},
|
|
||||||
{208, nullptr, "StartFirmwareUpdateForRevert"},
|
|
||||||
{209, nullptr, "GetAvailableFirmwareVersionForRevert"},
|
|
||||||
{210, nullptr, "IsFirmwareUpdatingDevice"},
|
|
||||||
{211, nullptr, "StartFirmwareUpdateIndividual"},
|
|
||||||
{215, nullptr, "SetUsbFirmwareForceUpdateEnabled"},
|
|
||||||
{216, nullptr, "SetAllKuinaDevicesToFirmwareUpdateMode"},
|
|
||||||
{221, nullptr, "UpdateControllerColor"},
|
|
||||||
{222, nullptr, "ConnectUsbPadsAsync"},
|
|
||||||
{223, nullptr, "DisconnectUsbPadsAsync"},
|
|
||||||
{224, nullptr, "UpdateDesignInfo"},
|
|
||||||
{225, nullptr, "GetUniquePadDriverState"},
|
|
||||||
{226, nullptr, "GetSixAxisSensorDriverStates"},
|
|
||||||
{227, nullptr, "GetRxPacketHistory"},
|
|
||||||
{228, nullptr, "AcquireOperationEventHandle"},
|
|
||||||
{229, nullptr, "ReadSerialFlash"},
|
|
||||||
{230, nullptr, "WriteSerialFlash"},
|
|
||||||
{231, nullptr, "GetOperationResult"},
|
|
||||||
{232, nullptr, "EnableShipmentMode"},
|
|
||||||
{233, nullptr, "ClearPairingInfo"},
|
|
||||||
{234, nullptr, "GetUniquePadDeviceTypeSetInternal"},
|
|
||||||
{235, nullptr, "EnableAnalogStickPower"},
|
|
||||||
{236, nullptr, "RequestKuinaUartClockCal"},
|
|
||||||
{237, nullptr, "GetKuinaUartClockCal"},
|
|
||||||
{238, nullptr, "SetKuinaUartClockTrim"},
|
|
||||||
{239, nullptr, "KuinaLoopbackTest"},
|
|
||||||
{240, nullptr, "RequestBatteryVoltage"},
|
|
||||||
{241, nullptr, "GetBatteryVoltage"},
|
|
||||||
{242, nullptr, "GetUniquePadPowerInfo"},
|
|
||||||
{243, nullptr, "RebootUniquePad"},
|
|
||||||
{244, nullptr, "RequestKuinaFirmwareVersion"},
|
|
||||||
{245, nullptr, "GetKuinaFirmwareVersion"},
|
|
||||||
{246, nullptr, "GetVidPid"},
|
|
||||||
{247, nullptr, "GetAnalogStickCalibrationValue"},
|
|
||||||
{248, nullptr, "GetUniquePadIdsFull"},
|
|
||||||
{249, nullptr, "ConnectUniquePad"},
|
|
||||||
{250, nullptr, "IsVirtual"},
|
|
||||||
{251, nullptr, "GetAnalogStickModuleParam"},
|
|
||||||
{301, nullptr, "GetAbstractedPadHandles"},
|
|
||||||
{302, nullptr, "GetAbstractedPadState"},
|
|
||||||
{303, nullptr, "GetAbstractedPadsState"},
|
|
||||||
{321, nullptr, "SetAutoPilotVirtualPadState"},
|
|
||||||
{322, nullptr, "UnsetAutoPilotVirtualPadState"},
|
|
||||||
{323, nullptr, "UnsetAllAutoPilotVirtualPadState"},
|
|
||||||
{324, nullptr, "AttachHdlsWorkBuffer"},
|
|
||||||
{325, nullptr, "ReleaseHdlsWorkBuffer"},
|
|
||||||
{326, nullptr, "DumpHdlsNpadAssignmentState"},
|
|
||||||
{327, nullptr, "DumpHdlsStates"},
|
|
||||||
{328, nullptr, "ApplyHdlsNpadAssignmentState"},
|
|
||||||
{329, nullptr, "ApplyHdlsStateList"},
|
|
||||||
{330, nullptr, "AttachHdlsVirtualDevice"},
|
|
||||||
{331, nullptr, "DetachHdlsVirtualDevice"},
|
|
||||||
{332, nullptr, "SetHdlsState"},
|
|
||||||
{350, nullptr, "AddRegisteredDevice"},
|
|
||||||
{400, nullptr, "DisableExternalMcuOnNxDevice"},
|
|
||||||
{401, nullptr, "DisableRailDeviceFiltering"},
|
|
||||||
{402, nullptr, "EnableWiredPairing"},
|
|
||||||
{403, nullptr, "EnableShipmentModeAutoClear"},
|
|
||||||
{404, nullptr, "SetRailEnabled"},
|
|
||||||
{500, nullptr, "SetFactoryInt"},
|
|
||||||
{501, nullptr, "IsFactoryBootEnabled"},
|
|
||||||
{550, nullptr, "SetAnalogStickModelDataTemporarily"},
|
|
||||||
{551, nullptr, "GetAnalogStickModelData"},
|
|
||||||
{552, nullptr, "ResetAnalogStickModelData"},
|
|
||||||
{600, nullptr, "ConvertPadState"},
|
|
||||||
{650, nullptr, "AddButtonPlayData"},
|
|
||||||
{651, nullptr, "StartButtonPlayData"},
|
|
||||||
{652, nullptr, "StopButtonPlayData"},
|
|
||||||
{2000, nullptr, "DeactivateDigitizer"},
|
|
||||||
{2001, nullptr, "SetDigitizerAutoPilotState"},
|
|
||||||
{2002, nullptr, "UnsetDigitizerAutoPilotState"},
|
|
||||||
{2002, nullptr, "ReloadFirmwareDebugSettings"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
}
|
|
||||||
|
|
||||||
IHidDebugServer::~IHidDebugServer() = default;
|
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() {
|
|
||||||
resource_manager->Initialize();
|
|
||||||
return resource_manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Service::HID
|
|
@ -1,26 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "core/hle/service/service.h"
|
|
||||||
|
|
||||||
namespace Core {
|
|
||||||
class System;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Service::HID {
|
|
||||||
class ResourceManager;
|
|
||||||
|
|
||||||
class IHidDebugServer final : public ServiceFramework<IHidDebugServer> {
|
|
||||||
public:
|
|
||||||
explicit IHidDebugServer(Core::System& system_, std::shared_ptr<ResourceManager> resource);
|
|
||||||
~IHidDebugServer() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::shared_ptr<ResourceManager> GetResourceManager();
|
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> resource_manager;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Service::HID
|
|
File diff suppressed because it is too large
Load Diff
@ -1,146 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "core/hle/service/service.h"
|
|
||||||
|
|
||||||
namespace Core {
|
|
||||||
class System;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Service::HID {
|
|
||||||
class ResourceManager;
|
|
||||||
|
|
||||||
class IHidServer final : public ServiceFramework<IHidServer> {
|
|
||||||
public:
|
|
||||||
explicit IHidServer(Core::System& system_, std::shared_ptr<ResourceManager> resource);
|
|
||||||
~IHidServer() override;
|
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> GetResourceManager();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void CreateAppletResource(HLERequestContext& ctx);
|
|
||||||
void ActivateDebugPad(HLERequestContext& ctx);
|
|
||||||
void ActivateTouchScreen(HLERequestContext& ctx);
|
|
||||||
void ActivateMouse(HLERequestContext& ctx);
|
|
||||||
void ActivateKeyboard(HLERequestContext& ctx);
|
|
||||||
void SendKeyboardLockKeyEvent(HLERequestContext& ctx);
|
|
||||||
void AcquireXpadIdEventHandle(HLERequestContext& ctx);
|
|
||||||
void ReleaseXpadIdEventHandle(HLERequestContext& ctx);
|
|
||||||
void ActivateXpad(HLERequestContext& ctx);
|
|
||||||
void GetXpadIds(HLERequestContext& ctx);
|
|
||||||
void ActivateJoyXpad(HLERequestContext& ctx);
|
|
||||||
void GetJoyXpadLifoHandle(HLERequestContext& ctx);
|
|
||||||
void GetJoyXpadIds(HLERequestContext& ctx);
|
|
||||||
void ActivateSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void DeactivateSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void GetSixAxisSensorLifoHandle(HLERequestContext& ctx);
|
|
||||||
void ActivateJoySixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void DeactivateJoySixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void GetJoySixAxisSensorLifoHandle(HLERequestContext& ctx);
|
|
||||||
void StartSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void StopSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void IsSixAxisSensorFusionEnabled(HLERequestContext& ctx);
|
|
||||||
void EnableSixAxisSensorFusion(HLERequestContext& ctx);
|
|
||||||
void SetSixAxisSensorFusionParameters(HLERequestContext& ctx);
|
|
||||||
void GetSixAxisSensorFusionParameters(HLERequestContext& ctx);
|
|
||||||
void ResetSixAxisSensorFusionParameters(HLERequestContext& ctx);
|
|
||||||
void SetGyroscopeZeroDriftMode(HLERequestContext& ctx);
|
|
||||||
void GetGyroscopeZeroDriftMode(HLERequestContext& ctx);
|
|
||||||
void ResetGyroscopeZeroDriftMode(HLERequestContext& ctx);
|
|
||||||
void IsSixAxisSensorAtRest(HLERequestContext& ctx);
|
|
||||||
void IsFirmwareUpdateAvailableForSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void EnableSixAxisSensorUnalteredPassthrough(HLERequestContext& ctx);
|
|
||||||
void IsSixAxisSensorUnalteredPassthroughEnabled(HLERequestContext& ctx);
|
|
||||||
void LoadSixAxisSensorCalibrationParameter(HLERequestContext& ctx);
|
|
||||||
void GetSixAxisSensorIcInformation(HLERequestContext& ctx);
|
|
||||||
void ResetIsSixAxisSensorDeviceNewlyAssigned(HLERequestContext& ctx);
|
|
||||||
void ActivateGesture(HLERequestContext& ctx);
|
|
||||||
void SetSupportedNpadStyleSet(HLERequestContext& ctx);
|
|
||||||
void GetSupportedNpadStyleSet(HLERequestContext& ctx);
|
|
||||||
void SetSupportedNpadIdType(HLERequestContext& ctx);
|
|
||||||
void ActivateNpad(HLERequestContext& ctx);
|
|
||||||
void DeactivateNpad(HLERequestContext& ctx);
|
|
||||||
void AcquireNpadStyleSetUpdateEventHandle(HLERequestContext& ctx);
|
|
||||||
void DisconnectNpad(HLERequestContext& ctx);
|
|
||||||
void GetPlayerLedPattern(HLERequestContext& ctx);
|
|
||||||
void ActivateNpadWithRevision(HLERequestContext& ctx);
|
|
||||||
void SetNpadJoyHoldType(HLERequestContext& ctx);
|
|
||||||
void GetNpadJoyHoldType(HLERequestContext& ctx);
|
|
||||||
void SetNpadJoyAssignmentModeSingleByDefault(HLERequestContext& ctx);
|
|
||||||
void SetNpadJoyAssignmentModeSingle(HLERequestContext& ctx);
|
|
||||||
void SetNpadJoyAssignmentModeDual(HLERequestContext& ctx);
|
|
||||||
void MergeSingleJoyAsDualJoy(HLERequestContext& ctx);
|
|
||||||
void StartLrAssignmentMode(HLERequestContext& ctx);
|
|
||||||
void StopLrAssignmentMode(HLERequestContext& ctx);
|
|
||||||
void SetNpadHandheldActivationMode(HLERequestContext& ctx);
|
|
||||||
void GetNpadHandheldActivationMode(HLERequestContext& ctx);
|
|
||||||
void SwapNpadAssignment(HLERequestContext& ctx);
|
|
||||||
void IsUnintendedHomeButtonInputProtectionEnabled(HLERequestContext& ctx);
|
|
||||||
void EnableUnintendedHomeButtonInputProtection(HLERequestContext& ctx);
|
|
||||||
void SetNpadJoyAssignmentModeSingleWithDestination(HLERequestContext& ctx);
|
|
||||||
void SetNpadAnalogStickUseCenterClamp(HLERequestContext& ctx);
|
|
||||||
void SetNpadCaptureButtonAssignment(HLERequestContext& ctx);
|
|
||||||
void ClearNpadCaptureButtonAssignment(HLERequestContext& ctx);
|
|
||||||
void GetVibrationDeviceInfo(HLERequestContext& ctx);
|
|
||||||
void SendVibrationValue(HLERequestContext& ctx);
|
|
||||||
void GetActualVibrationValue(HLERequestContext& ctx);
|
|
||||||
void CreateActiveVibrationDeviceList(HLERequestContext& ctx);
|
|
||||||
void PermitVibration(HLERequestContext& ctx);
|
|
||||||
void IsVibrationPermitted(HLERequestContext& ctx);
|
|
||||||
void SendVibrationValues(HLERequestContext& ctx);
|
|
||||||
void SendVibrationGcErmCommand(HLERequestContext& ctx);
|
|
||||||
void GetActualVibrationGcErmCommand(HLERequestContext& ctx);
|
|
||||||
void BeginPermitVibrationSession(HLERequestContext& ctx);
|
|
||||||
void EndPermitVibrationSession(HLERequestContext& ctx);
|
|
||||||
void IsVibrationDeviceMounted(HLERequestContext& ctx);
|
|
||||||
void ActivateConsoleSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void StartConsoleSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void StopConsoleSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void ActivateSevenSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void StartSevenSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void StopSevenSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void InitializeSevenSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void FinalizeSevenSixAxisSensor(HLERequestContext& ctx);
|
|
||||||
void ResetSevenSixAxisSensorTimestamp(HLERequestContext& ctx);
|
|
||||||
void IsUsbFullKeyControllerEnabled(HLERequestContext& ctx);
|
|
||||||
void GetPalmaConnectionHandle(HLERequestContext& ctx);
|
|
||||||
void InitializePalma(HLERequestContext& ctx);
|
|
||||||
void AcquirePalmaOperationCompleteEvent(HLERequestContext& ctx);
|
|
||||||
void GetPalmaOperationInfo(HLERequestContext& ctx);
|
|
||||||
void PlayPalmaActivity(HLERequestContext& ctx);
|
|
||||||
void SetPalmaFrModeType(HLERequestContext& ctx);
|
|
||||||
void ReadPalmaStep(HLERequestContext& ctx);
|
|
||||||
void EnablePalmaStep(HLERequestContext& ctx);
|
|
||||||
void ResetPalmaStep(HLERequestContext& ctx);
|
|
||||||
void ReadPalmaApplicationSection(HLERequestContext& ctx);
|
|
||||||
void WritePalmaApplicationSection(HLERequestContext& ctx);
|
|
||||||
void ReadPalmaUniqueCode(HLERequestContext& ctx);
|
|
||||||
void SetPalmaUniqueCodeInvalid(HLERequestContext& ctx);
|
|
||||||
void WritePalmaActivityEntry(HLERequestContext& ctx);
|
|
||||||
void WritePalmaRgbLedPatternEntry(HLERequestContext& ctx);
|
|
||||||
void WritePalmaWaveEntry(HLERequestContext& ctx);
|
|
||||||
void SetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx);
|
|
||||||
void GetPalmaDataBaseIdentificationVersion(HLERequestContext& ctx);
|
|
||||||
void SuspendPalmaFeature(HLERequestContext& ctx);
|
|
||||||
void GetPalmaOperationResult(HLERequestContext& ctx);
|
|
||||||
void ReadPalmaPlayLog(HLERequestContext& ctx);
|
|
||||||
void ResetPalmaPlayLog(HLERequestContext& ctx);
|
|
||||||
void SetIsPalmaAllConnectable(HLERequestContext& ctx);
|
|
||||||
void SetIsPalmaPairedConnectable(HLERequestContext& ctx);
|
|
||||||
void PairPalma(HLERequestContext& ctx);
|
|
||||||
void SetPalmaBoostMode(HLERequestContext& ctx);
|
|
||||||
void CancelWritePalmaWaveEntry(HLERequestContext& ctx);
|
|
||||||
void EnablePalmaBoostMode(HLERequestContext& ctx);
|
|
||||||
void GetPalmaBluetoothAddress(HLERequestContext& ctx);
|
|
||||||
void SetDisallowedPalmaConnection(HLERequestContext& ctx);
|
|
||||||
void SetNpadCommunicationMode(HLERequestContext& ctx);
|
|
||||||
void GetNpadCommunicationMode(HLERequestContext& ctx);
|
|
||||||
void SetTouchScreenConfiguration(HLERequestContext& ctx);
|
|
||||||
void IsFirmwareUpdateNeededForNotification(HLERequestContext& ctx);
|
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> resource_manager;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Service::HID
|
|
@ -1,304 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include "core/hid/hid_core.h"
|
|
||||||
#include "core/hle/service/hid/controllers/npad.h"
|
|
||||||
#include "core/hle/service/hid/controllers/touchscreen.h"
|
|
||||||
#include "core/hle/service/hid/errors.h"
|
|
||||||
#include "core/hle/service/hid/hid_system_server.h"
|
|
||||||
#include "core/hle/service/hid/resource_manager.h"
|
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
|
||||||
|
|
||||||
namespace Service::HID {
|
|
||||||
|
|
||||||
IHidSystemServer::IHidSystemServer(Core::System& system_, std::shared_ptr<ResourceManager> resource)
|
|
||||||
: ServiceFramework{system_, "hid:sys"}, service_context{system_, service_name},
|
|
||||||
resource_manager{resource} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{31, nullptr, "SendKeyboardLockKeyEvent"},
|
|
||||||
{101, nullptr, "AcquireHomeButtonEventHandle"},
|
|
||||||
{111, nullptr, "ActivateHomeButton"},
|
|
||||||
{121, nullptr, "AcquireSleepButtonEventHandle"},
|
|
||||||
{131, nullptr, "ActivateSleepButton"},
|
|
||||||
{141, nullptr, "AcquireCaptureButtonEventHandle"},
|
|
||||||
{151, nullptr, "ActivateCaptureButton"},
|
|
||||||
{161, nullptr, "GetPlatformConfig"},
|
|
||||||
{210, nullptr, "AcquireNfcDeviceUpdateEventHandle"},
|
|
||||||
{211, nullptr, "GetNpadsWithNfc"},
|
|
||||||
{212, nullptr, "AcquireNfcActivateEventHandle"},
|
|
||||||
{213, nullptr, "ActivateNfc"},
|
|
||||||
{214, nullptr, "GetXcdHandleForNpadWithNfc"},
|
|
||||||
{215, nullptr, "IsNfcActivated"},
|
|
||||||
{230, nullptr, "AcquireIrSensorEventHandle"},
|
|
||||||
{231, nullptr, "ActivateIrSensor"},
|
|
||||||
{232, nullptr, "GetIrSensorState"},
|
|
||||||
{233, nullptr, "GetXcdHandleForNpadWithIrSensor"},
|
|
||||||
{301, nullptr, "ActivateNpadSystem"},
|
|
||||||
{303, &IHidSystemServer::ApplyNpadSystemCommonPolicy, "ApplyNpadSystemCommonPolicy"},
|
|
||||||
{304, nullptr, "EnableAssigningSingleOnSlSrPress"},
|
|
||||||
{305, nullptr, "DisableAssigningSingleOnSlSrPress"},
|
|
||||||
{306, &IHidSystemServer::GetLastActiveNpad, "GetLastActiveNpad"},
|
|
||||||
{307, nullptr, "GetNpadSystemExtStyle"},
|
|
||||||
{308, nullptr, "ApplyNpadSystemCommonPolicyFull"},
|
|
||||||
{309, nullptr, "GetNpadFullKeyGripColor"},
|
|
||||||
{310, nullptr, "GetMaskedSupportedNpadStyleSet"},
|
|
||||||
{311, nullptr, "SetNpadPlayerLedBlinkingDevice"},
|
|
||||||
{312, nullptr, "SetSupportedNpadStyleSetAll"},
|
|
||||||
{313, nullptr, "GetNpadCaptureButtonAssignment"},
|
|
||||||
{314, nullptr, "GetAppletFooterUiType"},
|
|
||||||
{315, nullptr, "GetAppletDetailedUiType"},
|
|
||||||
{316, nullptr, "GetNpadInterfaceType"},
|
|
||||||
{317, nullptr, "GetNpadLeftRightInterfaceType"},
|
|
||||||
{318, nullptr, "HasBattery"},
|
|
||||||
{319, nullptr, "HasLeftRightBattery"},
|
|
||||||
{321, &IHidSystemServer::GetUniquePadsFromNpad, "GetUniquePadsFromNpad"},
|
|
||||||
{322, nullptr, "GetIrSensorState"},
|
|
||||||
{323, nullptr, "GetXcdHandleForNpadWithIrSensor"},
|
|
||||||
{324, nullptr, "GetUniquePadButtonSet"},
|
|
||||||
{325, nullptr, "GetUniquePadColor"},
|
|
||||||
{326, nullptr, "GetUniquePadAppletDetailedUiType"},
|
|
||||||
{327, nullptr, "GetAbstractedPadIdDataFromNpad"},
|
|
||||||
{328, nullptr, "AttachAbstractedPadToNpad"},
|
|
||||||
{329, nullptr, "DetachAbstractedPadAll"},
|
|
||||||
{330, nullptr, "CheckAbstractedPadConnection"},
|
|
||||||
{500, nullptr, "SetAppletResourceUserId"},
|
|
||||||
{501, nullptr, "RegisterAppletResourceUserId"},
|
|
||||||
{502, nullptr, "UnregisterAppletResourceUserId"},
|
|
||||||
{503, nullptr, "EnableAppletToGetInput"},
|
|
||||||
{504, nullptr, "SetAruidValidForVibration"},
|
|
||||||
{505, nullptr, "EnableAppletToGetSixAxisSensor"},
|
|
||||||
{506, nullptr, "EnableAppletToGetPadInput"},
|
|
||||||
{507, nullptr, "EnableAppletToGetTouchScreen"},
|
|
||||||
{510, nullptr, "SetVibrationMasterVolume"},
|
|
||||||
{511, nullptr, "GetVibrationMasterVolume"},
|
|
||||||
{512, nullptr, "BeginPermitVibrationSession"},
|
|
||||||
{513, nullptr, "EndPermitVibrationSession"},
|
|
||||||
{514, nullptr, "Unknown514"},
|
|
||||||
{520, nullptr, "EnableHandheldHids"},
|
|
||||||
{521, nullptr, "DisableHandheldHids"},
|
|
||||||
{522, nullptr, "SetJoyConRailEnabled"},
|
|
||||||
{523, nullptr, "IsJoyConRailEnabled"},
|
|
||||||
{524, nullptr, "IsHandheldHidsEnabled"},
|
|
||||||
{525, nullptr, "IsJoyConAttachedOnAllRail"},
|
|
||||||
{540, nullptr, "AcquirePlayReportControllerUsageUpdateEvent"},
|
|
||||||
{541, nullptr, "GetPlayReportControllerUsages"},
|
|
||||||
{542, nullptr, "AcquirePlayReportRegisteredDeviceUpdateEvent"},
|
|
||||||
{543, nullptr, "GetRegisteredDevicesOld"},
|
|
||||||
{544, nullptr, "AcquireConnectionTriggerTimeoutEvent"},
|
|
||||||
{545, nullptr, "SendConnectionTrigger"},
|
|
||||||
{546, nullptr, "AcquireDeviceRegisteredEventForControllerSupport"},
|
|
||||||
{547, nullptr, "GetAllowedBluetoothLinksCount"},
|
|
||||||
{548, nullptr, "GetRegisteredDevices"},
|
|
||||||
{549, nullptr, "GetConnectableRegisteredDevices"},
|
|
||||||
{700, nullptr, "ActivateUniquePad"},
|
|
||||||
{702, nullptr, "AcquireUniquePadConnectionEventHandle"},
|
|
||||||
{703, nullptr, "GetUniquePadIds"},
|
|
||||||
{751, &IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle, "AcquireJoyDetachOnBluetoothOffEventHandle"},
|
|
||||||
{800, nullptr, "ListSixAxisSensorHandles"},
|
|
||||||
{801, nullptr, "IsSixAxisSensorUserCalibrationSupported"},
|
|
||||||
{802, nullptr, "ResetSixAxisSensorCalibrationValues"},
|
|
||||||
{803, nullptr, "StartSixAxisSensorUserCalibration"},
|
|
||||||
{804, nullptr, "CancelSixAxisSensorUserCalibration"},
|
|
||||||
{805, nullptr, "GetUniquePadBluetoothAddress"},
|
|
||||||
{806, nullptr, "DisconnectUniquePad"},
|
|
||||||
{807, nullptr, "GetUniquePadType"},
|
|
||||||
{808, nullptr, "GetUniquePadInterface"},
|
|
||||||
{809, nullptr, "GetUniquePadSerialNumber"},
|
|
||||||
{810, nullptr, "GetUniquePadControllerNumber"},
|
|
||||||
{811, nullptr, "GetSixAxisSensorUserCalibrationStage"},
|
|
||||||
{812, nullptr, "GetConsoleUniqueSixAxisSensorHandle"},
|
|
||||||
{821, nullptr, "StartAnalogStickManualCalibration"},
|
|
||||||
{822, nullptr, "RetryCurrentAnalogStickManualCalibrationStage"},
|
|
||||||
{823, nullptr, "CancelAnalogStickManualCalibration"},
|
|
||||||
{824, nullptr, "ResetAnalogStickManualCalibration"},
|
|
||||||
{825, nullptr, "GetAnalogStickState"},
|
|
||||||
{826, nullptr, "GetAnalogStickManualCalibrationStage"},
|
|
||||||
{827, nullptr, "IsAnalogStickButtonPressed"},
|
|
||||||
{828, nullptr, "IsAnalogStickInReleasePosition"},
|
|
||||||
{829, nullptr, "IsAnalogStickInCircumference"},
|
|
||||||
{830, nullptr, "SetNotificationLedPattern"},
|
|
||||||
{831, nullptr, "SetNotificationLedPatternWithTimeout"},
|
|
||||||
{832, nullptr, "PrepareHidsForNotificationWake"},
|
|
||||||
{850, &IHidSystemServer::IsUsbFullKeyControllerEnabled, "IsUsbFullKeyControllerEnabled"},
|
|
||||||
{851, nullptr, "EnableUsbFullKeyController"},
|
|
||||||
{852, nullptr, "IsUsbConnected"},
|
|
||||||
{870, nullptr, "IsHandheldButtonPressedOnConsoleMode"},
|
|
||||||
{900, nullptr, "ActivateInputDetector"},
|
|
||||||
{901, nullptr, "NotifyInputDetector"},
|
|
||||||
{1000, nullptr, "InitializeFirmwareUpdate"},
|
|
||||||
{1001, nullptr, "GetFirmwareVersion"},
|
|
||||||
{1002, nullptr, "GetAvailableFirmwareVersion"},
|
|
||||||
{1003, nullptr, "IsFirmwareUpdateAvailable"},
|
|
||||||
{1004, nullptr, "CheckFirmwareUpdateRequired"},
|
|
||||||
{1005, nullptr, "StartFirmwareUpdate"},
|
|
||||||
{1006, nullptr, "AbortFirmwareUpdate"},
|
|
||||||
{1007, nullptr, "GetFirmwareUpdateState"},
|
|
||||||
{1008, nullptr, "ActivateAudioControl"},
|
|
||||||
{1009, nullptr, "AcquireAudioControlEventHandle"},
|
|
||||||
{1010, nullptr, "GetAudioControlStates"},
|
|
||||||
{1011, nullptr, "DeactivateAudioControl"},
|
|
||||||
{1050, nullptr, "IsSixAxisSensorAccurateUserCalibrationSupported"},
|
|
||||||
{1051, nullptr, "StartSixAxisSensorAccurateUserCalibration"},
|
|
||||||
{1052, nullptr, "CancelSixAxisSensorAccurateUserCalibration"},
|
|
||||||
{1053, nullptr, "GetSixAxisSensorAccurateUserCalibrationState"},
|
|
||||||
{1100, nullptr, "GetHidbusSystemServiceObject"},
|
|
||||||
{1120, nullptr, "SetFirmwareHotfixUpdateSkipEnabled"},
|
|
||||||
{1130, nullptr, "InitializeUsbFirmwareUpdate"},
|
|
||||||
{1131, nullptr, "FinalizeUsbFirmwareUpdate"},
|
|
||||||
{1132, nullptr, "CheckUsbFirmwareUpdateRequired"},
|
|
||||||
{1133, nullptr, "StartUsbFirmwareUpdate"},
|
|
||||||
{1134, nullptr, "GetUsbFirmwareUpdateState"},
|
|
||||||
{1150, nullptr, "SetTouchScreenMagnification"},
|
|
||||||
{1151, nullptr, "GetTouchScreenFirmwareVersion"},
|
|
||||||
{1152, nullptr, "SetTouchScreenDefaultConfiguration"},
|
|
||||||
{1153, &IHidSystemServer::GetTouchScreenDefaultConfiguration, "GetTouchScreenDefaultConfiguration"},
|
|
||||||
{1154, nullptr, "IsFirmwareAvailableForNotification"},
|
|
||||||
{1155, nullptr, "SetForceHandheldStyleVibration"},
|
|
||||||
{1156, nullptr, "SendConnectionTriggerWithoutTimeoutEvent"},
|
|
||||||
{1157, nullptr, "CancelConnectionTrigger"},
|
|
||||||
{1200, nullptr, "IsButtonConfigSupported"},
|
|
||||||
{1201, nullptr, "IsButtonConfigEmbeddedSupported"},
|
|
||||||
{1202, nullptr, "DeleteButtonConfig"},
|
|
||||||
{1203, nullptr, "DeleteButtonConfigEmbedded"},
|
|
||||||
{1204, nullptr, "SetButtonConfigEnabled"},
|
|
||||||
{1205, nullptr, "SetButtonConfigEmbeddedEnabled"},
|
|
||||||
{1206, nullptr, "IsButtonConfigEnabled"},
|
|
||||||
{1207, nullptr, "IsButtonConfigEmbeddedEnabled"},
|
|
||||||
{1208, nullptr, "SetButtonConfigEmbedded"},
|
|
||||||
{1209, nullptr, "SetButtonConfigFull"},
|
|
||||||
{1210, nullptr, "SetButtonConfigLeft"},
|
|
||||||
{1211, nullptr, "SetButtonConfigRight"},
|
|
||||||
{1212, nullptr, "GetButtonConfigEmbedded"},
|
|
||||||
{1213, nullptr, "GetButtonConfigFull"},
|
|
||||||
{1214, nullptr, "GetButtonConfigLeft"},
|
|
||||||
{1215, nullptr, "GetButtonConfigRight"},
|
|
||||||
{1250, nullptr, "IsCustomButtonConfigSupported"},
|
|
||||||
{1251, nullptr, "IsDefaultButtonConfigEmbedded"},
|
|
||||||
{1252, nullptr, "IsDefaultButtonConfigFull"},
|
|
||||||
{1253, nullptr, "IsDefaultButtonConfigLeft"},
|
|
||||||
{1254, nullptr, "IsDefaultButtonConfigRight"},
|
|
||||||
{1255, nullptr, "IsButtonConfigStorageEmbeddedEmpty"},
|
|
||||||
{1256, nullptr, "IsButtonConfigStorageFullEmpty"},
|
|
||||||
{1257, nullptr, "IsButtonConfigStorageLeftEmpty"},
|
|
||||||
{1258, nullptr, "IsButtonConfigStorageRightEmpty"},
|
|
||||||
{1259, nullptr, "GetButtonConfigStorageEmbeddedDeprecated"},
|
|
||||||
{1260, nullptr, "GetButtonConfigStorageFullDeprecated"},
|
|
||||||
{1261, nullptr, "GetButtonConfigStorageLeftDeprecated"},
|
|
||||||
{1262, nullptr, "GetButtonConfigStorageRightDeprecated"},
|
|
||||||
{1263, nullptr, "SetButtonConfigStorageEmbeddedDeprecated"},
|
|
||||||
{1264, nullptr, "SetButtonConfigStorageFullDeprecated"},
|
|
||||||
{1265, nullptr, "SetButtonConfigStorageLeftDeprecated"},
|
|
||||||
{1266, nullptr, "SetButtonConfigStorageRightDeprecated"},
|
|
||||||
{1267, nullptr, "DeleteButtonConfigStorageEmbedded"},
|
|
||||||
{1268, nullptr, "DeleteButtonConfigStorageFull"},
|
|
||||||
{1269, nullptr, "DeleteButtonConfigStorageLeft"},
|
|
||||||
{1270, nullptr, "DeleteButtonConfigStorageRight"},
|
|
||||||
{1271, nullptr, "IsUsingCustomButtonConfig"},
|
|
||||||
{1272, nullptr, "IsAnyCustomButtonConfigEnabled"},
|
|
||||||
{1273, nullptr, "SetAllCustomButtonConfigEnabled"},
|
|
||||||
{1274, nullptr, "SetDefaultButtonConfig"},
|
|
||||||
{1275, nullptr, "SetAllDefaultButtonConfig"},
|
|
||||||
{1276, nullptr, "SetHidButtonConfigEmbedded"},
|
|
||||||
{1277, nullptr, "SetHidButtonConfigFull"},
|
|
||||||
{1278, nullptr, "SetHidButtonConfigLeft"},
|
|
||||||
{1279, nullptr, "SetHidButtonConfigRight"},
|
|
||||||
{1280, nullptr, "GetHidButtonConfigEmbedded"},
|
|
||||||
{1281, nullptr, "GetHidButtonConfigFull"},
|
|
||||||
{1282, nullptr, "GetHidButtonConfigLeft"},
|
|
||||||
{1283, nullptr, "GetHidButtonConfigRight"},
|
|
||||||
{1284, nullptr, "GetButtonConfigStorageEmbedded"},
|
|
||||||
{1285, nullptr, "GetButtonConfigStorageFull"},
|
|
||||||
{1286, nullptr, "GetButtonConfigStorageLeft"},
|
|
||||||
{1287, nullptr, "GetButtonConfigStorageRight"},
|
|
||||||
{1288, nullptr, "SetButtonConfigStorageEmbedded"},
|
|
||||||
{1289, nullptr, "SetButtonConfigStorageFull"},
|
|
||||||
{1290, nullptr, "DeleteButtonConfigStorageRight"},
|
|
||||||
{1291, nullptr, "DeleteButtonConfigStorageRight"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
|
|
||||||
joy_detach_event = service_context.CreateEvent("HidSys::JoyDetachEvent");
|
|
||||||
}
|
|
||||||
|
|
||||||
IHidSystemServer::~IHidSystemServer() {
|
|
||||||
service_context.CloseEvent(joy_detach_event);
|
|
||||||
};
|
|
||||||
|
|
||||||
void IHidSystemServer::ApplyNpadSystemCommonPolicy(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_HID, "called");
|
|
||||||
|
|
||||||
GetResourceManager()
|
|
||||||
->GetController<Controller_NPad>(HidController::NPad)
|
|
||||||
.ApplyNpadSystemCommonPolicy();
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IHidSystemServer::GetLastActiveNpad(HLERequestContext& ctx) {
|
|
||||||
LOG_DEBUG(Service_HID, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushEnum(system.HIDCore().GetLastActiveController());
|
|
||||||
}
|
|
||||||
|
|
||||||
void IHidSystemServer::GetUniquePadsFromNpad(HLERequestContext& ctx) {
|
|
||||||
IPC::RequestParser rp{ctx};
|
|
||||||
const auto npad_id_type{rp.PopEnum<Core::HID::NpadIdType>()};
|
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, npad_id_type={}", npad_id_type);
|
|
||||||
|
|
||||||
const std::vector<Core::HID::UniquePadId> unique_pads{};
|
|
||||||
|
|
||||||
ctx.WriteBuffer(unique_pads);
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(static_cast<u32>(unique_pads.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void IHidSystemServer::AcquireJoyDetachOnBluetoothOffEventHandle(HLERequestContext& ctx) {
|
|
||||||
LOG_INFO(Service_AM, "called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushCopyObjects(joy_detach_event->GetReadableEvent());
|
|
||||||
}
|
|
||||||
|
|
||||||
void IHidSystemServer::IsUsbFullKeyControllerEnabled(HLERequestContext& ctx) {
|
|
||||||
const bool is_enabled = false;
|
|
||||||
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called, is_enabled={}", is_enabled);
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(is_enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IHidSystemServer::GetTouchScreenDefaultConfiguration(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_HID, "(STUBBED) called");
|
|
||||||
|
|
||||||
Core::HID::TouchScreenConfigurationForNx touchscreen_config{
|
|
||||||
.mode = Core::HID::TouchScreenModeForNx::Finger,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Heat2 &&
|
|
||||||
touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Finger) {
|
|
||||||
touchscreen_config.mode = Core::HID::TouchScreenModeForNx::UseSystemSetting;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 6};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushRaw(touchscreen_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> IHidSystemServer::GetResourceManager() {
|
|
||||||
resource_manager->Initialize();
|
|
||||||
return resource_manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Service::HID
|
|
@ -1,40 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "core/hle/service/kernel_helpers.h"
|
|
||||||
#include "core/hle/service/service.h"
|
|
||||||
|
|
||||||
namespace Core {
|
|
||||||
class System;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Kernel {
|
|
||||||
class KEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Service::HID {
|
|
||||||
class ResourceManager;
|
|
||||||
|
|
||||||
class IHidSystemServer final : public ServiceFramework<IHidSystemServer> {
|
|
||||||
public:
|
|
||||||
explicit IHidSystemServer(Core::System& system_, std::shared_ptr<ResourceManager> resource);
|
|
||||||
~IHidSystemServer() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void ApplyNpadSystemCommonPolicy(HLERequestContext& ctx);
|
|
||||||
void GetLastActiveNpad(HLERequestContext& ctx);
|
|
||||||
void GetUniquePadsFromNpad(HLERequestContext& ctx);
|
|
||||||
void AcquireJoyDetachOnBluetoothOffEventHandle(HLERequestContext& ctx);
|
|
||||||
void IsUsbFullKeyControllerEnabled(HLERequestContext& ctx);
|
|
||||||
void GetTouchScreenDefaultConfiguration(HLERequestContext& ctx);
|
|
||||||
|
|
||||||
std::shared_ptr<ResourceManager> GetResourceManager();
|
|
||||||
|
|
||||||
Kernel::KEvent* joy_detach_event;
|
|
||||||
KernelHelpers::ServiceContext service_context;
|
|
||||||
std::shared_ptr<ResourceManager> resource_manager;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Service::HID
|
|
@ -3,12 +3,15 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "core/core.h"
|
|
||||||
#include "core/hid/hid_types.h"
|
#include "core/hid/hid_types.h"
|
||||||
#include "core/hid/irs_types.h"
|
#include "core/hid/irs_types.h"
|
||||||
#include "core/hle/service/hid/irsensor/processor_base.h"
|
#include "core/hle/service/hid/irsensor/processor_base.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Core::HID {
|
namespace Core::HID {
|
||||||
class EmulatedController;
|
class EmulatedController;
|
||||||
} // namespace Core::HID
|
} // namespace Core::HID
|
||||||
|
@ -1,192 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
|
||||||
#include "core/core.h"
|
|
||||||
#include "core/core_timing.h"
|
|
||||||
#include "core/hid/hid_core.h"
|
|
||||||
#include "core/hle/kernel/k_shared_memory.h"
|
|
||||||
#include "core/hle/service/hid/resource_manager.h"
|
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
|
||||||
|
|
||||||
#include "core/hle/service/hid/controllers/console_sixaxis.h"
|
|
||||||
#include "core/hle/service/hid/controllers/controller_base.h"
|
|
||||||
#include "core/hle/service/hid/controllers/debug_pad.h"
|
|
||||||
#include "core/hle/service/hid/controllers/gesture.h"
|
|
||||||
#include "core/hle/service/hid/controllers/keyboard.h"
|
|
||||||
#include "core/hle/service/hid/controllers/mouse.h"
|
|
||||||
#include "core/hle/service/hid/controllers/npad.h"
|
|
||||||
#include "core/hle/service/hid/controllers/palma.h"
|
|
||||||
#include "core/hle/service/hid/controllers/stubbed.h"
|
|
||||||
#include "core/hle/service/hid/controllers/touchscreen.h"
|
|
||||||
#include "core/hle/service/hid/controllers/xpad.h"
|
|
||||||
|
|
||||||
namespace Service::HID {
|
|
||||||
|
|
||||||
// Updating period for each HID device.
|
|
||||||
// Period time is obtained by measuring the number of samples in a second on HW using a homebrew
|
|
||||||
// Correct npad_update_ns is 4ms this is overclocked to lower input lag
|
|
||||||
constexpr auto npad_update_ns = std::chrono::nanoseconds{1 * 1000 * 1000}; // (1ms, 1000Hz)
|
|
||||||
constexpr auto default_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 1000Hz)
|
|
||||||
constexpr auto mouse_keyboard_update_ns = std::chrono::nanoseconds{8 * 1000 * 1000}; // (8ms, 125Hz)
|
|
||||||
constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz)
|
|
||||||
|
|
||||||
ResourceManager::ResourceManager(Core::System& system_)
|
|
||||||
: system{system_}, service_context{system_, "hid"} {}
|
|
||||||
|
|
||||||
ResourceManager::~ResourceManager() = default;
|
|
||||||
|
|
||||||
void ResourceManager::Initialize() {
|
|
||||||
if (is_initialized) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u8* shared_memory = system.Kernel().GetHidSharedMem().GetPointer();
|
|
||||||
MakeController<Controller_DebugPad>(HidController::DebugPad, shared_memory);
|
|
||||||
MakeController<Controller_Touchscreen>(HidController::Touchscreen, shared_memory);
|
|
||||||
MakeController<Controller_Mouse>(HidController::Mouse, shared_memory);
|
|
||||||
MakeController<Controller_Keyboard>(HidController::Keyboard, shared_memory);
|
|
||||||
MakeController<Controller_XPad>(HidController::XPad, shared_memory);
|
|
||||||
MakeController<Controller_Stubbed>(HidController::HomeButton, shared_memory);
|
|
||||||
MakeController<Controller_Stubbed>(HidController::SleepButton, shared_memory);
|
|
||||||
MakeController<Controller_Stubbed>(HidController::CaptureButton, shared_memory);
|
|
||||||
MakeController<Controller_Stubbed>(HidController::InputDetector, shared_memory);
|
|
||||||
MakeController<Controller_Stubbed>(HidController::UniquePad, shared_memory);
|
|
||||||
MakeControllerWithServiceContext<Controller_NPad>(HidController::NPad, shared_memory);
|
|
||||||
MakeController<Controller_Gesture>(HidController::Gesture, shared_memory);
|
|
||||||
MakeController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor, shared_memory);
|
|
||||||
MakeController<Controller_Stubbed>(HidController::DebugMouse, shared_memory);
|
|
||||||
MakeControllerWithServiceContext<Controller_Palma>(HidController::Palma, shared_memory);
|
|
||||||
|
|
||||||
// Homebrew doesn't try to activate some controllers, so we activate them by default
|
|
||||||
GetController<Controller_NPad>(HidController::NPad).ActivateController();
|
|
||||||
GetController<Controller_Touchscreen>(HidController::Touchscreen).ActivateController();
|
|
||||||
|
|
||||||
GetController<Controller_Stubbed>(HidController::HomeButton).SetCommonHeaderOffset(0x4C00);
|
|
||||||
GetController<Controller_Stubbed>(HidController::SleepButton).SetCommonHeaderOffset(0x4E00);
|
|
||||||
GetController<Controller_Stubbed>(HidController::CaptureButton).SetCommonHeaderOffset(0x5000);
|
|
||||||
GetController<Controller_Stubbed>(HidController::InputDetector).SetCommonHeaderOffset(0x5200);
|
|
||||||
GetController<Controller_Stubbed>(HidController::UniquePad).SetCommonHeaderOffset(0x5A00);
|
|
||||||
GetController<Controller_Stubbed>(HidController::DebugMouse).SetCommonHeaderOffset(0x3DC00);
|
|
||||||
|
|
||||||
system.HIDCore().ReloadInputDevices();
|
|
||||||
is_initialized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::ActivateController(HidController controller) {
|
|
||||||
controllers[static_cast<size_t>(controller)]->ActivateController();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::DeactivateController(HidController controller) {
|
|
||||||
controllers[static_cast<size_t>(controller)]->DeactivateController();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::UpdateControllers(std::uintptr_t user_data,
|
|
||||||
std::chrono::nanoseconds ns_late) {
|
|
||||||
auto& core_timing = system.CoreTiming();
|
|
||||||
|
|
||||||
for (const auto& controller : controllers) {
|
|
||||||
// Keyboard has it's own update event
|
|
||||||
if (controller == controllers[static_cast<size_t>(HidController::Keyboard)]) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Mouse has it's own update event
|
|
||||||
if (controller == controllers[static_cast<size_t>(HidController::Mouse)]) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Npad has it's own update event
|
|
||||||
if (controller == controllers[static_cast<size_t>(HidController::NPad)]) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
controller->OnUpdate(core_timing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) {
|
|
||||||
auto& core_timing = system.CoreTiming();
|
|
||||||
|
|
||||||
controllers[static_cast<size_t>(HidController::NPad)]->OnUpdate(core_timing);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::UpdateMouseKeyboard(std::uintptr_t user_data,
|
|
||||||
std::chrono::nanoseconds ns_late) {
|
|
||||||
auto& core_timing = system.CoreTiming();
|
|
||||||
|
|
||||||
controllers[static_cast<size_t>(HidController::Mouse)]->OnUpdate(core_timing);
|
|
||||||
controllers[static_cast<size_t>(HidController::Keyboard)]->OnUpdate(core_timing);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResourceManager::UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late) {
|
|
||||||
auto& core_timing = system.CoreTiming();
|
|
||||||
|
|
||||||
controllers[static_cast<size_t>(HidController::NPad)]->OnMotionUpdate(core_timing);
|
|
||||||
}
|
|
||||||
|
|
||||||
IAppletResource::IAppletResource(Core::System& system_, std::shared_ptr<ResourceManager> resource)
|
|
||||||
: ServiceFramework{system_, "IAppletResource"} {
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
|
|
||||||
};
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
|
|
||||||
resource->Initialize();
|
|
||||||
|
|
||||||
// Register update callbacks
|
|
||||||
npad_update_event = Core::Timing::CreateEvent(
|
|
||||||
"HID::UpdatePadCallback",
|
|
||||||
[this, resource](std::uintptr_t user_data, s64 time, std::chrono::nanoseconds ns_late)
|
|
||||||
-> std::optional<std::chrono::nanoseconds> {
|
|
||||||
const auto guard = LockService();
|
|
||||||
resource->UpdateNpad(user_data, ns_late);
|
|
||||||
return std::nullopt;
|
|
||||||
});
|
|
||||||
default_update_event = Core::Timing::CreateEvent(
|
|
||||||
"HID::UpdateDefaultCallback",
|
|
||||||
[this, resource](std::uintptr_t user_data, s64 time, std::chrono::nanoseconds ns_late)
|
|
||||||
-> std::optional<std::chrono::nanoseconds> {
|
|
||||||
const auto guard = LockService();
|
|
||||||
resource->UpdateControllers(user_data, ns_late);
|
|
||||||
return std::nullopt;
|
|
||||||
});
|
|
||||||
mouse_keyboard_update_event = Core::Timing::CreateEvent(
|
|
||||||
"HID::UpdateMouseKeyboardCallback",
|
|
||||||
[this, resource](std::uintptr_t user_data, s64 time, std::chrono::nanoseconds ns_late)
|
|
||||||
-> std::optional<std::chrono::nanoseconds> {
|
|
||||||
const auto guard = LockService();
|
|
||||||
resource->UpdateMouseKeyboard(user_data, ns_late);
|
|
||||||
return std::nullopt;
|
|
||||||
});
|
|
||||||
motion_update_event = Core::Timing::CreateEvent(
|
|
||||||
"HID::UpdateMotionCallback",
|
|
||||||
[this, resource](std::uintptr_t user_data, s64 time, std::chrono::nanoseconds ns_late)
|
|
||||||
-> std::optional<std::chrono::nanoseconds> {
|
|
||||||
const auto guard = LockService();
|
|
||||||
resource->UpdateMotion(user_data, ns_late);
|
|
||||||
return std::nullopt;
|
|
||||||
});
|
|
||||||
|
|
||||||
system.CoreTiming().ScheduleLoopingEvent(npad_update_ns, npad_update_ns, npad_update_event);
|
|
||||||
system.CoreTiming().ScheduleLoopingEvent(default_update_ns, default_update_ns,
|
|
||||||
default_update_event);
|
|
||||||
system.CoreTiming().ScheduleLoopingEvent(mouse_keyboard_update_ns, mouse_keyboard_update_ns,
|
|
||||||
mouse_keyboard_update_event);
|
|
||||||
system.CoreTiming().ScheduleLoopingEvent(motion_update_ns, motion_update_ns,
|
|
||||||
motion_update_event);
|
|
||||||
}
|
|
||||||
|
|
||||||
IAppletResource::~IAppletResource() {
|
|
||||||
system.CoreTiming().UnscheduleEvent(npad_update_event, 0);
|
|
||||||
system.CoreTiming().UnscheduleEvent(default_update_event, 0);
|
|
||||||
system.CoreTiming().UnscheduleEvent(mouse_keyboard_update_event, 0);
|
|
||||||
system.CoreTiming().UnscheduleEvent(motion_update_event, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IAppletResource::GetSharedMemoryHandle(HLERequestContext& ctx) {
|
|
||||||
LOG_DEBUG(Service_HID, "called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushCopyObjects(&system.Kernel().GetHidSharedMem());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Service::HID
|
|
@ -1,106 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
|
|
||||||
#include "core/core.h"
|
|
||||||
#include "core/hle/service/hid/controllers/controller_base.h"
|
|
||||||
#include "core/hle/service/kernel_helpers.h"
|
|
||||||
#include "core/hle/service/service.h"
|
|
||||||
|
|
||||||
namespace Core::Timing {
|
|
||||||
struct EventType;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Core::HID {
|
|
||||||
class HIDCore;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Service::HID {
|
|
||||||
|
|
||||||
enum class HidController : std::size_t {
|
|
||||||
DebugPad,
|
|
||||||
Touchscreen,
|
|
||||||
Mouse,
|
|
||||||
Keyboard,
|
|
||||||
XPad,
|
|
||||||
HomeButton,
|
|
||||||
SleepButton,
|
|
||||||
CaptureButton,
|
|
||||||
InputDetector,
|
|
||||||
UniquePad,
|
|
||||||
NPad,
|
|
||||||
Gesture,
|
|
||||||
ConsoleSixAxisSensor,
|
|
||||||
DebugMouse,
|
|
||||||
Palma,
|
|
||||||
|
|
||||||
MaxControllers,
|
|
||||||
};
|
|
||||||
class ResourceManager {
|
|
||||||
public:
|
|
||||||
explicit ResourceManager(Core::System& system_);
|
|
||||||
~ResourceManager();
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T& GetController(HidController controller) {
|
|
||||||
return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
const T& GetController(HidController controller) const {
|
|
||||||
return static_cast<T&>(*controllers[static_cast<size_t>(controller)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Initialize();
|
|
||||||
void ActivateController(HidController controller);
|
|
||||||
void DeactivateController(HidController controller);
|
|
||||||
|
|
||||||
void UpdateControllers(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
|
||||||
void UpdateNpad(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
|
||||||
void UpdateMouseKeyboard(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
|
||||||
void UpdateMotion(std::uintptr_t user_data, std::chrono::nanoseconds ns_late);
|
|
||||||
|
|
||||||
private:
|
|
||||||
template <typename T>
|
|
||||||
void MakeController(HidController controller, u8* shared_memory) {
|
|
||||||
if constexpr (std::is_constructible_v<T, Core::System&, u8*>) {
|
|
||||||
controllers[static_cast<std::size_t>(controller)] =
|
|
||||||
std::make_unique<T>(system, shared_memory);
|
|
||||||
} else {
|
|
||||||
controllers[static_cast<std::size_t>(controller)] =
|
|
||||||
std::make_unique<T>(system.HIDCore(), shared_memory);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) {
|
|
||||||
controllers[static_cast<std::size_t>(controller)] =
|
|
||||||
std::make_unique<T>(system.HIDCore(), shared_memory, service_context);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_initialized{false};
|
|
||||||
std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
|
|
||||||
controllers{};
|
|
||||||
|
|
||||||
Core::System& system;
|
|
||||||
KernelHelpers::ServiceContext service_context;
|
|
||||||
};
|
|
||||||
|
|
||||||
class IAppletResource final : public ServiceFramework<IAppletResource> {
|
|
||||||
public:
|
|
||||||
explicit IAppletResource(Core::System& system_, std::shared_ptr<ResourceManager> resource);
|
|
||||||
~IAppletResource() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void GetSharedMemoryHandle(HLERequestContext& ctx);
|
|
||||||
|
|
||||||
std::shared_ptr<Core::Timing::EventType> npad_update_event;
|
|
||||||
std::shared_ptr<Core::Timing::EventType> default_update_event;
|
|
||||||
std::shared_ptr<Core::Timing::EventType> mouse_keyboard_update_event;
|
|
||||||
std::shared_ptr<Core::Timing::EventType> motion_update_event;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Service::HID
|
|
@ -1,10 +1,8 @@
|
|||||||
// SPDX-FileCopyrightText: 2015 Citra Emulator Project
|
// SPDX-FileCopyrightText: 2015 Citra Emulator Project
|
||||||
// SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <mutex>
|
|
||||||
#include <span>
|
#include <span>
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
@ -12,7 +10,6 @@
|
|||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/page_table.h"
|
#include "common/page_table.h"
|
||||||
#include "common/scope_exit.h"
|
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "common/swap.h"
|
#include "common/swap.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
@ -321,7 +318,7 @@ struct Memory::Impl {
|
|||||||
[&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount,
|
[&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount,
|
||||||
u8* const host_ptr) {
|
u8* const host_ptr) {
|
||||||
if constexpr (!UNSAFE) {
|
if constexpr (!UNSAFE) {
|
||||||
HandleRasterizerWrite(GetInteger(current_vaddr), copy_amount);
|
system.GPU().InvalidateRegion(GetInteger(current_vaddr), copy_amount);
|
||||||
}
|
}
|
||||||
std::memcpy(host_ptr, src_buffer, copy_amount);
|
std::memcpy(host_ptr, src_buffer, copy_amount);
|
||||||
},
|
},
|
||||||
@ -354,7 +351,7 @@ struct Memory::Impl {
|
|||||||
},
|
},
|
||||||
[&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount,
|
[&](const Common::ProcessAddress current_vaddr, const std::size_t copy_amount,
|
||||||
u8* const host_ptr) {
|
u8* const host_ptr) {
|
||||||
HandleRasterizerWrite(GetInteger(current_vaddr), copy_amount);
|
system.GPU().InvalidateRegion(GetInteger(current_vaddr), copy_amount);
|
||||||
std::memset(host_ptr, 0, copy_amount);
|
std::memset(host_ptr, 0, copy_amount);
|
||||||
},
|
},
|
||||||
[](const std::size_t copy_amount) {});
|
[](const std::size_t copy_amount) {});
|
||||||
@ -423,7 +420,7 @@ struct Memory::Impl {
|
|||||||
const std::size_t block_size) {
|
const std::size_t block_size) {
|
||||||
// dc cvac: Store to point of coherency
|
// dc cvac: Store to point of coherency
|
||||||
// CPU flush -> GPU invalidate
|
// CPU flush -> GPU invalidate
|
||||||
HandleRasterizerWrite(GetInteger(current_vaddr), block_size);
|
system.GPU().InvalidateRegion(GetInteger(current_vaddr), block_size);
|
||||||
};
|
};
|
||||||
return PerformCacheOperation(dest_addr, size, on_rasterizer);
|
return PerformCacheOperation(dest_addr, size, on_rasterizer);
|
||||||
}
|
}
|
||||||
@ -433,7 +430,7 @@ struct Memory::Impl {
|
|||||||
const std::size_t block_size) {
|
const std::size_t block_size) {
|
||||||
// dc civac: Store to point of coherency, and invalidate from cache
|
// dc civac: Store to point of coherency, and invalidate from cache
|
||||||
// CPU flush -> GPU invalidate
|
// CPU flush -> GPU invalidate
|
||||||
HandleRasterizerWrite(GetInteger(current_vaddr), block_size);
|
system.GPU().InvalidateRegion(GetInteger(current_vaddr), block_size);
|
||||||
};
|
};
|
||||||
return PerformCacheOperation(dest_addr, size, on_rasterizer);
|
return PerformCacheOperation(dest_addr, size, on_rasterizer);
|
||||||
}
|
}
|
||||||
@ -770,18 +767,7 @@ struct Memory::Impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void HandleRasterizerWrite(VAddr address, size_t size) {
|
void HandleRasterizerWrite(VAddr address, size_t size) {
|
||||||
constexpr size_t sys_core = Core::Hardware::NUM_CPU_CORES - 1;
|
const size_t core = system.GetCurrentHostThreadID();
|
||||||
const size_t core = std::min(system.GetCurrentHostThreadID(),
|
|
||||||
sys_core); // any other calls threads go to syscore.
|
|
||||||
// Guard on sys_core;
|
|
||||||
if (core == sys_core) [[unlikely]] {
|
|
||||||
sys_core_guard.lock();
|
|
||||||
}
|
|
||||||
SCOPE_EXIT({
|
|
||||||
if (core == sys_core) [[unlikely]] {
|
|
||||||
sys_core_guard.unlock();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
auto& current_area = rasterizer_write_areas[core];
|
auto& current_area = rasterizer_write_areas[core];
|
||||||
VAddr subaddress = address >> YUZU_PAGEBITS;
|
VAddr subaddress = address >> YUZU_PAGEBITS;
|
||||||
bool do_collection = current_area.last_address == subaddress;
|
bool do_collection = current_area.last_address == subaddress;
|
||||||
@ -813,7 +799,6 @@ struct Memory::Impl {
|
|||||||
rasterizer_read_areas{};
|
rasterizer_read_areas{};
|
||||||
std::array<GPUDirtyState, Core::Hardware::NUM_CPU_CORES> rasterizer_write_areas{};
|
std::array<GPUDirtyState, Core::Hardware::NUM_CPU_CORES> rasterizer_write_areas{};
|
||||||
std::span<Core::GPUDirtyMemoryManager> gpu_dirty_managers;
|
std::span<Core::GPUDirtyMemoryManager> gpu_dirty_managers;
|
||||||
std::mutex sys_core_guard;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Memory::Memory(Core::System& system_) : system{system_} {
|
Memory::Memory(Core::System& system_) : system{system_} {
|
||||||
|
@ -10,8 +10,7 @@
|
|||||||
#include "core/hle/kernel/k_page_table.h"
|
#include "core/hle/kernel/k_page_table.h"
|
||||||
#include "core/hle/kernel/k_process.h"
|
#include "core/hle/kernel/k_process.h"
|
||||||
#include "core/hle/service/hid/controllers/npad.h"
|
#include "core/hle/service/hid/controllers/npad.h"
|
||||||
#include "core/hle/service/hid/hid_server.h"
|
#include "core/hle/service/hid/hid.h"
|
||||||
#include "core/hle/service/hid/resource_manager.h"
|
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
#include "core/memory/cheat_engine.h"
|
#include "core/memory/cheat_engine.h"
|
||||||
@ -55,13 +54,13 @@ void StandardVmCallbacks::MemoryWrite(VAddr address, const void* data, u64 size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
u64 StandardVmCallbacks::HidKeysDown() {
|
u64 StandardVmCallbacks::HidKeysDown() {
|
||||||
const auto hid = system.ServiceManager().GetService<Service::HID::IHidServer>("hid");
|
const auto hid = system.ServiceManager().GetService<Service::HID::Hid>("hid");
|
||||||
if (hid == nullptr) {
|
if (hid == nullptr) {
|
||||||
LOG_WARNING(CheatEngine, "Attempted to read input state, but hid is not initialized!");
|
LOG_WARNING(CheatEngine, "Attempted to read input state, but hid is not initialized!");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto applet_resource = hid->GetResourceManager();
|
const auto applet_resource = hid->GetAppletResource();
|
||||||
if (applet_resource == nullptr) {
|
if (applet_resource == nullptr) {
|
||||||
LOG_WARNING(CheatEngine,
|
LOG_WARNING(CheatEngine,
|
||||||
"Attempted to read input state, but applet resource is not initialized!");
|
"Attempted to read input state, but applet resource is not initialized!");
|
||||||
|
@ -612,12 +612,8 @@ bool Config::ReadBooleanSetting(const std::string& key, const std::optional<bool
|
|||||||
s64 Config::ReadIntegerSetting(const std::string& key, const std::optional<s64> default_value) {
|
s64 Config::ReadIntegerSetting(const std::string& key, const std::optional<s64> default_value) {
|
||||||
std::string full_key = GetFullKey(key, false);
|
std::string full_key = GetFullKey(key, false);
|
||||||
if (!default_value.has_value()) {
|
if (!default_value.has_value()) {
|
||||||
try {
|
return std::stoll(
|
||||||
return std::stoll(
|
std::string(config->GetValue(GetSection().c_str(), full_key.c_str(), "0")));
|
||||||
std::string(config->GetValue(GetSection().c_str(), full_key.c_str(), "0")));
|
|
||||||
} catch (...) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s64 result = 0;
|
s64 result = 0;
|
||||||
@ -625,12 +621,8 @@ s64 Config::ReadIntegerSetting(const std::string& key, const std::optional<s64>
|
|||||||
std::string(full_key).append("\\default").c_str(), true)) {
|
std::string(full_key).append("\\default").c_str(), true)) {
|
||||||
result = default_value.value();
|
result = default_value.value();
|
||||||
} else {
|
} else {
|
||||||
try {
|
result = std::stoll(std::string(config->GetValue(GetSection().c_str(), full_key.c_str(),
|
||||||
result = std::stoll(std::string(config->GetValue(
|
ToString(default_value.value()).c_str())));
|
||||||
GetSection().c_str(), full_key.c_str(), ToString(default_value.value()).c_str())));
|
|
||||||
} catch (...) {
|
|
||||||
result = default_value.value();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -675,11 +667,6 @@ std::string Config::ReadStringSetting(const std::string& key,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Config::Exists(const std::string& section, const std::string& key) const {
|
|
||||||
const std::string value = config->GetValue(section.c_str(), key.c_str(), "");
|
|
||||||
return !value.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Type>
|
template <typename Type>
|
||||||
void Config::WriteSetting(const std::string& key, const Type& value,
|
void Config::WriteSetting(const std::string& key, const Type& value,
|
||||||
const std::optional<Type>& default_value,
|
const std::optional<Type>& default_value,
|
||||||
|
@ -36,8 +36,6 @@ public:
|
|||||||
|
|
||||||
[[nodiscard]] const std::string& GetConfigFilePath() const;
|
[[nodiscard]] const std::string& GetConfigFilePath() const;
|
||||||
|
|
||||||
[[nodiscard]] bool Exists(const std::string& section, const std::string& key) const;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit Config(ConfigType config_type = ConfigType::GlobalConfig);
|
explicit Config(ConfigType config_type = ConfigType::GlobalConfig);
|
||||||
|
|
||||||
|
@ -415,7 +415,7 @@ ButtonMapping GCAdapter::GetButtonMappingForDevice(const Common::ParamPackage& p
|
|||||||
// This list is missing ZL/ZR since those are not considered buttons.
|
// This list is missing ZL/ZR since those are not considered buttons.
|
||||||
// We will add those afterwards
|
// We will add those afterwards
|
||||||
// This list also excludes any button that can't be really mapped
|
// This list also excludes any button that can't be really mapped
|
||||||
static constexpr std::array<std::pair<Settings::NativeButton::Values, PadButton>, 14>
|
static constexpr std::array<std::pair<Settings::NativeButton::Values, PadButton>, 12>
|
||||||
switch_to_gcadapter_button = {
|
switch_to_gcadapter_button = {
|
||||||
std::pair{Settings::NativeButton::A, PadButton::ButtonA},
|
std::pair{Settings::NativeButton::A, PadButton::ButtonA},
|
||||||
{Settings::NativeButton::B, PadButton::ButtonB},
|
{Settings::NativeButton::B, PadButton::ButtonB},
|
||||||
@ -426,10 +426,8 @@ ButtonMapping GCAdapter::GetButtonMappingForDevice(const Common::ParamPackage& p
|
|||||||
{Settings::NativeButton::DUp, PadButton::ButtonUp},
|
{Settings::NativeButton::DUp, PadButton::ButtonUp},
|
||||||
{Settings::NativeButton::DRight, PadButton::ButtonRight},
|
{Settings::NativeButton::DRight, PadButton::ButtonRight},
|
||||||
{Settings::NativeButton::DDown, PadButton::ButtonDown},
|
{Settings::NativeButton::DDown, PadButton::ButtonDown},
|
||||||
{Settings::NativeButton::SLLeft, PadButton::TriggerL},
|
{Settings::NativeButton::SL, PadButton::TriggerL},
|
||||||
{Settings::NativeButton::SRLeft, PadButton::TriggerR},
|
{Settings::NativeButton::SR, PadButton::TriggerR},
|
||||||
{Settings::NativeButton::SLRight, PadButton::TriggerL},
|
|
||||||
{Settings::NativeButton::SRRight, PadButton::TriggerR},
|
|
||||||
{Settings::NativeButton::R, PadButton::TriggerZ},
|
{Settings::NativeButton::R, PadButton::TriggerZ},
|
||||||
};
|
};
|
||||||
if (!params.Has("port")) {
|
if (!params.Has("port")) {
|
||||||
|
@ -680,8 +680,8 @@ ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& par
|
|||||||
Common::ParamPackage sr_button_params = button_params;
|
Common::ParamPackage sr_button_params = button_params;
|
||||||
sl_button_params.Set("button", static_cast<int>(Joycon::PadButton::LeftSL));
|
sl_button_params.Set("button", static_cast<int>(Joycon::PadButton::LeftSL));
|
||||||
sr_button_params.Set("button", static_cast<int>(Joycon::PadButton::LeftSR));
|
sr_button_params.Set("button", static_cast<int>(Joycon::PadButton::LeftSR));
|
||||||
mapping.insert_or_assign(Settings::NativeButton::SLLeft, std::move(sl_button_params));
|
mapping.insert_or_assign(Settings::NativeButton::SL, std::move(sl_button_params));
|
||||||
mapping.insert_or_assign(Settings::NativeButton::SRLeft, std::move(sr_button_params));
|
mapping.insert_or_assign(Settings::NativeButton::SR, std::move(sr_button_params));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map SL and SR buttons for right joycons
|
// Map SL and SR buttons for right joycons
|
||||||
@ -693,8 +693,8 @@ ButtonMapping Joycons::GetButtonMappingForDevice(const Common::ParamPackage& par
|
|||||||
Common::ParamPackage sr_button_params = button_params;
|
Common::ParamPackage sr_button_params = button_params;
|
||||||
sl_button_params.Set("button", static_cast<int>(Joycon::PadButton::RightSL));
|
sl_button_params.Set("button", static_cast<int>(Joycon::PadButton::RightSL));
|
||||||
sr_button_params.Set("button", static_cast<int>(Joycon::PadButton::RightSR));
|
sr_button_params.Set("button", static_cast<int>(Joycon::PadButton::RightSR));
|
||||||
mapping.insert_or_assign(Settings::NativeButton::SLRight, std::move(sl_button_params));
|
mapping.insert_or_assign(Settings::NativeButton::SL, std::move(sl_button_params));
|
||||||
mapping.insert_or_assign(Settings::NativeButton::SRRight, std::move(sr_button_params));
|
mapping.insert_or_assign(Settings::NativeButton::SR, std::move(sr_button_params));
|
||||||
}
|
}
|
||||||
|
|
||||||
return mapping;
|
return mapping;
|
||||||
|
@ -828,18 +828,16 @@ ButtonMapping SDLDriver::GetButtonMappingForDevice(const Common::ParamPackage& p
|
|||||||
ButtonBindings SDLDriver::GetDefaultButtonBinding(
|
ButtonBindings SDLDriver::GetDefaultButtonBinding(
|
||||||
const std::shared_ptr<SDLJoystick>& joystick) const {
|
const std::shared_ptr<SDLJoystick>& joystick) const {
|
||||||
// Default SL/SR mapping for other controllers
|
// Default SL/SR mapping for other controllers
|
||||||
auto sll_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER;
|
auto sl_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER;
|
||||||
auto srl_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER;
|
auto sr_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER;
|
||||||
auto slr_button = SDL_CONTROLLER_BUTTON_LEFTSHOULDER;
|
|
||||||
auto srr_button = SDL_CONTROLLER_BUTTON_RIGHTSHOULDER;
|
|
||||||
|
|
||||||
if (joystick->IsJoyconLeft()) {
|
if (joystick->IsJoyconLeft()) {
|
||||||
sll_button = SDL_CONTROLLER_BUTTON_PADDLE2;
|
sl_button = SDL_CONTROLLER_BUTTON_PADDLE2;
|
||||||
srl_button = SDL_CONTROLLER_BUTTON_PADDLE4;
|
sr_button = SDL_CONTROLLER_BUTTON_PADDLE4;
|
||||||
}
|
}
|
||||||
if (joystick->IsJoyconRight()) {
|
if (joystick->IsJoyconRight()) {
|
||||||
slr_button = SDL_CONTROLLER_BUTTON_PADDLE3;
|
sl_button = SDL_CONTROLLER_BUTTON_PADDLE3;
|
||||||
srr_button = SDL_CONTROLLER_BUTTON_PADDLE1;
|
sr_button = SDL_CONTROLLER_BUTTON_PADDLE1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@ -857,10 +855,8 @@ ButtonBindings SDLDriver::GetDefaultButtonBinding(
|
|||||||
{Settings::NativeButton::DUp, SDL_CONTROLLER_BUTTON_DPAD_UP},
|
{Settings::NativeButton::DUp, SDL_CONTROLLER_BUTTON_DPAD_UP},
|
||||||
{Settings::NativeButton::DRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT},
|
{Settings::NativeButton::DRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT},
|
||||||
{Settings::NativeButton::DDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN},
|
{Settings::NativeButton::DDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN},
|
||||||
{Settings::NativeButton::SLLeft, sll_button},
|
{Settings::NativeButton::SL, sl_button},
|
||||||
{Settings::NativeButton::SRLeft, srl_button},
|
{Settings::NativeButton::SR, sr_button},
|
||||||
{Settings::NativeButton::SLRight, slr_button},
|
|
||||||
{Settings::NativeButton::SRRight, srr_button},
|
|
||||||
{Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE},
|
{Settings::NativeButton::Home, SDL_CONTROLLER_BUTTON_GUIDE},
|
||||||
{Settings::NativeButton::Screenshot, SDL_CONTROLLER_BUTTON_MISC1},
|
{Settings::NativeButton::Screenshot, SDL_CONTROLLER_BUTTON_MISC1},
|
||||||
};
|
};
|
||||||
|
@ -24,7 +24,7 @@ namespace InputCommon {
|
|||||||
class SDLJoystick;
|
class SDLJoystick;
|
||||||
|
|
||||||
using ButtonBindings =
|
using ButtonBindings =
|
||||||
std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerButton>, 20>;
|
std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerButton>, 18>;
|
||||||
using ZButtonBindings =
|
using ZButtonBindings =
|
||||||
std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerAxis>, 2>;
|
std::array<std::pair<Settings::NativeButton::Values, SDL_GameControllerAxis>, 2>;
|
||||||
|
|
||||||
|
@ -396,7 +396,7 @@ std::vector<Common::ParamPackage> UDPClient::GetInputDevices() const {
|
|||||||
|
|
||||||
ButtonMapping UDPClient::GetButtonMappingForDevice(const Common::ParamPackage& params) {
|
ButtonMapping UDPClient::GetButtonMappingForDevice(const Common::ParamPackage& params) {
|
||||||
// This list excludes any button that can't be really mapped
|
// This list excludes any button that can't be really mapped
|
||||||
static constexpr std::array<std::pair<Settings::NativeButton::Values, PadButton>, 22>
|
static constexpr std::array<std::pair<Settings::NativeButton::Values, PadButton>, 20>
|
||||||
switch_to_dsu_button = {
|
switch_to_dsu_button = {
|
||||||
std::pair{Settings::NativeButton::A, PadButton::Circle},
|
std::pair{Settings::NativeButton::A, PadButton::Circle},
|
||||||
{Settings::NativeButton::B, PadButton::Cross},
|
{Settings::NativeButton::B, PadButton::Cross},
|
||||||
@ -412,10 +412,8 @@ ButtonMapping UDPClient::GetButtonMappingForDevice(const Common::ParamPackage& p
|
|||||||
{Settings::NativeButton::R, PadButton::R1},
|
{Settings::NativeButton::R, PadButton::R1},
|
||||||
{Settings::NativeButton::ZL, PadButton::L2},
|
{Settings::NativeButton::ZL, PadButton::L2},
|
||||||
{Settings::NativeButton::ZR, PadButton::R2},
|
{Settings::NativeButton::ZR, PadButton::R2},
|
||||||
{Settings::NativeButton::SLLeft, PadButton::L2},
|
{Settings::NativeButton::SL, PadButton::L2},
|
||||||
{Settings::NativeButton::SRLeft, PadButton::R2},
|
{Settings::NativeButton::SR, PadButton::R2},
|
||||||
{Settings::NativeButton::SLRight, PadButton::L2},
|
|
||||||
{Settings::NativeButton::SRRight, PadButton::R2},
|
|
||||||
{Settings::NativeButton::LStick, PadButton::L3},
|
{Settings::NativeButton::LStick, PadButton::L3},
|
||||||
{Settings::NativeButton::RStick, PadButton::R3},
|
{Settings::NativeButton::RStick, PadButton::R3},
|
||||||
{Settings::NativeButton::Home, PadButton::Home},
|
{Settings::NativeButton::Home, PadButton::Home},
|
||||||
|
@ -86,7 +86,10 @@ public:
|
|||||||
uncommitted_operations.emplace_back(std::move(func));
|
uncommitted_operations.emplace_back(std::move(func));
|
||||||
}
|
}
|
||||||
pending_operations.emplace_back(std::move(uncommitted_operations));
|
pending_operations.emplace_back(std::move(uncommitted_operations));
|
||||||
QueueFence(new_fence);
|
{
|
||||||
|
std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex};
|
||||||
|
QueueFence(new_fence);
|
||||||
|
}
|
||||||
if (!delay_fence) {
|
if (!delay_fence) {
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
|
@ -555,7 +555,7 @@ void RasterizerOpenGL::OnCacheInvalidation(VAddr addr, u64 size) {
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::scoped_lock lock{buffer_cache.mutex};
|
std::scoped_lock lock{buffer_cache.mutex};
|
||||||
buffer_cache.WriteMemory(addr, size);
|
buffer_cache.CachedWriteMemory(addr, size);
|
||||||
}
|
}
|
||||||
shader_cache.InvalidateRegion(addr, size);
|
shader_cache.InvalidateRegion(addr, size);
|
||||||
}
|
}
|
||||||
|
@ -132,12 +132,16 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
|
|||||||
const bool use_accelerated =
|
const bool use_accelerated =
|
||||||
rasterizer.AccelerateDisplay(*framebuffer, framebuffer_addr, framebuffer->stride);
|
rasterizer.AccelerateDisplay(*framebuffer, framebuffer_addr, framebuffer->stride);
|
||||||
const bool is_srgb = use_accelerated && screen_info.is_srgb;
|
const bool is_srgb = use_accelerated && screen_info.is_srgb;
|
||||||
RenderScreenshot(*framebuffer, use_accelerated);
|
|
||||||
|
|
||||||
Frame* frame = present_manager.GetRenderFrame();
|
{
|
||||||
blit_screen.DrawToSwapchain(frame, *framebuffer, use_accelerated, is_srgb);
|
std::scoped_lock lock{rasterizer.LockCaches()};
|
||||||
scheduler.Flush(*frame->render_ready);
|
RenderScreenshot(*framebuffer, use_accelerated);
|
||||||
present_manager.Present(frame);
|
|
||||||
|
Frame* frame = present_manager.GetRenderFrame();
|
||||||
|
blit_screen.DrawToSwapchain(frame, *framebuffer, use_accelerated, is_srgb);
|
||||||
|
scheduler.Flush(*frame->render_ready);
|
||||||
|
present_manager.Present(frame);
|
||||||
|
}
|
||||||
|
|
||||||
gpu.RendererFrameEndNotify();
|
gpu.RendererFrameEndNotify();
|
||||||
rasterizer.TickFrame();
|
rasterizer.TickFrame();
|
||||||
|
@ -211,13 +211,6 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
PauseCounter();
|
PauseCounter();
|
||||||
const auto driver_id = device.GetDriverID();
|
|
||||||
if (driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY ||
|
|
||||||
driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) {
|
|
||||||
pending_sync.clear();
|
|
||||||
sync_values_stash.clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
sync_values_stash.clear();
|
sync_values_stash.clear();
|
||||||
sync_values_stash.emplace_back();
|
sync_values_stash.emplace_back();
|
||||||
std::vector<HostSyncValues>* sync_values = &sync_values_stash.back();
|
std::vector<HostSyncValues>* sync_values = &sync_values_stash.back();
|
||||||
@ -1385,12 +1378,6 @@ bool QueryCacheRuntime::HostConditionalRenderingCompareValues(VideoCommon::Looku
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto driver_id = impl->device.GetDriverID();
|
|
||||||
if (driver_id == VK_DRIVER_ID_QUALCOMM_PROPRIETARY ||
|
|
||||||
driver_id == VK_DRIVER_ID_ARM_PROPRIETARY || driver_id == VK_DRIVER_ID_MESA_TURNIP) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = 0; i < 2; i++) {
|
for (size_t i = 0; i < 2; i++) {
|
||||||
is_null[i] = !is_in_ac[i] && check_value(objects[i]->address);
|
is_null[i] = !is_in_ac[i] && check_value(objects[i]->address);
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,7 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) {
|
|||||||
if (!pipeline) {
|
if (!pipeline) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex};
|
std::scoped_lock lock{LockCaches()};
|
||||||
// update engine as channel may be different.
|
// update engine as channel may be different.
|
||||||
pipeline->SetEngine(maxwell3d, gpu_memory);
|
pipeline->SetEngine(maxwell3d, gpu_memory);
|
||||||
pipeline->Configure(is_indexed);
|
pipeline->Configure(is_indexed);
|
||||||
@ -621,7 +621,7 @@ void RasterizerVulkan::OnCacheInvalidation(VAddr addr, u64 size) {
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::scoped_lock lock{buffer_cache.mutex};
|
std::scoped_lock lock{buffer_cache.mutex};
|
||||||
buffer_cache.WriteMemory(addr, size);
|
buffer_cache.CachedWriteMemory(addr, size);
|
||||||
}
|
}
|
||||||
pipeline_cache.InvalidateRegion(addr, size);
|
pipeline_cache.InvalidateRegion(addr, size);
|
||||||
}
|
}
|
||||||
@ -710,6 +710,7 @@ void RasterizerVulkan::TiledCacheBarrier() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RasterizerVulkan::FlushCommands() {
|
void RasterizerVulkan::FlushCommands() {
|
||||||
|
std::scoped_lock lock{LockCaches()};
|
||||||
if (draw_counter == 0) {
|
if (draw_counter == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -807,6 +808,7 @@ void RasterizerVulkan::FlushWork() {
|
|||||||
if ((++draw_counter & 7) != 7) {
|
if ((++draw_counter & 7) != 7) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
std::scoped_lock lock{LockCaches()};
|
||||||
if (draw_counter < DRAWS_TO_DISPATCH) {
|
if (draw_counter < DRAWS_TO_DISPATCH) {
|
||||||
// Send recorded tasks to the worker thread
|
// Send recorded tasks to the worker thread
|
||||||
scheduler.DispatchWork();
|
scheduler.DispatchWork();
|
||||||
@ -1505,7 +1507,7 @@ void RasterizerVulkan::UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs)
|
|||||||
void RasterizerVulkan::InitializeChannel(Tegra::Control::ChannelState& channel) {
|
void RasterizerVulkan::InitializeChannel(Tegra::Control::ChannelState& channel) {
|
||||||
CreateChannel(channel);
|
CreateChannel(channel);
|
||||||
{
|
{
|
||||||
std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex};
|
std::scoped_lock lock{LockCaches()};
|
||||||
texture_cache.CreateChannel(channel);
|
texture_cache.CreateChannel(channel);
|
||||||
buffer_cache.CreateChannel(channel);
|
buffer_cache.CreateChannel(channel);
|
||||||
}
|
}
|
||||||
@ -1518,7 +1520,7 @@ void RasterizerVulkan::BindChannel(Tegra::Control::ChannelState& channel) {
|
|||||||
const s32 channel_id = channel.bind_id;
|
const s32 channel_id = channel.bind_id;
|
||||||
BindToChannel(channel_id);
|
BindToChannel(channel_id);
|
||||||
{
|
{
|
||||||
std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex};
|
std::scoped_lock lock{LockCaches()};
|
||||||
texture_cache.BindToChannel(channel_id);
|
texture_cache.BindToChannel(channel_id);
|
||||||
buffer_cache.BindToChannel(channel_id);
|
buffer_cache.BindToChannel(channel_id);
|
||||||
}
|
}
|
||||||
@ -1531,7 +1533,7 @@ void RasterizerVulkan::BindChannel(Tegra::Control::ChannelState& channel) {
|
|||||||
void RasterizerVulkan::ReleaseChannel(s32 channel_id) {
|
void RasterizerVulkan::ReleaseChannel(s32 channel_id) {
|
||||||
EraseChannel(channel_id);
|
EraseChannel(channel_id);
|
||||||
{
|
{
|
||||||
std::scoped_lock lock{buffer_cache.mutex, texture_cache.mutex};
|
std::scoped_lock lock{LockCaches()};
|
||||||
texture_cache.EraseChannel(channel_id);
|
texture_cache.EraseChannel(channel_id);
|
||||||
buffer_cache.EraseChannel(channel_id);
|
buffer_cache.EraseChannel(channel_id);
|
||||||
}
|
}
|
||||||
|
@ -133,6 +133,10 @@ public:
|
|||||||
|
|
||||||
void ReleaseChannel(s32 channel_id) override;
|
void ReleaseChannel(s32 channel_id) override;
|
||||||
|
|
||||||
|
std::scoped_lock<std::recursive_mutex, std::recursive_mutex> LockCaches() {
|
||||||
|
return std::scoped_lock{buffer_cache.mutex, texture_cache.mutex};
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr size_t MAX_TEXTURES = 192;
|
static constexpr size_t MAX_TEXTURES = 192;
|
||||||
static constexpr size_t MAX_IMAGES = 48;
|
static constexpr size_t MAX_IMAGES = 48;
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "core/hid/hid_core.h"
|
#include "core/hid/hid_core.h"
|
||||||
#include "core/hid/hid_types.h"
|
#include "core/hid/hid_types.h"
|
||||||
#include "core/hle/service/hid/controllers/npad.h"
|
#include "core/hle/service/hid/controllers/npad.h"
|
||||||
|
#include "core/hle/service/hid/hid.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
#include "ui_qt_controller.h"
|
#include "ui_qt_controller.h"
|
||||||
#include "yuzu/applets/qt_controller.h"
|
#include "yuzu/applets/qt_controller.h"
|
||||||
|
@ -323,12 +323,11 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i
|
|||||||
setFocusPolicy(Qt::ClickFocus);
|
setFocusPolicy(Qt::ClickFocus);
|
||||||
|
|
||||||
button_map = {
|
button_map = {
|
||||||
ui->buttonA, ui->buttonB, ui->buttonX, ui->buttonY,
|
ui->buttonA, ui->buttonB, ui->buttonX, ui->buttonY,
|
||||||
ui->buttonLStick, ui->buttonRStick, ui->buttonL, ui->buttonR,
|
ui->buttonLStick, ui->buttonRStick, ui->buttonL, ui->buttonR,
|
||||||
ui->buttonZL, ui->buttonZR, ui->buttonPlus, ui->buttonMinus,
|
ui->buttonZL, ui->buttonZR, ui->buttonPlus, ui->buttonMinus,
|
||||||
ui->buttonDpadLeft, ui->buttonDpadUp, ui->buttonDpadRight, ui->buttonDpadDown,
|
ui->buttonDpadLeft, ui->buttonDpadUp, ui->buttonDpadRight, ui->buttonDpadDown,
|
||||||
ui->buttonSLLeft, ui->buttonSRLeft, ui->buttonHome, ui->buttonScreenshot,
|
ui->buttonSL, ui->buttonSR, ui->buttonHome, ui->buttonScreenshot,
|
||||||
ui->buttonSLRight, ui->buttonSRRight,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
analog_map_buttons = {{
|
analog_map_buttons = {{
|
||||||
@ -1183,13 +1182,10 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
|
|||||||
|
|
||||||
// List of all the widgets that will be hidden by any of the following layouts that need
|
// List of all the widgets that will be hidden by any of the following layouts that need
|
||||||
// "unhidden" after the controller type changes
|
// "unhidden" after the controller type changes
|
||||||
const std::array<QWidget*, 14> layout_show = {
|
const std::array<QWidget*, 11> layout_show = {
|
||||||
ui->buttonShoulderButtonsSLSRLeft,
|
ui->buttonShoulderButtonsSLSR,
|
||||||
ui->buttonShoulderButtonsSLSRRight,
|
|
||||||
ui->horizontalSpacerShoulderButtonsWidget,
|
ui->horizontalSpacerShoulderButtonsWidget,
|
||||||
ui->horizontalSpacerShoulderButtonsWidget2,
|
ui->horizontalSpacerShoulderButtonsWidget2,
|
||||||
ui->horizontalSpacerShoulderButtonsWidget3,
|
|
||||||
ui->horizontalSpacerShoulderButtonsWidget4,
|
|
||||||
ui->buttonShoulderButtonsLeft,
|
ui->buttonShoulderButtonsLeft,
|
||||||
ui->buttonMiscButtonsMinusScreenshot,
|
ui->buttonMiscButtonsMinusScreenshot,
|
||||||
ui->bottomLeft,
|
ui->bottomLeft,
|
||||||
@ -1207,19 +1203,16 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
|
|||||||
std::vector<QWidget*> layout_hidden;
|
std::vector<QWidget*> layout_hidden;
|
||||||
switch (layout) {
|
switch (layout) {
|
||||||
case Core::HID::NpadStyleIndex::ProController:
|
case Core::HID::NpadStyleIndex::ProController:
|
||||||
|
case Core::HID::NpadStyleIndex::JoyconDual:
|
||||||
case Core::HID::NpadStyleIndex::Handheld:
|
case Core::HID::NpadStyleIndex::Handheld:
|
||||||
layout_hidden = {
|
layout_hidden = {
|
||||||
ui->buttonShoulderButtonsSLSRLeft,
|
ui->buttonShoulderButtonsSLSR,
|
||||||
ui->buttonShoulderButtonsSLSRRight,
|
|
||||||
ui->horizontalSpacerShoulderButtonsWidget2,
|
ui->horizontalSpacerShoulderButtonsWidget2,
|
||||||
ui->horizontalSpacerShoulderButtonsWidget4,
|
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::JoyconLeft:
|
case Core::HID::NpadStyleIndex::JoyconLeft:
|
||||||
layout_hidden = {
|
layout_hidden = {
|
||||||
ui->buttonShoulderButtonsSLSRRight,
|
|
||||||
ui->horizontalSpacerShoulderButtonsWidget2,
|
ui->horizontalSpacerShoulderButtonsWidget2,
|
||||||
ui->horizontalSpacerShoulderButtonsWidget3,
|
|
||||||
ui->buttonShoulderButtonsRight,
|
ui->buttonShoulderButtonsRight,
|
||||||
ui->buttonMiscButtonsPlusHome,
|
ui->buttonMiscButtonsPlusHome,
|
||||||
ui->bottomRight,
|
ui->bottomRight,
|
||||||
@ -1227,17 +1220,16 @@ void ConfigureInputPlayer::UpdateControllerAvailableButtons() {
|
|||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::JoyconRight:
|
case Core::HID::NpadStyleIndex::JoyconRight:
|
||||||
layout_hidden = {
|
layout_hidden = {
|
||||||
ui->buttonShoulderButtonsSLSRLeft, ui->horizontalSpacerShoulderButtonsWidget,
|
ui->horizontalSpacerShoulderButtonsWidget,
|
||||||
ui->horizontalSpacerShoulderButtonsWidget4, ui->buttonShoulderButtonsLeft,
|
ui->buttonShoulderButtonsLeft,
|
||||||
ui->buttonMiscButtonsMinusScreenshot, ui->bottomLeft,
|
ui->buttonMiscButtonsMinusScreenshot,
|
||||||
|
ui->bottomLeft,
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case Core::HID::NpadStyleIndex::GameCube:
|
case Core::HID::NpadStyleIndex::GameCube:
|
||||||
layout_hidden = {
|
layout_hidden = {
|
||||||
ui->buttonShoulderButtonsSLSRLeft,
|
ui->buttonShoulderButtonsSLSR,
|
||||||
ui->buttonShoulderButtonsSLSRRight,
|
|
||||||
ui->horizontalSpacerShoulderButtonsWidget2,
|
ui->horizontalSpacerShoulderButtonsWidget2,
|
||||||
ui->horizontalSpacerShoulderButtonsWidget4,
|
|
||||||
ui->buttonMiscButtonsMinusGroup,
|
ui->buttonMiscButtonsMinusGroup,
|
||||||
ui->buttonMiscButtonsScreenshotGroup,
|
ui->buttonMiscButtonsScreenshotGroup,
|
||||||
};
|
};
|
||||||
|
@ -1208,159 +1208,6 @@
|
|||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
|
||||||
<widget class="QWidget" name="buttonShoulderButtonsSLSRLeft" native="true">
|
|
||||||
<layout class="QVBoxLayout" name="buttonShoulderButtonsSLSRLeftVerticalLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item alignment="Qt::AlignHCenter">
|
|
||||||
<widget class="QGroupBox" name="buttonShoulderButtonsSLLeftGroup">
|
|
||||||
<property name="title">
|
|
||||||
<string>SL</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="buttonShoulderButtonsSLLeftVerticalLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="buttonSLLeft">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>68</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>68</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">min-width: 68px;</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>SL</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item alignment="Qt::AlignHCenter">
|
|
||||||
<widget class="QGroupBox" name="buttonShoulderButtonsSRLeftGroup">
|
|
||||||
<property name="title">
|
|
||||||
<string>SR</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="buttonShoulderButtonsSRLeftVerticalLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="buttonSRLeft">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>68</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>68</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">min-width: 68px;</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>SR</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QWidget" name="horizontalSpacerShoulderButtonsWidget4" native="true">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalSpacerShoulderButtonsWidget4Layout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacerShoulderButtons5">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="buttonShoulderButtonsLeft" native="true">
|
<widget class="QWidget" name="buttonShoulderButtonsLeft" native="true">
|
||||||
<layout class="QVBoxLayout" name="buttonShoulderButtonsLeftVerticalLayout">
|
<layout class="QVBoxLayout" name="buttonShoulderButtonsLeftVerticalLayout">
|
||||||
@ -1983,125 +1830,125 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="buttonShoulderButtonsSLSRRight" native="true">
|
<widget class="QWidget" name="buttonShoulderButtonsSLSR" native="true">
|
||||||
<layout class="QVBoxLayout" name="buttonShoulderButtonsSLSRRightVerticalLayout">
|
<layout class="QVBoxLayout" name="buttonShoulderButtonsSLSRVerticalLayout">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="topMargin">
|
<property name="topMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="rightMargin">
|
<property name="rightMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item alignment="Qt::AlignHCenter">
|
<item alignment="Qt::AlignHCenter">
|
||||||
<widget class="QGroupBox" name="buttonShoulderButtonsSLRightGroup">
|
<widget class="QGroupBox" name="buttonShoulderButtonsSLGroup">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>SL</string>
|
<string>SL</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="buttonShoulderButtonsSLRightVerticalLayout">
|
<layout class="QVBoxLayout" name="buttonShoulderButtonsSLVerticalLayout">
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="topMargin">
|
<property name="topMargin">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="rightMargin">
|
<property name="rightMargin">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="buttonSLRight">
|
<widget class="QPushButton" name="buttonSL">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>68</width>
|
<width>68</width>
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>68</width>
|
<width>68</width>
|
||||||
<height>16777215</height>
|
<height>16777215</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">min-width: 68px;</string>
|
<string notr="true">min-width: 68px;</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>SL</string>
|
<string>SL</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item alignment="Qt::AlignHCenter">
|
|
||||||
<widget class="QGroupBox" name="buttonShoulderButtonsSRRightGroup">
|
|
||||||
<property name="title">
|
|
||||||
<string>SR</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="buttonShoulderButtonsSRRightVerticalLayout">
|
|
||||||
<property name="spacing">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="buttonSRRight">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>68</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>68</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string notr="true">min-width: 68px;</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>SR</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item alignment="Qt::AlignHCenter">
|
||||||
|
<widget class="QGroupBox" name="buttonShoulderButtonsSRGroup">
|
||||||
|
<property name="title">
|
||||||
|
<string>SR</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="buttonShoulderButtonsSRVerticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonSR">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>68</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>68</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">min-width: 68px;</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>SR</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -297,8 +297,8 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
|
|||||||
|
|
||||||
// Sideview SL and SR buttons
|
// Sideview SL and SR buttons
|
||||||
button_color = colors.slider_button;
|
button_color = colors.slider_button;
|
||||||
DrawRoundButton(p, center + QPoint(59, 52), button_values[SRLeft], 5, 12, Direction::Left);
|
DrawRoundButton(p, center + QPoint(59, 52), button_values[SR], 5, 12, Direction::Left);
|
||||||
DrawRoundButton(p, center + QPoint(59, -69), button_values[SLLeft], 5, 12, Direction::Left);
|
DrawRoundButton(p, center + QPoint(59, -69), button_values[SL], 5, 12, Direction::Left);
|
||||||
|
|
||||||
DrawLeftBody(p, center);
|
DrawLeftBody(p, center);
|
||||||
|
|
||||||
@ -353,10 +353,8 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
|
|||||||
// SR and SL buttons
|
// SR and SL buttons
|
||||||
p.setPen(colors.outline);
|
p.setPen(colors.outline);
|
||||||
button_color = colors.slider_button;
|
button_color = colors.slider_button;
|
||||||
DrawRoundButton(p, center + QPoint(155, 52), button_values[SRLeft], 5.2f, 12, Direction::None,
|
DrawRoundButton(p, center + QPoint(155, 52), button_values[SR], 5.2f, 12, Direction::None, 4);
|
||||||
4);
|
DrawRoundButton(p, center + QPoint(155, -69), button_values[SL], 5.2f, 12, Direction::None, 4);
|
||||||
DrawRoundButton(p, center + QPoint(155, -69), button_values[SLLeft], 5.2f, 12, Direction::None,
|
|
||||||
4);
|
|
||||||
|
|
||||||
// SR and SL text
|
// SR and SL text
|
||||||
p.setPen(colors.transparent);
|
p.setPen(colors.transparent);
|
||||||
@ -430,10 +428,8 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
|
|||||||
|
|
||||||
// Sideview SL and SR buttons
|
// Sideview SL and SR buttons
|
||||||
button_color = colors.slider_button;
|
button_color = colors.slider_button;
|
||||||
DrawRoundButton(p, center + QPoint(-59, 52), button_values[SLRight], 5, 11,
|
DrawRoundButton(p, center + QPoint(-59, 52), button_values[SL], 5, 11, Direction::Right);
|
||||||
Direction::Right);
|
DrawRoundButton(p, center + QPoint(-59, -69), button_values[SR], 5, 11, Direction::Right);
|
||||||
DrawRoundButton(p, center + QPoint(-59, -69), button_values[SRRight], 5, 11,
|
|
||||||
Direction::Right);
|
|
||||||
|
|
||||||
DrawRightBody(p, center);
|
DrawRightBody(p, center);
|
||||||
|
|
||||||
@ -488,10 +484,8 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
|
|||||||
// SR and SL buttons
|
// SR and SL buttons
|
||||||
p.setPen(colors.outline);
|
p.setPen(colors.outline);
|
||||||
button_color = colors.slider_button;
|
button_color = colors.slider_button;
|
||||||
DrawRoundButton(p, center + QPoint(-155, 52), button_values[SLRight], 5, 12, Direction::None,
|
DrawRoundButton(p, center + QPoint(-155, 52), button_values[SL], 5, 12, Direction::None, 4.0f);
|
||||||
4.0f);
|
DrawRoundButton(p, center + QPoint(-155, -69), button_values[SR], 5, 12, Direction::None, 4.0f);
|
||||||
DrawRoundButton(p, center + QPoint(-155, -69), button_values[SRRight], 5, 12, Direction::None,
|
|
||||||
4.0f);
|
|
||||||
|
|
||||||
// SR and SL text
|
// SR and SL text
|
||||||
p.setPen(colors.transparent);
|
p.setPen(colors.transparent);
|
||||||
@ -563,19 +557,6 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
|
|||||||
DrawRoundButton(p, center + QPoint(-154, -72), button_values[Minus], 7, 4, Direction::Up,
|
DrawRoundButton(p, center + QPoint(-154, -72), button_values[Minus], 7, 4, Direction::Up,
|
||||||
1);
|
1);
|
||||||
|
|
||||||
// Left SR and SL sideview buttons
|
|
||||||
button_color = colors.slider_button;
|
|
||||||
DrawRoundButton(p, center + QPoint(-20, -62), button_values[SLLeft], 4, 11,
|
|
||||||
Direction::Left);
|
|
||||||
DrawRoundButton(p, center + QPoint(-20, 47), button_values[SRLeft], 4, 11, Direction::Left);
|
|
||||||
|
|
||||||
// Right SR and SL sideview buttons
|
|
||||||
button_color = colors.slider_button;
|
|
||||||
DrawRoundButton(p, center + QPoint(20, 47), button_values[SLRight], 4, 11,
|
|
||||||
Direction::Right);
|
|
||||||
DrawRoundButton(p, center + QPoint(20, -62), button_values[SRRight], 4, 11,
|
|
||||||
Direction::Right);
|
|
||||||
|
|
||||||
DrawDualBody(p, center);
|
DrawDualBody(p, center);
|
||||||
|
|
||||||
// Right trigger top view
|
// Right trigger top view
|
||||||
@ -1811,6 +1792,16 @@ void PlayerControlPreview::DrawDualBody(QPainter& p, const QPointF center) {
|
|||||||
p.setBrush(colors.right);
|
p.setBrush(colors.right);
|
||||||
DrawPolygon(p, qright_joycon_topview);
|
DrawPolygon(p, qright_joycon_topview);
|
||||||
|
|
||||||
|
// Right SR and SL sideview buttons
|
||||||
|
p.setPen(colors.outline);
|
||||||
|
p.setBrush(colors.slider_button);
|
||||||
|
DrawRoundRectangle(p, center + QPoint(19, 47), 7, 22, 1);
|
||||||
|
DrawRoundRectangle(p, center + QPoint(19, -62), 7, 22, 1);
|
||||||
|
|
||||||
|
// Left SR and SL sideview buttons
|
||||||
|
DrawRoundRectangle(p, center + QPoint(-19, 47), 7, 22, 1);
|
||||||
|
DrawRoundRectangle(p, center + QPoint(-19, -62), 7, 22, 1);
|
||||||
|
|
||||||
// Right Sideview body
|
// Right Sideview body
|
||||||
p.setBrush(colors.slider);
|
p.setBrush(colors.slider);
|
||||||
DrawPolygon(p, qright_joycon_slider);
|
DrawPolygon(p, qright_joycon_slider);
|
||||||
|
@ -10,7 +10,6 @@ const std::array<int, Settings::NativeButton::NumButtons> QtConfig::default_butt
|
|||||||
Qt::Key_G, Qt::Key_Q, Qt::Key_E, Qt::Key_R, Qt::Key_T,
|
Qt::Key_G, Qt::Key_Q, Qt::Key_E, Qt::Key_R, Qt::Key_T,
|
||||||
Qt::Key_M, Qt::Key_N, Qt::Key_Left, Qt::Key_Up, Qt::Key_Right,
|
Qt::Key_M, Qt::Key_N, Qt::Key_Left, Qt::Key_Up, Qt::Key_Right,
|
||||||
Qt::Key_Down, Qt::Key_Q, Qt::Key_E, 0, 0,
|
Qt::Key_Down, Qt::Key_Q, Qt::Key_E, 0, 0,
|
||||||
Qt::Key_Q, Qt::Key_E,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::array<int, Settings::NativeMotion::NumMotions> QtConfig::default_motions = {
|
const std::array<int, Settings::NativeMotion::NumMotions> QtConfig::default_motions = {
|
||||||
|
@ -4878,8 +4878,8 @@ void GMainWindow::closeEvent(QCloseEvent* event) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
UpdateUISettings();
|
UpdateUISettings();
|
||||||
game_list->SaveInterfaceLayout();
|
|
||||||
UISettings::SaveWindowState();
|
UISettings::SaveWindowState();
|
||||||
|
game_list->SaveInterfaceLayout();
|
||||||
hotkey_registry.SaveHotkeys();
|
hotkey_registry.SaveHotkeys();
|
||||||
|
|
||||||
// Unload controllers early
|
// Unload controllers early
|
||||||
@ -5227,8 +5227,8 @@ static void SetHighDPIAttributes() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
|
UISettings::RestoreWindowState();
|
||||||
std::unique_ptr<QtConfig> config = std::make_unique<QtConfig>();
|
std::unique_ptr<QtConfig> config = std::make_unique<QtConfig>();
|
||||||
UISettings::RestoreWindowState(config);
|
|
||||||
bool has_broken_vulkan = false;
|
bool has_broken_vulkan = false;
|
||||||
bool is_child = false;
|
bool is_child = false;
|
||||||
if (CheckEnvVars(&is_child)) {
|
if (CheckEnvVars(&is_child)) {
|
||||||
|
@ -55,6 +55,7 @@ u32 CalculateWidth(u32 height, Settings::AspectRatio ratio) {
|
|||||||
return height * 16 / 9;
|
return height * 16 / 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// You wanted to make a Save/Restore State thing here with a file in the config dir
|
||||||
void SaveWindowState() {
|
void SaveWindowState() {
|
||||||
const auto window_state_config_loc =
|
const auto window_state_config_loc =
|
||||||
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "window_state.ini");
|
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "window_state.ini");
|
||||||
@ -71,33 +72,12 @@ void SaveWindowState() {
|
|||||||
config.sync();
|
config.sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RestoreWindowState(std::unique_ptr<QtConfig>& qtConfig) {
|
void RestoreWindowState() {
|
||||||
const auto window_state_config_loc =
|
const auto window_state_config_loc =
|
||||||
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "window_state.ini");
|
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "window_state.ini");
|
||||||
|
|
||||||
// Migrate window state from old location
|
|
||||||
if (!FS::Exists(window_state_config_loc) && qtConfig->Exists("UI", "UILayout\\geometry")) {
|
|
||||||
const auto config_loc =
|
|
||||||
FS::PathToUTF8String(FS::GetYuzuPath(FS::YuzuPath::ConfigDir) / "qt-config.ini");
|
|
||||||
QSettings config(QString::fromStdString(config_loc), QSettings::IniFormat);
|
|
||||||
|
|
||||||
config.beginGroup(QStringLiteral("UI"));
|
|
||||||
config.beginGroup(QStringLiteral("UILayout"));
|
|
||||||
values.geometry = config.value(QStringLiteral("geometry")).toByteArray();
|
|
||||||
values.state = config.value(QStringLiteral("state")).toByteArray();
|
|
||||||
values.renderwindow_geometry =
|
|
||||||
config.value(QStringLiteral("geometryRenderWindow")).toByteArray();
|
|
||||||
values.gamelist_header_state =
|
|
||||||
config.value(QStringLiteral("gameListHeaderState")).toByteArray();
|
|
||||||
values.microprofile_geometry =
|
|
||||||
config.value(QStringLiteral("microProfileDialogGeometry")).toByteArray();
|
|
||||||
config.endGroup();
|
|
||||||
config.endGroup();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void(FS::CreateParentDir(window_state_config_loc));
|
void(FS::CreateParentDir(window_state_config_loc));
|
||||||
const QSettings config(QString::fromStdString(window_state_config_loc), QSettings::IniFormat);
|
QSettings config(QString::fromStdString(window_state_config_loc), QSettings::IniFormat);
|
||||||
|
|
||||||
values.geometry = config.value(QStringLiteral("geometry")).toByteArray();
|
values.geometry = config.value(QStringLiteral("geometry")).toByteArray();
|
||||||
values.state = config.value(QStringLiteral("state")).toByteArray();
|
values.state = config.value(QStringLiteral("state")).toByteArray();
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "common/settings_enums.h"
|
#include "common/settings_enums.h"
|
||||||
#include "configuration/qt_config.h"
|
|
||||||
|
|
||||||
using Settings::Category;
|
using Settings::Category;
|
||||||
using Settings::ConfirmStop;
|
using Settings::ConfirmStop;
|
||||||
@ -216,7 +215,7 @@ extern Values values;
|
|||||||
u32 CalculateWidth(u32 height, Settings::AspectRatio ratio);
|
u32 CalculateWidth(u32 height, Settings::AspectRatio ratio);
|
||||||
|
|
||||||
void SaveWindowState();
|
void SaveWindowState();
|
||||||
void RestoreWindowState(std::unique_ptr<QtConfig>& qtConfig);
|
void RestoreWindowState();
|
||||||
|
|
||||||
// This shouldn't have anything except static initializers (no functions). So
|
// This shouldn't have anything except static initializers (no functions). So
|
||||||
// QKeySequence(...).toString() is NOT ALLOWED HERE.
|
// QKeySequence(...).toString() is NOT ALLOWED HERE.
|
||||||
|
Reference in New Issue
Block a user