bool QWindowsInputContext::composition(HWND hwnd, LPARAM lParamIn) { QObject *fo = qApp->focusObject(); const int lParam = int(lParamIn); if (QWindowsContext::verboseInputMethods) qDebug() << '>' << __FUNCTION__ << fo << debugComposition(lParam) << " composing=" << m_compositionContext.isComposing; if (!fo || m_compositionContext.hwnd != hwnd || !lParam) return false; const HIMC himc = ImmGetContext(m_compositionContext.hwnd); if (!himc) return false; QScopedPointer<QInputMethodEvent> event; if (lParam & (GCS_COMPSTR | GCS_COMPATTR | GCS_CURSORPOS)) { if (!m_compositionContext.isComposing) startContextComposition(); // Some intermediate composition result. Parametrize event with // attribute sequence specifying the formatting of the converted part. int selStart, selLength; m_compositionContext.composition = getCompositionString(himc, GCS_COMPSTR); m_compositionContext.position = ImmGetCompositionString(himc, GCS_CURSORPOS, 0, 0); getCompositionStringConvertedRange(himc, &selStart, &selLength); if ((lParam & CS_INSERTCHAR) && (lParam & CS_NOMOVECARET)) { // make Korean work correctly. Hope this is correct for all IMEs selStart = 0; selLength = m_compositionContext.composition.size(); } if (!selLength) selStart = 0; event.reset(new QInputMethodEvent(m_compositionContext.composition, intermediateMarkup(m_compositionContext.position, m_compositionContext.composition.size(), selStart, selLength))); } if (event.isNull()) event.reset(new QInputMethodEvent); if (lParam & GCS_RESULTSTR) { // A fixed result, return the converted string event->setCommitString(getCompositionString(himc, GCS_RESULTSTR)); endContextComposition(); } const bool result = QCoreApplication::sendEvent(fo, event.data()); if (QWindowsContext::verboseInputMethods) qDebug() << '<' << __FUNCTION__ << "sending markup=" << event->attributes().size() << " commit=" << event->commitString() << " to " << fo << " returns " << result; update(Qt::ImQueryAll); ImmReleaseContext(m_compositionContext.hwnd, himc); return result; }
WCHAR* IME_getCompositionString() { HWND hwnd = GetFocus(); if (!hwnd) return NULL; HIMC imc = ImmGetContext(hwnd); if (!imc) return NULL; WCHAR* comp_str = getCompositionString(imc, GCS_COMPSTR); ImmReleaseContext(hwnd, imc); return comp_str; }
static bool handleEndComposition(HWND hwnd, WPARAM wParam, LPARAM lParam) { /* Obtain IME context */ HIMC imc = ImmGetContext(hwnd); if (!imc) return false; wchar_t* comp_str = getCompositionString(imc, GCS_RESULTSTR); ImmReleaseContext(hwnd, imc); /* Generate notification */ nvdaControllerInternal_inputCompositionUpdate((comp_str?comp_str:L""),-1,-1,0); if(comp_str) { free(comp_str); return true; } return false; }
static bool handleComposition(HWND hwnd, WPARAM wParam, LPARAM lParam) { /* Obtain IME context */ HIMC imc = ImmGetContext(hwnd); if (!imc) return false; wchar_t* comp_str = getCompositionString(imc, GCS_COMPSTR); long selectionStart=ImmGetCompositionString(imc,GCS_CURSORPOS,NULL,0)&0xffff; ImmReleaseContext(hwnd, imc); if(!comp_str) return false; /* Generate notification */ long len=(long)wcslen(comp_str); if(len>1||(len==1&&comp_str[0]!=L'\x3000')) { nvdaControllerInternal_inputCompositionUpdate(comp_str,selectionStart,selectionStart,0); } free(comp_str); return true; }