- LPINPUTCONTEXT pIC;
-
- TRACE("ImmGetConversionStatus(%p %p %p)\n", hIMC, lpfdwConversion, lpfdwSentence);
-
- pIC = ImmLockIMC(hIMC);
- if (!pIC)
- return FALSE;
-
- if (lpfdwConversion)
- *lpfdwConversion = pIC->fdwConversion;
- if (lpfdwSentence)
- *lpfdwSentence = pIC->fdwSentence;
-
- ImmUnlockIMC(hIMC);
- return TRUE;
-}
-
-static BOOL needs_ime_window(HWND hwnd)
-{
- WCHAR classW[8];
-
- if (GetClassNameW(hwnd, classW, ARRAY_SIZE(classW)) && !lstrcmpW(classW, szwIME))
- return FALSE;
- if (GetClassLongPtrW(hwnd, GCL_STYLE) & CS_IME) return FALSE;
-
- return TRUE;
-}
-
-/***********************************************************************
- * __wine_register_window (IMM32.@)
- */
-BOOL WINAPI __wine_register_window(HWND hwnd)
-{
- HWND new = NULL;
- IMMThreadData *thread_data;
- TRACE("(%p)\n", hwnd);
-
- if (!needs_ime_window(hwnd))
- return FALSE;
-
- thread_data = IMM_GetThreadData(hwnd, 0);
- if (!thread_data)
- return FALSE;
-
- if (thread_data->disableIME || disable_ime)
- {
- TRACE("IME for this thread is disabled\n");
- LeaveCriticalSection(&threaddata_cs);
- return FALSE;
- }
- thread_data->windowRefs++;
- TRACE("windowRefs=%u, hwndDefault=%p\n",
- thread_data->windowRefs, thread_data->hwndDefault);
-
- /* Create default IME window */
- if (thread_data->windowRefs == 1)
- {
- /* Do not create the window inside of a critical section */
- LeaveCriticalSection(&threaddata_cs);
- new = CreateWindowExW( 0, szwIME, szwDefaultIME,
- WS_POPUP | WS_DISABLED | WS_CLIPSIBLINGS,
- 0, 0, 1, 1, 0, 0, 0, 0);
- /* thread_data is in the current thread so we can assume it's still valid */
- EnterCriticalSection(&threaddata_cs);
- /* See if anyone beat us */
- if (thread_data->hwndDefault == NULL)
- {
- thread_data->hwndDefault = new;
- new = NULL;
- TRACE("Default is %p\n", thread_data->hwndDefault);
- }
- }
-
- LeaveCriticalSection(&threaddata_cs);
-
- /* Clean up an unused new window outside of the critical section */
- if (new != NULL)
- DestroyWindow(new);
- return TRUE;
-}
-
-/***********************************************************************
- * __wine_unregister_window (IMM32.@)
- */
-void WINAPI __wine_unregister_window(HWND hwnd)
-{
- HWND to_destroy = 0;
- IMMThreadData *thread_data;
- TRACE("(%p)\n", hwnd);
-
- thread_data = IMM_GetThreadData(hwnd, 0);
- if (!thread_data) return;
-
- thread_data->windowRefs--;
- TRACE("windowRefs=%u, hwndDefault=%p\n",
- thread_data->windowRefs, thread_data->hwndDefault);
-
- /* Destroy default IME window */
- if (thread_data->windowRefs == 0 && thread_data->hwndDefault)
- {
- to_destroy = thread_data->hwndDefault;
- thread_data->hwndDefault = NULL;
- }
- LeaveCriticalSection(&threaddata_cs);
-
- if (to_destroy) DestroyWindow( to_destroy );
-}
-
-/***********************************************************************
- * ImmGetDefaultIMEWnd (IMM32.@)
- */
-HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd)
-{
- if (!(g_dwImm32Flags & IMM32_FLAG_UNKNOWN))
- return NULL;
-
- if (hWnd == NULL)
- return (HWND)Imm32GetThreadState(THREADSTATE_ACTIVEWINDOW);
-
- return (HWND)Imm32QueryWindow(hWnd, QUERY_WINDOW_DEFAULT_IME);
-}
-
-/***********************************************************************
- * CtfImmIsCiceroEnabled (IMM32.@)
- */
-BOOL WINAPI CtfImmIsCiceroEnabled(VOID)
-{
- return !!(g_dwImm32Flags & IMM32_FLAG_CICERO_ENABLED);
-}
-
-/***********************************************************************
- * ImmGetDescriptionA (IMM32.@)
- */
-UINT WINAPI ImmGetDescriptionA(
- HKL hKL, LPSTR lpszDescription, UINT uBufLen)
-{
- IMEINFOEX info;
- size_t cch;
-
- TRACE("ImmGetDescriptionA(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
-
- if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL))
- return 0;
-
- StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch);
- cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeDescription, (INT)cch,
- lpszDescription, uBufLen, NULL, NULL);
- if (uBufLen)
- lpszDescription[cch] = 0;
- return cch;
-}
-
-/***********************************************************************
- * ImmGetDescriptionW (IMM32.@)
- */
-UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
-{
- IMEINFOEX info;
- size_t cch;
-
- TRACE("ImmGetDescriptionW(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
-
- if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL))
- return 0;
-
- if (uBufLen != 0)
- StringCchCopyW(lpszDescription, uBufLen, info.wszImeDescription);
-
- StringCchLengthW(info.wszImeDescription, _countof(info.wszImeDescription), &cch);
- return (UINT)cch;
-}
-
-/***********************************************************************
- * ImmGetGuideLineA (IMM32.@)
- */
-DWORD WINAPI ImmGetGuideLineA(
- HIMC hIMC, DWORD dwIndex, LPSTR lpBuf, DWORD dwBufLen)
-{
- FIXME("(%p, %d, %s, %d): stub\n",
- hIMC, dwIndex, debugstr_a(lpBuf), dwBufLen
- );
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-/***********************************************************************
- * ImmGetGuideLineW (IMM32.@)
- */
-DWORD WINAPI ImmGetGuideLineW(HIMC hIMC, DWORD dwIndex, LPWSTR lpBuf, DWORD dwBufLen)
-{
- FIXME("(%p, %d, %s, %d): stub\n",
- hIMC, dwIndex, debugstr_w(lpBuf), dwBufLen
- );
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-/***********************************************************************
- * ImmGetIMEFileNameA (IMM32.@)
- */
-UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen)
-{
- BOOL bDefUsed;
- IMEINFOEX info;
- size_t cch;
-
- TRACE("ImmGetIMEFileNameA(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
-
- if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL))
- {
- if (uBufLen > 0)
- lpszFileName[0] = 0;
- return 0;
- }
-
- StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
-
- cch = WideCharToMultiByte(CP_ACP, 0, info.wszImeFile, (INT)cch,
- lpszFileName, uBufLen, NULL, &bDefUsed);
- if (uBufLen == 0)
- return (UINT)cch;
-
- if (cch > uBufLen - 1)
- cch = uBufLen - 1;
-
- lpszFileName[cch] = 0;
- return (UINT)cch;
-}
-
-/***********************************************************************
- * ImmGetIMEFileNameW (IMM32.@)
- */
-UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
-{
- IMEINFOEX info;
- size_t cch;
-
- TRACE("ImmGetIMEFileNameW(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
-
- if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL) || !IS_IME_HKL(hKL))
- {
- if (uBufLen > 0)
- lpszFileName[0] = 0;
- return 0;
- }
-
- StringCchLengthW(info.wszImeFile, _countof(info.wszImeFile), &cch);
- if (uBufLen == 0)
- return (UINT)cch;
-
- StringCchCopyNW(lpszFileName, uBufLen, info.wszImeFile, cch);
-
- if (cch > uBufLen - 1)
- cch = uBufLen - 1;
-
- lpszFileName[cch] = 0;
- return (UINT)cch;
-}
-
-/***********************************************************************
- * ImmGetOpenStatus (IMM32.@)
- */
-BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
-{
- BOOL ret;
- LPINPUTCONTEXT pIC;
-
- TRACE("ImmGetOpenStatus(%p)\n", hIMC);
-
- if (!hIMC)
- return FALSE;
-
- pIC = ImmLockIMC(hIMC);
- if (!pIC)
- return FALSE;
-
- ret = pIC->fOpen;
-
- ImmUnlockIMC(hIMC);
- return ret;
-}
-
-/***********************************************************************
- * ImmGetProperty (IMM32.@)
- */
-DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
-{
- DWORD rc = 0;
- ImmHkl *kbd;
-
- TRACE("(%p, %d)\n", hKL, fdwIndex);
- kbd = IMM_GetImmHkl(hKL);
-
- if (kbd && kbd->hIME)
- {
- switch (fdwIndex)
- {
- case IGP_PROPERTY: rc = kbd->imeInfo.fdwProperty; break;
- case IGP_CONVERSION: rc = kbd->imeInfo.fdwConversionCaps; break;
- case IGP_SENTENCE: rc = kbd->imeInfo.fdwSentenceCaps; break;
- case IGP_SETCOMPSTR: rc = kbd->imeInfo.fdwSCSCaps; break;
- case IGP_SELECT: rc = kbd->imeInfo.fdwSelectCaps; break;
- case IGP_GETIMEVERSION: rc = IMEVER_0400; break;
- case IGP_UI: rc = 0; break;
- default: rc = 0;
- }
- }
- return rc;
-}
-
-/***********************************************************************
- * ImmGetRegisterWordStyleA (IMM32.@)
- */
-UINT WINAPI ImmGetRegisterWordStyleA(
- HKL hKL, UINT nItem, LPSTYLEBUFA lpStyleBuf)
-{
- ImmHkl *immHkl = IMM_GetImmHkl(hKL);
- TRACE("(%p, %d, %p):\n", hKL, nItem, lpStyleBuf);
- if (immHkl->hIME && immHkl->pImeGetRegisterWordStyle)
- {
- if (!is_kbd_ime_unicode(immHkl))
- return immHkl->pImeGetRegisterWordStyle(nItem,(LPSTYLEBUFW)lpStyleBuf);
- else
- {
- STYLEBUFW sbw;
- UINT rc;
-
- rc = immHkl->pImeGetRegisterWordStyle(nItem,&sbw);
- WideCharToMultiByte(CP_ACP, 0, sbw.szDescription, -1,
- lpStyleBuf->szDescription, 32, NULL, NULL);
- lpStyleBuf->dwStyle = sbw.dwStyle;
- return rc;
- }
- }
- else
- return 0;
-}
-
-/***********************************************************************
- * ImmGetRegisterWordStyleW (IMM32.@)
- */
-UINT WINAPI ImmGetRegisterWordStyleW(
- HKL hKL, UINT nItem, LPSTYLEBUFW lpStyleBuf)
-{
- ImmHkl *immHkl = IMM_GetImmHkl(hKL);
- TRACE("(%p, %d, %p):\n", hKL, nItem, lpStyleBuf);
- if (immHkl->hIME && immHkl->pImeGetRegisterWordStyle)
- {
- if (is_kbd_ime_unicode(immHkl))
- return immHkl->pImeGetRegisterWordStyle(nItem,lpStyleBuf);
- else
- {
- STYLEBUFA sba;
- UINT rc;
-
- rc = immHkl->pImeGetRegisterWordStyle(nItem,(LPSTYLEBUFW)&sba);
- MultiByteToWideChar(CP_ACP, 0, sba.szDescription, -1,
- lpStyleBuf->szDescription, 32);
- lpStyleBuf->dwStyle = sba.dwStyle;
- return rc;
- }
- }
- else
- return 0;
-}
-
-/***********************************************************************
- * ImmGetStatusWindowPos (IMM32.@)
- */
-BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
-{
- LPINPUTCONTEXT pIC;
- BOOL ret;
-
- TRACE("ImmGetStatusWindowPos(%p, %p)\n", hIMC, lpptPos);
-
- pIC = ImmLockIMC(hIMC);
- if (pIC == NULL)
- return FALSE;
-
- ret = !!(pIC->fdwInit & INIT_STATUSWNDPOS);
- if (ret)
- *lpptPos = pIC->ptStatusWndPos;
-
- ImmUnlockIMC(hIMC);
- return ret;
-}
-
-/***********************************************************************
- * ImmGetVirtualKey (IMM32.@)
- */
-UINT WINAPI ImmGetVirtualKey(HWND hWnd)
-{
- OSVERSIONINFOA version;
- InputContextData *data = ImmGetContext( hWnd );
- TRACE("%p\n", hWnd);
-
- if ( data )
- return data->lastVK;
-
- version.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
- GetVersionExA( &version );
- switch(version.dwPlatformId)
- {
- case VER_PLATFORM_WIN32_WINDOWS:
- return VK_PROCESSKEY;
- case VER_PLATFORM_WIN32_NT:
- return 0;
- default:
- FIXME("%d not supported\n",version.dwPlatformId);
- return VK_PROCESSKEY;
- }
-}
-
-/***********************************************************************
- * ImmInstallIMEA (IMM32.@)
- */
-HKL WINAPI ImmInstallIMEA(
- LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
-{
- LPWSTR lpszwIMEFileName;
- LPWSTR lpszwLayoutText;
- HKL hkl;
-
- TRACE ("(%s, %s)\n", debugstr_a(lpszIMEFileName),
- debugstr_a(lpszLayoutText));
-
- lpszwIMEFileName = strdupAtoW(lpszIMEFileName);
- lpszwLayoutText = strdupAtoW(lpszLayoutText);
-
- hkl = ImmInstallIMEW(lpszwIMEFileName, lpszwLayoutText);
-
- HeapFree(GetProcessHeap(),0,lpszwIMEFileName);
- HeapFree(GetProcessHeap(),0,lpszwLayoutText);
- return hkl;
-}
-
-/***********************************************************************
- * ImmInstallIMEW (IMM32.@)
- */
-HKL WINAPI ImmInstallIMEW(
- LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
-{
- INT lcid = GetUserDefaultLCID();
- INT count;
- HKL hkl;
- DWORD rc;
- HKEY hkey;
- WCHAR regKey[ARRAY_SIZE(szImeRegFmt)+8];
-
- TRACE ("(%s, %s):\n", debugstr_w(lpszIMEFileName),
- debugstr_w(lpszLayoutText));
-
- /* Start with 2. e001 will be blank and so default to the wine internal IME */
- count = 2;
-
- while (count < 0xfff)
- {
- DWORD disposition = 0;
-
- hkl = (HKL)MAKELPARAM( lcid, 0xe000 | count );
- wsprintfW( regKey, szImeRegFmt, (ULONG_PTR)hkl);
-
- rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE, regKey, 0, NULL, 0, KEY_WRITE, NULL, &hkey, &disposition);
- if (rc == ERROR_SUCCESS && disposition == REG_CREATED_NEW_KEY)
- break;
- else if (rc == ERROR_SUCCESS)
- RegCloseKey(hkey);
-
- count++;
- }
-
- if (count == 0xfff)
- {
- WARN("Unable to find slot to install IME\n");
- return 0;
- }
-
- if (rc == ERROR_SUCCESS)
- {
- rc = RegSetValueExW(hkey, szImeFileW, 0, REG_SZ, (const BYTE*)lpszIMEFileName,
- (lstrlenW(lpszIMEFileName) + 1) * sizeof(WCHAR));
- if (rc == ERROR_SUCCESS)
- rc = RegSetValueExW(hkey, szLayoutTextW, 0, REG_SZ, (const BYTE*)lpszLayoutText,
- (lstrlenW(lpszLayoutText) + 1) * sizeof(WCHAR));
- RegCloseKey(hkey);
- return hkl;
- }
- else
- {
- WARN("Unable to set IME registry values\n");
- return 0;
- }
-}
-
-/***********************************************************************
- * ImmIsIME (IMM32.@)
- */
-BOOL WINAPI ImmIsIME(HKL hKL)
-{
- IMEINFOEX info;
- TRACE("ImmIsIME(%p)\n", hKL);
- return !!ImmGetImeInfoEx(&info, ImeInfoExImeWindow, &hKL);
-}
-
-/***********************************************************************
- * ImmIsUIMessageA (IMM32.@)
- */
-BOOL WINAPI ImmIsUIMessageA(
- HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- TRACE("(%p, %x, %ld, %ld)\n", hWndIME, msg, wParam, lParam);
- if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) ||
- (msg == WM_IME_SETCONTEXT) ||
- (msg == WM_IME_NOTIFY) ||
- (msg == WM_IME_COMPOSITIONFULL) ||
- (msg == WM_IME_SELECT) ||
- (msg == 0x287 /* FIXME: WM_IME_SYSTEM */))
- {
- if (hWndIME)
- SendMessageA(hWndIME, msg, wParam, lParam);
-
- return TRUE;
- }
- return FALSE;
-}
-
-/***********************************************************************
- * ImmIsUIMessageW (IMM32.@)
- */
-BOOL WINAPI ImmIsUIMessageW(
- HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- TRACE("(%p, %x, %ld, %ld)\n", hWndIME, msg, wParam, lParam);
- if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) ||
- (msg == WM_IME_SETCONTEXT) ||
- (msg == WM_IME_NOTIFY) ||
- (msg == WM_IME_COMPOSITIONFULL) ||
- (msg == WM_IME_SELECT) ||
- (msg == 0x287 /* FIXME: WM_IME_SYSTEM */))
- {
- if (hWndIME)
- SendMessageW(hWndIME, msg, wParam, lParam);
-
- return TRUE;
- }
- return FALSE;
-}
-
-/***********************************************************************
- * ImmNotifyIME (IMM32.@)
- */
-BOOL WINAPI ImmNotifyIME(
- HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
-{
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("(%p, %d, %d, %d)\n",
- hIMC, dwAction, dwIndex, dwValue);
-
- if (hIMC == NULL)
- {
- SetLastError(ERROR_SUCCESS);
- return FALSE;
- }
-
- if (!data || ! data->immKbd->pNotifyIME)
- {
- return FALSE;
- }
-
- return data->immKbd->pNotifyIME(hIMC,dwAction,dwIndex,dwValue);
-}
-
-/***********************************************************************
- * ImmRegisterWordA (IMM32.@)
- */
-BOOL WINAPI ImmRegisterWordA(
- HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszRegister)
-{
- ImmHkl *immHkl = IMM_GetImmHkl(hKL);
- TRACE("(%p, %s, %d, %s):\n", hKL, debugstr_a(lpszReading), dwStyle,
- debugstr_a(lpszRegister));
- if (immHkl->hIME && immHkl->pImeRegisterWord)
- {
- if (!is_kbd_ime_unicode(immHkl))
- return immHkl->pImeRegisterWord((LPCWSTR)lpszReading,dwStyle,
- (LPCWSTR)lpszRegister);
- else
- {
- LPWSTR lpszwReading = strdupAtoW(lpszReading);
- LPWSTR lpszwRegister = strdupAtoW(lpszRegister);
- BOOL rc;
-
- rc = immHkl->pImeRegisterWord(lpszwReading,dwStyle,lpszwRegister);
- HeapFree(GetProcessHeap(),0,lpszwReading);
- HeapFree(GetProcessHeap(),0,lpszwRegister);
- return rc;
- }
- }
- else
- return FALSE;
-}
-
-/***********************************************************************
- * ImmRegisterWordW (IMM32.@)
- */
-BOOL WINAPI ImmRegisterWordW(
- HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszRegister)
-{
- ImmHkl *immHkl = IMM_GetImmHkl(hKL);
- TRACE("(%p, %s, %d, %s):\n", hKL, debugstr_w(lpszReading), dwStyle,
- debugstr_w(lpszRegister));
- if (immHkl->hIME && immHkl->pImeRegisterWord)
- {
- if (is_kbd_ime_unicode(immHkl))
- return immHkl->pImeRegisterWord(lpszReading,dwStyle,lpszRegister);
- else
- {
- LPSTR lpszaReading = strdupWtoA(lpszReading);
- LPSTR lpszaRegister = strdupWtoA(lpszRegister);
- BOOL rc;
-
- rc = immHkl->pImeRegisterWord((LPCWSTR)lpszaReading,dwStyle,
- (LPCWSTR)lpszaRegister);
- HeapFree(GetProcessHeap(),0,lpszaReading);
- HeapFree(GetProcessHeap(),0,lpszaRegister);
- return rc;
- }
- }
- else
- return FALSE;
-}
-
-/***********************************************************************
- * ImmReleaseContext (IMM32.@)
- */
-BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
-{
- static BOOL shown = FALSE;
-
- if (!shown) {
- FIXME("(%p, %p): stub\n", hWnd, hIMC);
- shown = TRUE;
- }
- return TRUE;
-}
-
-/***********************************************************************
-* ImmRequestMessageA(IMM32.@)
-*/
-LRESULT WINAPI ImmRequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam)
-{
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("%p %ld %ld\n", hIMC, wParam, wParam);
-
- if (data) return SendMessageA(data->IMC.hWnd, WM_IME_REQUEST, wParam, lParam);
-
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
-}
-
-/***********************************************************************
-* ImmRequestMessageW(IMM32.@)
-*/
-LRESULT WINAPI ImmRequestMessageW(HIMC hIMC, WPARAM wParam, LPARAM lParam)
-{
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("%p %ld %ld\n", hIMC, wParam, wParam);
-
- if (data) return SendMessageW(data->IMC.hWnd, WM_IME_REQUEST, wParam, lParam);
-
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
-}
-
-/***********************************************************************
- * ImmSetCandidateWindow (IMM32.@)
- */
-BOOL WINAPI ImmSetCandidateWindow(
- HIMC hIMC, LPCANDIDATEFORM lpCandidate)
-{
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("(%p, %p)\n", hIMC, lpCandidate);
-
- if (!data || !lpCandidate)
- return FALSE;
-
- if (IMM_IsCrossThreadAccess(NULL, hIMC))
- return FALSE;
-
- TRACE("\t%x, %x, %s, %s\n",
- lpCandidate->dwIndex, lpCandidate->dwStyle,
- wine_dbgstr_point(&lpCandidate->ptCurrentPos),
- wine_dbgstr_rect(&lpCandidate->rcArea));
-
- if (lpCandidate->dwIndex >= ARRAY_SIZE(data->IMC.cfCandForm))
- return FALSE;
-
- data->IMC.cfCandForm[lpCandidate->dwIndex] = *lpCandidate;
- ImmNotifyIME(hIMC, NI_CONTEXTUPDATED, 0, IMC_SETCANDIDATEPOS);
- ImmInternalSendIMENotify(data, IMN_SETCANDIDATEPOS, 1 << lpCandidate->dwIndex);
-
- return TRUE;
-}
-
-/***********************************************************************
- * ImmSetCompositionFontA (IMM32.@)
- */
-BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
-{
- InputContextData *data = get_imc_data(hIMC);
- TRACE("(%p, %p)\n", hIMC, lplf);
-
- if (!data || !lplf)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if (IMM_IsCrossThreadAccess(NULL, hIMC))
- return FALSE;
-
- memcpy(&data->IMC.lfFont.W,lplf,sizeof(LOGFONTA));
- MultiByteToWideChar(CP_ACP, 0, lplf->lfFaceName, -1, data->IMC.lfFont.W.lfFaceName,
- LF_FACESIZE);
- ImmNotifyIME(hIMC, NI_CONTEXTUPDATED, 0, IMC_SETCOMPOSITIONFONT);
- ImmInternalSendIMENotify(data, IMN_SETCOMPOSITIONFONT, 0);
-
- return TRUE;
-}
-
-/***********************************************************************
- * ImmSetCompositionFontW (IMM32.@)
- */
-BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
-{
- InputContextData *data = get_imc_data(hIMC);
- TRACE("(%p, %p)\n", hIMC, lplf);
-
- if (!data || !lplf)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if (IMM_IsCrossThreadAccess(NULL, hIMC))
- return FALSE;
-
- data->IMC.lfFont.W = *lplf;
- ImmNotifyIME(hIMC, NI_CONTEXTUPDATED, 0, IMC_SETCOMPOSITIONFONT);
- ImmInternalSendIMENotify(data, IMN_SETCOMPOSITIONFONT, 0);
-
- return TRUE;
-}
-
-/***********************************************************************
- * ImmSetCompositionStringA (IMM32.@)
- */
-BOOL WINAPI ImmSetCompositionStringA(
- HIMC hIMC, DWORD dwIndex,
- LPCVOID lpComp, DWORD dwCompLen,
- LPCVOID lpRead, DWORD dwReadLen)
-{
- DWORD comp_len;
- DWORD read_len;
- WCHAR *CompBuffer = NULL;
- WCHAR *ReadBuffer = NULL;
- BOOL rc;
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("(%p, %d, %p, %d, %p, %d):\n",
- hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
-
- if (!data)
- return FALSE;
-
- if (!(dwIndex == SCS_SETSTR ||
- dwIndex == SCS_CHANGEATTR ||
- dwIndex == SCS_CHANGECLAUSE ||
- dwIndex == SCS_SETRECONVERTSTRING ||
- dwIndex == SCS_QUERYRECONVERTSTRING))
- return FALSE;
-
- if (!is_himc_ime_unicode(data))
- return data->immKbd->pImeSetCompositionString(hIMC, dwIndex, lpComp,
- dwCompLen, lpRead, dwReadLen);
-
- comp_len = MultiByteToWideChar(CP_ACP, 0, lpComp, dwCompLen, NULL, 0);
- if (comp_len)
- {
- CompBuffer = HeapAlloc(GetProcessHeap(),0,comp_len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, lpComp, dwCompLen, CompBuffer, comp_len);
- }
-
- read_len = MultiByteToWideChar(CP_ACP, 0, lpRead, dwReadLen, NULL, 0);
- if (read_len)
- {
- ReadBuffer = HeapAlloc(GetProcessHeap(),0,read_len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, lpRead, dwReadLen, ReadBuffer, read_len);
- }
-
- rc = ImmSetCompositionStringW(hIMC, dwIndex, CompBuffer, comp_len,
- ReadBuffer, read_len);
-
- HeapFree(GetProcessHeap(), 0, CompBuffer);
- HeapFree(GetProcessHeap(), 0, ReadBuffer);
-
- return rc;
-}
-
-/***********************************************************************
- * ImmSetCompositionStringW (IMM32.@)
- */
-BOOL WINAPI ImmSetCompositionStringW(
- HIMC hIMC, DWORD dwIndex,
- LPCVOID lpComp, DWORD dwCompLen,
- LPCVOID lpRead, DWORD dwReadLen)
-{
- DWORD comp_len;
- DWORD read_len;
- CHAR *CompBuffer = NULL;
- CHAR *ReadBuffer = NULL;
- BOOL rc;
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("(%p, %d, %p, %d, %p, %d):\n",
- hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
-
- if (!data)
- return FALSE;
-
- if (!(dwIndex == SCS_SETSTR ||
- dwIndex == SCS_CHANGEATTR ||
- dwIndex == SCS_CHANGECLAUSE ||
- dwIndex == SCS_SETRECONVERTSTRING ||
- dwIndex == SCS_QUERYRECONVERTSTRING))
- return FALSE;
-
- if (is_himc_ime_unicode(data))
- return data->immKbd->pImeSetCompositionString(hIMC, dwIndex, lpComp,
- dwCompLen, lpRead, dwReadLen);
-
- comp_len = WideCharToMultiByte(CP_ACP, 0, lpComp, dwCompLen, NULL, 0, NULL,
- NULL);
- if (comp_len)
- {
- CompBuffer = HeapAlloc(GetProcessHeap(),0,comp_len);
- WideCharToMultiByte(CP_ACP, 0, lpComp, dwCompLen, CompBuffer, comp_len,
- NULL, NULL);
- }
-
- read_len = WideCharToMultiByte(CP_ACP, 0, lpRead, dwReadLen, NULL, 0, NULL,
- NULL);
- if (read_len)
- {
- ReadBuffer = HeapAlloc(GetProcessHeap(),0,read_len);
- WideCharToMultiByte(CP_ACP, 0, lpRead, dwReadLen, ReadBuffer, read_len,
- NULL, NULL);
- }
-
- rc = ImmSetCompositionStringA(hIMC, dwIndex, CompBuffer, comp_len,
- ReadBuffer, read_len);
-
- HeapFree(GetProcessHeap(), 0, CompBuffer);
- HeapFree(GetProcessHeap(), 0, ReadBuffer);
-
- return rc;
-}
-
-/***********************************************************************
- * ImmSetCompositionWindow (IMM32.@)
- */
-BOOL WINAPI ImmSetCompositionWindow(
- HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
-{
- BOOL reshow = FALSE;
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("(%p, %p)\n", hIMC, lpCompForm);
- if (lpCompForm)
- TRACE("\t%x, %s, %s\n", lpCompForm->dwStyle,
- wine_dbgstr_point(&lpCompForm->ptCurrentPos),
- wine_dbgstr_rect(&lpCompForm->rcArea));
-
- if (!data)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if (IMM_IsCrossThreadAccess(NULL, hIMC))
- return FALSE;
-
- data->IMC.cfCompForm = *lpCompForm;
-
- if (IsWindowVisible(data->immKbd->UIWnd))
- {
- reshow = TRUE;
- ShowWindow(data->immKbd->UIWnd,SW_HIDE);
- }
-
- /* FIXME: this is a partial stub */
-
- if (reshow)
- ShowWindow(data->immKbd->UIWnd,SW_SHOWNOACTIVATE);
-
- ImmInternalSendIMENotify(data, IMN_SETCOMPOSITIONWINDOW, 0);
- return TRUE;
-}
-
-/***********************************************************************
- * ImmSetConversionStatus (IMM32.@)
- */
-BOOL WINAPI ImmSetConversionStatus(
- HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
-{
- DWORD oldConversion, oldSentence;
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("%p %d %d\n", hIMC, fdwConversion, fdwSentence);
-
- if (!data)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if (IMM_IsCrossThreadAccess(NULL, hIMC))
- return FALSE;
-
- if ( fdwConversion != data->IMC.fdwConversion )
- {
- oldConversion = data->IMC.fdwConversion;
- data->IMC.fdwConversion = fdwConversion;
- ImmNotifyIME(hIMC, NI_CONTEXTUPDATED, oldConversion, IMC_SETCONVERSIONMODE);
- ImmInternalSendIMENotify(data, IMN_SETCONVERSIONMODE, 0);
- }
- if ( fdwSentence != data->IMC.fdwSentence )
- {
- oldSentence = data->IMC.fdwSentence;
- data->IMC.fdwSentence = fdwSentence;
- ImmNotifyIME(hIMC, NI_CONTEXTUPDATED, oldSentence, IMC_SETSENTENCEMODE);
- ImmInternalSendIMENotify(data, IMN_SETSENTENCEMODE, 0);
- }
-
- return TRUE;
-}
-
-/***********************************************************************
- * ImmSetOpenStatus (IMM32.@)
- */
-BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
-{
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("%p %d\n", hIMC, fOpen);
-
- if (!data)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if (IMM_IsCrossThreadAccess(NULL, hIMC))
- return FALSE;
-
- if (data->immKbd->UIWnd == NULL)
- {
- /* create the ime window */
- data->immKbd->UIWnd = CreateWindowExW( WS_EX_TOOLWINDOW,
- data->immKbd->imeClassName, NULL, WS_POPUP, 0, 0, 1, 1, 0,
- 0, data->immKbd->hIME, 0);
- SetWindowLongPtrW(data->immKbd->UIWnd, IMMGWL_IMC, (LONG_PTR)data);
- }
- else if (fOpen)
- SetWindowLongPtrW(data->immKbd->UIWnd, IMMGWL_IMC, (LONG_PTR)data);
-
- if (!fOpen != !data->IMC.fOpen)
- {
- data->IMC.fOpen = fOpen;
- ImmNotifyIME( hIMC, NI_CONTEXTUPDATED, 0, IMC_SETOPENSTATUS);
- ImmInternalSendIMENotify(data, IMN_SETOPENSTATUS, 0);
- }
-
- return TRUE;
-}
-
-/***********************************************************************
- * ImmSetStatusWindowPos (IMM32.@)
- */
-BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
-{
- InputContextData *data = get_imc_data(hIMC);
-
- TRACE("(%p, %p)\n", hIMC, lpptPos);
-
- if (!data || !lpptPos)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
-
- if (IMM_IsCrossThreadAccess(NULL, hIMC))
- return FALSE;
-
- TRACE("\t%s\n", wine_dbgstr_point(lpptPos));
-
- data->IMC.ptStatusWndPos = *lpptPos;
- ImmNotifyIME( hIMC, NI_CONTEXTUPDATED, 0, IMC_SETSTATUSWINDOWPOS);
- ImmInternalSendIMENotify(data, IMN_SETSTATUSWINDOWPOS, 0);
-
- return TRUE;
-}
-
-/***********************************************************************
- * ImmCreateSoftKeyboard(IMM32.@)
- */
-HWND WINAPI ImmCreateSoftKeyboard(UINT uType, UINT hOwner, int x, int y)
-{
- FIXME("(%d, %d, %d, %d): stub\n", uType, hOwner, x, y);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
-/***********************************************************************
- * ImmDestroySoftKeyboard(IMM32.@)
- */
-BOOL WINAPI ImmDestroySoftKeyboard(HWND hSoftWnd)
-{
- TRACE("(%p)\n", hSoftWnd);
- return DestroyWindow(hSoftWnd);
-}
-
-/***********************************************************************
- * ImmShowSoftKeyboard(IMM32.@)
- */
-BOOL WINAPI ImmShowSoftKeyboard(HWND hSoftWnd, int nCmdShow)
-{
- TRACE("(%p, %d)\n", hSoftWnd, nCmdShow);
- if (hSoftWnd)
- return ShowWindow(hSoftWnd, nCmdShow);
- return FALSE;
-}
-
-/***********************************************************************
- * ImmSimulateHotKey (IMM32.@)
- */
-BOOL WINAPI ImmSimulateHotKey(HWND hWnd, DWORD dwHotKeyID)
-{
- FIXME("(%p, %d): stub\n", hWnd, dwHotKeyID);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
-
-/***********************************************************************
- * ImmUnregisterWordA (IMM32.@)
- */
-BOOL WINAPI ImmUnregisterWordA(
- HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszUnregister)
-{
- ImmHkl *immHkl = IMM_GetImmHkl(hKL);
- TRACE("(%p, %s, %d, %s):\n", hKL, debugstr_a(lpszReading), dwStyle,
- debugstr_a(lpszUnregister));
- if (immHkl->hIME && immHkl->pImeUnregisterWord)
- {
- if (!is_kbd_ime_unicode(immHkl))
- return immHkl->pImeUnregisterWord((LPCWSTR)lpszReading,dwStyle,
- (LPCWSTR)lpszUnregister);
- else
- {
- LPWSTR lpszwReading = strdupAtoW(lpszReading);
- LPWSTR lpszwUnregister = strdupAtoW(lpszUnregister);
- BOOL rc;
-
- rc = immHkl->pImeUnregisterWord(lpszwReading,dwStyle,lpszwUnregister);
- HeapFree(GetProcessHeap(),0,lpszwReading);
- HeapFree(GetProcessHeap(),0,lpszwUnregister);
- return rc;
- }
- }
- else
- return FALSE;
-}
-
-/***********************************************************************
- * ImmUnregisterWordW (IMM32.@)
- */
-BOOL WINAPI ImmUnregisterWordW(
- HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszUnregister)
-{
- ImmHkl *immHkl = IMM_GetImmHkl(hKL);
- TRACE("(%p, %s, %d, %s):\n", hKL, debugstr_w(lpszReading), dwStyle,
- debugstr_w(lpszUnregister));
- if (immHkl->hIME && immHkl->pImeUnregisterWord)
- {
- if (is_kbd_ime_unicode(immHkl))
- return immHkl->pImeUnregisterWord(lpszReading,dwStyle,lpszUnregister);
- else
- {
- LPSTR lpszaReading = strdupWtoA(lpszReading);
- LPSTR lpszaUnregister = strdupWtoA(lpszUnregister);
- BOOL rc;
-
- rc = immHkl->pImeUnregisterWord((LPCWSTR)lpszaReading,dwStyle,
- (LPCWSTR)lpszaUnregister);
- HeapFree(GetProcessHeap(),0,lpszaReading);
- HeapFree(GetProcessHeap(),0,lpszaUnregister);
- return rc;
- }
- }
- else
- return FALSE;
-}
-
-/***********************************************************************
- * ImmGetImeMenuItemsA (IMM32.@)
- */
-DWORD WINAPI ImmGetImeMenuItemsA( HIMC hIMC, DWORD dwFlags, DWORD dwType,
- LPIMEMENUITEMINFOA lpImeParentMenu, LPIMEMENUITEMINFOA lpImeMenu,
- DWORD dwSize)
-{
- InputContextData *data = get_imc_data(hIMC);
- TRACE("(%p, %i, %i, %p, %p, %i):\n", hIMC, dwFlags, dwType,
- lpImeParentMenu, lpImeMenu, dwSize);
-
- if (!data)
- {
- SetLastError(ERROR_INVALID_HANDLE);
- return 0;
- }
-
- if (data->immKbd->hIME && data->immKbd->pImeGetImeMenuItems)
- {
- if (!is_himc_ime_unicode(data) || (!lpImeParentMenu && !lpImeMenu))
- return data->immKbd->pImeGetImeMenuItems(hIMC, dwFlags, dwType,
- (IMEMENUITEMINFOW*)lpImeParentMenu,
- (IMEMENUITEMINFOW*)lpImeMenu, dwSize);
- else
- {
- IMEMENUITEMINFOW lpImeParentMenuW;
- IMEMENUITEMINFOW *lpImeMenuW, *parent = NULL;
- DWORD rc;
-
- if (lpImeParentMenu)
- parent = &lpImeParentMenuW;
- if (lpImeMenu)
- {
- int count = dwSize / sizeof(LPIMEMENUITEMINFOA);
- dwSize = count * sizeof(IMEMENUITEMINFOW);
- lpImeMenuW = HeapAlloc(GetProcessHeap(), 0, dwSize);
- }
- else
- lpImeMenuW = NULL;