bool QWindowsInputContext::endComposition(HWND hwnd) { if (QWindowsContext::verboseInputMethods) qDebug() << __FUNCTION__ << m_endCompositionRecursionGuard << hwnd; // Googles Pinyin Input Method likes to call endComposition again // when we call notifyIME with CPS_CANCEL, so protect ourselves // against that. if (m_endCompositionRecursionGuard || m_compositionContext.hwnd != hwnd) return false; QObject *fo = qApp->focusObject(); if (!fo) return false; m_endCompositionRecursionGuard = true; imeNotifyCancelComposition(m_compositionContext.hwnd); if (m_compositionContext.isComposing) { QInputMethodEvent event; QCoreApplication::sendEvent(fo, &event); } doneContext(); m_endCompositionRecursionGuard = false; return true; }
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 && window->handle()) { 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; } } } }
void QWindowsInputContext::reset() { QPlatformInputContext::reset(); if (!m_compositionContext.hwnd) return; qCDebug(lcQpaInputMethods) << __FUNCTION__; if (m_compositionContext.isComposing && !m_compositionContext.focusObject.isNull()) { QInputMethodEvent event; if (!m_compositionContext.composition.isEmpty()) event.setCommitString(m_compositionContext.composition); QCoreApplication::sendEvent(m_compositionContext.focusObject, &event); endContextComposition(); } imeNotifyCancelComposition(m_compositionContext.hwnd); doneContext(); }
void QWindowsInputContext::reset() { QPlatformInputContext::reset(); if (!m_compositionContext.hwnd) return; QObject *fo = qApp->focusObject(); if (QWindowsContext::verboseInputMethods) qDebug() << __FUNCTION__<< fo; if (!fo) return; if (m_compositionContext.isComposing) { QInputMethodEvent event; if (!m_compositionContext.composition.isEmpty()) event.setCommitString(m_compositionContext.composition); QCoreApplication::sendEvent(fo, &event); endContextComposition(); } imeNotifyCancelComposition(m_compositionContext.hwnd); doneContext(); }