95 lines
4.1 KiB
Diff
95 lines
4.1 KiB
Diff
![]() |
From c137502c7fd7550c780c9531ec414098d8101757 Mon Sep 17 00:00:00 2001
|
||
|
From: Alexander Volkov <a.volkov@rusbitech.ru>
|
||
|
Date: Thu, 18 Sep 2014 16:16:26 +0400
|
||
|
Subject: Fix shortcuts with keypad keys
|
||
|
|
||
|
The way of searching a shortcut match for a key without the keypad
|
||
|
modifier introduced in 547a1bea492954d828aa0798be93384669812489 is
|
||
|
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 before 547a1bea492954d828aa0798be93384669812489.
|
||
|
|
||
|
Task-number: QTBUG-33093
|
||
|
Task-number: QTBUG-20191
|
||
|
Change-Id: I5b33c9b6cf2c06b133166a31eba9aff9181c9483
|
||
|
---
|
||
|
src/gui/kernel/qshortcutmap.cpp | 12 +++++-------
|
||
|
src/gui/kernel/qshortcutmap_p.h | 4 ++--
|
||
|
2 files changed, 7 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/src/gui/kernel/qshortcutmap.cpp b/src/gui/kernel/qshortcutmap.cpp
|
||
|
index c915ed39..c13c82c 100644
|
||
|
--- a/src/gui/kernel/qshortcutmap.cpp
|
||
|
+++ b/src/gui/kernel/qshortcutmap.cpp
|
||
|
@@ -388,9 +388,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
|
||
|
@@ -443,13 +441,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
|
||
|
@@ -551,7 +549,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);
|
||
|
@@ -581,7 +579,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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
diff --git a/src/gui/kernel/qshortcutmap_p.h b/src/gui/kernel/qshortcutmap_p.h
|
||
|
index 3959c2c..39a8eac 100644
|
||
|
--- a/src/gui/kernel/qshortcutmap_p.h
|
||
|
+++ b/src/gui/kernel/qshortcutmap_p.h
|
||
|
@@ -96,10 +96,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);
|
||
|
|
||
|
--
|
||
|
cgit v0.11.0
|
||
|
|