yuzu-emu
/
yuzu-mainline
Archived
1
0
Fork 0

configure_input: Add per-player vibration

Allows for enabling and modifying vibration and vibration strength per player.
Also adds a toggle for enabling/disabling accurate vibrations.

Co-authored-by: Its-Rei <kupfel@gmail.com>
This commit is contained in:
Morph 2020-10-17 09:38:12 -04:00
parent d6a41cfc21
commit 38110dd485
18 changed files with 751 additions and 30 deletions

View File

@ -1293,15 +1293,24 @@ QPushButton#buttonRefreshDevices {
QSpinBox#spinboxLStickRange, QSpinBox#spinboxLStickRange,
QSpinBox#spinboxRStickRange, QSpinBox#spinboxRStickRange,
QSpinBox#vibrationSpin { QSpinBox#vibrationSpinPlayer1,
QSpinBox#vibrationSpinPlayer2,
QSpinBox#vibrationSpinPlayer3,
QSpinBox#vibrationSpinPlayer4,
QSpinBox#vibrationSpinPlayer5,
QSpinBox#vibrationSpinPlayer6,
QSpinBox#vibrationSpinPlayer7,
QSpinBox#vibrationSpinPlayer8 {
min-width: 68px; min-width: 68px;
} }
QDialog#ConfigureVibration QGroupBox::indicator,
QGroupBox#motionGroup::indicator, QGroupBox#motionGroup::indicator,
QGroupBox#vibrationGroup::indicator { QGroupBox#vibrationGroup::indicator {
margin-left: 0px; margin-left: 0px;
} }
QDialog#ConfigureVibration QGroupBox::title,
QGroupBox#motionGroup::title, QGroupBox#motionGroup::title,
QGroupBox#vibrationGroup::title { QGroupBox#vibrationGroup::title {
spacing: 2px; spacing: 2px;

View File

@ -2200,21 +2200,31 @@ QPushButton#buttonRefreshDevices {
QSpinBox#spinboxLStickRange, QSpinBox#spinboxLStickRange,
QSpinBox#spinboxRStickRange, QSpinBox#spinboxRStickRange,
QSpinBox#vibrationSpin { QSpinBox#vibrationSpinPlayer1,
QSpinBox#vibrationSpinPlayer2,
QSpinBox#vibrationSpinPlayer3,
QSpinBox#vibrationSpinPlayer4,
QSpinBox#vibrationSpinPlayer5,
QSpinBox#vibrationSpinPlayer6,
QSpinBox#vibrationSpinPlayer7,
QSpinBox#vibrationSpinPlayer8 {
min-width: 68px; min-width: 68px;
} }
QDialog#ConfigureVibration QGroupBox::indicator,
QGroupBox#motionGroup::indicator, QGroupBox#motionGroup::indicator,
QGroupBox#vibrationGroup::indicator { QGroupBox#vibrationGroup::indicator {
margin-left: 0px; margin-left: 0px;
} }
QDialog#ConfigureVibration QGroupBox,
QWidget#bottomPerGameInput QGroupBox#motionGroup, QWidget#bottomPerGameInput QGroupBox#motionGroup,
QWidget#bottomPerGameInput QGroupBox#vibrationGroup, QWidget#bottomPerGameInput QGroupBox#vibrationGroup,
QWidget#bottomPerGameInput QGroupBox#inputConfigGroup { QWidget#bottomPerGameInput QGroupBox#inputConfigGroup {
padding: 0px; padding: 0px;
} }
QDialog#ConfigureVibration QGroupBox::title,
QGroupBox#motionGroup::title, QGroupBox#motionGroup::title,
QGroupBox#vibrationGroup::title { QGroupBox#vibrationGroup::title {
spacing: 2px; spacing: 2px;

View File

@ -680,11 +680,19 @@ bool Controller_NPad::VibrateControllerAtIndex(std::size_t npad_index,
return false; return false;
} }
const auto& player = Settings::values.players.GetValue()[npad_index];
if (!player.vibration_enabled) {
return false;
}
using namespace Settings::NativeButton; using namespace Settings::NativeButton;
const auto& button_state = buttons[npad_index]; const auto& button_state = buttons[npad_index];
return button_state[A - BUTTON_HID_BEGIN]->SetRumblePlay( return button_state[A - BUTTON_HID_BEGIN]->SetRumblePlay(
vibration_value.amp_low, vibration_value.freq_low, vibration_value.amp_high, std::min(vibration_value.amp_low * player.vibration_strength / 100.0f, 1.0f),
vibration_value.freq_low,
std::min(vibration_value.amp_high * player.vibration_strength / 100.0f, 1.0f),
vibration_value.freq_high); vibration_value.freq_high);
} }
@ -728,7 +736,8 @@ void Controller_NPad::VibrateControllers(const std::vector<DeviceHandle>& vibrat
} }
// Filter out non-zero vibrations that are within 0.015625 absolute amplitude of each other. // Filter out non-zero vibrations that are within 0.015625 absolute amplitude of each other.
if ((vibration_values[i].amp_low != 0.0f || vibration_values[i].amp_high != 0.0f) && if (!Settings::values.enable_accurate_vibrations.GetValue() &&
(vibration_values[i].amp_low != 0.0f || vibration_values[i].amp_high != 0.0f) &&
(latest_vibration_values[npad_index][device_index].amp_low != 0.0f || (latest_vibration_values[npad_index][device_index].amp_low != 0.0f ||
latest_vibration_values[npad_index][device_index].amp_high != 0.0f) && latest_vibration_values[npad_index][device_index].amp_high != 0.0f) &&
(abs(vibration_values[i].amp_low - (abs(vibration_values[i].amp_low -

View File

@ -170,6 +170,7 @@ struct Values {
Setting<bool> use_docked_mode; Setting<bool> use_docked_mode;
Setting<bool> vibration_enabled; Setting<bool> vibration_enabled;
Setting<bool> enable_accurate_vibrations;
Setting<bool> motion_enabled; Setting<bool> motion_enabled;
std::string motion_device; std::string motion_device;

View File

@ -332,6 +332,9 @@ struct PlayerInput {
AnalogsRaw analogs; AnalogsRaw analogs;
MotionRaw motions; MotionRaw motions;
bool vibration_enabled;
int vibration_strength;
u32 body_color_left; u32 body_color_left;
u32 body_color_right; u32 body_color_right;
u32 button_color_left; u32 button_color_left;

View File

@ -105,6 +105,9 @@ add_executable(yuzu
configuration/configure_ui.cpp configuration/configure_ui.cpp
configuration/configure_ui.h configuration/configure_ui.h
configuration/configure_ui.ui configuration/configure_ui.ui
configuration/configure_vibration.cpp
configuration/configure_vibration.h
configuration/configure_vibration.ui
configuration/configure_web.cpp configuration/configure_web.cpp
configuration/configure_web.h configuration/configure_web.h
configuration/configure_web.ui configuration/configure_web.ui

View File

@ -14,6 +14,7 @@
#include "ui_controller.h" #include "ui_controller.h"
#include "yuzu/applets/controller.h" #include "yuzu/applets/controller.h"
#include "yuzu/configuration/configure_input_dialog.h" #include "yuzu/configuration/configure_input_dialog.h"
#include "yuzu/configuration/configure_vibration.h"
#include "yuzu/main.h" #include "yuzu/main.h"
namespace { namespace {
@ -223,6 +224,9 @@ QtControllerSelectorDialog::QtControllerSelectorDialog(
} }
} }
connect(ui->vibrationButton, &QPushButton::clicked, this,
&QtControllerSelectorDialog::CallConfigureVibrationDialog);
connect(ui->inputConfigButton, &QPushButton::clicked, this, connect(ui->inputConfigButton, &QPushButton::clicked, this,
&QtControllerSelectorDialog::CallConfigureInputDialog); &QtControllerSelectorDialog::CallConfigureInputDialog);
@ -285,6 +289,18 @@ void QtControllerSelectorDialog::LoadConfiguration() {
ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue()); ui->motionGroup->setChecked(Settings::values.motion_enabled.GetValue());
} }
void QtControllerSelectorDialog::CallConfigureVibrationDialog() {
ConfigureVibration dialog(this);
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
Qt::WindowSystemMenuHint);
dialog.setWindowModality(Qt::WindowModal);
if (dialog.exec() == QDialog::Accepted) {
dialog.ApplyConfiguration();
}
}
void QtControllerSelectorDialog::CallConfigureInputDialog() { void QtControllerSelectorDialog::CallConfigureInputDialog() {
const auto max_supported_players = parameters.enable_single_mode ? 1 : parameters.max_players; const auto max_supported_players = parameters.enable_single_mode ? 1 : parameters.max_players;

View File

@ -42,6 +42,9 @@ private:
// Loads the current input configuration into the frontend applet. // Loads the current input configuration into the frontend applet.
void LoadConfiguration(); void LoadConfiguration();
// Initializes the "Configure Vibration" Dialog.
void CallConfigureVibrationDialog();
// Initializes the "Configure Input" Dialog. // Initializes the "Configure Input" Dialog.
void CallConfigureInputDialog(); void CallConfigureInputDialog();

View File

@ -2329,11 +2329,11 @@
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<widget class="QSpinBox" name="vibrationSpin"> <widget class="QPushButton" name="vibrationButton">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>68</width> <width>68</width>
<height>21</height> <height>0</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
@ -2342,17 +2342,11 @@
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="suffix"> <property name="styleSheet">
<string>%</string> <string notr="true">min-width: 68px;</string>
</property> </property>
<property name="minimum"> <property name="text">
<number>1</number> <string>Configure</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -300,6 +300,14 @@ void Config::ReadPlayerValue(std::size_t player_index) {
static_cast<u8>(Settings::ControllerType::ProController)) static_cast<u8>(Settings::ControllerType::ProController))
.toUInt()); .toUInt());
player.vibration_enabled =
qt_config->value(QStringLiteral("%1vibration_enabled").arg(player_prefix), true)
.toBool();
player.vibration_strength =
qt_config->value(QStringLiteral("%1vibration_strength").arg(player_prefix), 100)
.toInt();
player.body_color_left = qt_config player.body_color_left = qt_config
->value(QStringLiteral("%1body_color_left").arg(player_prefix), ->value(QStringLiteral("%1body_color_left").arg(player_prefix),
Settings::JOYCON_BODY_NEON_BLUE) Settings::JOYCON_BODY_NEON_BLUE)
@ -493,6 +501,8 @@ void Config::ReadControlValues() {
ReadSettingGlobal(Settings::values.use_docked_mode, QStringLiteral("use_docked_mode"), false); ReadSettingGlobal(Settings::values.use_docked_mode, QStringLiteral("use_docked_mode"), false);
ReadSettingGlobal(Settings::values.vibration_enabled, QStringLiteral("vibration_enabled"), ReadSettingGlobal(Settings::values.vibration_enabled, QStringLiteral("vibration_enabled"),
true); true);
ReadSettingGlobal(Settings::values.enable_accurate_vibrations,
QStringLiteral("enable_accurate_vibrations"), false);
ReadSettingGlobal(Settings::values.motion_enabled, QStringLiteral("motion_enabled"), true); ReadSettingGlobal(Settings::values.motion_enabled, QStringLiteral("motion_enabled"), true);
qt_config->endGroup(); qt_config->endGroup();
@ -983,6 +993,10 @@ void Config::SavePlayerValue(std::size_t player_index) {
if (!player_prefix.isEmpty()) { if (!player_prefix.isEmpty()) {
WriteSetting(QStringLiteral("%1connected").arg(player_prefix), player.connected, false); WriteSetting(QStringLiteral("%1connected").arg(player_prefix), player.connected, false);
WriteSetting(QStringLiteral("%1vibration_enabled").arg(player_prefix),
player.vibration_enabled, true);
WriteSetting(QStringLiteral("%1vibration_strength").arg(player_prefix),
player.vibration_strength, 100);
WriteSetting(QStringLiteral("%1body_color_left").arg(player_prefix), player.body_color_left, WriteSetting(QStringLiteral("%1body_color_left").arg(player_prefix), player.body_color_left,
Settings::JOYCON_BODY_NEON_BLUE); Settings::JOYCON_BODY_NEON_BLUE);
WriteSetting(QStringLiteral("%1body_color_right").arg(player_prefix), WriteSetting(QStringLiteral("%1body_color_right").arg(player_prefix),
@ -1150,6 +1164,8 @@ void Config::SaveControlValues() {
WriteSettingGlobal(QStringLiteral("use_docked_mode"), Settings::values.use_docked_mode, false); WriteSettingGlobal(QStringLiteral("use_docked_mode"), Settings::values.use_docked_mode, false);
WriteSettingGlobal(QStringLiteral("vibration_enabled"), Settings::values.vibration_enabled, WriteSettingGlobal(QStringLiteral("vibration_enabled"), Settings::values.vibration_enabled,
true); true);
WriteSettingGlobal(QStringLiteral("enable_accurate_vibrations"),
Settings::values.enable_accurate_vibrations, false);
WriteSettingGlobal(QStringLiteral("motion_enabled"), Settings::values.motion_enabled, true); WriteSettingGlobal(QStringLiteral("motion_enabled"), Settings::values.motion_enabled, true);
WriteSetting(QStringLiteral("motion_device"), WriteSetting(QStringLiteral("motion_device"),
QString::fromStdString(Settings::values.motion_device), QString::fromStdString(Settings::values.motion_device),

View File

@ -23,6 +23,7 @@
#include "yuzu/configuration/configure_motion_touch.h" #include "yuzu/configuration/configure_motion_touch.h"
#include "yuzu/configuration/configure_mouse_advanced.h" #include "yuzu/configuration/configure_mouse_advanced.h"
#include "yuzu/configuration/configure_touchscreen_advanced.h" #include "yuzu/configuration/configure_touchscreen_advanced.h"
#include "yuzu/configuration/configure_vibration.h"
#include "yuzu/configuration/input_profiles.h" #include "yuzu/configuration/input_profiles.h"
namespace { namespace {
@ -156,6 +157,9 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,
CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);
}); });
connect(ui->vibrationButton, &QPushButton::clicked,
[this] { CallConfigureDialog<ConfigureVibration>(*this); });
connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] { connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] {
CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem);
}); });

View File

@ -6,7 +6,7 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>700</width> <width>680</width>
<height>540</height> <height>540</height>
</rect> </rect>
</property> </property>
@ -195,11 +195,11 @@
<number>3</number> <number>3</number>
</property> </property>
<item> <item>
<widget class="QSpinBox" name="vibrationSpin"> <widget class="QPushButton" name="vibrationButton">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>68</width> <width>68</width>
<height>21</height> <height>0</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
@ -208,17 +208,11 @@
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="suffix"> <property name="styleSheet">
<string>%</string> <string notr="true">min-width: 68px;</string>
</property> </property>
<property name="minimum"> <property name="text">
<number>1</number> <string>Configure</string>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>100</number>
</property> </property>
</widget> </widget>
</item> </item>
@ -272,7 +266,7 @@
</widget> </widget>
</item> </item>
<item alignment="Qt::AlignVCenter"> <item alignment="Qt::AlignVCenter">
<widget class="QWidget" name="widget" native="true"> <widget class="QWidget" name="connectedControllers" native="true">
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin"> <property name="leftMargin">
<number>5</number> <number>5</number>

View File

@ -0,0 +1,66 @@
// Copyright 2020 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include "core/settings.h"
#include "ui_configure_vibration.h"
#include "yuzu/configuration/configure_vibration.h"
ConfigureVibration::ConfigureVibration(QWidget* parent)
: QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) {
ui->setupUi(this);
vibration_groupboxes = {
ui->vibrationGroupPlayer1, ui->vibrationGroupPlayer2, ui->vibrationGroupPlayer3,
ui->vibrationGroupPlayer4, ui->vibrationGroupPlayer5, ui->vibrationGroupPlayer6,
ui->vibrationGroupPlayer7, ui->vibrationGroupPlayer8,
};
vibration_spinboxes = {
ui->vibrationSpinPlayer1, ui->vibrationSpinPlayer2, ui->vibrationSpinPlayer3,
ui->vibrationSpinPlayer4, ui->vibrationSpinPlayer5, ui->vibrationSpinPlayer6,
ui->vibrationSpinPlayer7, ui->vibrationSpinPlayer8,
};
const auto& players = Settings::values.players.GetValue();
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
vibration_groupboxes[i]->setChecked(players[i].vibration_enabled);
vibration_spinboxes[i]->setValue(players[i].vibration_strength);
}
ui->checkBoxAccurateVibration->setChecked(
Settings::values.enable_accurate_vibrations.GetValue());
if (!Settings::IsConfiguringGlobal()) {
ui->checkBoxAccurateVibration->setDisabled(true);
}
RetranslateUI();
}
ConfigureVibration::~ConfigureVibration() = default;
void ConfigureVibration::ApplyConfiguration() {
auto& players = Settings::values.players.GetValue();
for (std::size_t i = 0; i < NUM_PLAYERS; ++i) {
players[i].vibration_enabled = vibration_groupboxes[i]->isChecked();
players[i].vibration_strength = vibration_spinboxes[i]->value();
}
Settings::values.enable_accurate_vibrations.SetValue(
ui->checkBoxAccurateVibration->isChecked());
}
void ConfigureVibration::changeEvent(QEvent* event) {
if (event->type() == QEvent::LanguageChange) {
RetranslateUI();
}
QDialog::changeEvent(event);
}
void ConfigureVibration::RetranslateUI() {
ui->retranslateUi(this);
}

View File

@ -0,0 +1,40 @@
// Copyright 2020 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <array>
#include <memory>
#include <QDialog>
class QGroupBox;
class QSpinBox;
namespace Ui {
class ConfigureVibration;
}
class ConfigureVibration : public QDialog {
Q_OBJECT
public:
explicit ConfigureVibration(QWidget* parent);
~ConfigureVibration() override;
void ApplyConfiguration();
private:
void changeEvent(QEvent* event) override;
void RetranslateUI();
std::unique_ptr<Ui::ConfigureVibration> ui;
static constexpr std::size_t NUM_PLAYERS = 8;
// Groupboxes encapsulating the vibration strength spinbox.
std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes;
// Spinboxes representing the vibration strength percentage.
std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes;
};

View File

@ -0,0 +1,546 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ConfigureVibration</class>
<widget class="QDialog" name="ConfigureVibration">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>364</width>
<height>242</height>
</rect>
</property>
<property name="windowTitle">
<string>Configure Vibration</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<layout class="QVBoxLayout">
<item>
<widget class="QGroupBox" name="vibrationStrengthGroup">
<property name="title">
<string>Vibration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="0,0">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item>
<widget class="QWidget" name="player14Widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<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>
<widget class="QGroupBox" name="vibrationGroupPlayer1">
<property name="title">
<string>Player 1</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<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="QSpinBox" name="vibrationSpinPlayer1">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="vibrationGroupPlayer2">
<property name="title">
<string>Player 2</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<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="QSpinBox" name="vibrationSpinPlayer2">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="vibrationGroupPlayer3">
<property name="title">
<string>Player 3</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<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="QSpinBox" name="vibrationSpinPlayer3">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="vibrationGroupPlayer4">
<property name="title">
<string>Player 4</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_11">
<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="QSpinBox" name="vibrationSpinPlayer4">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="player58Widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<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>
<widget class="QGroupBox" name="vibrationGroupPlayer7">
<property name="title">
<string>Player 5</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<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="QSpinBox" name="vibrationSpinPlayer7">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="vibrationGroupPlayer8">
<property name="title">
<string>Player 6</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_15">
<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="QSpinBox" name="vibrationSpinPlayer8">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="vibrationGroupPlayer5">
<property name="title">
<string>Player 7</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<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="QSpinBox" name="vibrationSpinPlayer5">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="vibrationGroupPlayer6">
<property name="title">
<string>Player 8</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_13">
<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="QSpinBox" name="vibrationSpinPlayer6">
<property name="minimumSize">
<size>
<width>68</width>
<height>21</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>68</width>
<height>16777215</height>
</size>
</property>
<property name="suffix">
<string>%</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>150</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="vibrationSettingsGroup">
<property name="title">
<string>Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="checkBoxAccurateVibration">
<property name="text">
<string>Enable Accurate Vibration</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="spacerVibration">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>167</width>
<height>55</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBoxVibration">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBoxVibration</sender>
<signal>accepted()</signal>
<receiver>ConfigureVibration</receiver>
<slot>accept()</slot>
</connection>
<connection>
<sender>buttonBoxVibration</sender>
<signal>rejected()</signal>
<receiver>ConfigureVibration</receiver>
<slot>reject()</slot>
</connection>
</connections>
</ui>

View File

@ -290,6 +290,8 @@ void Config::ReadValues() {
Settings::values.vibration_enabled.SetValue( Settings::values.vibration_enabled.SetValue(
sdl2_config->GetBoolean("ControlsGeneral", "vibration_enabled", true)); sdl2_config->GetBoolean("ControlsGeneral", "vibration_enabled", true));
Settings::values.enable_accurate_vibrations.SetValue(
sdl2_config->GetBoolean("ControlsGeneral", "enable_accurate_vibrations", false));
Settings::values.motion_enabled.SetValue( Settings::values.motion_enabled.SetValue(
sdl2_config->GetBoolean("ControlsGeneral", "motion_enabled", true)); sdl2_config->GetBoolean("ControlsGeneral", "motion_enabled", true));
Settings::values.touchscreen.enabled = Settings::values.touchscreen.enabled =

View File

@ -69,6 +69,10 @@ rstick=
# 0: Disabled, 1 (default): Enabled # 0: Disabled, 1 (default): Enabled
vibration_enabled= vibration_enabled=
# Whether to enable or disable accurate vibrations
# 0 (default): Disabled, 1: Enabled
enable_accurate_vibrations=
# for motion input, the following devices are available: # for motion input, the following devices are available:
# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters: # - "motion_emu" (default) for emulating motion input from mouse input. Required parameters:
# - "update_period": update period in milliseconds (default to 100) # - "update_period": update period in milliseconds (default to 100)

View File

@ -76,6 +76,7 @@ void Config::ReadValues() {
} }
Settings::values.vibration_enabled.SetValue(true); Settings::values.vibration_enabled.SetValue(true);
Settings::values.enable_accurate_vibrations.SetValue(false);
Settings::values.motion_enabled.SetValue(true); Settings::values.motion_enabled.SetValue(true);
Settings::values.touchscreen.enabled = ""; Settings::values.touchscreen.enabled = "";
Settings::values.touchscreen.device = ""; Settings::values.touchscreen.device = "";