4 * Copyright 1998 Patrik Stridvall
5 * Copyright 2002, 2003 CodeWeavers, Aric Stewart
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include "wine/debug.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(imm);
35 #define FROM_IME 0xcafe1337
37 static void (*pX11DRV_ForceXIMReset)(HWND);
39 typedef struct tagInputContextData
41 LPBYTE CompositionString;
42 LPBYTE CompositionReadingString;
44 LPBYTE ResultReadingString;
45 DWORD dwCompStringSize; /* buffer size */
46 DWORD dwCompStringLength; /* string length (in bytes) */
47 DWORD dwCompReadStringSize;
48 DWORD dwResultStringSize;
49 DWORD dwResultReadStringSize;
56 COMPOSITIONFORM CompForm;
59 static InputContextData *root_context = NULL;
60 static HWND hwndDefault = NULL;
61 static HANDLE hImeInst;
62 static const WCHAR WC_IMECLASSNAME[] = {'I','M','E',0};
65 static UINT WM_MSIME_SERVICE;
66 static UINT WM_MSIME_RECONVERTOPTIONS;
67 static UINT WM_MSIME_MOUSE;
68 static UINT WM_MSIME_RECONVERTREQUEST;
69 static UINT WM_MSIME_RECONVERT;
70 static UINT WM_MSIME_QUERYPOSITION;
71 static UINT WM_MSIME_DOCUMENTFEED;
76 static LRESULT WINAPI IME_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
78 static void UpdateDataInDefaultIMEWindow(HWND hwnd);
79 static void ImmInternalPostIMEMessage(UINT, WPARAM, LPARAM);
80 static void ImmInternalSetOpenStatus(BOOL fOpen);
82 static VOID IMM_PostResult(InputContextData *data)
85 TRACE("Posting result as IME_CHAR\n");
87 for (i = 0; i < data->dwResultStringSize / sizeof (WCHAR); i++)
88 ImmInternalPostIMEMessage (WM_IME_CHAR, ((WCHAR*)data->ResultString)[i],
91 /* clear the buffer */
92 if (data->dwResultStringSize)
93 HeapFree(GetProcessHeap(),0,data->ResultString);
94 data->dwResultStringSize = 0;
95 data->ResultString = NULL;
98 static void IMM_Register(void)
101 ZeroMemory(&wndClass, sizeof(WNDCLASSW));
102 wndClass.style = CS_GLOBALCLASS | CS_IME | CS_HREDRAW | CS_VREDRAW;
103 wndClass.lpfnWndProc = (WNDPROC) IME_WindowProc;
104 wndClass.cbClsExtra = 0;
105 wndClass.cbWndExtra = 0;
106 wndClass.hInstance = hImeInst;
107 wndClass.hCursor = LoadCursorW(NULL, (LPWSTR)IDC_ARROW);
108 wndClass.hIcon = NULL;
109 wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW +1);
110 wndClass.lpszMenuName = 0;
111 wndClass.lpszClassName = WC_IMECLASSNAME;
112 RegisterClassW(&wndClass);
115 static void IMM_Unregister(void)
117 UnregisterClassW(WC_IMECLASSNAME, NULL);
120 static void IMM_RegisterMessages(void)
122 WM_MSIME_SERVICE = RegisterWindowMessageA("MSIMEService");
123 WM_MSIME_RECONVERTOPTIONS = RegisterWindowMessageA("MSIMEReconvertOptions");
124 WM_MSIME_MOUSE = RegisterWindowMessageA("MSIMEMouseOperation");
125 WM_MSIME_RECONVERTREQUEST = RegisterWindowMessageA("MSIMEReconvertRequest");
126 WM_MSIME_RECONVERT = RegisterWindowMessageA("MSIMEReconvert");
127 WM_MSIME_QUERYPOSITION = RegisterWindowMessageA("MSIMEQueryPosition");
128 WM_MSIME_DOCUMENTFEED = RegisterWindowMessageA("MSIMEDocumentFeed");
132 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved)
136 TRACE("%p, %lx, %p\n",hInstDLL,fdwReason,lpReserved);
139 case DLL_PROCESS_ATTACH:
140 DisableThreadLibraryCalls(hInstDLL);
142 IMM_RegisterMessages();
143 x11drv = GetModuleHandleA("winex11.drv");
144 if (x11drv) pX11DRV_ForceXIMReset = (void *)GetProcAddress( x11drv, "ForceXIMReset");
146 case DLL_PROCESS_DETACH:
149 DestroyWindow(hwndDefault);
158 /* for posting messages as the IME */
159 static void ImmInternalPostIMEMessage(UINT msg, WPARAM wParam, LPARAM lParam)
161 HWND target = GetFocus();
163 PostMessageW(root_context->hwnd,msg,wParam,lParam);
165 PostMessageW(target, msg, wParam, lParam);
169 static void ImmInternalSetOpenStatus(BOOL fOpen)
171 TRACE("Setting internal state to %s\n",(fOpen)?"OPEN":"CLOSED");
173 root_context->bOpen = fOpen;
174 root_context->bInternalState = fOpen;
178 ShowWindow(hwndDefault,SW_HIDE);
180 if (root_context->dwCompStringSize)
181 HeapFree(GetProcessHeap(),0,root_context->CompositionString);
182 if (root_context->dwCompReadStringSize)
183 HeapFree(GetProcessHeap(),0,root_context->CompositionReadingString);
184 if (root_context->dwResultStringSize)
185 HeapFree(GetProcessHeap(),0,root_context->ResultString);
186 if (root_context->dwResultReadStringSize)
187 HeapFree(GetProcessHeap(),0,root_context->ResultReadingString);
188 root_context->dwCompStringSize = 0;
189 root_context->dwCompStringLength = 0;
190 root_context->CompositionString = NULL;
191 root_context->dwCompReadStringSize = 0;
192 root_context->CompositionReadingString = NULL;
193 root_context->dwResultStringSize = 0;
194 root_context->ResultString = NULL;
195 root_context->dwResultReadStringSize = 0;
196 root_context->ResultReadingString = NULL;
199 ShowWindow(hwndDefault, SW_SHOWNOACTIVATE);
201 SendMessageW(root_context->hwnd, WM_IME_NOTIFY, IMN_SETOPENSTATUS, 0);
205 /***********************************************************************
206 * ImmAssociateContext (IMM32.@)
208 HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
210 InputContextData *data = (InputContextData*)hIMC;
212 WARN("(%p, %p): semi-stub\n",hWnd,hIMC);
218 * WINE SPECIFIC! MAY CONFLICT
219 * associate the root context we have an XIM created
223 root_context = (InputContextData*)hIMC;
227 * If already associated just return
229 if (data->hwnd == hWnd)
232 if (IsWindow(data->hwnd))
235 * Post a message that your context is switching
237 SendMessageW(data->hwnd, WM_IME_SETCONTEXT, FALSE, ISC_SHOWUIALL);
242 if (IsWindow(data->hwnd))
245 * Post a message that your context is switching
247 SendMessageW(data->hwnd, WM_IME_SETCONTEXT, TRUE, ISC_SHOWUIALL);
251 * TODO: We need to keep track of the old context associated
252 * with a window and return it for now we will return NULL;
257 /***********************************************************************
258 * ImmAssociateContextEx (IMM32.@)
260 BOOL WINAPI ImmAssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags)
262 FIXME("(%p, %p, %ld): stub\n", hWnd, hIMC, dwFlags);
263 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
267 /***********************************************************************
268 * ImmConfigureIMEA (IMM32.@)
270 BOOL WINAPI ImmConfigureIMEA(
271 HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
273 FIXME("(%p, %p, %ld, %p): stub\n",
274 hKL, hWnd, dwMode, lpData
276 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
280 /***********************************************************************
281 * ImmConfigureIMEW (IMM32.@)
283 BOOL WINAPI ImmConfigureIMEW(
284 HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
286 FIXME("(%p, %p, %ld, %p): stub\n",
287 hKL, hWnd, dwMode, lpData
289 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
293 /***********************************************************************
294 * ImmCreateContext (IMM32.@)
296 HIMC WINAPI ImmCreateContext(void)
298 InputContextData *new_context;
300 new_context = HeapAlloc(GetProcessHeap(),0,sizeof(InputContextData));
301 ZeroMemory(new_context,sizeof(InputContextData));
303 return (HIMC)new_context;
306 /***********************************************************************
307 * ImmDestroyContext (IMM32.@)
309 BOOL WINAPI ImmDestroyContext(HIMC hIMC)
311 InputContextData *data = (InputContextData*)hIMC;
313 TRACE("Destroying %p\n",hIMC);
317 if (data->dwCompStringSize)
318 HeapFree(GetProcessHeap(),0,data->CompositionString);
319 if (data->dwCompReadStringSize)
320 HeapFree(GetProcessHeap(),0,data->CompositionReadingString);
321 if (data->dwResultStringSize)
322 HeapFree(GetProcessHeap(),0,data->ResultString);
323 if (data->dwResultReadStringSize)
324 HeapFree(GetProcessHeap(),0,data->ResultReadingString);
328 DeleteObject(data->textfont);
329 data->textfont = NULL;
332 HeapFree(GetProcessHeap(),0,data);
337 /***********************************************************************
338 * ImmDisableIME (IMM32.@)
340 BOOL WINAPI ImmDisableIME(DWORD idThread)
342 FIXME("(%ld): stub\n", idThread);
346 /***********************************************************************
347 * ImmEnumRegisterWordA (IMM32.@)
349 UINT WINAPI ImmEnumRegisterWordA(
350 HKL hKL, REGISTERWORDENUMPROCA lpfnEnumProc,
351 LPCSTR lpszReading, DWORD dwStyle,
352 LPCSTR lpszRegister, LPVOID lpData)
354 FIXME("(%p, %p, %s, %ld, %s, %p): stub\n",
356 debugstr_a(lpszReading), dwStyle,
357 debugstr_a(lpszRegister), lpData
359 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
363 /***********************************************************************
364 * ImmEnumRegisterWordW (IMM32.@)
366 UINT WINAPI ImmEnumRegisterWordW(
367 HKL hKL, REGISTERWORDENUMPROCW lpfnEnumProc,
368 LPCWSTR lpszReading, DWORD dwStyle,
369 LPCWSTR lpszRegister, LPVOID lpData)
371 FIXME("(%p, %p, %s, %ld, %s, %p): stub\n",
373 debugstr_w(lpszReading), dwStyle,
374 debugstr_w(lpszRegister), lpData
376 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
380 /***********************************************************************
381 * ImmEscapeA (IMM32.@)
383 LRESULT WINAPI ImmEscapeA(
385 UINT uEscape, LPVOID lpData)
387 FIXME("(%p, %p, %d, %p): stub\n",
388 hKL, hIMC, uEscape, lpData
390 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
394 /***********************************************************************
395 * ImmEscapeW (IMM32.@)
397 LRESULT WINAPI ImmEscapeW(
399 UINT uEscape, LPVOID lpData)
401 FIXME("(%p, %p, %d, %p): stub\n",
402 hKL, hIMC, uEscape, lpData
404 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
408 /***********************************************************************
409 * ImmGetCandidateListA (IMM32.@)
411 DWORD WINAPI ImmGetCandidateListA(
412 HIMC hIMC, DWORD deIndex,
413 LPCANDIDATELIST lpCandList, DWORD dwBufLen)
415 FIXME("(%p, %ld, %p, %ld): stub\n",
419 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
423 /***********************************************************************
424 * ImmGetCandidateListCountA (IMM32.@)
426 DWORD WINAPI ImmGetCandidateListCountA(
427 HIMC hIMC, LPDWORD lpdwListCount)
429 FIXME("(%p, %p): stub\n", hIMC, lpdwListCount);
430 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
434 /***********************************************************************
435 * ImmGetCandidateListCountW (IMM32.@)
437 DWORD WINAPI ImmGetCandidateListCountW(
438 HIMC hIMC, LPDWORD lpdwListCount)
440 FIXME("(%p, %p): stub\n", hIMC, lpdwListCount);
441 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
445 /***********************************************************************
446 * ImmGetCandidateListW (IMM32.@)
448 DWORD WINAPI ImmGetCandidateListW(
449 HIMC hIMC, DWORD deIndex,
450 LPCANDIDATELIST lpCandList, DWORD dwBufLen)
452 FIXME("(%p, %ld, %p, %ld): stub\n",
456 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
460 /***********************************************************************
461 * ImmGetCandidateWindow (IMM32.@)
463 BOOL WINAPI ImmGetCandidateWindow(
464 HIMC hIMC, DWORD dwBufLen, LPCANDIDATEFORM lpCandidate)
466 FIXME("(%p, %ld, %p): stub\n", hIMC, dwBufLen, lpCandidate);
467 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
471 /***********************************************************************
472 * ImmGetCompositionFontA (IMM32.@)
474 BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
476 FIXME("(%p, %p): stub\n", hIMC, lplf);
477 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
481 /***********************************************************************
482 * ImmGetCompositionFontW (IMM32.@)
484 BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
486 FIXME("(%p, %p): stub\n", hIMC, lplf);
487 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
491 /***********************************************************************
492 * ImmGetCompositionStringA (IMM32.@)
494 LONG WINAPI ImmGetCompositionStringA(
495 HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
499 InputContextData *data = (InputContextData*)hIMC;
501 TRACE("(%p, 0x%lx, %p, %ld)\n", hIMC, dwIndex, lpBuf, dwBufLen);
506 if (dwIndex == GCS_RESULTSTR)
508 TRACE("GSC_RESULTSTR %p %li\n",data->ResultString,
509 data->dwResultStringSize);
511 buf = HeapAlloc( GetProcessHeap(), 0, data->dwResultStringSize * 3 );
512 rc = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)data->ResultString,
513 data->dwResultStringSize / sizeof(WCHAR), buf,
514 data->dwResultStringSize * 3, NULL, NULL);
516 memcpy(lpBuf,buf,rc);
519 HeapFree( GetProcessHeap(), 0, buf );
521 else if (dwIndex == GCS_COMPSTR)
523 TRACE("GSC_COMPSTR %p %li\n",data->CompositionString,
524 data->dwCompStringLength/ sizeof(WCHAR));
526 buf = HeapAlloc( GetProcessHeap(), 0, data->dwCompStringLength * 3 );
527 rc = WideCharToMultiByte(CP_ACP, 0,(LPWSTR)data->CompositionString,
528 data->dwCompStringLength/ sizeof(WCHAR), buf,
529 data->dwCompStringLength* 3, NULL, NULL);
531 memcpy(lpBuf,buf,rc);
532 HeapFree( GetProcessHeap(), 0, buf );
534 else if (dwIndex == GCS_COMPATTR)
536 TRACE("GSC_COMPATTR %p %li\n",data->CompositionString,
537 data->dwCompStringLength/ sizeof(WCHAR));
539 rc = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)data->CompositionString,
540 data->dwCompStringLength/ sizeof(WCHAR), NULL,
546 for (i = 0; i < rc; i++)
547 ((LPBYTE)lpBuf)[i] = ATTR_INPUT;
550 else if (dwIndex == GCS_COMPCLAUSE)
552 TRACE("GSC_COMPCLAUSE %p %li\n",data->CompositionString,
553 data->dwCompStringLength/ sizeof(WCHAR));
555 rc = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)data->CompositionString,
556 data->dwCompStringLength/ sizeof(WCHAR), NULL,
559 if (dwBufLen >= sizeof(DWORD)*2)
561 ((LPDWORD)lpBuf)[0] = 0;
562 ((LPDWORD)lpBuf)[1] = rc;
564 rc = sizeof(DWORD)*2;
568 FIXME("Unhandled index 0x%lx\n",dwIndex);
574 /***********************************************************************
575 * ImmGetCompositionStringW (IMM32.@)
577 LONG WINAPI ImmGetCompositionStringW(
578 HIMC hIMC, DWORD dwIndex,
579 LPVOID lpBuf, DWORD dwBufLen)
582 InputContextData *data = (InputContextData*)hIMC;
584 TRACE("(%p, 0x%lx, %p, %ld)\n", hIMC, dwIndex, lpBuf, dwBufLen);
589 if (dwIndex == GCS_RESULTSTR)
593 if (dwBufLen >= data->dwResultStringSize)
594 memcpy(lpBuf,data->ResultString,data->dwResultStringSize);
596 rc = data->dwResultStringSize;
598 else if (dwIndex == GCS_RESULTREADSTR)
600 if (dwBufLen >= data->dwResultReadStringSize)
601 memcpy(lpBuf,data->ResultReadingString,
602 data->dwResultReadStringSize);
604 rc = data->dwResultReadStringSize;
606 else if (dwIndex == GCS_COMPSTR)
608 if (dwBufLen >= data->dwCompStringLength)
609 memcpy(lpBuf,data->CompositionString,data->dwCompStringLength);
611 rc = data->dwCompStringLength;
613 else if (dwIndex == GCS_COMPATTR)
615 unsigned int len = data->dwCompStringLength;
620 for (i = 0; i < len; i++)
621 ((LPBYTE)lpBuf)[i] = ATTR_INPUT;
626 else if (dwIndex == GCS_COMPCLAUSE)
628 if (dwBufLen >= sizeof(DWORD)*2)
630 ((LPDWORD)lpBuf)[0] = 0;
631 ((LPDWORD)lpBuf)[1] = data->dwCompStringLength/sizeof(WCHAR);
633 rc = sizeof(DWORD)*2;
635 else if (dwIndex == GCS_COMPREADSTR)
637 if (dwBufLen >= data->dwCompReadStringSize)
638 memcpy(lpBuf,data->CompositionReadingString,
639 data->dwCompReadStringSize);
641 rc = data->dwCompReadStringSize;
645 FIXME("Unhandled index 0x%lx\n",dwIndex);
651 /***********************************************************************
652 * ImmGetCompositionWindow (IMM32.@)
654 BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
656 InputContextData *data = (InputContextData*)hIMC;
658 TRACE("(%p, %p)\n", hIMC, lpCompForm);
663 memcpy(lpCompForm,&(data->CompForm),sizeof(COMPOSITIONFORM));
667 /***********************************************************************
668 * ImmGetContext (IMM32.@)
671 HIMC WINAPI ImmGetContext(HWND hWnd)
678 root_context->hwnd = hWnd;
679 return (HIMC)root_context;
682 /***********************************************************************
683 * ImmGetConversionListA (IMM32.@)
685 DWORD WINAPI ImmGetConversionListA(
687 LPCSTR pSrc, LPCANDIDATELIST lpDst,
688 DWORD dwBufLen, UINT uFlag)
690 FIXME("(%p, %p, %s, %p, %ld, %d): stub\n",
691 hKL, hIMC, debugstr_a(pSrc), lpDst, dwBufLen, uFlag
693 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
697 /***********************************************************************
698 * ImmGetConversionListW (IMM32.@)
700 DWORD WINAPI ImmGetConversionListW(
702 LPCWSTR pSrc, LPCANDIDATELIST lpDst,
703 DWORD dwBufLen, UINT uFlag)
705 FIXME("(%p, %p, %s, %p, %ld, %d): stub\n",
706 hKL, hIMC, debugstr_w(pSrc), lpDst, dwBufLen, uFlag
708 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
712 /***********************************************************************
713 * ImmGetConversionStatus (IMM32.@)
715 BOOL WINAPI ImmGetConversionStatus(
716 HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence)
718 TRACE("(%p, %p, %p): best guess\n", hIMC, lpfdwConversion, lpfdwSentence);
720 *lpfdwConversion = IME_CMODE_NATIVE;
722 *lpfdwSentence = IME_SMODE_NONE;
726 /***********************************************************************
727 * ImmGetDefaultIMEWnd (IMM32.@)
729 HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd)
731 FIXME("(%p - %p %p ): semi-stub\n", hWnd,hwndDefault, root_context);
733 if (hwndDefault == NULL)
735 static const WCHAR the_name[] = {'I','M','E','\0'};
738 hwndDefault = CreateWindowExW( WS_EX_CLIENTEDGE, WC_IMECLASSNAME,
739 the_name, WS_POPUPWINDOW|WS_CAPTION, 0, 0, 120, 55, 0, 0,
742 TRACE("Default created (%p)\n",hwndDefault);
745 return (HWND)hwndDefault;
748 /***********************************************************************
749 * ImmGetDescriptionA (IMM32.@)
751 UINT WINAPI ImmGetDescriptionA(
752 HKL hKL, LPSTR lpszDescription, UINT uBufLen)
757 TRACE("%p %p %d\n", hKL, lpszDescription, uBufLen);
759 /* find out how many characters in the unicode buffer */
760 len = ImmGetDescriptionW( hKL, NULL, 0 );
762 /* allocate a buffer of that size */
763 buf = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof (WCHAR) );
767 /* fetch the unicode buffer */
768 len = ImmGetDescriptionW( hKL, buf, len + 1 );
770 /* convert it back to ASCII */
771 len = WideCharToMultiByte( CP_ACP, 0, buf, len + 1,
772 lpszDescription, uBufLen, NULL, NULL );
774 HeapFree( GetProcessHeap(), 0, buf );
779 /***********************************************************************
780 * ImmGetDescriptionW (IMM32.@)
782 UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
784 static const WCHAR name[] = { 'W','i','n','e',' ','X','I','M',0 };
786 FIXME("(%p, %p, %d): semi stub\n", hKL, lpszDescription, uBufLen);
788 if (!uBufLen) return lstrlenW( name );
789 lstrcpynW( lpszDescription, name, uBufLen );
790 return lstrlenW( lpszDescription );
793 /***********************************************************************
794 * ImmGetGuideLineA (IMM32.@)
796 DWORD WINAPI ImmGetGuideLineA(
797 HIMC hIMC, DWORD dwIndex, LPSTR lpBuf, DWORD dwBufLen)
799 FIXME("(%p, %ld, %s, %ld): stub\n",
800 hIMC, dwIndex, debugstr_a(lpBuf), dwBufLen
802 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
806 /***********************************************************************
807 * ImmGetGuideLineW (IMM32.@)
809 DWORD WINAPI ImmGetGuideLineW(HIMC hIMC, DWORD dwIndex, LPWSTR lpBuf, DWORD dwBufLen)
811 FIXME("(%p, %ld, %s, %ld): stub\n",
812 hIMC, dwIndex, debugstr_w(lpBuf), dwBufLen
814 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
818 /***********************************************************************
819 * ImmGetIMEFileNameA (IMM32.@)
821 UINT WINAPI ImmGetIMEFileNameA(
822 HKL hKL, LPSTR lpszFileName, UINT uBufLen)
824 FIXME("(%p, %p, %d): stub\n", hKL, lpszFileName, uBufLen);
825 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
829 /***********************************************************************
830 * ImmGetIMEFileNameW (IMM32.@)
832 UINT WINAPI ImmGetIMEFileNameW(
833 HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
835 FIXME("(%p, %p, %d): stub\n", hKL, lpszFileName, uBufLen);
836 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
840 /***********************************************************************
841 * ImmGetOpenStatus (IMM32.@)
843 BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
845 InputContextData *data = (InputContextData*)hIMC;
849 FIXME("(%p): semi-stub\n", hIMC);
854 /***********************************************************************
855 * ImmGetProperty (IMM32.@)
857 DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
860 TRACE("(%p, %ld)\n", hKL, fdwIndex);
865 TRACE("(%s)\n", "IGP_PROPERTY");
866 rc = IME_PROP_UNICODE | IME_PROP_AT_CARET;
869 FIXME("(%s)\n", "IGP_CONVERSION");
870 rc = IME_CMODE_NATIVE;
873 FIXME("%s)\n", "IGP_SENTENCE");
874 rc = IME_SMODE_AUTOMATIC;
877 TRACE("(%s)\n", "IGP_SETCOMPSTR");
881 TRACE("(%s)\n", "IGP_SELECT");
882 rc = SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE;
884 case IGP_GETIMEVERSION:
885 TRACE("(%s)\n", "IGP_GETIMEVERSION");
889 TRACE("(%s)\n", "IGP_UI");
898 /***********************************************************************
899 * ImmGetRegisterWordStyleA (IMM32.@)
901 UINT WINAPI ImmGetRegisterWordStyleA(
902 HKL hKL, UINT nItem, LPSTYLEBUFA lpStyleBuf)
904 FIXME("(%p, %d, %p): stub\n", hKL, nItem, lpStyleBuf);
905 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
909 /***********************************************************************
910 * ImmGetRegisterWordStyleW (IMM32.@)
912 UINT WINAPI ImmGetRegisterWordStyleW(
913 HKL hKL, UINT nItem, LPSTYLEBUFW lpStyleBuf)
915 FIXME("(%p, %d, %p): stub\n", hKL, nItem, lpStyleBuf);
916 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
920 /***********************************************************************
921 * ImmGetStatusWindowPos (IMM32.@)
923 BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
925 FIXME("(%p, %p): stub\n", hIMC, lpptPos);
926 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
930 /***********************************************************************
931 * ImmGetVirtualKey (IMM32.@)
933 UINT WINAPI ImmGetVirtualKey(HWND hWnd)
935 OSVERSIONINFOA version;
936 FIXME("(%p): stub\n", hWnd);
937 GetVersionExA( &version );
938 switch(version.dwPlatformId)
940 case VER_PLATFORM_WIN32_WINDOWS:
941 return VK_PROCESSKEY;
942 case VER_PLATFORM_WIN32_NT:
945 FIXME("%ld not supported\n",version.dwPlatformId);
946 return VK_PROCESSKEY;
950 /***********************************************************************
951 * ImmInstallIMEA (IMM32.@)
953 HKL WINAPI ImmInstallIMEA(
954 LPCSTR lpszIMEFileName, LPCSTR lpszLayoutText)
956 FIXME("(%s, %s): stub\n",
957 debugstr_a(lpszIMEFileName), debugstr_a(lpszLayoutText)
959 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
963 /***********************************************************************
964 * ImmInstallIMEW (IMM32.@)
966 HKL WINAPI ImmInstallIMEW(
967 LPCWSTR lpszIMEFileName, LPCWSTR lpszLayoutText)
969 FIXME("(%s, %s): stub\n",
970 debugstr_w(lpszIMEFileName), debugstr_w(lpszLayoutText)
972 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
976 /***********************************************************************
979 BOOL WINAPI ImmIsIME(HKL hKL)
981 TRACE("(%p): semi-stub\n", hKL);
983 * FIXME: Dead key locales will return TRUE here when they should not
984 * There is probably a more proper way to check this.
986 return (root_context != NULL);
989 /***********************************************************************
990 * ImmIsUIMessageA (IMM32.@)
992 BOOL WINAPI ImmIsUIMessageA(
993 HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
997 TRACE("(%p, %x, %d, %ld)\n", hWndIME, msg, wParam, lParam);
998 if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) ||
999 (msg >= WM_IME_SETCONTEXT && msg <= WM_IME_KEYUP) ||
1000 (msg == WM_MSIME_SERVICE) ||
1001 (msg == WM_MSIME_RECONVERTOPTIONS) ||
1002 (msg == WM_MSIME_MOUSE) ||
1003 (msg == WM_MSIME_RECONVERTREQUEST) ||
1004 (msg == WM_MSIME_RECONVERT) ||
1005 (msg == WM_MSIME_QUERYPOSITION) ||
1006 (msg == WM_MSIME_DOCUMENTFEED))
1010 ImmGetDefaultIMEWnd(NULL);
1012 if (hWndIME == NULL)
1013 PostMessageA(hwndDefault, msg, wParam, lParam);
1020 /***********************************************************************
1021 * ImmIsUIMessageW (IMM32.@)
1023 BOOL WINAPI ImmIsUIMessageW(
1024 HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
1027 TRACE("(%p, %d, %d, %ld): stub\n", hWndIME, msg, wParam, lParam);
1028 if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) ||
1029 (msg >= WM_IME_SETCONTEXT && msg <= WM_IME_KEYUP) ||
1030 (msg == WM_MSIME_SERVICE) ||
1031 (msg == WM_MSIME_RECONVERTOPTIONS) ||
1032 (msg == WM_MSIME_MOUSE) ||
1033 (msg == WM_MSIME_RECONVERTREQUEST) ||
1034 (msg == WM_MSIME_RECONVERT) ||
1035 (msg == WM_MSIME_QUERYPOSITION) ||
1036 (msg == WM_MSIME_DOCUMENTFEED))
1041 /***********************************************************************
1042 * ImmNotifyIME (IMM32.@)
1044 BOOL WINAPI ImmNotifyIME(
1045 HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
1049 TRACE("(%p, %ld, %ld, %ld)\n",
1050 hIMC, dwAction, dwIndex, dwValue);
1057 case NI_CHANGECANDIDATELIST:
1058 FIXME("%s\n","NI_CHANGECANDIDATELIST");
1060 case NI_CLOSECANDIDATE:
1061 FIXME("%s\n","NI_CLOSECANDIDATE");
1063 case NI_COMPOSITIONSTR:
1067 TRACE("%s - %s\n","NI_COMPOSITIONSTR","CPS_CANCEL");
1068 if (pX11DRV_ForceXIMReset)
1069 pX11DRV_ForceXIMReset(root_context->hwnd);
1070 if (root_context->dwCompStringSize)
1072 HeapFree(GetProcessHeap(),0,
1073 root_context->CompositionString);
1074 root_context->dwCompStringSize = 0;
1075 root_context->dwCompStringLength = 0;
1076 root_context->CompositionString = NULL;
1077 ImmInternalPostIMEMessage(WM_IME_COMPOSITION, 0,
1083 TRACE("%s - %s\n","NI_COMPOSITIONSTR","CPS_COMPLETE");
1084 if (hIMC != (HIMC)FROM_IME && pX11DRV_ForceXIMReset)
1085 pX11DRV_ForceXIMReset(root_context->hwnd);
1087 if (root_context->dwResultStringSize)
1089 HeapFree(GetProcessHeap(),0,root_context->ResultString);
1090 root_context->dwResultStringSize = 0;
1091 root_context->ResultString = NULL;
1093 if (root_context->dwCompStringLength)
1095 root_context->ResultString = HeapAlloc(
1096 GetProcessHeap(), 0, root_context->dwCompStringLength);
1097 root_context->dwResultStringSize =
1098 root_context->dwCompStringLength;
1100 memcpy(root_context->ResultString,
1101 root_context->CompositionString,
1102 root_context->dwCompStringLength);
1104 HeapFree(GetProcessHeap(),0,
1105 root_context->CompositionString);
1107 root_context->dwCompStringSize = 0;
1108 root_context->dwCompStringLength = 0;
1109 root_context->CompositionString = NULL;
1110 root_context->bRead = FALSE;
1112 ImmInternalPostIMEMessage(WM_IME_COMPOSITION, 0,
1115 ImmInternalPostIMEMessage(WM_IME_COMPOSITION,
1116 root_context->ResultString[0],
1117 GCS_RESULTSTR|GCS_RESULTCLAUSE);
1121 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_CONVERT");
1124 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_REVERT");
1127 ERR("%s - %s (%li)\n","NI_COMPOSITIONSTR","UNKNOWN",dwIndex);
1131 case NI_IMEMENUSELECTED:
1132 FIXME("%s\n", "NI_IMEMENUSELECTED");
1134 case NI_OPENCANDIDATE:
1135 FIXME("%s\n", "NI_OPENCANDIDATE");
1137 case NI_SELECTCANDIDATESTR:
1138 FIXME("%s\n", "NI_SELECTCANDIDATESTR");
1140 case NI_SETCANDIDATE_PAGESIZE:
1141 FIXME("%s\n", "NI_SETCANDIDATE_PAGESIZE");
1143 case NI_SETCANDIDATE_PAGESTART:
1144 FIXME("%s\n", "NI_SETCANDIDATE_PAGESTART");
1153 /***********************************************************************
1154 * ImmRegisterWordA (IMM32.@)
1156 BOOL WINAPI ImmRegisterWordA(
1157 HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszRegister)
1159 FIXME("(%p, %s, %ld, %s): stub\n",
1160 hKL, debugstr_a(lpszReading), dwStyle, debugstr_a(lpszRegister)
1162 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1166 /***********************************************************************
1167 * ImmRegisterWordW (IMM32.@)
1169 BOOL WINAPI ImmRegisterWordW(
1170 HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszRegister)
1172 FIXME("(%p, %s, %ld, %s): stub\n",
1173 hKL, debugstr_w(lpszReading), dwStyle, debugstr_w(lpszRegister)
1175 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1179 /***********************************************************************
1180 * ImmReleaseContext (IMM32.@)
1182 BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
1184 FIXME("(%p, %p): stub\n", hWnd, hIMC);
1189 /***********************************************************************
1190 * ImmSetCandidateWindow (IMM32.@)
1192 BOOL WINAPI ImmSetCandidateWindow(
1193 HIMC hIMC, LPCANDIDATEFORM lpCandidate)
1195 FIXME("(%p, %p): stub\n", hIMC, lpCandidate);
1196 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1200 /***********************************************************************
1201 * ImmSetCompositionFontA (IMM32.@)
1203 BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
1205 InputContextData *data = (InputContextData*)hIMC;
1206 TRACE("(%p, %p)\n", hIMC, lplf);
1211 memcpy(&data->font,lplf,sizeof(LOGFONTA));
1212 MultiByteToWideChar(CP_ACP, 0, lplf->lfFaceName, -1, data->font.lfFaceName,
1215 SendMessageW(root_context->hwnd, WM_IME_NOTIFY, IMN_SETCOMPOSITIONFONT, 0);
1219 DeleteObject(data->textfont);
1220 data->textfont = NULL;
1223 data->textfont = CreateFontIndirectW(&data->font);
1227 /***********************************************************************
1228 * ImmSetCompositionFontW (IMM32.@)
1230 BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
1232 InputContextData *data = (InputContextData*)hIMC;
1233 TRACE("(%p, %p)\n", hIMC, lplf);
1238 memcpy(&data->font,lplf,sizeof(LOGFONTW));
1239 SendMessageW(root_context->hwnd, WM_IME_NOTIFY, IMN_SETCOMPOSITIONFONT, 0);
1243 DeleteObject(data->textfont);
1244 data->textfont = NULL;
1246 data->textfont = CreateFontIndirectW(&data->font);
1250 /***********************************************************************
1251 * ImmSetCompositionStringA (IMM32.@)
1253 BOOL WINAPI ImmSetCompositionStringA(
1254 HIMC hIMC, DWORD dwIndex,
1255 LPCVOID lpComp, DWORD dwCompLen,
1256 LPCVOID lpRead, DWORD dwReadLen)
1260 WCHAR *CompBuffer = NULL;
1261 WCHAR *ReadBuffer = NULL;
1264 TRACE("(%p, %ld, %p, %ld, %p, %ld): stub\n",
1265 hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
1267 comp_len = MultiByteToWideChar(CP_ACP, 0, lpComp, dwCompLen, NULL, 0);
1270 CompBuffer = HeapAlloc(GetProcessHeap(),0,comp_len * sizeof(WCHAR));
1271 MultiByteToWideChar(CP_ACP, 0, lpComp, dwCompLen, CompBuffer, comp_len);
1274 read_len = MultiByteToWideChar(CP_ACP, 0, lpRead, dwReadLen, NULL, 0);
1277 ReadBuffer = HeapAlloc(GetProcessHeap(),0,read_len * sizeof(WCHAR));
1278 MultiByteToWideChar(CP_ACP, 0, lpRead, dwReadLen, ReadBuffer, read_len);
1281 rc = ImmSetCompositionStringW(hIMC, dwIndex, CompBuffer, comp_len,
1282 ReadBuffer, read_len);
1284 HeapFree(GetProcessHeap(), 0, CompBuffer);
1285 HeapFree(GetProcessHeap(), 0, ReadBuffer);
1290 /***********************************************************************
1291 * ImmSetCompositionStringW (IMM32.@)
1293 BOOL WINAPI ImmSetCompositionStringW(
1294 HIMC hIMC, DWORD dwIndex,
1295 LPCVOID lpComp, DWORD dwCompLen,
1296 LPCVOID lpRead, DWORD dwReadLen)
1301 TRACE("(%p, %ld, %p, %ld, %p, %ld): stub\n",
1302 hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
1305 if (hIMC != (HIMC)FROM_IME)
1306 FIXME("PROBLEM: This only sets the wine level string\n");
1310 * this sets the composition string in the imm32.dll level
1311 * of the composition buffer. we cannot manipulate the xim level
1312 * buffer, which means that once the xim level buffer changes again
1313 * any call to this function from the application will be lost
1316 if (lpRead && dwReadLen)
1317 FIXME("Reading string unimplemented\n");
1320 * app operating this api to also receive the message from xim
1323 if (dwIndex == SCS_SETSTR)
1325 flags = GCS_COMPSTR;
1327 if (root_context->dwCompStringLength)
1328 HeapFree(GetProcessHeap(),0,root_context->CompositionString);
1330 root_context->dwCompStringLength = dwCompLen;
1331 root_context->dwCompStringSize = dwCompLen;
1333 if (dwCompLen && lpComp)
1335 root_context->CompositionString = HeapAlloc(GetProcessHeap(), 0,
1337 memcpy(root_context->CompositionString,lpComp,dwCompLen);
1339 wParam = ((const WCHAR*)lpComp)[0];
1340 flags |= GCS_COMPCLAUSE | GCS_COMPATTR;
1343 root_context->CompositionString = NULL;
1347 UpdateDataInDefaultIMEWindow(hwndDefault);
1349 ImmInternalPostIMEMessage(WM_IME_COMPOSITION, wParam, flags);
1354 /***********************************************************************
1355 * ImmSetCompositionWindow (IMM32.@)
1357 BOOL WINAPI ImmSetCompositionWindow(
1358 HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
1360 BOOL reshow = FALSE;
1361 InputContextData *data = (InputContextData*)hIMC;
1363 TRACE("(%p, %p)\n", hIMC, lpCompForm);
1364 TRACE("\t%lx, (%li,%li), (%li,%li - %li,%li)\n",lpCompForm->dwStyle,
1365 lpCompForm->ptCurrentPos.x, lpCompForm->ptCurrentPos.y, lpCompForm->rcArea.top,
1366 lpCompForm->rcArea.left, lpCompForm->rcArea.bottom, lpCompForm->rcArea.right);
1371 memcpy(&data->CompForm,lpCompForm,sizeof(COMPOSITIONFORM));
1373 if (IsWindowVisible(hwndDefault))
1376 ShowWindow(hwndDefault,SW_HIDE);
1379 /* FIXME: this is a partial stub */
1382 ShowWindow(hwndDefault,SW_SHOWNOACTIVATE);
1384 SendMessageW(root_context->hwnd, WM_IME_NOTIFY,IMN_SETCOMPOSITIONWINDOW, 0);
1388 /***********************************************************************
1389 * ImmSetConversionStatus (IMM32.@)
1391 BOOL WINAPI ImmSetConversionStatus(
1392 HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
1394 FIXME("(%p, %ld, %ld): stub\n",
1395 hIMC, fdwConversion, fdwSentence
1397 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1401 /***********************************************************************
1402 * ImmSetOpenStatus (IMM32.@)
1404 BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
1406 InputContextData *data = (InputContextData*)hIMC;
1408 TRACE("%p %d\n", hIMC, fOpen);
1410 if (hIMC == (HIMC)FROM_IME)
1413 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION, 0, 0);
1415 ImmInternalSetOpenStatus(fOpen);
1418 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION, 0, 0);
1426 if (fOpen != data->bInternalState)
1428 if (fOpen == FALSE && pX11DRV_ForceXIMReset)
1429 pX11DRV_ForceXIMReset(data->hwnd);
1432 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION,0,0);
1434 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION,0,0);
1436 ImmInternalSetOpenStatus(fOpen);
1437 ImmInternalSetOpenStatus(!fOpen);
1439 if (data->bOpen == FALSE)
1440 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION,0,0);
1442 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION,0,0);
1449 /***********************************************************************
1450 * ImmSetStatusWindowPos (IMM32.@)
1452 BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
1454 FIXME("(%p, %p): stub\n", hIMC, lpptPos);
1455 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1459 /***********************************************************************
1460 * ImmSimulateHotKey (IMM32.@)
1462 BOOL WINAPI ImmSimulateHotKey(HWND hWnd, DWORD dwHotKeyID)
1464 FIXME("(%p, %ld): stub\n", hWnd, dwHotKeyID);
1465 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1469 /***********************************************************************
1470 * ImmUnregisterWordA (IMM32.@)
1472 BOOL WINAPI ImmUnregisterWordA(
1473 HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszUnregister)
1475 FIXME("(%p, %s, %ld, %s): stub\n",
1476 hKL, debugstr_a(lpszReading), dwStyle, debugstr_a(lpszUnregister)
1478 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1482 /***********************************************************************
1483 * ImmUnregisterWordW (IMM32.@)
1485 BOOL WINAPI ImmUnregisterWordW(
1486 HKL hKL, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszUnregister)
1488 FIXME("(%p, %s, %ld, %s): stub\n",
1489 hKL, debugstr_w(lpszReading), dwStyle, debugstr_w(lpszUnregister)
1491 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
1497 * Internal functions to help with IME window management
1499 static void PaintDefaultIMEWnd(HWND hwnd)
1503 HDC hdc = BeginPaint(hwnd,&ps);
1504 GetClientRect(hwnd,&rect);
1506 if (root_context->dwCompStringLength && root_context->CompositionString)
1510 HFONT oldfont = NULL;
1512 if (root_context->textfont)
1513 oldfont = SelectObject(hdc,root_context->textfont);
1515 TextOutW(hdc, 0,0,(LPWSTR)root_context->CompositionString,
1516 root_context->dwCompStringLength / sizeof(WCHAR));
1518 GetTextExtentPoint32W(hdc, (LPWSTR)root_context->CompositionString,
1519 root_context->dwCompStringLength / sizeof(WCHAR),
1527 SelectObject(hdc,oldfont);
1529 FillRect(hdc,&rect, (HBRUSH) (COLOR_WINDOW+1));
1533 static void UpdateDataInDefaultIMEWindow(HWND hwnd)
1535 RedrawWindow(hwnd,NULL,NULL,RDW_ERASENOW|RDW_INVALIDATE);
1539 * The window proc for the default IME window
1541 static LRESULT WINAPI IME_WindowProc(HWND hwnd, UINT msg, WPARAM wParam,
1546 TRACE("Incoming Message 0x%x (0x%08x, 0x%08x)\n", msg, (UINT)wParam,
1552 PaintDefaultIMEWnd(hwnd);
1559 SetWindowTextA(hwnd,"Wine Ime Active");
1564 SetFocus((HWND)wParam);
1566 FIXME("Received focus, should never have focus\n");
1568 case WM_IME_COMPOSITION:
1569 TRACE("IME message %s, 0x%x, 0x%x (%i)\n",
1570 "WM_IME_COMPOSITION", (UINT)wParam, (UINT)lParam,
1571 root_context->bRead);
1572 if ((lParam & GCS_RESULTSTR) && (!root_context->bRead))
1573 IMM_PostResult(root_context);
1575 UpdateDataInDefaultIMEWindow(hwnd);
1577 case WM_IME_STARTCOMPOSITION:
1578 TRACE("IME message %s, 0x%x, 0x%x\n",
1579 "WM_IME_STARTCOMPOSITION", (UINT)wParam, (UINT)lParam);
1580 root_context->hwnd = GetFocus();
1581 ShowWindow(hwndDefault,SW_SHOWNOACTIVATE);
1583 case WM_IME_ENDCOMPOSITION:
1584 TRACE("IME message %s, 0x%x, 0x%x\n",
1585 "WM_IME_ENDCOMPOSITION", (UINT)wParam, (UINT)lParam);
1586 ShowWindow(hwndDefault,SW_HIDE);
1589 TRACE("IME message %s, 0x%x, 0x%x\n","WM_IME_SELECT",
1590 (UINT)wParam, (UINT)lParam);
1592 case WM_IME_CONTROL:
1593 TRACE("IME message %s, 0x%x, 0x%x\n","WM_IME_CONTROL",
1594 (UINT)wParam, (UINT)lParam);
1598 TRACE("!! IME NOTIFY\n");
1601 TRACE("Non-standard message 0x%x\n",msg);
1603 /* check the MSIME messages */
1604 if (msg == WM_MSIME_SERVICE)
1606 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_SERVICE",
1607 (UINT)wParam, (UINT)lParam);
1610 else if (msg == WM_MSIME_RECONVERTOPTIONS)
1612 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_RECONVERTOPTIONS",
1613 (UINT)wParam, (UINT)lParam);
1615 else if (msg == WM_MSIME_MOUSE)
1617 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_MOUSE",
1618 (UINT)wParam, (UINT)lParam);
1620 else if (msg == WM_MSIME_RECONVERTREQUEST)
1622 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_RECONVERTREQUEST",
1623 (UINT)wParam, (UINT)lParam);
1625 else if (msg == WM_MSIME_RECONVERT)
1627 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_RECONVERT",
1628 (UINT)wParam, (UINT)lParam);
1630 else if (msg == WM_MSIME_QUERYPOSITION)
1632 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_QUERYPOSITION",
1633 (UINT)wParam, (UINT)lParam);
1635 else if (msg == WM_MSIME_DOCUMENTFEED)
1637 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_DOCUMENTFEED",
1638 (UINT)wParam, (UINT)lParam);
1640 /* DefWndProc if not an IME message */
1641 else if (!rc && !((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) ||
1642 (msg >= WM_IME_SETCONTEXT && msg <= WM_IME_KEYUP)))
1643 rc = DefWindowProcW(hwnd,msg,wParam,lParam);