Skip to content

Commit 13f6622

Browse files
Merge remote-tracking branch 'origin/dsTouchpad' into my_master
2 parents 89cc276 + 723b54b commit 13f6622

File tree

11 files changed

+183
-11
lines changed

11 files changed

+183
-11
lines changed

src/citra_qt/configuration/config.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,14 @@ void QtConfig::ReadControlValues() {
403403
ReadSetting(QStringLiteral("touch_device"), QStringLiteral("engine:emu_window"))
404404
.toString()
405405
.toStdString();
406+
profile.controller_touch_device =
407+
ReadSetting(QStringLiteral("controller_touch_device"),QStringLiteral(""))
408+
.toString()
409+
.toStdString();
406410
profile.use_touch_from_button =
407411
ReadSetting(QStringLiteral("use_touch_from_button"), false).toBool();
412+
profile.use_touchpad =
413+
ReadSetting(QStringLiteral("use_touchpad"), false).toBool();
408414
profile.touch_from_button_map_index =
409415
ReadSetting(QStringLiteral("touch_from_button_map"), 0).toInt();
410416
profile.touch_from_button_map_index =
@@ -990,6 +996,8 @@ void QtConfig::SaveControlValues() {
990996
WriteSetting(QStringLiteral("touch_device"), QString::fromStdString(profile.touch_device),
991997
QStringLiteral("engine:emu_window"));
992998
WriteSetting(QStringLiteral("use_touch_from_button"), profile.use_touch_from_button, false);
999+
WriteSetting(QStringLiteral("use_touchpad"), profile.use_touchpad, false);
1000+
WriteSetting(QStringLiteral("controller_touch_device"), QString::fromStdString(profile.controller_touch_device), QStringLiteral(""));
9931001
WriteSetting(QStringLiteral("touch_from_button_map"), profile.touch_from_button_map_index,
9941002
0);
9951003
WriteSetting(QStringLiteral("udp_input_address"),

src/citra_qt/configuration/configure_motion_touch.cpp

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ void ConfigureMotionTouch::SetConfiguration() {
139139
ui->touch_provider->findData(QString::fromStdString(touch_engine)));
140140
ui->touch_from_button_checkbox->setChecked(
141141
Settings::values.current_input_profile.use_touch_from_button);
142+
ui->touchpad_checkbox->setChecked(
143+
Settings::values.current_input_profile.use_touchpad);
142144
touch_from_button_maps = Settings::values.touch_from_button_maps;
143145
for (const auto& touch_map : touch_from_button_maps) {
144146
ui->touch_from_button_map->addItem(QString::fromStdString(touch_map.name));
@@ -164,7 +166,9 @@ void ConfigureMotionTouch::SetConfiguration() {
164166
void ConfigureMotionTouch::UpdateUiDisplay() {
165167
const std::string motion_engine = ui->motion_provider->currentData().toString().toStdString();
166168
const std::string touch_engine = ui->touch_provider->currentData().toString().toStdString();
167-
169+
ui->touchpad_config_btn->setEnabled(
170+
ui->touchpad_checkbox->isChecked()
171+
);
168172
if (motion_engine == "motion_emu") {
169173
ui->motion_sensitivity_label->setVisible(true);
170174
ui->motion_sensitivity->setVisible(true);
@@ -229,6 +233,32 @@ void ConfigureMotionTouch::ConnectEvents() {
229233
poll_timer->start(200); // Check for new inputs every 200ms
230234
}
231235
});
236+
connect(ui->touchpad_checkbox,&QCheckBox::checkStateChanged, this, [this]() {UpdateUiDisplay(); });
237+
connect(ui->touchpad_config_btn, &QPushButton::clicked, this, [this]() {
238+
if (QMessageBox::information(this, tr("Information"),
239+
tr("After pressing OK, tap the trackpad on the controller"
240+
"that you want to track."),
241+
QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
242+
ui->touchpad_config_btn->setText(tr("[press touchpad]"));
243+
ui->touchpad_config_btn->setFocus();
244+
245+
input_setter = [this](const Common::ParamPackage& params) {
246+
tpguid = params.Get("guid", "0");
247+
tpport = params.Get("port", 0);
248+
tp = params.Get("touchpad",0);
249+
};
250+
251+
device_pollers =
252+
InputCommon::Polling::GetPollers(InputCommon::Polling::DeviceType::Touchpad);
253+
254+
for (auto& poller : device_pollers) {
255+
poller->Start();
256+
}
257+
258+
timeout_timer->start(5000); // Cancel after 5 seconds
259+
poll_timer->start(200); // Check for new inputs every 200ms
260+
}
261+
});
232262
connect(ui->udp_test, &QPushButton::clicked, this, &ConfigureMotionTouch::OnCemuhookUDPTest);
233263
connect(ui->touch_calibration_config, &QPushButton::clicked, this,
234264
&ConfigureMotionTouch::OnConfigureTouchCalibration);
@@ -253,7 +283,7 @@ void ConfigureMotionTouch::SetPollingResult(const Common::ParamPackage& params,
253283
if (!abort && input_setter) {
254284
(*input_setter)(params);
255285
}
256-
286+
ui->touchpad_config_btn->setText(tr("Configure"));
257287
ui->motion_controller_button->setText(tr("Configure"));
258288
input_setter.reset();
259289
}
@@ -291,7 +321,6 @@ void ConfigureMotionTouch::OnConfigureTouchCalibration() {
291321
"UDP touchpad calibration config success: min_x={}, min_y={}, max_x={}, max_y={}",
292322
min_x, min_y, max_x, max_y);
293323
UpdateUiDisplay();
294-
} else {
295324
LOG_ERROR(Frontend, "UDP touchpad calibration config failed");
296325
}
297326
ui->touch_calibration_config->setEnabled(true);
@@ -374,12 +403,22 @@ void ConfigureMotionTouch::ApplyConfiguration() {
374403
touch_param.Set("max_y", max_y);
375404
}
376405

406+
Common::ParamPackage touchpad_param{};
407+
if (ui->touchpad_checkbox->isChecked()) {
408+
touchpad_param.Set("engine", "sdl");
409+
touchpad_param.Set("guid", tpguid);
410+
touchpad_param.Set("port", tpport);
411+
touchpad_param.Set("touchpad",tp);
412+
}
377413
Settings::values.current_input_profile.motion_device = motion_param.Serialize();
378414
Settings::values.current_input_profile.touch_device = touch_param.Serialize();
379415
Settings::values.current_input_profile.use_touch_from_button =
380416
ui->touch_from_button_checkbox->isChecked();
381417
Settings::values.current_input_profile.touch_from_button_map_index =
382418
ui->touch_from_button_map->currentIndex();
419+
Settings::values.current_input_profile.use_touchpad =
420+
ui->touchpad_checkbox->isChecked();
421+
Settings::values.current_input_profile.controller_touch_device = touchpad_param.Serialize();
383422
Settings::values.touch_from_button_maps = touch_from_button_maps;
384423
Settings::values.current_input_profile.udp_input_address = ui->udp_server->text().toStdString();
385424
Settings::values.current_input_profile.udp_input_port =

src/citra_qt/configuration/configure_motion_touch.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ private slots:
7676
// Used for SDL input polling
7777
std::string guid;
7878
int port;
79+
std::string tpguid; // guid for touchpad
80+
int tpport; //port for touchpad
81+
int tp; //which touchpad
7982
std::unique_ptr<QTimer> timeout_timer;
8083
std::unique_ptr<QTimer> poll_timer;
8184
std::vector<std::unique_ptr<InputCommon::Polling::DevicePoller>> device_pollers;

src/citra_qt/configuration/configure_motion_touch.ui

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
<ui version="4.0">
33
<class>ConfigureMotionTouch</class>
44
<widget class="QDialog" name="ConfigureMotionTouch">
5-
<property name="windowTitle">
6-
<string>Configure Motion / Touch</string>
7-
</property>
85
<property name="geometry">
96
<rect>
107
<x>0</x>
118
<y>0</y>
12-
<width>500</width>
13-
<height>450</height>
9+
<width>517</width>
10+
<height>659</height>
1411
</rect>
1512
</property>
13+
<property name="windowTitle">
14+
<string>Configure Motion / Touch</string>
15+
</property>
1616
<layout class="QVBoxLayout">
1717
<item>
1818
<widget class="QGroupBox" name="motion_group_box">
@@ -175,6 +175,24 @@
175175
</item>
176176
</layout>
177177
</item>
178+
<item>
179+
<layout class="QHBoxLayout" name="touchpad_hlayout">
180+
<item>
181+
<widget class="QCheckBox" name="touchpad_checkbox">
182+
<property name="text">
183+
<string>Use controller (e.g. DualSense) touchpad</string>
184+
</property>
185+
</widget>
186+
</item>
187+
<item alignment="Qt::AlignRight">
188+
<widget class="QPushButton" name="touchpad_config_btn">
189+
<property name="text">
190+
<string>Configure</string>
191+
</property>
192+
</widget>
193+
</item>
194+
</layout>
195+
</item>
178196
</layout>
179197
</widget>
180198
</item>
@@ -324,4 +342,5 @@
324342
</layout>
325343
</widget>
326344
<resources/>
345+
<connections/>
327346
</ui>

src/citra_sdl/config.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ void SdlConfig::ReadValues() {
121121
"engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0");
122122
Settings::values.current_input_profile.touch_device =
123123
sdl2_config->GetString("Controls", "touch_device", "engine:emu_window");
124+
Settings::values.current_input_profile.controller_touch_device =
125+
sdl2_config->GetString("Controls","controller_touch_device","");
124126
Settings::values.current_input_profile.udp_input_address = sdl2_config->GetString(
125127
"Controls", "udp_input_address", InputCommon::CemuhookUDP::DEFAULT_ADDR);
126128
Settings::values.current_input_profile.udp_input_port =

src/common/settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ struct InputProfile {
431431
std::array<std::string, NativeAnalog::NumAnalogs> analogs;
432432
std::string motion_device;
433433
std::string touch_device;
434+
std::string controller_touch_device;
435+
bool use_touchpad;
434436
bool use_touch_from_button;
435437
int touch_from_button_map_index;
436438
std::string udp_input_address;

src/core/hle/service/hid/hid.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ DirectionState GetStickDirectionState(s16 circle_pad_x, s16 circle_pad_y) {
115115
}
116116

117117
void Module::LoadInputDevices() {
118+
LOG_DEBUG(Frontend,"Loading input devices");
118119
std::transform(Settings::values.current_input_profile.buttons.begin() +
119120
Settings::NativeButton::BUTTON_HID_BEGIN,
120121
Settings::values.current_input_profile.buttons.begin() +
@@ -126,6 +127,12 @@ void Module::LoadInputDevices() {
126127
Settings::values.current_input_profile.motion_device);
127128
touch_device = Input::CreateDevice<Input::TouchDevice>(
128129
Settings::values.current_input_profile.touch_device);
130+
if (Settings::values.current_input_profile.use_touchpad &&
131+
Settings::values.current_input_profile.controller_touch_device != "") {
132+
controller_touch_device = Input::CreateDevice<Input::TouchDevice>(Settings::values.current_input_profile.controller_touch_device);
133+
} else {
134+
controller_touch_device.reset();
135+
}
129136
if (Settings::values.current_input_profile.use_touch_from_button) {
130137
touch_btn_device = Input::CreateDevice<Input::TouchDevice>("engine:touch_from_button");
131138
} else {
@@ -278,6 +285,9 @@ void Module::UpdatePadCallback(std::uintptr_t user_data, s64 cycles_late) {
278285
if (!pressed && touch_btn_device) {
279286
std::tie(x, y, pressed) = touch_btn_device->GetStatus();
280287
}
288+
if (!pressed && controller_touch_device) {
289+
std::tie(x,y,pressed) = controller_touch_device->GetStatus();
290+
}
281291
touch_entry.x = static_cast<u16>(x * Core::kScreenBottomWidth);
282292
touch_entry.y = static_cast<u16>(y * Core::kScreenBottomHeight);
283293
touch_entry.valid.Assign(pressed ? 1 : 0);

src/core/hle/service/hid/hid.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ class Module final {
390390
buttons;
391391
std::unique_ptr<Input::AnalogDevice> circle_pad;
392392
std::unique_ptr<Input::MotionDevice> motion_device;
393+
std::unique_ptr<Input::TouchDevice> controller_touch_device;
393394
std::unique_ptr<Input::TouchDevice> touch_device;
394395
std::unique_ptr<Input::TouchDevice> touch_btn_device;
395396

src/input_common/main.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ void ReloadInputDevices();
4545

4646
namespace Polling {
4747

48-
enum class DeviceType { Button, Analog };
48+
enum class DeviceType { Button, Analog, Touchpad};
4949

5050
/**
5151
* A class that can be used to get inputs from an input device like controllers without having to

0 commit comments

Comments
 (0)