static void DefaultIMEComposition(HIMC hIMC, HWND hwnd, LPARAM lParam) { TRACE("IME message WM_IME_COMPOSITION 0x%lx\n", lParam); if (lParam & GCS_RESULTSTR) { LPCOMPOSITIONSTRING compstr; LPBYTE compdata; LPWSTR ResultStr; HIMCC newCompStr; LPINPUTCONTEXT lpIMC; lpIMC = LockRealIMC(hIMC); if (lpIMC == NULL) return; TRACE("Posting result as IME_CHAR\n"); compdata = ImmLockIMCC(lpIMC->hCompStr); compstr = (LPCOMPOSITIONSTRING)compdata; ResultStr = (LPWSTR)(compdata + compstr->dwResultStrOffset); GenerateIMECHARMessages(hIMC, ResultStr, compstr->dwResultStrLen); ImmUnlockIMCC(lpIMC->hCompStr); /* clear the buffer */ newCompStr = updateResultStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; UnlockRealIMC(hIMC); } else UpdateDefaultIMEWindow(hIMC, hwnd); }
void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen) { HIMC imc; LPINPUTCONTEXT lpIMC; HIMCC newCompStr; LPIMEPRIVATE myPrivate; imc = RealIMC(FROM_X11); lpIMC = ImmLockIMC(imc); if (lpIMC == NULL) return; newCompStr = updateResultStr(lpIMC->hCompStr, lpResult, dwResultLen); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; myPrivate = ImmLockIMCC(lpIMC->hPrivate); if (!myPrivate->bInComposition) GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0); GenerateIMEMessage(imc, WM_IME_COMPOSITION, 0, GCS_RESULTSTR); if (!myPrivate->bInComposition) GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0); ImmUnlockIMCC(lpIMC->hPrivate); ImmUnlockIMC(imc); }
void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen) { HIMC imc; LPINPUTCONTEXT lpIMC; HIMCC newCompStr; LPIMEPRIVATE myPrivate; BOOL inComp; imc = RealIMC(FROM_X11); lpIMC = ImmLockIMC(imc); if (lpIMC == NULL) return; newCompStr = updateCompStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; newCompStr = updateResultStr(lpIMC->hCompStr, lpResult, dwResultLen); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; myPrivate = ImmLockIMCC(lpIMC->hPrivate); inComp = myPrivate->bInComposition; ImmUnlockIMCC(lpIMC->hPrivate); if (!inComp) { ImmSetOpenStatus(imc, TRUE); GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0); } GenerateIMEMessage(imc, WM_IME_COMPOSITION, 0, GCS_COMPSTR); GenerateIMEMessage(imc, WM_IME_COMPOSITION, lpResult[0], GCS_RESULTSTR|GCS_RESULTCLAUSE); GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0); if (!inComp) ImmSetOpenStatus(imc, FALSE); ImmUnlockIMC(imc); }
BOOL WINAPI NotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue) { BOOL bRet = FALSE; LPINPUTCONTEXT lpIMC; TRACE("%p %i %i %i\n",hIMC,dwAction,dwIndex,dwValue); lpIMC = LockRealIMC(hIMC); if (lpIMC == NULL) return FALSE; switch (dwAction) { case NI_OPENCANDIDATE: FIXME("NI_OPENCANDIDATE\n"); break; case NI_CLOSECANDIDATE: FIXME("NI_CLOSECANDIDATE\n"); break; case NI_SELECTCANDIDATESTR: FIXME("NI_SELECTCANDIDATESTR\n"); break; case NI_CHANGECANDIDATELIST: FIXME("NI_CHANGECANDIDATELIST\n"); break; case NI_SETCANDIDATE_PAGESTART: FIXME("NI_SETCANDIDATE_PAGESTART\n"); break; case NI_SETCANDIDATE_PAGESIZE: FIXME("NI_SETCANDIDATE_PAGESIZE\n"); break; case NI_CONTEXTUPDATED: switch (dwValue) { case IMC_SETCOMPOSITIONWINDOW: FIXME("IMC_SETCOMPOSITIONWINDOW\n"); break; case IMC_SETCONVERSIONMODE: FIXME("IMC_SETCONVERSIONMODE\n"); break; case IMC_SETSENTENCEMODE: FIXME("IMC_SETSENTENCEMODE\n"); break; case IMC_SETCANDIDATEPOS: FIXME("IMC_SETCANDIDATEPOS\n"); break; case IMC_SETCOMPOSITIONFONT: { LPIMEPRIVATE myPrivate; TRACE("IMC_SETCOMPOSITIONFONT\n"); myPrivate = ImmLockIMCC(lpIMC->hPrivate); if (myPrivate->textfont) { DeleteObject(myPrivate->textfont); myPrivate->textfont = NULL; } myPrivate->textfont = CreateFontIndirectW(&lpIMC->lfFont.W); ImmUnlockIMCC(lpIMC->hPrivate); } break; case IMC_SETOPENSTATUS: TRACE("IMC_SETOPENSTATUS\n"); bRet = TRUE; X11DRV_SetPreeditState(lpIMC->hWnd, lpIMC->fOpen); if (!lpIMC->fOpen) { LPIMEPRIVATE myPrivate; myPrivate = ImmLockIMCC(lpIMC->hPrivate); if (myPrivate->bInComposition) { X11DRV_ForceXIMReset(lpIMC->hWnd); GenerateIMEMessage(hIMC, WM_IME_ENDCOMPOSITION, 0, 0); myPrivate->bInComposition = FALSE; } ImmUnlockIMCC(lpIMC->hPrivate); } break; default: FIXME("Unknown\n"); break; } break; case NI_COMPOSITIONSTR: switch (dwIndex) { case CPS_COMPLETE: { HIMCC newCompStr; DWORD cplen = 0; LPWSTR cpstr; LPCOMPOSITIONSTRING cs = NULL; LPBYTE cdata = NULL; LPIMEPRIVATE myPrivate; TRACE("CPS_COMPLETE\n"); /* clear existing result */ newCompStr = updateResultStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; if (lpIMC->hCompStr) { cdata = ImmLockIMCC(lpIMC->hCompStr); cs = (LPCOMPOSITIONSTRING)cdata; cplen = cs->dwCompStrLen; cpstr = (LPWSTR)&(cdata[cs->dwCompStrOffset]); ImmUnlockIMCC(lpIMC->hCompStr); } if (cplen > 0) { WCHAR param = cpstr[0]; newCompStr = updateResultStr(lpIMC->hCompStr, cpstr, cplen); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; newCompStr = updateCompStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; GenerateIMEMessage(hIMC, WM_IME_COMPOSITION, 0, GCS_COMPSTR); GenerateIMEMessage(hIMC, WM_IME_COMPOSITION, param, GCS_RESULTSTR|GCS_RESULTCLAUSE); } GenerateIMEMessage(hIMC,WM_IME_ENDCOMPOSITION, 0, 0); myPrivate = ImmLockIMCC(lpIMC->hPrivate); myPrivate->bInComposition = FALSE; ImmUnlockIMCC(lpIMC->hPrivate); bRet = TRUE; } break; case CPS_CONVERT: FIXME("CPS_CONVERT\n"); break; case CPS_REVERT: FIXME("CPS_REVERT\n"); break; case CPS_CANCEL: { LPIMEPRIVATE myPrivate; TRACE("CPS_CANCEL\n"); X11DRV_ForceXIMReset(lpIMC->hWnd); if (lpIMC->hCompStr) ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = ImeCreateBlankCompStr(); myPrivate = ImmLockIMCC(lpIMC->hPrivate); if (myPrivate->bInComposition) { GenerateIMEMessage(hIMC, WM_IME_ENDCOMPOSITION, 0, 0); myPrivate->bInComposition = FALSE; } ImmUnlockIMCC(lpIMC->hPrivate); bRet = TRUE; } break; default: FIXME("Unknown\n"); break; } break; default: FIXME("Unknown Message\n"); break; } UnlockRealIMC(hIMC); return bRet; }
BOOL WINAPI ImeSetCompositionString(HIMC hIMC, DWORD dwIndex, LPCVOID lpComp, DWORD dwCompLen, LPCVOID lpRead, DWORD dwReadLen) { LPINPUTCONTEXT lpIMC; DWORD flags = 0; WCHAR wParam = 0; LPIMEPRIVATE myPrivate; TRACE("(%p, %d, %p, %d, %p, %d):\n", hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen); if (hIMC != FROM_X11) FIXME("PROBLEM: This only sets the wine level string\n"); /* * Explanation: * this sets the composition string in the imm32.dll level * of the composition buffer. we cannot manipulate the xim level * buffer, which means that once the xim level buffer changes again * any call to this function from the application will be lost */ if (lpRead && dwReadLen) FIXME("Reading string unimplemented\n"); lpIMC = LockRealIMC(hIMC); if (lpIMC == NULL) return FALSE; myPrivate = ImmLockIMCC(lpIMC->hPrivate); if (dwIndex == SCS_SETSTR) { HIMCC newCompStr; if (!myPrivate->bInComposition) { GenerateIMEMessage(hIMC, WM_IME_STARTCOMPOSITION, 0, 0); myPrivate->bInComposition = TRUE; } /* clear existing result */ newCompStr = updateResultStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; flags = GCS_COMPSTR; if (dwCompLen && lpComp) { newCompStr = updateCompStr(lpIMC->hCompStr, (LPCWSTR)lpComp, dwCompLen / sizeof(WCHAR)); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; wParam = ((const WCHAR*)lpComp)[0]; flags |= GCS_COMPCLAUSE | GCS_COMPATTR | GCS_DELTASTART; } else { newCompStr = updateCompStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; } } GenerateIMEMessage(hIMC, WM_IME_COMPOSITION, wParam, flags); ImmUnlockIMCC(lpIMC->hPrivate); UnlockRealIMC(hIMC); return TRUE; }