mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-27 00:40:19 +00:00
Qt/Input: fix numpad (regression)
This commit is contained in:
parent
8b31a9448a
commit
58d8d12665
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user