From 9e44b76093e08fed7b57b52246f39a38f3265727 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 11 Oct 2012 07:42:08 +0200 Subject: [PATCH] Added possibleKeys(QKeyEvent *) to QWindowsIntegration Task-number: QTBUG-26902 Change-Id: I08d244816eae8794b52f244f049ee1fb825dac8b Reviewed-by: Friedemann Kleint --- .../platforms/windows/qwindowscontext.cpp | 5 ++++ .../platforms/windows/qwindowscontext.h | 2 ++ .../platforms/windows/qwindowsintegration.cpp | 5 ++++ .../platforms/windows/qwindowsintegration.h | 1 + .../platforms/windows/qwindowskeymapper.cpp | 26 +++++++++++++++++++ .../platforms/windows/qwindowskeymapper.h | 2 ++ 6 files changed, 41 insertions(+) diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 0dade2c49b..c36b9196b1 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -331,6 +331,11 @@ bool QWindowsContext::useRTLExtensions() const return d->m_keyMapper.useRTLExtensions(); } +QList QWindowsContext::possibleKeys(const QKeyEvent *e) const +{ + return d->m_keyMapper.possibleKeys(e); +} + void QWindowsContext::setWindowCreationContext(const QSharedPointer &ctx) { d->m_creationContext = ctx; diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index 3f08a742f8..450d6c8f4b 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -60,6 +60,7 @@ class QWindowsMimeConverter; struct QWindowCreationContext; struct QWindowsContextPrivate; class QPoint; +class QKeyEvent; #ifndef Q_OS_WINCE struct QWindowsUser32DLL @@ -170,6 +171,7 @@ public: unsigned systemInfo() const; bool useRTLExtensions() const; + QList possibleKeys(const QKeyEvent *e) const; QWindowsMimeConverter &mimeConverter() const; QWindowsScreenManager &screenManager(); diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 463e01246b..1f26ec5bab 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -447,6 +447,11 @@ Qt::KeyboardModifiers QWindowsIntegration::queryKeyboardModifiers() const return QWindowsKeyMapper::queryKeyboardModifiers(); } +QList QWindowsIntegration::possibleKeys(const QKeyEvent *e) const +{ + return d->m_context.possibleKeys(e); +} + QPlatformNativeInterface *QWindowsIntegration::nativeInterface() const { return &d->m_nativeInterface; diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h index fe095cf5d3..49780566dd 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.h +++ b/src/plugins/platforms/windows/qwindowsintegration.h @@ -81,6 +81,7 @@ public: virtual QVariant styleHint(StyleHint hint) const; virtual Qt::KeyboardModifiers queryKeyboardModifiers() const; + virtual QList possibleKeys(const QKeyEvent *e) const; static QWindowsIntegration *instance(); diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp index 322d66836a..b57a27acb4 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.cpp +++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp @@ -1119,4 +1119,30 @@ Qt::KeyboardModifiers QWindowsKeyMapper::queryKeyboardModifiers() return modifiers; } +QList QWindowsKeyMapper::possibleKeys(const QKeyEvent *e) const +{ + QList result; + + KeyboardLayoutItem *kbItem = keyLayout[e->nativeVirtualKey()]; + if (!kbItem) + return result; + + quint32 baseKey = kbItem->qtKey[0]; + Qt::KeyboardModifiers keyMods = e->modifiers(); + if (baseKey == Qt::Key_Return && (e->nativeModifiers() & ExtendedKey)) { + result << int(Qt::Key_Enter + keyMods); + return result; + } + result << int(baseKey + keyMods); // The base key is _always_ valid, of course + + for (int i = 1; i < 9; ++i) { + Qt::KeyboardModifiers neededMods = ModsTbl[i]; + quint32 key = kbItem->qtKey[i]; + if (key && key != baseKey && ((keyMods & neededMods) == neededMods)) + result << int(key + (keyMods & ~neededMods)); + } + + return result; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowskeymapper.h b/src/plugins/platforms/windows/qwindowskeymapper.h index 3a13deb0b6..7b3f18a42d 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.h +++ b/src/plugins/platforms/windows/qwindowskeymapper.h @@ -48,6 +48,7 @@ QT_BEGIN_NAMESPACE +class QKeyEvent; class QWindow; struct KeyboardLayoutItem; @@ -70,6 +71,7 @@ public: void setKeyGrabber(QWindow *w) { m_keyGrabber = w; } static Qt::KeyboardModifiers queryKeyboardModifiers(); + QList possibleKeys(const QKeyEvent *e) const; private: bool translateKeyEventInternal(QWindow *receiver, const MSG &msg, bool grab);