Compare commits

...

5 Commits

Author SHA1 Message Date
Daniel Brodsky
fe0f272168 disable mouse-as-joystick options when mouse panning disabled 2021-10-11 09:26:57 -07:00
Daniel Brodsky
b55b44e36f changed unmodified variables to const 2021-10-11 09:13:29 -07:00
Daniel Brodsky
267e9a02b3 input_common/mouse_input: Add mouse-as-joystick option 2021-10-11 08:11:06 -07:00
Morph
97452b9558 Merge pull request #7110 from vonchenplus/fix_extract_offline_romefs_error
applets/web: Fallback to loader to get the manual romfs if none is found
2021-10-11 02:09:42 -04:00
Feng Chen
0ee2185c59 applets/web: Fallback to loader to get the manual romfs if none is found 2021-10-11 13:12:51 +08:00
8 changed files with 143 additions and 2 deletions

View File

@@ -519,6 +519,9 @@ struct Values {
BasicSetting<bool> mouse_panning{false, "mouse_panning"};
BasicRangedSetting<u8> mouse_panning_sensitivity{10, 1, 100, "mouse_panning_sensitivity"};
BasicSetting<bool> mouse_as_joystick{false, "mouse_as_joystick"};
BasicRangedSetting<u16> max_mouse_movement{500, 0, 65535, "max_mouse_movement"};
BasicRangedSetting<u8> mouse_as_joystick_deadzone{20, 1, 100, "mouse_as_joystick_deadzone"};
BasicSetting<bool> mouse_enabled{false, "mouse_enabled"};
std::string mouse_device;
MouseButtonsRaw mouse_buttons;

View File

@@ -24,6 +24,7 @@
#include "core/hle/service/am/applets/applet_web_browser.h"
#include "core/hle/service/filesystem/filesystem.h"
#include "core/hle/service/ns/pl_u.h"
#include "core/loader/loader.h"
namespace Service::AM::Applets {
@@ -122,6 +123,15 @@ FileSys::VirtualFile GetOfflineRomFS(Core::System& system, u64 title_id,
const auto nca = system.GetContentProvider().GetEntry(title_id, nca_type);
if (nca == nullptr) {
if (nca_type == FileSys::ContentRecordType::HtmlDocument) {
LOG_WARNING(Service_AM, "Falling back to AppLoader to get the RomFS.");
FileSys::VirtualFile romfs;
system.GetAppLoader().ReadManualRomFS(romfs);
if (romfs != nullptr) {
return romfs;
}
}
LOG_ERROR(Service_AM,
"NCA of type={} with title_id={:016X} is not found in the ContentProvider!",
nca_type, title_id);

View File

@@ -32,6 +32,30 @@ void Mouse::UpdateThread(std::stop_token stop_token) {
info.tilt_speed = 0;
info.data.motion = info.motion.GetMotion();
if (Settings::values.mouse_panning) {
if (Settings::values.mouse_as_joystick) {
float axis_x = 0.0f;
float axis_y = 0.0f;
const float max_mouse_movement =
static_cast<float>(Settings::values.max_mouse_movement.GetValue());
const float deadzone = Settings::values.mouse_as_joystick_deadzone.GetValue() /
100.0f * max_mouse_movement;
if (fabs(info.last_mouse_change.x) > deadzone) {
axis_x = info.last_mouse_change.x -
(info.last_mouse_change.x > 0 ? deadzone : -deadzone);
axis_x /= max_mouse_movement;
axis_x *= 8;
}
if (fabs(info.last_mouse_change.y) > deadzone) {
axis_y = info.last_mouse_change.y -
(info.last_mouse_change.y > 0 ? deadzone : -deadzone);
axis_y /= max_mouse_movement;
axis_y *= 8;
}
info.data.axis = {static_cast<int>(16 * axis_x),
static_cast<int>(16 * -axis_y)};
continue;
}
info.last_mouse_change *= 0.96f;
info.data.axis = {static_cast<int>(16 * info.last_mouse_change.x),
static_cast<int>(16 * -info.last_mouse_change.y)};
@@ -40,8 +64,10 @@ void Mouse::UpdateThread(std::stop_token stop_token) {
if (configuring) {
UpdateYuzuSettings();
}
if (mouse_panning_timout++ > 20) {
StopPanning();
if (!Settings::values.mouse_as_joystick) {
if (mouse_panning_timout++ > 20) {
StopPanning();
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(update_time));
}
@@ -92,6 +118,19 @@ void Mouse::MouseMove(int x, int y, int center_x, int center_y) {
if (mouse_change.y == 0 && mouse_change.x == 0) {
continue;
}
if (Settings::values.mouse_as_joystick) {
info.last_mouse_change += mouse_change;
const float max_mouse_movement =
static_cast<float>(Settings::values.max_mouse_movement.GetValue());
info.last_mouse_change = {
std::clamp(info.last_mouse_change.x, -max_mouse_movement, max_mouse_movement),
std::clamp(info.last_mouse_change.y, -max_mouse_movement, max_mouse_movement)};
info.tilt_direction = info.last_mouse_change;
info.tilt_speed = info.tilt_direction.Normalize() * info.sensitivity;
continue;
}
const auto mouse_change_length = mouse_change.Length();
if (mouse_change_length < 3.0f) {
mouse_change /= mouse_change_length / 3.0f;

View File

@@ -4,6 +4,7 @@
#pragma once
#include <algorithm>
#include <array>
#include <mutex>
#include <stop_token>

View File

@@ -570,6 +570,9 @@ void Config::ReadControlValues() {
ReadBasicSetting(Settings::values.emulate_analog_keyboard);
Settings::values.mouse_panning = false;
ReadBasicSetting(Settings::values.mouse_panning_sensitivity);
ReadBasicSetting(Settings::values.mouse_as_joystick);
ReadBasicSetting(Settings::values.max_mouse_movement);
ReadBasicSetting(Settings::values.mouse_as_joystick_deadzone);
ReadBasicSetting(Settings::values.tas_enable);
ReadBasicSetting(Settings::values.tas_loop);
@@ -1204,6 +1207,9 @@ void Config::SaveControlValues() {
WriteBasicSetting(Settings::values.keyboard_enabled);
WriteBasicSetting(Settings::values.emulate_analog_keyboard);
WriteBasicSetting(Settings::values.mouse_panning_sensitivity);
WriteBasicSetting(Settings::values.mouse_as_joystick);
WriteBasicSetting(Settings::values.max_mouse_movement);
WriteBasicSetting(Settings::values.mouse_as_joystick_deadzone);
WriteBasicSetting(Settings::values.tas_enable);
WriteBasicSetting(Settings::values.tas_loop);

View File

@@ -73,6 +73,8 @@ ConfigureInputAdvanced::ConfigureInputAdvanced(QWidget* parent)
}
}
connect(ui->mouse_panning, &QCheckBox::stateChanged, this,
&ConfigureInputAdvanced::UpdateUIEnabled);
connect(ui->mouse_enabled, &QCheckBox::stateChanged, this,
&ConfigureInputAdvanced::UpdateUIEnabled);
connect(ui->debug_enabled, &QCheckBox::stateChanged, this,
@@ -129,6 +131,10 @@ void ConfigureInputAdvanced::ApplyConfiguration() {
Settings::values.mouse_panning = ui->mouse_panning->isChecked();
Settings::values.mouse_panning_sensitivity =
static_cast<float>(ui->mouse_panning_sensitivity->value());
Settings::values.mouse_as_joystick = ui->mouse_as_joystick->isChecked();
Settings::values.max_mouse_movement = static_cast<float>(ui->max_mouse_movement->value());
Settings::values.mouse_as_joystick_deadzone =
static_cast<float>(ui->mouse_as_joystick_deadzone->value());
Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked();
Settings::values.enable_raw_input = ui->enable_raw_input->isChecked();
}
@@ -159,6 +165,10 @@ void ConfigureInputAdvanced::LoadConfiguration() {
ui->emulate_analog_keyboard->setChecked(Settings::values.emulate_analog_keyboard.GetValue());
ui->mouse_panning->setChecked(Settings::values.mouse_panning.GetValue());
ui->mouse_panning_sensitivity->setValue(Settings::values.mouse_panning_sensitivity.GetValue());
ui->mouse_as_joystick->setChecked(Settings::values.mouse_as_joystick.GetValue());
ui->max_mouse_movement->setValue(Settings::values.max_mouse_movement.GetValue());
ui->mouse_as_joystick_deadzone->setValue(
Settings::values.mouse_as_joystick_deadzone.GetValue());
ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled);
ui->enable_raw_input->setChecked(Settings::values.enable_raw_input.GetValue());
@@ -181,4 +191,7 @@ void ConfigureInputAdvanced::UpdateUIEnabled() {
ui->mouse_advanced->setEnabled(ui->mouse_enabled->isChecked());
ui->debug_configure->setEnabled(ui->debug_enabled->isChecked());
ui->touchscreen_advanced->setEnabled(ui->touchscreen_enabled->isChecked());
ui->mouse_as_joystick->setEnabled(ui->mouse_panning->isChecked());
ui->max_mouse_movement->setEnabled(ui->mouse_panning->isChecked());
ui->mouse_as_joystick_deadzone->setEnabled(ui->mouse_panning->isChecked());
}

View File

@@ -2688,6 +2688,63 @@
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="mouse_as_joystick">
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Enable mouse-as-joystick (requires mouse panning)</string>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QSpinBox" name="max_mouse_movement">
<property name="toolTip">
<string>Max mouse movement</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="suffix">
<string>M</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>65536</number>
</property>
<property name="value">
<number>500</number>
</property>
</widget>
</item>
<item row="10" column="2">
<widget class="QSpinBox" name="mouse_as_joystick_deadzone">
<property name="toolTip">
<string>Mouse joystick deadzone</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>20</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View File

@@ -122,6 +122,18 @@ mouse_panning =
# Default: 1.0
mouse_panning_sensitivity =
# Mouse-controlled axis moves like a joystick (requires mouse_panning)
# 0 (default): Off, 1: On
mouse_as_joystick =
# Maximum surface area mouse-as-joystick can move
# Default: 500.0
max_mouse_movement =
# Size of mouse center area where controlled axis is set to 0
# Default: 0.2
mouse_as_joystick_deadzone =
# Emulate an analog control stick from keyboard inputs.
# 0 (default): Disabled, 1: Enabled
emulate_analog_keyboard =