Remapping gui improvements (#212)

* Unmap right-click, escape bindable, allow hor resizing

* clang
This commit is contained in:
rainmakerv2
2025-12-10 00:30:48 +08:00
committed by GitHub
parent 42e17a1839
commit 4b529141f7
12 changed files with 688 additions and 547 deletions

View File

@@ -376,6 +376,8 @@ set(QT_GUI src/qt_gui/about_dialog.cpp
src/qt_gui/version_dialog.ui
src/qt_gui/create_shortcut.cpp
src/qt_gui/create_shortcut.h
src/qt_gui/right_click_button.cpp
src/qt_gui/right_click_button.h
${RESOURCE_FILES}
${TRANSLATIONS}
${UPDATER}

View File

@@ -5,6 +5,7 @@
#include <QKeyEvent>
#include <QMessageBox>
#include <QPushButton>
#include "common/logging/log.h"
#include "common/path_util.h"
#include "control_settings.h"
@@ -19,8 +20,6 @@ ControlSettings::ControlSettings(std::shared_ptr<GameInfoClass> game_info_get,
ui(new Ui::ControlSettings) {
ui->setupUi(this);
this->setFixedWidth(this->width());
SDL_InitSubSystem(SDL_INIT_GAMEPAD);
SDL_InitSubSystem(SDL_INIT_EVENTS);
@@ -56,11 +55,19 @@ ControlSettings::ControlSettings(std::shared_ptr<GameInfoClass> game_info_get,
for (auto& button : ButtonsList) {
connect(button, &QPushButton::clicked, this,
[this, &button]() { StartTimer(button, true); });
connect(button, &QRightClickButton::rightClicked, this,
[this, &button]() { button->setText("unmapped"); });
}
for (auto& button : AxisList) {
connect(button, &QPushButton::clicked, this,
[this, &button]() { StartTimer(button, false); });
connect(button, &QRightClickButton::rightClicked, this, [this, &button]() {
button->setText("unmapped");
ConnectAxisInputs(button);
});
}
connect(ui->buttonBox, &QDialogButtonBox::clicked, this, [this](QAbstractButton* button) {
@@ -798,7 +805,7 @@ void ControlSettings::EnableMappingButtons() {
ui->buttonBox->button(QDialogButtonBox::RestoreDefaults)->setEnabled(true);
}
void ControlSettings::ConnectAxisInputs(QPushButton*& button) {
void ControlSettings::ConnectAxisInputs(QRightClickButton*& button) {
QString input = button->text();
if (button == ui->LStickUpButton) {
ui->LStickDownButton->setText(input);
@@ -819,7 +826,7 @@ void ControlSettings::ConnectAxisInputs(QPushButton*& button) {
}
}
void ControlSettings::StartTimer(QPushButton*& button, bool isButton) {
void ControlSettings::StartTimer(QRightClickButton*& button, bool isButton) {
MappingTimer = 3;
isButton ? EnableButtonMapping = true : EnableAxisMapping = true;
MappingCompleted = false;
@@ -836,7 +843,7 @@ void ControlSettings::StartTimer(QPushButton*& button, bool isButton) {
connect(timer, &QTimer::timeout, this, [this]() { CheckMapping(MappingButton); });
}
void ControlSettings::CheckMapping(QPushButton*& button) {
void ControlSettings::CheckMapping(QRightClickButton*& button) {
MappingTimer -= 1;
EnableButtonMapping
? button->setText(tr("Press a button") + " [" + QString::number(MappingTimer) + "]")

View File

@@ -4,8 +4,10 @@
#include <QDialog>
#include <SDL3/SDL.h>
#include <SDL3/SDL_gamepad.h>
#include "game_info.h"
#include "ipc/ipc_client.h"
#include "right_click_button.h"
#include "sdl_event_wrapper.h"
namespace Ui {
@@ -28,9 +30,9 @@ private Q_SLOTS:
void SaveControllerConfig(bool CloseOnSave);
void SetDefault();
void UpdateLightbarColor();
void CheckMapping(QPushButton*& button);
void StartTimer(QPushButton*& button, bool isButton);
void ConnectAxisInputs(QPushButton*& button);
void CheckMapping(QRightClickButton*& button);
void StartTimer(QRightClickButton*& button, bool isButton);
void ConnectAxisInputs(QRightClickButton*& button);
void ActiveControllerChanged(int value);
private:
@@ -52,8 +54,8 @@ private:
// use QMap instead of QSet to maintain order of inserted strings
QMap<int, QString> pressedButtons;
QList<QPushButton*> ButtonsList;
QList<QPushButton*> AxisList;
QList<QRightClickButton*> ButtonsList;
QList<QRightClickButton*> AxisList;
std::string RunningGameSerial;
bool GameRunning;
@@ -66,7 +68,7 @@ private:
int MappingTimer;
int gamepad_count;
QTimer* timer;
QPushButton* MappingButton;
QRightClickButton* MappingButton;
SDL_Gamepad* gamepad = nullptr;
SDL_JoystickID* gamepads;
SdlEventWrapper::Wrapper* RemapWrapper;

View File

@@ -12,7 +12,7 @@
<x>0</x>
<y>0</y>
<width>1124</width>
<height>857</height>
<height>904</height>
</rect>
</property>
<property name="windowTitle">
@@ -46,7 +46,7 @@
<x>0</x>
<y>0</y>
<width>1110</width>
<height>819</height>
<height>862</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
@@ -145,7 +145,7 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="DpadUpButton">
<widget class="QRightClickButton" name="DpadUpButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -181,7 +181,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="DpadLeftButton">
<widget class="QRightClickButton" name="DpadLeftButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -212,7 +212,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="DpadRightButton">
<widget class="QRightClickButton" name="DpadRightButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -260,7 +260,7 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="DpadDownButton">
<widget class="QRightClickButton" name="DpadDownButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -309,7 +309,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L1Button">
<widget class="QRightClickButton" name="L1Button">
<property name="text">
<string>unmapped</string>
</property>
@@ -340,7 +340,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L2Button">
<widget class="QRightClickButton" name="L2Button">
<property name="text">
<string>unmapped</string>
</property>
@@ -549,7 +549,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QPushButton" name="LStickUpButton">
<widget class="QRightClickButton" name="LStickUpButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -585,7 +585,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="LStickLeftButton">
<widget class="QRightClickButton" name="LStickLeftButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -598,7 +598,7 @@
<widget class="QGroupBox" name="gb_left_stick_right">
<property name="maximumSize">
<size>
<width>179</width>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
@@ -622,7 +622,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="LStickRightButton">
<widget class="QRightClickButton" name="LStickRightButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -670,7 +670,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QPushButton" name="LStickDownButton">
<widget class="QRightClickButton" name="LStickDownButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -967,7 +967,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L3Button">
<widget class="QRightClickButton" name="L3Button">
<property name="text">
<string>unmapped</string>
</property>
@@ -998,7 +998,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="OptionsButton">
<widget class="QRightClickButton" name="OptionsButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1035,7 +1035,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R3Button">
<widget class="QRightClickButton" name="R3Button">
<property name="text">
<string>unmapped</string>
</property>
@@ -1058,7 +1058,7 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QPushButton" name="TouchpadLeftButton">
<widget class="QRightClickButton" name="TouchpadLeftButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1077,7 +1077,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QPushButton" name="TouchpadCenterButton">
<widget class="QRightClickButton" name="TouchpadCenterButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1096,7 +1096,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QPushButton" name="TouchpadRightButton">
<widget class="QRightClickButton" name="TouchpadRightButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1167,7 +1167,7 @@
<widget class="QLabel" name="RLabel">
<property name="maximumSize">
<size>
<width>20</width>
<width>25</width>
<height>16777215</height>
</size>
</property>
@@ -1212,7 +1212,7 @@
<widget class="QLabel" name="GLabel">
<property name="maximumSize">
<size>
<width>20</width>
<width>25</width>
<height>16777215</height>
</size>
</property>
@@ -1260,7 +1260,7 @@
<widget class="QLabel" name="BLabel">
<property name="maximumSize">
<size>
<width>20</width>
<width>25</width>
<height>16777215</height>
</size>
</property>
@@ -1392,7 +1392,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="TriangleButton">
<widget class="QRightClickButton" name="TriangleButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1428,7 +1428,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="SquareButton">
<widget class="QRightClickButton" name="SquareButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1459,7 +1459,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="CircleButton">
<widget class="QRightClickButton" name="CircleButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1507,7 +1507,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QPushButton" name="CrossButton">
<widget class="QRightClickButton" name="CrossButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1556,7 +1556,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R1Button">
<widget class="QRightClickButton" name="R1Button">
<property name="text">
<string>unmapped</string>
</property>
@@ -1587,7 +1587,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R2Button">
<widget class="QRightClickButton" name="R2Button">
<property name="text">
<string>unmapped</string>
</property>
@@ -1799,7 +1799,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QPushButton" name="RStickUpButton">
<widget class="QRightClickButton" name="RStickUpButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1835,7 +1835,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="RStickLeftButton">
<widget class="QRightClickButton" name="RStickLeftButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1866,7 +1866,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="RStickRightButton">
<widget class="QRightClickButton" name="RStickRightButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1914,7 +1914,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="RStickDownButton">
<widget class="QRightClickButton" name="RStickDownButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1938,17 +1938,52 @@
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_23">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Tip: Unmap inputs with right-click</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="layoutDirection">
<enum>Qt::LayoutDirection::LeftToRight</enum>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QRightClickButton</class>
<extends>QPushButton</extends>
<header>src/qt_gui/right_click_button.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="../shadps4.qrc"/>
</resources>

View File

@@ -56,11 +56,17 @@ Hotkeys::Hotkeys(std::shared_ptr<IpcClient> ipc_client, bool isGameRunning, QWid
for (auto& button : PadButtonsList) {
connect(button, &QPushButton::clicked, this,
[this, &button]() { StartTimer(button, true); });
connect(button, &QRightClickButton::rightClicked, this,
[this, &button]() { button->setText("unmapped"); });
}
for (auto& button : KBButtonsList) {
connect(button, &QPushButton::clicked, this,
[this, &button]() { StartTimer(button, false); });
connect(button, &QRightClickButton::rightClicked, this,
[this, &button]() { button->setText("unmapped"); });
}
SdlEventWrapper::Wrapper::wrapperActive = true;
@@ -333,7 +339,7 @@ void Hotkeys::CheckGamePad() {
}
}
void Hotkeys::StartTimer(QPushButton*& button, bool isButton) {
void Hotkeys::StartTimer(QRightClickButton*& button, bool isButton) {
MappingTimer = 3;
MappingCompleted = false;
mapping = button->text();
@@ -348,7 +354,7 @@ void Hotkeys::StartTimer(QPushButton*& button, bool isButton) {
connect(timer, &QTimer::timeout, this, [this]() { CheckMapping(MappingButton); });
}
void Hotkeys::CheckMapping(QPushButton*& button) {
void Hotkeys::CheckMapping(QRightClickButton*& button) {
MappingTimer -= 1;
button->setText(tr("Waiting for inputs") + " [" + QString::number(MappingTimer) + "]");
@@ -385,396 +391,392 @@ void Hotkeys::SetMapping(QString input) {
bool Hotkeys::eventFilter(QObject* obj, QEvent* event) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Escape) {
if (EnableKBMapping || EnablePadMapping) {
SetMapping("unmapped");
CheckMapping(MappingButton);
}
return true;
} else {
if (EnableKBMapping) {
if (EnableKBMapping) {
if (pressedButtons.size() >= 3) {
return true;
}
switch (keyEvent->key()) {
// modifiers
case Qt::Key_Shift:
if (keyEvent->nativeScanCode() == LSHIFT_KEY) {
pressedButtons.insert(1, "lshift");
} else {
pressedButtons.insert(2, "rshift");
}
break;
case Qt::Key_Alt:
if (keyEvent->nativeScanCode() == LALT_KEY) {
pressedButtons.insert(3, "lalt");
} else {
pressedButtons.insert(4, "ralt");
}
break;
case Qt::Key_Control:
if (keyEvent->nativeScanCode() == LCTRL_KEY) {
pressedButtons.insert(5, "lctrl");
} else {
pressedButtons.insert(6, "rctrl");
}
break;
case Qt::Key_Meta:
#ifdef _WIN32
pressedButtons.insert(7, "lwin");
#else
pressedButtons.insert(7, "lmeta");
#endif
break;
// f keys
case Qt::Key_F1:
pressedButtons.insert(8, "f1");
break;
case Qt::Key_F2:
pressedButtons.insert(9, "f2");
break;
case Qt::Key_F3:
pressedButtons.insert(10, "f3");
break;
case Qt::Key_F4:
pressedButtons.insert(11, "f4");
break;
case Qt::Key_F5:
pressedButtons.insert(12, "f5");
break;
case Qt::Key_F6:
pressedButtons.insert(13, "f6");
break;
case Qt::Key_F7:
pressedButtons.insert(14, "f7");
break;
case Qt::Key_F8:
pressedButtons.insert(15, "f8");
break;
case Qt::Key_F9:
pressedButtons.insert(16, "f9");
break;
case Qt::Key_F10:
pressedButtons.insert(17, "f10");
break;
case Qt::Key_F11:
pressedButtons.insert(18, "f11");
break;
case Qt::Key_F12:
pressedButtons.insert(19, "f12");
break;
// alphanumeric
case Qt::Key_A:
pressedButtons.insert(20, "a");
break;
case Qt::Key_B:
pressedButtons.insert(21, "b");
break;
case Qt::Key_C:
pressedButtons.insert(22, "c");
break;
case Qt::Key_D:
pressedButtons.insert(23, "d");
break;
case Qt::Key_E:
pressedButtons.insert(24, "e");
break;
case Qt::Key_F:
pressedButtons.insert(25, "f");
break;
case Qt::Key_G:
pressedButtons.insert(26, "g");
break;
case Qt::Key_H:
pressedButtons.insert(27, "h");
break;
case Qt::Key_I:
pressedButtons.insert(28, "i");
break;
case Qt::Key_J:
pressedButtons.insert(29, "j");
break;
case Qt::Key_K:
pressedButtons.insert(30, "k");
break;
case Qt::Key_L:
pressedButtons.insert(31, "l");
break;
case Qt::Key_M:
pressedButtons.insert(32, "m");
break;
case Qt::Key_N:
pressedButtons.insert(33, "n");
break;
case Qt::Key_O:
pressedButtons.insert(34, "o");
break;
case Qt::Key_P:
pressedButtons.insert(35, "p");
break;
case Qt::Key_Q:
pressedButtons.insert(36, "q");
break;
case Qt::Key_R:
pressedButtons.insert(37, "r");
break;
case Qt::Key_S:
pressedButtons.insert(38, "s");
break;
case Qt::Key_T:
pressedButtons.insert(39, "t");
break;
case Qt::Key_U:
pressedButtons.insert(40, "u");
break;
case Qt::Key_V:
pressedButtons.insert(41, "v");
break;
case Qt::Key_W:
pressedButtons.insert(42, "w");
break;
case Qt::Key_X:
pressedButtons.insert(43, "x");
break;
case Qt::Key_Y:
pressedButtons.insert(44, "y");
break;
case Qt::Key_Z:
pressedButtons.insert(45, "z");
break;
case Qt::Key_0:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(46, "kp0")
: pressedButtons.insert(56, "0");
break;
case Qt::Key_1:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(47, "kp1")
: pressedButtons.insert(57, "1");
break;
case Qt::Key_2:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(48, "kp2")
: pressedButtons.insert(58, "2");
break;
case Qt::Key_3:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(49, "kp3")
: pressedButtons.insert(59, "3");
break;
case Qt::Key_4:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(50, "kp4")
: pressedButtons.insert(60, "4");
break;
case Qt::Key_5:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(51, "kp5")
: pressedButtons.insert(61, "5");
break;
case Qt::Key_6:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(52, "kp6")
: pressedButtons.insert(62, "6");
break;
case Qt::Key_7:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(53, "kp7")
: pressedButtons.insert(63, "7");
break;
case Qt::Key_8:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(54, "kp8")
: pressedButtons.insert(64, "8");
break;
case Qt::Key_9:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(55, "kp9")
: pressedButtons.insert(65, "9");
break;
// symbols
case Qt::Key_Asterisk:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(66, "kpasterisk")
: pressedButtons.insert(74, "asterisk");
break;
case Qt::Key_Minus:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(67, "kpminus")
: pressedButtons.insert(75, "minus");
break;
case Qt::Key_Equal:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(68, "kpequals")
: pressedButtons.insert(76, "equals");
break;
case Qt::Key_Plus:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(69, "kpplus")
: pressedButtons.insert(77, "plus");
break;
case Qt::Key_Slash:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(70, "kpslash")
: pressedButtons.insert(78, "slash");
break;
case Qt::Key_Comma:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(71, "kpcomma")
: pressedButtons.insert(79, "comma");
break;
case Qt::Key_Period:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(72, "kpperiod")
: pressedButtons.insert(80, "period");
break;
case Qt::Key_Enter:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(73, "kpenter")
: pressedButtons.insert(81, "enter");
break;
case Qt::Key_QuoteLeft:
pressedButtons.insert(82, "grave");
break;
case Qt::Key_AsciiTilde:
pressedButtons.insert(83, "tilde");
break;
case Qt::Key_Exclam:
pressedButtons.insert(84, "exclamation");
break;
case Qt::Key_At:
pressedButtons.insert(85, "at");
break;
case Qt::Key_NumberSign:
pressedButtons.insert(86, "hash");
break;
case Qt::Key_Dollar:
pressedButtons.insert(87, "dollar");
break;
case Qt::Key_Percent:
pressedButtons.insert(88, "percent");
break;
case Qt::Key_AsciiCircum:
pressedButtons.insert(89, "caret");
break;
case Qt::Key_Ampersand:
pressedButtons.insert(90, "ampersand");
break;
case Qt::Key_ParenLeft:
pressedButtons.insert(91, "lparen");
break;
case Qt::Key_ParenRight:
pressedButtons.insert(92, "rparen");
break;
case Qt::Key_BracketLeft:
pressedButtons.insert(93, "lbracket");
break;
case Qt::Key_BracketRight:
pressedButtons.insert(94, "rbracket");
break;
case Qt::Key_BraceLeft:
pressedButtons.insert(95, "lbrace");
break;
case Qt::Key_BraceRight:
pressedButtons.insert(96, "rbrace");
break;
case Qt::Key_Underscore:
pressedButtons.insert(97, "underscore");
break;
case Qt::Key_Backslash:
pressedButtons.insert(98, "backslash");
break;
case Qt::Key_Bar:
pressedButtons.insert(99, "pipe");
break;
case Qt::Key_Semicolon:
pressedButtons.insert(100, "semicolon");
break;
case Qt::Key_Colon:
pressedButtons.insert(101, "colon");
break;
case Qt::Key_Apostrophe:
pressedButtons.insert(102, "apostrophe");
break;
case Qt::Key_QuoteDbl:
pressedButtons.insert(103, "quote");
break;
case Qt::Key_Less:
pressedButtons.insert(104, "less");
break;
case Qt::Key_Greater:
pressedButtons.insert(105, "greater");
break;
case Qt::Key_Question:
pressedButtons.insert(106, "question");
break;
// special keys
case Qt::Key_Print:
pressedButtons.insert(107, "printscreen");
break;
case Qt::Key_ScrollLock:
pressedButtons.insert(108, "scrolllock");
break;
case Qt::Key_Pause:
pressedButtons.insert(109, "pausebreak");
break;
case Qt::Key_Backspace:
pressedButtons.insert(110, "backspace");
break;
case Qt::Key_Insert:
pressedButtons.insert(111, "insert");
break;
case Qt::Key_Delete:
pressedButtons.insert(112, "delete");
break;
case Qt::Key_Home:
pressedButtons.insert(113, "home");
break;
case Qt::Key_End:
pressedButtons.insert(114, "end");
break;
case Qt::Key_PageUp:
pressedButtons.insert(115, "pgup");
break;
case Qt::Key_PageDown:
pressedButtons.insert(116, "pgdown");
break;
case Qt::Key_Tab:
pressedButtons.insert(117, "tab");
break;
case Qt::Key_CapsLock:
pressedButtons.insert(118, "capslock");
break;
case Qt::Key_Return:
pressedButtons.insert(119, "enter");
break;
case Qt::Key_Space:
pressedButtons.insert(120, "space");
break;
case Qt::Key_Up:
pressedButtons.insert(121, "up");
break;
case Qt::Key_Down:
pressedButtons.insert(122, "down");
break;
case Qt::Key_Left:
pressedButtons.insert(123, "left");
break;
case Qt::Key_Right:
pressedButtons.insert(124, "right");
break;
default:
break;
}
if (pressedButtons.size() >= 3) {
return true;
}
switch (keyEvent->key()) {
// modifiers
case Qt::Key_Shift:
if (keyEvent->nativeScanCode() == LSHIFT_KEY) {
pressedButtons.insert(1, "lshift");
} else {
pressedButtons.insert(2, "rshift");
}
break;
case Qt::Key_Alt:
if (keyEvent->nativeScanCode() == LALT_KEY) {
pressedButtons.insert(3, "lalt");
} else {
pressedButtons.insert(4, "ralt");
}
break;
case Qt::Key_Control:
if (keyEvent->nativeScanCode() == LCTRL_KEY) {
pressedButtons.insert(5, "lctrl");
} else {
pressedButtons.insert(6, "rctrl");
}
break;
case Qt::Key_Meta:
#ifdef _WIN32
pressedButtons.insert(7, "lwin");
#else
pressedButtons.insert(7, "lmeta");
#endif
break;
// f keys
case Qt::Key_F1:
pressedButtons.insert(8, "f1");
break;
case Qt::Key_F2:
pressedButtons.insert(9, "f2");
break;
case Qt::Key_F3:
pressedButtons.insert(10, "f3");
break;
case Qt::Key_F4:
pressedButtons.insert(11, "f4");
break;
case Qt::Key_F5:
pressedButtons.insert(12, "f5");
break;
case Qt::Key_F6:
pressedButtons.insert(13, "f6");
break;
case Qt::Key_F7:
pressedButtons.insert(14, "f7");
break;
case Qt::Key_F8:
pressedButtons.insert(15, "f8");
break;
case Qt::Key_F9:
pressedButtons.insert(16, "f9");
break;
case Qt::Key_F10:
pressedButtons.insert(17, "f10");
break;
case Qt::Key_F11:
pressedButtons.insert(18, "f11");
break;
case Qt::Key_F12:
pressedButtons.insert(19, "f12");
break;
// alphanumeric
case Qt::Key_A:
pressedButtons.insert(20, "a");
break;
case Qt::Key_B:
pressedButtons.insert(21, "b");
break;
case Qt::Key_C:
pressedButtons.insert(22, "c");
break;
case Qt::Key_D:
pressedButtons.insert(23, "d");
break;
case Qt::Key_E:
pressedButtons.insert(24, "e");
break;
case Qt::Key_F:
pressedButtons.insert(25, "f");
break;
case Qt::Key_G:
pressedButtons.insert(26, "g");
break;
case Qt::Key_H:
pressedButtons.insert(27, "h");
break;
case Qt::Key_I:
pressedButtons.insert(28, "i");
break;
case Qt::Key_J:
pressedButtons.insert(29, "j");
break;
case Qt::Key_K:
pressedButtons.insert(30, "k");
break;
case Qt::Key_L:
pressedButtons.insert(31, "l");
break;
case Qt::Key_M:
pressedButtons.insert(32, "m");
break;
case Qt::Key_N:
pressedButtons.insert(33, "n");
break;
case Qt::Key_O:
pressedButtons.insert(34, "o");
break;
case Qt::Key_P:
pressedButtons.insert(35, "p");
break;
case Qt::Key_Q:
pressedButtons.insert(36, "q");
break;
case Qt::Key_R:
pressedButtons.insert(37, "r");
break;
case Qt::Key_S:
pressedButtons.insert(38, "s");
break;
case Qt::Key_T:
pressedButtons.insert(39, "t");
break;
case Qt::Key_U:
pressedButtons.insert(40, "u");
break;
case Qt::Key_V:
pressedButtons.insert(41, "v");
break;
case Qt::Key_W:
pressedButtons.insert(42, "w");
break;
case Qt::Key_X:
pressedButtons.insert(43, "x");
break;
case Qt::Key_Y:
pressedButtons.insert(44, "y");
break;
case Qt::Key_Z:
pressedButtons.insert(45, "z");
break;
case Qt::Key_0:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(46, "kp0")
: pressedButtons.insert(56, "0");
break;
case Qt::Key_1:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(47, "kp1")
: pressedButtons.insert(57, "1");
break;
case Qt::Key_2:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(48, "kp2")
: pressedButtons.insert(58, "2");
break;
case Qt::Key_3:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(49, "kp3")
: pressedButtons.insert(59, "3");
break;
case Qt::Key_4:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(50, "kp4")
: pressedButtons.insert(60, "4");
break;
case Qt::Key_5:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(51, "kp5")
: pressedButtons.insert(61, "5");
break;
case Qt::Key_6:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(52, "kp6")
: pressedButtons.insert(62, "6");
break;
case Qt::Key_7:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(53, "kp7")
: pressedButtons.insert(63, "7");
break;
case Qt::Key_8:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(54, "kp8")
: pressedButtons.insert(64, "8");
break;
case Qt::Key_9:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(55, "kp9")
: pressedButtons.insert(65, "9");
break;
// symbols
case Qt::Key_Asterisk:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(66, "kpasterisk")
: pressedButtons.insert(74, "asterisk");
break;
case Qt::Key_Minus:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(67, "kpminus")
: pressedButtons.insert(75, "minus");
break;
case Qt::Key_Equal:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(68, "kpequals")
: pressedButtons.insert(76, "equals");
break;
case Qt::Key_Plus:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(69, "kpplus")
: pressedButtons.insert(77, "plus");
break;
case Qt::Key_Slash:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(70, "kpslash")
: pressedButtons.insert(78, "slash");
break;
case Qt::Key_Comma:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(71, "kpcomma")
: pressedButtons.insert(79, "comma");
break;
case Qt::Key_Period:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(72, "kpperiod")
: pressedButtons.insert(80, "period");
break;
case Qt::Key_Enter:
QApplication::keyboardModifiers() & Qt::KeypadModifier
? pressedButtons.insert(73, "kpenter")
: pressedButtons.insert(81, "enter");
break;
case Qt::Key_QuoteLeft:
pressedButtons.insert(82, "grave");
break;
case Qt::Key_AsciiTilde:
pressedButtons.insert(83, "tilde");
break;
case Qt::Key_Exclam:
pressedButtons.insert(84, "exclamation");
break;
case Qt::Key_At:
pressedButtons.insert(85, "at");
break;
case Qt::Key_NumberSign:
pressedButtons.insert(86, "hash");
break;
case Qt::Key_Dollar:
pressedButtons.insert(87, "dollar");
break;
case Qt::Key_Percent:
pressedButtons.insert(88, "percent");
break;
case Qt::Key_AsciiCircum:
pressedButtons.insert(89, "caret");
break;
case Qt::Key_Ampersand:
pressedButtons.insert(90, "ampersand");
break;
case Qt::Key_ParenLeft:
pressedButtons.insert(91, "lparen");
break;
case Qt::Key_ParenRight:
pressedButtons.insert(92, "rparen");
break;
case Qt::Key_BracketLeft:
pressedButtons.insert(93, "lbracket");
break;
case Qt::Key_BracketRight:
pressedButtons.insert(94, "rbracket");
break;
case Qt::Key_BraceLeft:
pressedButtons.insert(95, "lbrace");
break;
case Qt::Key_BraceRight:
pressedButtons.insert(96, "rbrace");
break;
case Qt::Key_Underscore:
pressedButtons.insert(97, "underscore");
break;
case Qt::Key_Backslash:
pressedButtons.insert(98, "backslash");
break;
case Qt::Key_Bar:
pressedButtons.insert(99, "pipe");
break;
case Qt::Key_Semicolon:
pressedButtons.insert(100, "semicolon");
break;
case Qt::Key_Colon:
pressedButtons.insert(101, "colon");
break;
case Qt::Key_Apostrophe:
pressedButtons.insert(102, "apostrophe");
break;
case Qt::Key_QuoteDbl:
pressedButtons.insert(103, "quote");
break;
case Qt::Key_Less:
pressedButtons.insert(104, "less");
break;
case Qt::Key_Greater:
pressedButtons.insert(105, "greater");
break;
case Qt::Key_Question:
pressedButtons.insert(106, "question");
break;
// special keys
case Qt::Key_Print:
pressedButtons.insert(107, "printscreen");
break;
case Qt::Key_ScrollLock:
pressedButtons.insert(108, "scrolllock");
break;
case Qt::Key_Pause:
pressedButtons.insert(109, "pausebreak");
break;
case Qt::Key_Backspace:
pressedButtons.insert(110, "backspace");
break;
case Qt::Key_Insert:
pressedButtons.insert(111, "insert");
break;
case Qt::Key_Delete:
pressedButtons.insert(112, "delete");
break;
case Qt::Key_Home:
pressedButtons.insert(113, "home");
break;
case Qt::Key_End:
pressedButtons.insert(114, "end");
break;
case Qt::Key_PageUp:
pressedButtons.insert(115, "pgup");
break;
case Qt::Key_PageDown:
pressedButtons.insert(116, "pgdown");
break;
case Qt::Key_Tab:
pressedButtons.insert(117, "tab");
break;
case Qt::Key_CapsLock:
pressedButtons.insert(118, "capslock");
break;
case Qt::Key_Return:
pressedButtons.insert(119, "enter");
break;
case Qt::Key_Space:
pressedButtons.insert(120, "space");
break;
case Qt::Key_Up:
pressedButtons.insert(121, "up");
break;
case Qt::Key_Down:
pressedButtons.insert(122, "down");
break;
case Qt::Key_Left:
pressedButtons.insert(123, "left");
break;
case Qt::Key_Right:
pressedButtons.insert(124, "right");
break;
case Qt::Key_Escape:
pressedButtons.insert(125, "escape");
break;
default:
break;
}
return true;
}
}

View File

@@ -7,6 +7,7 @@
#include <SDL3/SDL_gamepad.h>
#include "ipc/ipc_client.h"
#include "right_click_button.h"
#ifdef _WIN32
#define LCTRL_KEY 29
@@ -32,13 +33,13 @@ public:
private Q_SLOTS:
void processSDLEvents(int Type, int Input, int Value);
void StartTimer(QPushButton*& button, bool isPad);
void StartTimer(QRightClickButton*& button, bool isPad);
void SaveHotkeys(bool CloseOnSave);
void SetDefault();
private:
bool eventFilter(QObject* obj, QEvent* event) override;
void CheckMapping(QPushButton*& button);
void CheckMapping(QRightClickButton*& button);
void DisableMappingButtons();
void EnableMappingButtons();
void LoadHotkeys();
@@ -59,14 +60,14 @@ private:
int gamepad_count;
QString mapping;
QTimer* timer;
QPushButton* MappingButton;
QRightClickButton* MappingButton;
SDL_Gamepad* h_gamepad = nullptr;
SDL_JoystickID* h_gamepads;
// use QMap instead of QSet to maintain order of inserted strings
QMap<int, QString> pressedButtons;
QList<QPushButton*> PadButtonsList;
QList<QPushButton*> KBButtonsList;
QList<QRightClickButton*> PadButtonsList;
QList<QRightClickButton*> KBButtonsList;
QFuture<void> Polling;
Ui::Hotkeys* ui;

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
<!-- SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
SPDX-License-Identifier: GPL-2.0-or-later -->
<ui version="4.0">
<class>Hotkeys</class>
@@ -12,7 +12,7 @@
<x>0</x>
<y>0</y>
<width>987</width>
<height>549</height>
<height>641</height>
</rect>
</property>
<property name="windowTitle">
@@ -24,7 +24,7 @@
<x>3</x>
<y>2</y>
<width>981</width>
<height>541</height>
<height>601</height>
</rect>
</property>
<property name="widgetResizable">
@@ -36,7 +36,7 @@
<x>0</x>
<y>0</y>
<width>979</width>
<height>539</height>
<height>599</height>
</rect>
</property>
<widget class="QWidget" name="verticalLayoutWidget_3">
@@ -45,7 +45,7 @@
<x>3</x>
<y>7</y>
<width>971</width>
<height>532</height>
<height>587</height>
</rect>
</property>
<layout class="QVBoxLayout" name="HotkeysLayout">
@@ -86,7 +86,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QPushButton" name="fpsButtonPad">
<widget class="QRightClickButton" name="fpsButtonPad">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -111,7 +111,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QPushButton" name="quitButtonPad">
<widget class="QRightClickButton" name="quitButtonPad">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -136,7 +136,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="reloadButtonPad">
<widget class="QRightClickButton" name="reloadButtonPad">
<property name="text">
<string>unmapped</string>
</property>
@@ -162,7 +162,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="fullscreenButtonPad">
<widget class="QRightClickButton" name="fullscreenButtonPad">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -187,7 +187,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QPushButton" name="pauseButtonPad">
<widget class="QRightClickButton" name="pauseButtonPad">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -251,7 +251,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QPushButton" name="fpsButtonKB">
<widget class="QRightClickButton" name="fpsButtonKB">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -276,7 +276,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<widget class="QPushButton" name="quitButtonKB">
<widget class="QRightClickButton" name="quitButtonKB">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -301,7 +301,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QPushButton" name="reloadButtonKB">
<widget class="QRightClickButton" name="reloadButtonKB">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -330,7 +330,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QPushButton" name="fullscreenButtonKB">
<widget class="QRightClickButton" name="fullscreenButtonKB">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -355,7 +355,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QPushButton" name="pauseButtonKB">
<widget class="QRightClickButton" name="pauseButtonKB">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -380,7 +380,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QPushButton" name="renderdocButton">
<widget class="QRightClickButton" name="renderdocButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -409,7 +409,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
<item>
<widget class="QPushButton" name="mouseJoystickButton">
<widget class="QRightClickButton" name="mouseJoystickButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -434,7 +434,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_14">
<item>
<widget class="QPushButton" name="mouseGyroButton">
<widget class="QRightClickButton" name="mouseGyroButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -484,25 +484,24 @@
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<widget class="QLabel" name="tipLabel_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
<property name="font">
<font>
<pointsize>12</pointsize>
<bold>true</bold>
</font>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
<property name="text">
<string>Tip: Unmap inputs with right-click</string>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save</set>
<property name="alignment">
<set>Qt::AlignmentFlag::AlignCenter</set>
</property>
</widget>
</item>
@@ -510,7 +509,30 @@
</widget>
</widget>
</widget>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="geometry">
<rect>
<x>10</x>
<y>610</y>
<width>969</width>
<height>26</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save</set>
</property>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>QRightClickButton</class>
<extends>QPushButton</extends>
<header>src/qt_gui/right_click_button.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>

View File

@@ -23,7 +23,6 @@ KBMSettings::KBMSettings(std::shared_ptr<GameInfoClass> game_info_get,
GameRunning(isGameRunning), RunningGameSerial(GameRunningSerial), ui(new Ui::KBMSettings) {
ui->setupUi(this);
this->setFixedWidth(this->width());
ui->PerGameCheckBox->setChecked(!Config::GetUseUnifiedInputConfig());
ui->TextEditorButton->setFocus();
this->setFocusPolicy(Qt::StrongFocus);
@@ -68,7 +67,7 @@ KBMSettings::KBMSettings(std::shared_ptr<GameInfoClass> game_info_get,
ButtonConnects();
SetUIValuestoMappings("default");
installEventFilter(this);
qApp->installEventFilter(this);
ui->ProfileComboBox->setCurrentText(tr("Common Config"));
ui->TitleLabel->setText(tr("Common Config"));
@@ -153,6 +152,9 @@ tr("Do you want to overwrite existing mappings with the mappings from the Common
void KBMSettings::ButtonConnects() {
for (auto& button : ButtonsList) {
connect(button, &QPushButton::clicked, this, [this, &button]() { StartTimer(button); });
connect(button, &QRightClickButton::rightClicked, this,
[this, &button]() { button->setText("unmapped"); });
}
}
@@ -544,7 +546,7 @@ void KBMSettings::onHelpClicked() {
}
}
void KBMSettings::StartTimer(QPushButton*& button) {
void KBMSettings::StartTimer(QRightClickButton*& button) {
MappingTimer = 3;
EnableMapping = true;
MappingCompleted = false;
@@ -558,7 +560,7 @@ void KBMSettings::StartTimer(QPushButton*& button) {
timer->start(1000);
}
void KBMSettings::CheckMapping(QPushButton*& button) {
void KBMSettings::CheckMapping(QRightClickButton*& button) {
MappingTimer -= 1;
button->setText(tr("Press a key") + " [" + QString::number(MappingTimer) + "]");
@@ -955,7 +957,7 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
// cancel mapping
case Qt::Key_Escape:
SetMapping("unmapped");
pressedKeys.insert(125, "escape");
break;
default:
break;
@@ -968,19 +970,19 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
if (pressedKeys.size() < 3) {
switch (mouseEvent->button()) {
case Qt::LeftButton:
pressedKeys.insert(125, "leftbutton");
pressedKeys.insert(126, "leftbutton");
break;
case Qt::RightButton:
pressedKeys.insert(127, "rightbutton");
pressedKeys.insert(128, "rightbutton");
break;
case Qt::MiddleButton:
pressedKeys.insert(126, "middlebutton");
pressedKeys.insert(127, "middlebutton");
break;
case Qt::XButton1:
pressedKeys.insert(128, "sidebuttonback");
pressedKeys.insert(129, "sidebuttonback");
break;
case Qt::XButton2:
pressedKeys.insert(129, "sidebuttonforward");
pressedKeys.insert(130, "sidebuttonforward");
break;
// default case
@@ -1002,7 +1004,7 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
if (wheelEvent->angleDelta().y() > 5) {
if (std::find(AxisList.begin(), AxisList.end(), MappingButton) ==
AxisList.end()) {
pressedKeys.insert(130, "mousewheelup");
pressedKeys.insert(131, "mousewheelup");
if (QApplication::keyboardModifiers() == Qt::NoModifier)
emit PushKBMEvent();
} else {
@@ -1013,7 +1015,7 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
} else if (wheelEvent->angleDelta().y() < -5) {
if (std::find(AxisList.begin(), AxisList.end(), MappingButton) ==
AxisList.end()) {
pressedKeys.insert(131, "mousewheeldown");
pressedKeys.insert(132, "mousewheeldown");
if (QApplication::keyboardModifiers() == Qt::NoModifier)
emit PushKBMEvent();
} else {
@@ -1027,8 +1029,8 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
AxisList.end()) {
// QT changes scrolling to horizontal for all widgets with the alt modifier
QApplication::keyboardModifiers() & Qt::AltModifier
? pressedKeys.insert(130, "mousewheelup")
: pressedKeys.insert(133, "mousewheelright");
? pressedKeys.insert(131, "mousewheelup")
: pressedKeys.insert(134, "mousewheelright");
if (QApplication::keyboardModifiers() == Qt::NoModifier)
emit PushKBMEvent();
} else {
@@ -1040,8 +1042,8 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
if (std::find(AxisList.begin(), AxisList.end(), MappingButton) ==
AxisList.end()) {
QApplication::keyboardModifiers() & Qt::AltModifier
? pressedKeys.insert(131, "mousewheeldown")
: pressedKeys.insert(132, "mousewheelleft");
? pressedKeys.insert(132, "mousewheeldown")
: pressedKeys.insert(133, "mousewheelleft");
if (QApplication::keyboardModifiers() == Qt::NoModifier)
emit PushKBMEvent();
} else {
@@ -1059,4 +1061,6 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
return QDialog::eventFilter(obj, event);
}
KBMSettings::~KBMSettings() {}
KBMSettings::~KBMSettings() {
qApp->removeEventFilter(this);
}

View File

@@ -5,6 +5,7 @@
#include "game_info.h"
#include "ipc/ipc_client.h"
#include "right_click_button.h"
// macros > declaring constants
// also, we were only using one counterpart
@@ -36,8 +37,8 @@ signals:
private Q_SLOTS:
void SaveKBMConfig(bool CloseOnSave);
void SetDefault();
void CheckMapping(QPushButton*& button);
void StartTimer(QPushButton*& button);
void CheckMapping(QRightClickButton*& button);
void StartTimer(QRightClickButton*& button);
void onHelpClicked();
private:
@@ -63,8 +64,8 @@ private:
QString mapping;
int MappingTimer;
QTimer* timer;
QPushButton* MappingButton;
QList<QPushButton*> ButtonsList;
QRightClickButton* MappingButton;
QList<QRightClickButton*> ButtonsList;
std::string config_id;
const std::vector<std::string> ControllerInputs = {
"cross", "circle", "square", "triangle", "l1",

View File

@@ -12,7 +12,7 @@
<x>0</x>
<y>0</y>
<width>1235</width>
<height>836</height>
<height>874</height>
</rect>
</property>
<property name="sizePolicy">
@@ -57,7 +57,7 @@
<x>0</x>
<y>0</y>
<width>1207</width>
<height>827</height>
<height>860</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_19">
@@ -86,7 +86,7 @@
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -156,7 +156,7 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QPushButton" name="DpadUpButton">
<widget class="QRightClickButton" name="DpadUpButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -201,7 +201,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="DpadLeftButton">
<widget class="QRightClickButton" name="DpadLeftButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -241,7 +241,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="DpadRightButton">
<widget class="QRightClickButton" name="DpadRightButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -292,7 +292,7 @@
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="DpadDownButton">
<widget class="QRightClickButton" name="DpadDownButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -329,14 +329,14 @@
<item>
<widget class="QGroupBox" name="LeftStickDeadZoneGB">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>344</width>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
@@ -345,7 +345,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_15">
<item>
<widget class="QPushButton" name="LHalfButton">
<widget class="QRightClickButton" name="LHalfButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -372,7 +372,7 @@
<item>
<widget class="QGroupBox" name="gb_left_stick">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -442,7 +442,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QPushButton" name="LStickUpButton">
<widget class="QRightClickButton" name="LStickUpButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -487,7 +487,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="LStickLeftButton">
<widget class="QRightClickButton" name="LStickLeftButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -509,7 +509,7 @@
</property>
<property name="maximumSize">
<size>
<width>179</width>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
@@ -533,7 +533,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="LStickRightButton">
<widget class="QRightClickButton" name="LStickRightButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -584,7 +584,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
<item>
<widget class="QPushButton" name="LStickDownButton">
<widget class="QRightClickButton" name="LStickDownButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -767,7 +767,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L1Button">
<widget class="QRightClickButton" name="L1Button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -819,7 +819,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L2Button">
<widget class="QRightClickButton" name="L2Button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -945,7 +945,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="OptionsButton">
<widget class="QRightClickButton" name="OptionsButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -1001,7 +1001,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R1Button">
<widget class="QRightClickButton" name="R1Button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -1053,7 +1053,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R2Button">
<widget class="QRightClickButton" name="R2Button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -1162,7 +1162,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="L3Button">
<widget class="QRightClickButton" name="L3Button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -1190,7 +1190,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_17">
<item>
<widget class="QPushButton" name="TouchpadLeftButton">
<widget class="QRightClickButton" name="TouchpadLeftButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1259,7 +1259,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QPushButton" name="TouchpadCenterButton">
<widget class="QRightClickButton" name="TouchpadCenterButton">
<property name="text">
<string>unmapped</string>
</property>
@@ -1306,7 +1306,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="R3Button">
<widget class="QRightClickButton" name="R3Button">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -1346,7 +1346,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<widget class="QPushButton" name="TouchpadRightButton">
<widget class="QRightClickButton" name="TouchpadRightButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
@@ -1599,7 +1599,7 @@
<item>
<widget class="QGroupBox" name="gb_face_buttons">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -1663,7 +1663,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QPushButton" name="TriangleButton">
<widget class="QRightClickButton" name="TriangleButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -1708,7 +1708,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="SquareButton">
<widget class="QRightClickButton" name="SquareButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -1748,7 +1748,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="CircleButton">
<widget class="QRightClickButton" name="CircleButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -1799,7 +1799,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QPushButton" name="CrossButton">
<widget class="QRightClickButton" name="CrossButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -1836,14 +1836,14 @@
<item>
<widget class="QGroupBox" name="RightStickDeadZoneGB">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>344</width>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
@@ -1852,7 +1852,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
<item>
<widget class="QPushButton" name="RHalfButton">
<widget class="QRightClickButton" name="RHalfButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -1879,7 +1879,7 @@
<item>
<widget class="QGroupBox" name="gb_right_stick">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -1949,7 +1949,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QPushButton" name="RStickUpButton">
<widget class="QRightClickButton" name="RStickUpButton">
<property name="minimumSize">
<size>
<width>0</width>
@@ -2000,7 +2000,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="RStickLeftButton">
<widget class="QRightClickButton" name="RStickLeftButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -2040,7 +2040,7 @@
<number>5</number>
</property>
<item>
<widget class="QPushButton" name="RStickRightButton">
<widget class="QRightClickButton" name="RStickRightButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -2091,7 +2091,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="RStickDownButton">
<widget class="QRightClickButton" name="RStickDownButton">
<property name="focusPolicy">
<enum>Qt::FocusPolicy::NoFocus</enum>
</property>
@@ -2118,17 +2118,46 @@
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Tip: Unmap inputs with right-click</string>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::StandardButton::Apply|QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::RestoreDefaults|QDialogButtonBox::StandardButton::Save</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QRightClickButton</class>
<extends>QPushButton</extends>
<header>src/qt_gui/right_click_button.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="../shadps4.qrc"/>
</resources>

View File

@@ -0,0 +1,16 @@
// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <QMouseEvent>
#include "right_click_button.h"
QRightClickButton::QRightClickButton(QWidget* parent) : QPushButton(parent) {}
void QRightClickButton::mousePressEvent(QMouseEvent* e) {
if (e->button() == Qt::RightButton) {
emit rightClicked();
} else {
QPushButton::mousePressEvent(e);
}
}

View File

@@ -0,0 +1,20 @@
// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QObject>
#include <QPushButton>
class QRightClickButton : public QPushButton {
Q_OBJECT
public:
explicit QRightClickButton(QWidget* parent = 0);
public slots:
void mousePressEvent(QMouseEvent* e);
signals:
void rightClicked();
};