summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/windows/qwindowsinputcontext.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2014-11-12 09:13:23 +0100
committerFriedemann Kleint <Friedemann.Kleint@theqtcompany.com>2014-11-26 21:14:48 +0100
commitb55f88caba339a49bf0ebabfa324dde523c2b866 (patch)
treee46f7384de455a36badf3df8bb68e6136c70006c /src/plugins/platforms/windows/qwindowsinputcontext.cpp
parentc91c05b056c769c3df0d7634aed7d9bf2c0e550d (diff)
Windows: Correctly associate IME contexts.
Associate a 0-context with the window if IME is disabled, store this state as a flag to QWindowsWindow. Associate default context again when enabled window gains focus. Task-number: QTBUG-40691 Change-Id: I78d5494a05f93a39e245ca7c096d45445e684ea8 Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
Diffstat (limited to 'src/plugins/platforms/windows/qwindowsinputcontext.cpp')
-rw-r--r--src/plugins/platforms/windows/qwindowsinputcontext.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
index b1259d757e..94a27d146f 100644
--- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
@@ -145,6 +145,7 @@ static inline void imeNotifyCancelComposition(HWND hwnd)
*/
+HIMC QWindowsInputContext::m_defaultContext = 0;
QWindowsInputContext::CompositionContext::CompositionContext() :
hwnd(0), haveCaret(false), position(0), isComposing(false)
@@ -199,13 +200,33 @@ void QWindowsInputContext::reset()
doneContext();
}
-void QWindowsInputContext::setFocusObject(QObject *)
+void QWindowsInputContext::setFocusObject(QObject *object)
{
// ### fixme: On Windows 8.1, it has been observed that the Input context
// remains active when this happens resulting in a lock-up. Consecutive
// key events still have VK_PROCESSKEY set and are thus ignored.
if (m_compositionContext.isComposing)
imeNotifyCancelComposition(m_compositionContext.hwnd);
+
+ const QWindow *window = QGuiApplication::focusWindow();
+ if (object && window) {
+ QWindowsWindow *platformWindow = QWindowsWindow::baseWindowOf(window);
+ if (inputMethodAccepted()) {
+ // Re-enable IME by associating default context saved on first disabling.
+ if (platformWindow->testFlag(QWindowsWindow::InputMethodDisabled)) {
+ ImmAssociateContext(platformWindow->handle(), QWindowsInputContext::m_defaultContext);
+ platformWindow->clearFlag(QWindowsWindow::InputMethodDisabled);
+ }
+ } else {
+ // Disable IME by associating 0 context. Store context first time.
+ if (!platformWindow->testFlag(QWindowsWindow::InputMethodDisabled)) {
+ const HIMC oldImC = ImmAssociateContext(platformWindow->handle(), 0);
+ platformWindow->setFlag(QWindowsWindow::InputMethodDisabled);
+ if (!QWindowsInputContext::m_defaultContext && oldImC)
+ QWindowsInputContext::m_defaultContext = oldImC;
+ }
+ }
+ }
}
/*!