Fix shortcuts with keypad keys
The way of searching a shortcut match for a key without the keypad modifier introduced inbb10547a1bea49is not correct. QKeyEvent::setModifiers() doesn't change native scan code so we get the incorrect QKeyEvent object which is eventually passed to the implementation of QPlatformIntegration::possibleKeys(). And then QPlatformIntegration::possibleKeys() returns the same result as for the original QKeyEvent object. So to fix it we have to remove Qt::KeypadModifier from keys after calling the implementation of QPlatformIntegration::possibleKeys(), as it was before547a1bea49. Task-number: QTBUG-33093 Task-number: QTBUG-44577 Change-Id: I5b33c9b6cf2c06b133166a31eba9aff9181c9483 Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
parent
08150122aa
commit
be18d6fb01
|
|
@ -386,9 +386,7 @@ QKeySequence::SequenceMatch QShortcutMap::nextState(QKeyEvent *e)
|
|||
result = find(e);
|
||||
if (result == QKeySequence::NoMatch && (e->modifiers() & Qt::KeypadModifier)) {
|
||||
// Try to find a match without keypad modifier
|
||||
QKeyEvent event = *e;
|
||||
event.setModifiers(e->modifiers() & ~Qt::KeypadModifier);
|
||||
result = find(&event);
|
||||
result = find(e, Qt::KeypadModifier);
|
||||
}
|
||||
if (result == QKeySequence::NoMatch && e->modifiers() & Qt::ShiftModifier) {
|
||||
// If Shift + Key_Backtab, also try Shift + Qt::Key_Tab
|
||||
|
|
@ -441,13 +439,13 @@ bool QShortcutMap::hasShortcutForKeySequence(const QKeySequence &seq) const
|
|||
which can be access through matches().
|
||||
\sa matches
|
||||
*/
|
||||
QKeySequence::SequenceMatch QShortcutMap::find(QKeyEvent *e)
|
||||
QKeySequence::SequenceMatch QShortcutMap::find(QKeyEvent *e, int ignoredModifiers)
|
||||
{
|
||||
Q_D(QShortcutMap);
|
||||
if (!d->sequences.count())
|
||||
return QKeySequence::NoMatch;
|
||||
|
||||
createNewSequences(e, d->newEntries);
|
||||
createNewSequences(e, d->newEntries, ignoredModifiers);
|
||||
#if defined(DEBUG_QSHORTCUTMAP)
|
||||
qDebug() << "Possible shortcut key sequences:" << d->newEntries;
|
||||
#endif
|
||||
|
|
@ -549,7 +547,7 @@ void QShortcutMap::clearSequence(QVector<QKeySequence> &ksl)
|
|||
Alters \a seq to the new sequence state, based on the
|
||||
current sequence state, and the new key event \a e.
|
||||
*/
|
||||
void QShortcutMap::createNewSequences(QKeyEvent *e, QVector<QKeySequence> &ksl)
|
||||
void QShortcutMap::createNewSequences(QKeyEvent *e, QVector<QKeySequence> &ksl, int ignoredModifiers)
|
||||
{
|
||||
Q_D(QShortcutMap);
|
||||
QList<int> possibleKeys = QKeyMapper::possibleKeys(e);
|
||||
|
|
@ -579,7 +577,7 @@ void QShortcutMap::createNewSequences(QKeyEvent *e, QVector<QKeySequence> &ksl)
|
|||
curKsl.setKey(0, 2);
|
||||
curKsl.setKey(0, 3);
|
||||
}
|
||||
curKsl.setKey(possibleKeys.at(pkNum), index);
|
||||
curKsl.setKey(possibleKeys.at(pkNum) & ~ignoredModifiers, index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,10 +88,10 @@ private:
|
|||
QKeySequence::SequenceMatch state();
|
||||
void dispatchEvent(QKeyEvent *e);
|
||||
|
||||
QKeySequence::SequenceMatch find(QKeyEvent *e);
|
||||
QKeySequence::SequenceMatch find(QKeyEvent *e, int ignoredModifiers = 0);
|
||||
QKeySequence::SequenceMatch matches(const QKeySequence &seq1, const QKeySequence &seq2) const;
|
||||
QVector<const QShortcutEntry *> matches() const;
|
||||
void createNewSequences(QKeyEvent *e, QVector<QKeySequence> &ksl);
|
||||
void createNewSequences(QKeyEvent *e, QVector<QKeySequence> &ksl, int ignoredModifiers);
|
||||
void clearSequence(QVector<QKeySequence> &ksl);
|
||||
int translateModifiers(Qt::KeyboardModifiers modifiers);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue