multikey for kbm_gui (#2778)
Some checks are pending
Build and Release / reuse (push) Waiting to run
Build and Release / clang-format (push) Waiting to run
Build and Release / get-info (push) Waiting to run
Build and Release / windows-sdl (push) Blocked by required conditions
Build and Release / windows-qt (push) Blocked by required conditions
Build and Release / macos-sdl (push) Blocked by required conditions
Build and Release / macos-qt (push) Blocked by required conditions
Build and Release / linux-sdl (push) Blocked by required conditions
Build and Release / linux-qt (push) Blocked by required conditions
Build and Release / linux-sdl-gcc (push) Blocked by required conditions
Build and Release / linux-qt-gcc (push) Blocked by required conditions
Build and Release / pre-release (push) Blocked by required conditions

* Update kbm_gui.cpp

* Update kbm_gui.cpp

* Update kbm_gui.h

* Update kbm_gui.cpp

* lunix test

* linux test

* Update kbm_gui.h

* Update kbm_gui.cpp

* Update kbm_gui.cpp

* Update kbm_gui.cpp

* Update kbm_gui.cpp

* Update kbm_gui.h

* Update kbm_gui.cpp

* Update kbm_gui.h

* Update kbm_gui.cpp

* Update kbm_gui.h

* Update kbm_gui.cpp

* kbm_gui.cpp's names fix

just cleaning my code

* name fix

* Update kbm_gui.cpp

* Update kbm_gui.h

* Update kbm_gui.cpp

* Update src/qt_gui/kbm_gui.cpp

Co-authored-by: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com>

* clean up from main

* bruh, welp here we go again

---------

Co-authored-by: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com>
This commit is contained in:
tlarok 2025-04-23 12:41:14 +02:00 committed by GitHub
parent aeee7706ee
commit 3f4249084c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 169 additions and 121 deletions

View file

@ -608,21 +608,28 @@ void KBMSettings::CheckMapping(QPushButton*& button) {
MappingTimer -= 1; MappingTimer -= 1;
button->setText(tr("Press a key") + " [" + QString::number(MappingTimer) + "]"); button->setText(tr("Press a key") + " [" + QString::number(MappingTimer) + "]");
if (pressedKeys.size() > 0) {
QStringList keyStrings;
for (const QString& buttonAction : pressedKeys) {
keyStrings << buttonAction;
}
QString combo = keyStrings.join(",");
SetMapping(combo);
MappingCompleted = true;
EnableMapping = false;
MappingButton->setText(combo);
pressedKeys.clear();
timer->stop();
}
if (MappingCompleted) { if (MappingCompleted) {
EnableMapping = false; EnableMapping = false;
EnableMappingButtons(); EnableMappingButtons();
timer->stop(); timer->stop();
if (mapping == "lshift" || mapping == "lalt" || mapping == "lctrl" || mapping == "lmeta" || button->setText(mapping);
mapping == "lwin") {
modifier = "";
}
if (modifier != "") {
button->setText(modifier + ", " + mapping);
} else {
button->setText(mapping);
}
} }
if (MappingTimer <= 0) { if (MappingTimer <= 0) {
@ -647,322 +654,346 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
} }
if (EnableMapping) { if (EnableMapping) {
if (Qt::ShiftModifier & QApplication::keyboardModifiers()) {
modifier = "lshift";
} else if (Qt::AltModifier & QApplication::keyboardModifiers()) {
modifier = "lalt";
} else if (Qt::ControlModifier & QApplication::keyboardModifiers()) {
modifier = "lctrl";
} else if (Qt::MetaModifier & QApplication::keyboardModifiers()) {
#ifdef _WIN32
modifier = "lwin";
#else
modifier = "lmeta";
#endif
}
if (event->type() == QEvent::KeyPress) { if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event); QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->isAutoRepeat())
return true;
if (pressedKeys.size() >= 3) {
return true;
}
switch (keyEvent->key()) { switch (keyEvent->key()) {
case Qt::Key_Space: case Qt::Key_Space:
SetMapping("space"); pressedKeys.insert("space");
break; break;
case Qt::Key_Comma: case Qt::Key_Comma:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kpcomma"); pressedKeys.insert("kpcomma");
} else { } else {
SetMapping("comma"); pressedKeys.insert("comma");
} }
break; break;
case Qt::Key_Period: case Qt::Key_Period:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kpperiod"); pressedKeys.insert("kpperiod");
} else { } else {
SetMapping("period"); pressedKeys.insert("period");
} }
break; break;
case Qt::Key_Slash: case Qt::Key_Slash:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) if (Qt::KeypadModifier & QApplication::keyboardModifiers())
SetMapping("kpdivide"); pressedKeys.insert("kpdivide");
break; break;
case Qt::Key_Asterisk: case Qt::Key_Asterisk:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) if (Qt::KeypadModifier & QApplication::keyboardModifiers())
SetMapping("kpmultiply"); pressedKeys.insert("kpmultiply");
break; break;
case Qt::Key_Question: case Qt::Key_Question:
SetMapping("question"); pressedKeys.insert("question");
break; break;
case Qt::Key_Semicolon: case Qt::Key_Semicolon:
SetMapping("semicolon"); pressedKeys.insert("semicolon");
break; break;
case Qt::Key_Minus: case Qt::Key_Minus:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kpminus"); pressedKeys.insert("kpminus");
} else { } else {
SetMapping("minus"); pressedKeys.insert("minus");
} }
break; break;
case Qt::Key_Plus: case Qt::Key_Plus:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kpplus"); pressedKeys.insert("kpplus");
} else { } else {
SetMapping("plus"); pressedKeys.insert("plus");
} }
break; break;
case Qt::Key_ParenLeft: case Qt::Key_ParenLeft:
SetMapping("lparenthesis"); pressedKeys.insert("lparenthesis");
break; break;
case Qt::Key_ParenRight: case Qt::Key_ParenRight:
SetMapping("rparenthesis"); pressedKeys.insert("rparenthesis");
break; break;
case Qt::Key_BracketLeft: case Qt::Key_BracketLeft:
SetMapping("lbracket"); pressedKeys.insert("lbracket");
break; break;
case Qt::Key_BracketRight: case Qt::Key_BracketRight:
SetMapping("rbracket"); pressedKeys.insert("rbracket");
break; break;
case Qt::Key_BraceLeft: case Qt::Key_BraceLeft:
SetMapping("lbrace"); pressedKeys.insert("lbrace");
break; break;
case Qt::Key_BraceRight: case Qt::Key_BraceRight:
SetMapping("rbrace"); pressedKeys.insert("rbrace");
break; break;
case Qt::Key_Backslash: case Qt::Key_Backslash:
SetMapping("backslash"); pressedKeys.insert("backslash");
break; break;
case Qt::Key_Tab: case Qt::Key_Tab:
SetMapping("tab"); pressedKeys.insert("tab");
break; break;
case Qt::Key_Backspace: case Qt::Key_Backspace:
SetMapping("backspace"); pressedKeys.insert("backspace");
break; break;
case Qt::Key_Return: case Qt::Key_Return:
SetMapping("enter"); pressedKeys.insert("enter");
break; break;
case Qt::Key_Enter: case Qt::Key_Enter:
SetMapping("kpenter"); pressedKeys.insert("kpenter");
break;
case Qt::Key_Home:
pressedKeys.insert("home");
break;
case Qt::Key_End:
pressedKeys.insert("end");
break;
case Qt::Key_PageDown:
pressedKeys.insert("pgdown");
break;
case Qt::Key_PageUp:
pressedKeys.insert("pgup");
break;
case Qt::Key_CapsLock:
pressedKeys.insert("capslock");
break; break;
case Qt::Key_Escape: case Qt::Key_Escape:
SetMapping("unmapped"); pressedKeys.insert("unmapped");
break; break;
case Qt::Key_Shift: case Qt::Key_Shift:
SetMapping("lshift"); if (keyEvent->nativeScanCode() == rshift) {
pressedKeys.insert("rshift");
} else {
pressedKeys.insert("lshift");
}
break; break;
case Qt::Key_Alt: case Qt::Key_Alt:
SetMapping("lalt"); if (keyEvent->nativeScanCode() == ralt) {
pressedKeys.insert("ralt");
} else {
pressedKeys.insert("lalt");
}
break; break;
case Qt::Key_Control: case Qt::Key_Control:
SetMapping("lctrl"); if (keyEvent->nativeScanCode() == rctrl) {
pressedKeys.insert("rctrl");
} else {
pressedKeys.insert("lctrl");
}
break; break;
case Qt::Key_Meta: case Qt::Key_Meta:
activateWindow(); activateWindow();
#ifdef _WIN32 #ifdef _WIN32
SetMapping("lwin"); pressedKeys.insert("lwin");
#else #else
SetMapping("lmeta"); pressedKeys.insert("lmeta");
#endif #endif
case Qt::Key_1: case Qt::Key_1:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp1"); pressedKeys.insert("kp1");
} else { } else {
SetMapping("1"); pressedKeys.insert("1");
} }
break; break;
case Qt::Key_2: case Qt::Key_2:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp2"); pressedKeys.insert("kp2");
} else { } else {
SetMapping("2"); pressedKeys.insert("2");
} }
break; break;
case Qt::Key_3: case Qt::Key_3:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp3"); pressedKeys.insert("kp3");
} else { } else {
SetMapping("3"); pressedKeys.insert("3");
} }
break; break;
case Qt::Key_4: case Qt::Key_4:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp4"); pressedKeys.insert("kp4");
} else { } else {
SetMapping("4"); pressedKeys.insert("4");
} }
break; break;
case Qt::Key_5: case Qt::Key_5:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp5"); pressedKeys.insert("kp5");
} else { } else {
SetMapping("5"); pressedKeys.insert("5");
} }
break; break;
case Qt::Key_6: case Qt::Key_6:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp6"); pressedKeys.insert("kp6");
} else { } else {
SetMapping("6"); pressedKeys.insert("6");
} }
break; break;
case Qt::Key_7: case Qt::Key_7:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp7"); pressedKeys.insert("kp7");
} else { } else {
SetMapping("7"); pressedKeys.insert("7");
} }
break; break;
case Qt::Key_8: case Qt::Key_8:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp8"); pressedKeys.insert("kp8");
} else { } else {
SetMapping("8"); pressedKeys.insert("8");
} }
break; break;
case Qt::Key_9: case Qt::Key_9:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp9"); pressedKeys.insert("kp9");
} else { } else {
SetMapping("9"); pressedKeys.insert("9");
} }
break; break;
case Qt::Key_0: case Qt::Key_0:
if (Qt::KeypadModifier & QApplication::keyboardModifiers()) { if (Qt::KeypadModifier & QApplication::keyboardModifiers()) {
SetMapping("kp0"); pressedKeys.insert("kp0");
} else { } else {
SetMapping("0"); pressedKeys.insert("0");
} }
break; break;
case Qt::Key_Up: case Qt::Key_Up:
activateWindow(); activateWindow();
SetMapping("up"); pressedKeys.insert("up");
break; break;
case Qt::Key_Down: case Qt::Key_Down:
SetMapping("down"); pressedKeys.insert("down");
break; break;
case Qt::Key_Left: case Qt::Key_Left:
SetMapping("left"); pressedKeys.insert("left");
break; break;
case Qt::Key_Right: case Qt::Key_Right:
SetMapping("right"); pressedKeys.insert("right");
break; break;
case Qt::Key_A: case Qt::Key_A:
SetMapping("a"); pressedKeys.insert("a");
break; break;
case Qt::Key_B: case Qt::Key_B:
SetMapping("b"); pressedKeys.insert("b");
break; break;
case Qt::Key_C: case Qt::Key_C:
SetMapping("c"); pressedKeys.insert("c");
break; break;
case Qt::Key_D: case Qt::Key_D:
SetMapping("d"); pressedKeys.insert("d");
break; break;
case Qt::Key_E: case Qt::Key_E:
SetMapping("e"); pressedKeys.insert("e");
break; break;
case Qt::Key_F: case Qt::Key_F:
SetMapping("f"); pressedKeys.insert("f");
break; break;
case Qt::Key_G: case Qt::Key_G:
SetMapping("g"); pressedKeys.insert("g");
break; break;
case Qt::Key_H: case Qt::Key_H:
SetMapping("h"); pressedKeys.insert("h");
break; break;
case Qt::Key_I: case Qt::Key_I:
SetMapping("i"); pressedKeys.insert("i");
break; break;
case Qt::Key_J: case Qt::Key_J:
SetMapping("j"); pressedKeys.insert("j");
break; break;
case Qt::Key_K: case Qt::Key_K:
SetMapping("k"); pressedKeys.insert("k");
break; break;
case Qt::Key_L: case Qt::Key_L:
SetMapping("l"); pressedKeys.insert("l");
break; break;
case Qt::Key_M: case Qt::Key_M:
SetMapping("m"); pressedKeys.insert("m");
break; break;
case Qt::Key_N: case Qt::Key_N:
SetMapping("n"); pressedKeys.insert("n");
break; break;
case Qt::Key_O: case Qt::Key_O:
SetMapping("o"); pressedKeys.insert("o");
break; break;
case Qt::Key_P: case Qt::Key_P:
SetMapping("p"); pressedKeys.insert("p");
break; break;
case Qt::Key_Q: case Qt::Key_Q:
SetMapping("q"); pressedKeys.insert("q");
break; break;
case Qt::Key_R: case Qt::Key_R:
SetMapping("r"); pressedKeys.insert("r");
break; break;
case Qt::Key_S: case Qt::Key_S:
SetMapping("s"); pressedKeys.insert("s");
break; break;
case Qt::Key_T: case Qt::Key_T:
SetMapping("t"); pressedKeys.insert("t");
break; break;
case Qt::Key_U: case Qt::Key_U:
SetMapping("u"); pressedKeys.insert("u");
break; break;
case Qt::Key_V: case Qt::Key_V:
SetMapping("v"); pressedKeys.insert("v");
break; break;
case Qt::Key_W: case Qt::Key_W:
SetMapping("w"); pressedKeys.insert("w");
break; break;
case Qt::Key_X: case Qt::Key_X:
SetMapping("x"); pressedKeys.insert("x");
break; break;
case Qt::Key_Y: case Qt::Key_Y:
SetMapping("Y"); pressedKeys.insert("Y");
break; break;
case Qt::Key_Z: case Qt::Key_Z:
SetMapping("z"); pressedKeys.insert("z");
break; break;
default: default:
break; break;
} }
return true; return true;
} }
}
if (event->type() == QEvent::MouseButtonPress) { if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event); QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
if (pressedKeys.size() < 3) {
switch (mouseEvent->button()) { switch (mouseEvent->button()) {
case Qt::LeftButton: case Qt::LeftButton:
SetMapping("leftbutton"); pressedKeys.insert("leftbutton");
break; break;
case Qt::RightButton: case Qt::RightButton:
SetMapping("rightbutton"); pressedKeys.insert("rightbutton");
break; break;
case Qt::MiddleButton: case Qt::MiddleButton:
SetMapping("middlebutton"); pressedKeys.insert("middlebutton");
break; break;
default: default:
break; break;
} }
return true; return true;
} }
}
const QList<QPushButton*> AxisList = { const QList<QPushButton*> AxisList = {
ui->LStickUpButton, ui->LStickDownButton, ui->LStickLeftButton, ui->LStickRightButton, ui->LStickUpButton, ui->LStickDownButton, ui->LStickLeftButton, ui->LStickRightButton,
ui->RStickUpButton, ui->LStickDownButton, ui->LStickLeftButton, ui->RStickRightButton}; ui->RStickUpButton, ui->LStickDownButton, ui->LStickLeftButton, ui->RStickRightButton};
if (event->type() == QEvent::Wheel) { if (event->type() == QEvent::Wheel) {
QWheelEvent* wheelEvent = static_cast<QWheelEvent*>(event); QWheelEvent* wheelEvent = static_cast<QWheelEvent*>(event);
if (pressedKeys.size() < 3) {
if (wheelEvent->angleDelta().y() > 5) { if (wheelEvent->angleDelta().y() > 5) {
if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) {
SetMapping("mousewheelup"); pressedKeys.insert("mousewheelup");
} else { } else {
QMessageBox::information(this, tr("Cannot set mapping"), QMessageBox::information(this, tr("Cannot set mapping"),
tr("Mousewheel cannot be mapped to stick outputs")); tr("Mousewheel cannot be mapped to stick outputs"));
} }
} else if (wheelEvent->angleDelta().y() < -5) { } else if (wheelEvent->angleDelta().y() < -5) {
if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) {
SetMapping("mousewheeldown"); pressedKeys.insert("mousewheeldown");
} else { } else {
QMessageBox::information(this, tr("Cannot set mapping"), QMessageBox::information(this, tr("Cannot set mapping"),
tr("Mousewheel cannot be mapped to stick outputs")); tr("Mousewheel cannot be mapped to stick outputs"));
@ -972,9 +1003,9 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) {
// QT changes scrolling to horizontal for all widgets with the alt modifier // QT changes scrolling to horizontal for all widgets with the alt modifier
if (Qt::AltModifier & QApplication::keyboardModifiers()) { if (Qt::AltModifier & QApplication::keyboardModifiers()) {
SetMapping("mousewheelup"); pressedKeys.insert("mousewheelup");
} else { } else {
SetMapping("mousewheelright"); pressedKeys.insert("mousewheelright");
} }
} else { } else {
QMessageBox::information(this, tr("Cannot set mapping"), QMessageBox::information(this, tr("Cannot set mapping"),
@ -983,18 +1014,18 @@ bool KBMSettings::eventFilter(QObject* obj, QEvent* event) {
} else if (wheelEvent->angleDelta().x() < -5) { } else if (wheelEvent->angleDelta().x() < -5) {
if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) { if (std::find(AxisList.begin(), AxisList.end(), MappingButton) == AxisList.end()) {
if (Qt::AltModifier & QApplication::keyboardModifiers()) { if (Qt::AltModifier & QApplication::keyboardModifiers()) {
SetMapping("mousewheeldown"); pressedKeys.insert("mousewheeldown");
} else { } else {
SetMapping("mousewheelleft"); pressedKeys.insert("mousewheelleft");
} }
} else { } else {
QMessageBox::information(this, tr("Cannot set mapping"), QMessageBox::information(this, tr("Cannot set mapping"),
tr("Mousewheel cannot be mapped to stick outputs")); tr("Mousewheel cannot be mapped to stick outputs"));
} }
} }
return true;
} }
} }
return QDialog::eventFilter(obj, event); return QDialog::eventFilter(obj, event);
} }

View file

@ -25,6 +25,22 @@ private:
std::unique_ptr<Ui::KBMSettings> ui; std::unique_ptr<Ui::KBMSettings> ui;
std::shared_ptr<GameInfoClass> m_game_info; std::shared_ptr<GameInfoClass> m_game_info;
#ifdef _WIN32
const int lctrl = 29;
const int rctrl = 57373;
const int lalt = 56;
const int ralt = 57400;
const int lshift = 42;
const int rshift = 54;
#else
const int lctrl = 37;
const int rctrl = 105;
const int lalt = 64;
const int ralt = 108;
const int lshift = 50;
const int rshift = 62;
#endif
bool eventFilter(QObject* obj, QEvent* event) override; bool eventFilter(QObject* obj, QEvent* event) override;
void ButtonConnects(); void ButtonConnects();
void SetUIValuestoMappings(std::string config_id); void SetUIValuestoMappings(std::string config_id);
@ -33,6 +49,7 @@ private:
void EnableMappingButtons(); void EnableMappingButtons();
void SetMapping(QString input); void SetMapping(QString input);
QSet<QString> pressedKeys;
bool EnableMapping = false; bool EnableMapping = false;
bool MappingCompleted = false; bool MappingCompleted = false;
bool HelpWindowOpen = false; bool HelpWindowOpen = false;