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;
}
示例#2
0
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;
            }
        }
    }
}
示例#3
0
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();
}