Compare commits

...

3 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
7 changed files with 133 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

@@ -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 =