Qt/Input: fix numpad (regression)

This commit is contained in:
Unknown 2017-12-22 17:03:24 +01:00 committed by Ivan
parent 8b31a9448a
commit 58d8d12665
2 changed files with 105 additions and 37 deletions

View File

@ -174,29 +174,52 @@ void keyboard_pad_handler::processKeyEvent(QKeyEvent* event, bool pressed)
return; return;
} }
auto handleKey = [this, pressed, event]()
{
const QString name = qstr(GetKeyName(event));
QStringList list = GetKeyNames(event);
if (list.isEmpty())
return;
bool is_num_key = list.contains("Num");
if (is_num_key)
list.removeAll("Num");
// TODO: Edge case: switching numlock keeps numpad keys pressed due to now different modifier
// Handle every possible key combination, for example: ctrl+A -> {ctrl, A, ctrl+A}
for (const auto& keyname : list)
{
// skip the 'original keys' when handling numpad keys
if (is_num_key && !keyname.contains("Num"))
continue;
// skip held modifiers when handling another key
if (keyname != name && list.count() > 1 && (keyname == "Alt" || keyname == "AltGr" || keyname == "Ctrl" || keyname == "Meta" || keyname == "Shift"))
continue;
Key(GetKeyCode(keyname), pressed);
}
};
// We need to ignore keys when using rpcs3 keyboard shortcuts
int key = event->key(); int key = event->key();
switch (key) switch (key)
{ {
case Qt::Key_Escape:
break;
case Qt::Key_L: case Qt::Key_L:
case Qt::Key_Return: case Qt::Key_Return:
if (!(event->modifiers() == Qt::AltModifier)) if (event->modifiers() != Qt::AltModifier)
Key(key, pressed); handleKey();
break;
case Qt::Key_Escape:
break; break;
case Qt::Key_P: case Qt::Key_P:
case Qt::Key_S: case Qt::Key_S:
case Qt::Key_R: case Qt::Key_R:
case Qt::Key_E: case Qt::Key_E:
if (!(event->modifiers() == Qt::ControlModifier)) if (event->modifiers() != Qt::ControlModifier)
Key(key, pressed); handleKey();
break; break;
default: default:
int keymod = key + GetModifierCode(event); handleKey();
if (keymod == key)
Key(keymod, pressed);
else
Key(key, pressed);
break; break;
} }
event->ignore(); event->ignore();
@ -244,6 +267,62 @@ std::string keyboard_pad_handler::GetMouseName(u32 button)
return "FAIL"; return "FAIL";
} }
QStringList keyboard_pad_handler::GetKeyNames(const QKeyEvent* keyEvent)
{
QStringList list;
if (keyEvent->modifiers() & Qt::ShiftModifier)
{
list.append("Shift");
list.append(QKeySequence(keyEvent->key() | Qt::ShiftModifier).toString(QKeySequence::NativeText));
}
if (keyEvent->modifiers() & Qt::AltModifier)
{
list.append("Alt");
list.append(QKeySequence(keyEvent->key() | Qt::AltModifier).toString(QKeySequence::NativeText));
}
if (keyEvent->modifiers() & Qt::ControlModifier)
{
list.append("Ctrl");
list.append(QKeySequence(keyEvent->key() | Qt::ControlModifier).toString(QKeySequence::NativeText));
}
if (keyEvent->modifiers() & Qt::MetaModifier)
{
list.append("Meta");
list.append(QKeySequence(keyEvent->key() | Qt::MetaModifier).toString(QKeySequence::NativeText));
}
if (keyEvent->modifiers() & Qt::KeypadModifier)
{
list.append("Num"); // helper object, not used as actual key
list.append(QKeySequence(keyEvent->key() | Qt::KeypadModifier).toString(QKeySequence::NativeText));
}
switch (keyEvent->key())
{
case Qt::Key_Alt:
list.append("Alt");
break;
case Qt::Key_AltGr:
list.append("AltGr");
break;
case Qt::Key_Shift:
list.append("Shift");
break;
case Qt::Key_Control:
list.append("Ctrl");
break;
case Qt::Key_Meta:
list.append("Meta");
break;
default:
list.append(QKeySequence(keyEvent->key()).toString(QKeySequence::NativeText));
break;
}
list.removeDuplicates();
return list;
}
std::string keyboard_pad_handler::GetKeyName(const QKeyEvent* keyEvent) std::string keyboard_pad_handler::GetKeyName(const QKeyEvent* keyEvent)
{ {
switch (keyEvent->key()) switch (keyEvent->key())
@ -273,7 +352,14 @@ std::string keyboard_pad_handler::GetKeyName(const u32& keyCode)
u32 keyboard_pad_handler::GetKeyCode(const std::string& keyName) u32 keyboard_pad_handler::GetKeyCode(const std::string& keyName)
{ {
if (keyName == "Alt") return GetKeyCode(qstr(keyName));
}
u32 keyboard_pad_handler::GetKeyCode(const QString& keyName)
{
if (keyName.isEmpty())
return 0;
else if (keyName == "Alt")
return Qt::Key_Alt; return Qt::Key_Alt;
else if (keyName == "AltGr") else if (keyName == "AltGr")
return Qt::Key_AltGr; return Qt::Key_AltGr;
@ -284,34 +370,14 @@ u32 keyboard_pad_handler::GetKeyCode(const std::string& keyName)
else if (keyName == "Meta") else if (keyName == "Meta")
return Qt::Key_Meta; return Qt::Key_Meta;
QString key = qstr(keyName); QKeySequence seq(keyName);
QKeySequence seq(key); u32 keyCode = 0;
u32 keyCode;
// We should only working with a single key here
if (seq.count() == 1) if (seq.count() == 1)
{
keyCode = seq[0]; keyCode = seq[0];
}
else else
{ LOG_NOTICE(GENERAL, "GetKeyCode(%s): seq.count() = %d", sstr(keyName), seq.count());
// TODO: Maybe ditch this code
// Should be here only if a modifier key (e.g. Ctrl, Alt) is pressed.
if (seq.count() != 0)
{
LOG_ERROR(GENERAL, "GetKeyCode(%s): seq.count() != 0 . seq.count() = %d", keyName, seq.count());
return 0;
}
// Add a non-modifier key "A" to the picture because QKeySequence
// seems to need that to acknowledge the modifier. We know that A has
// a keyCode of 65 (or 0x41 in hex)
seq = QKeySequence(key + "+A");
if (seq.count() != 0 || seq[0] <= 65)
{
LOG_ERROR(GENERAL, "GetKeyCode(%s): seq.count() != 0 || seq[0] <= 65 . seq[0] = %d . seq.count() = %d", keyName, seq[0], seq.count());
return 0;
}
keyCode = seq[0] - 65;
}
return keyCode; return keyCode;
} }

View File

@ -63,9 +63,11 @@ public:
std::string GetMouseName(const QMouseEvent* event); std::string GetMouseName(const QMouseEvent* event);
std::string GetMouseName(u32 button); std::string GetMouseName(u32 button);
QStringList GetKeyNames(const QKeyEvent* keyEvent);
std::string GetKeyName(const QKeyEvent* keyEvent); std::string GetKeyName(const QKeyEvent* keyEvent);
std::string GetKeyName(const u32& keyCode); std::string GetKeyName(const u32& keyCode);
u32 GetKeyCode(const std::string& keyName); u32 GetKeyCode(const std::string& keyName);
u32 GetKeyCode(const QString& keyName);
protected: protected:
void Key(const u32 code, bool pressed, u16 value = 255); void Key(const u32 code, bool pressed, u16 value = 255);