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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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, %x, %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, %d): 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, %d, %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, %d, %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("(%d): 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, %d, %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, %d, %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, %d, %p, %d): 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, %d, %p, %d): 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, %d, %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%x, %p, %d)\n", hIMC
, dwIndex
, lpBuf
, dwBufLen
);
506 if (dwIndex
== GCS_RESULTSTR
)
508 TRACE("GSC_RESULTSTR %p %i\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 %i\n", data
->CompositionString
, data
->dwCompStringLength
);
525 buf
= HeapAlloc( GetProcessHeap(), 0, data
->dwCompStringLength
* 3 );
526 rc
= WideCharToMultiByte(CP_ACP
, 0,(LPWSTR
)data
->CompositionString
,
527 data
->dwCompStringLength
/ sizeof(WCHAR
), buf
,
528 data
->dwCompStringLength
* 3, NULL
, NULL
);
530 memcpy(lpBuf
,buf
,rc
);
531 HeapFree( GetProcessHeap(), 0, buf
);
533 else if (dwIndex
== GCS_COMPATTR
)
535 TRACE("GSC_COMPATTR %p %i\n", data
->CompositionString
, data
->dwCompStringLength
);
537 rc
= WideCharToMultiByte(CP_ACP
, 0, (LPWSTR
)data
->CompositionString
,
538 data
->dwCompStringLength
/ sizeof(WCHAR
), NULL
,
544 for (i
= 0; i
< rc
; i
++)
545 ((LPBYTE
)lpBuf
)[i
] = ATTR_INPUT
;
548 else if (dwIndex
== GCS_COMPCLAUSE
)
550 TRACE("GSC_COMPCLAUSE %p %i\n", data
->CompositionString
, data
->dwCompStringLength
);
552 rc
= WideCharToMultiByte(CP_ACP
, 0, (LPWSTR
)data
->CompositionString
,
553 data
->dwCompStringLength
/ sizeof(WCHAR
), NULL
,
556 if (dwBufLen
>= sizeof(DWORD
)*2)
558 ((LPDWORD
)lpBuf
)[0] = 0;
559 ((LPDWORD
)lpBuf
)[1] = rc
;
561 rc
= sizeof(DWORD
)*2;
565 FIXME("Unhandled index 0x%x\n",dwIndex
);
571 /***********************************************************************
572 * ImmGetCompositionStringW (IMM32.@)
574 LONG WINAPI
ImmGetCompositionStringW(
575 HIMC hIMC
, DWORD dwIndex
,
576 LPVOID lpBuf
, DWORD dwBufLen
)
579 InputContextData
*data
= (InputContextData
*)hIMC
;
581 TRACE("(%p, 0x%x, %p, %d)\n", hIMC
, dwIndex
, lpBuf
, dwBufLen
);
586 if (dwIndex
== GCS_RESULTSTR
)
590 if (dwBufLen
>= data
->dwResultStringSize
)
591 memcpy(lpBuf
,data
->ResultString
,data
->dwResultStringSize
);
593 rc
= data
->dwResultStringSize
;
595 else if (dwIndex
== GCS_RESULTREADSTR
)
597 if (dwBufLen
>= data
->dwResultReadStringSize
)
598 memcpy(lpBuf
,data
->ResultReadingString
,
599 data
->dwResultReadStringSize
);
601 rc
= data
->dwResultReadStringSize
;
603 else if (dwIndex
== GCS_COMPSTR
)
605 if (dwBufLen
>= data
->dwCompStringLength
)
606 memcpy(lpBuf
,data
->CompositionString
,data
->dwCompStringLength
);
608 rc
= data
->dwCompStringLength
;
610 else if (dwIndex
== GCS_COMPATTR
)
612 unsigned int len
= data
->dwCompStringLength
;
617 for (i
= 0; i
< len
; i
++)
618 ((LPBYTE
)lpBuf
)[i
] = ATTR_INPUT
;
623 else if (dwIndex
== GCS_COMPCLAUSE
)
625 if (dwBufLen
>= sizeof(DWORD
)*2)
627 ((LPDWORD
)lpBuf
)[0] = 0;
628 ((LPDWORD
)lpBuf
)[1] = data
->dwCompStringLength
/sizeof(WCHAR
);
630 rc
= sizeof(DWORD
)*2;
632 else if (dwIndex
== GCS_COMPREADSTR
)
634 if (dwBufLen
>= data
->dwCompReadStringSize
)
635 memcpy(lpBuf
,data
->CompositionReadingString
,
636 data
->dwCompReadStringSize
);
638 rc
= data
->dwCompReadStringSize
;
642 FIXME("Unhandled index 0x%x\n",dwIndex
);
648 /***********************************************************************
649 * ImmGetCompositionWindow (IMM32.@)
651 BOOL WINAPI
ImmGetCompositionWindow(HIMC hIMC
, LPCOMPOSITIONFORM lpCompForm
)
653 InputContextData
*data
= (InputContextData
*)hIMC
;
655 TRACE("(%p, %p)\n", hIMC
, lpCompForm
);
660 memcpy(lpCompForm
,&(data
->CompForm
),sizeof(COMPOSITIONFORM
));
664 /***********************************************************************
665 * ImmGetContext (IMM32.@)
668 HIMC WINAPI
ImmGetContext(HWND hWnd
)
675 root_context
->hwnd
= hWnd
;
676 return (HIMC
)root_context
;
679 /***********************************************************************
680 * ImmGetConversionListA (IMM32.@)
682 DWORD WINAPI
ImmGetConversionListA(
684 LPCSTR pSrc
, LPCANDIDATELIST lpDst
,
685 DWORD dwBufLen
, UINT uFlag
)
687 FIXME("(%p, %p, %s, %p, %d, %d): stub\n",
688 hKL
, hIMC
, debugstr_a(pSrc
), lpDst
, dwBufLen
, uFlag
690 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
694 /***********************************************************************
695 * ImmGetConversionListW (IMM32.@)
697 DWORD WINAPI
ImmGetConversionListW(
699 LPCWSTR pSrc
, LPCANDIDATELIST lpDst
,
700 DWORD dwBufLen
, UINT uFlag
)
702 FIXME("(%p, %p, %s, %p, %d, %d): stub\n",
703 hKL
, hIMC
, debugstr_w(pSrc
), lpDst
, dwBufLen
, uFlag
705 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
709 /***********************************************************************
710 * ImmGetConversionStatus (IMM32.@)
712 BOOL WINAPI
ImmGetConversionStatus(
713 HIMC hIMC
, LPDWORD lpfdwConversion
, LPDWORD lpfdwSentence
)
715 TRACE("(%p, %p, %p): best guess\n", hIMC
, lpfdwConversion
, lpfdwSentence
);
717 *lpfdwConversion
= IME_CMODE_NATIVE
;
719 *lpfdwSentence
= IME_SMODE_NONE
;
723 /***********************************************************************
724 * ImmGetDefaultIMEWnd (IMM32.@)
726 HWND WINAPI
ImmGetDefaultIMEWnd(HWND hWnd
)
728 FIXME("(%p - %p %p ): semi-stub\n", hWnd
,hwndDefault
, root_context
);
730 if (hwndDefault
== NULL
)
732 static const WCHAR the_name
[] = {'I','M','E','\0'};
735 hwndDefault
= CreateWindowExW( WS_EX_CLIENTEDGE
, WC_IMECLASSNAME
,
736 the_name
, WS_POPUPWINDOW
|WS_CAPTION
, 0, 0, 120, 55, 0, 0,
739 TRACE("Default created (%p)\n",hwndDefault
);
742 return (HWND
)hwndDefault
;
745 /***********************************************************************
746 * ImmGetDescriptionA (IMM32.@)
748 UINT WINAPI
ImmGetDescriptionA(
749 HKL hKL
, LPSTR lpszDescription
, UINT uBufLen
)
754 TRACE("%p %p %d\n", hKL
, lpszDescription
, uBufLen
);
756 /* find out how many characters in the unicode buffer */
757 len
= ImmGetDescriptionW( hKL
, NULL
, 0 );
759 /* allocate a buffer of that size */
760 buf
= HeapAlloc( GetProcessHeap(), 0, (len
+ 1) * sizeof (WCHAR
) );
764 /* fetch the unicode buffer */
765 len
= ImmGetDescriptionW( hKL
, buf
, len
+ 1 );
767 /* convert it back to ASCII */
768 len
= WideCharToMultiByte( CP_ACP
, 0, buf
, len
+ 1,
769 lpszDescription
, uBufLen
, NULL
, NULL
);
771 HeapFree( GetProcessHeap(), 0, buf
);
776 /***********************************************************************
777 * ImmGetDescriptionW (IMM32.@)
779 UINT WINAPI
ImmGetDescriptionW(HKL hKL
, LPWSTR lpszDescription
, UINT uBufLen
)
781 static const WCHAR name
[] = { 'W','i','n','e',' ','X','I','M',0 };
783 FIXME("(%p, %p, %d): semi stub\n", hKL
, lpszDescription
, uBufLen
);
785 if (!uBufLen
) return lstrlenW( name
);
786 lstrcpynW( lpszDescription
, name
, uBufLen
);
787 return lstrlenW( lpszDescription
);
790 /***********************************************************************
791 * ImmGetGuideLineA (IMM32.@)
793 DWORD WINAPI
ImmGetGuideLineA(
794 HIMC hIMC
, DWORD dwIndex
, LPSTR lpBuf
, DWORD dwBufLen
)
796 FIXME("(%p, %d, %s, %d): stub\n",
797 hIMC
, dwIndex
, debugstr_a(lpBuf
), dwBufLen
799 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
803 /***********************************************************************
804 * ImmGetGuideLineW (IMM32.@)
806 DWORD WINAPI
ImmGetGuideLineW(HIMC hIMC
, DWORD dwIndex
, LPWSTR lpBuf
, DWORD dwBufLen
)
808 FIXME("(%p, %d, %s, %d): stub\n",
809 hIMC
, dwIndex
, debugstr_w(lpBuf
), dwBufLen
811 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
815 /***********************************************************************
816 * ImmGetIMEFileNameA (IMM32.@)
818 UINT WINAPI
ImmGetIMEFileNameA(
819 HKL hKL
, LPSTR lpszFileName
, UINT uBufLen
)
821 FIXME("(%p, %p, %d): stub\n", hKL
, lpszFileName
, uBufLen
);
822 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
826 /***********************************************************************
827 * ImmGetIMEFileNameW (IMM32.@)
829 UINT WINAPI
ImmGetIMEFileNameW(
830 HKL hKL
, LPWSTR lpszFileName
, UINT uBufLen
)
832 FIXME("(%p, %p, %d): stub\n", hKL
, lpszFileName
, uBufLen
);
833 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
837 /***********************************************************************
838 * ImmGetOpenStatus (IMM32.@)
840 BOOL WINAPI
ImmGetOpenStatus(HIMC hIMC
)
842 InputContextData
*data
= (InputContextData
*)hIMC
;
846 FIXME("(%p): semi-stub\n", hIMC
);
851 /***********************************************************************
852 * ImmGetProperty (IMM32.@)
854 DWORD WINAPI
ImmGetProperty(HKL hKL
, DWORD fdwIndex
)
857 TRACE("(%p, %d)\n", hKL
, fdwIndex
);
862 TRACE("(%s)\n", "IGP_PROPERTY");
863 rc
= IME_PROP_UNICODE
| IME_PROP_AT_CARET
;
866 FIXME("(%s)\n", "IGP_CONVERSION");
867 rc
= IME_CMODE_NATIVE
;
870 FIXME("%s)\n", "IGP_SENTENCE");
871 rc
= IME_SMODE_AUTOMATIC
;
874 TRACE("(%s)\n", "IGP_SETCOMPSTR");
878 TRACE("(%s)\n", "IGP_SELECT");
879 rc
= SELECT_CAP_CONVERSION
| SELECT_CAP_SENTENCE
;
881 case IGP_GETIMEVERSION
:
882 TRACE("(%s)\n", "IGP_GETIMEVERSION");
886 TRACE("(%s)\n", "IGP_UI");
895 /***********************************************************************
896 * ImmGetRegisterWordStyleA (IMM32.@)
898 UINT WINAPI
ImmGetRegisterWordStyleA(
899 HKL hKL
, UINT nItem
, LPSTYLEBUFA lpStyleBuf
)
901 FIXME("(%p, %d, %p): stub\n", hKL
, nItem
, lpStyleBuf
);
902 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
906 /***********************************************************************
907 * ImmGetRegisterWordStyleW (IMM32.@)
909 UINT WINAPI
ImmGetRegisterWordStyleW(
910 HKL hKL
, UINT nItem
, LPSTYLEBUFW lpStyleBuf
)
912 FIXME("(%p, %d, %p): stub\n", hKL
, nItem
, lpStyleBuf
);
913 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
917 /***********************************************************************
918 * ImmGetStatusWindowPos (IMM32.@)
920 BOOL WINAPI
ImmGetStatusWindowPos(HIMC hIMC
, LPPOINT lpptPos
)
922 FIXME("(%p, %p): stub\n", hIMC
, lpptPos
);
923 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
927 /***********************************************************************
928 * ImmGetVirtualKey (IMM32.@)
930 UINT WINAPI
ImmGetVirtualKey(HWND hWnd
)
932 OSVERSIONINFOA version
;
933 FIXME("(%p): stub\n", hWnd
);
934 GetVersionExA( &version
);
935 switch(version
.dwPlatformId
)
937 case VER_PLATFORM_WIN32_WINDOWS
:
938 return VK_PROCESSKEY
;
939 case VER_PLATFORM_WIN32_NT
:
942 FIXME("%d not supported\n",version
.dwPlatformId
);
943 return VK_PROCESSKEY
;
947 /***********************************************************************
948 * ImmInstallIMEA (IMM32.@)
950 HKL WINAPI
ImmInstallIMEA(
951 LPCSTR lpszIMEFileName
, LPCSTR lpszLayoutText
)
953 FIXME("(%s, %s): stub\n",
954 debugstr_a(lpszIMEFileName
), debugstr_a(lpszLayoutText
)
956 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
960 /***********************************************************************
961 * ImmInstallIMEW (IMM32.@)
963 HKL WINAPI
ImmInstallIMEW(
964 LPCWSTR lpszIMEFileName
, LPCWSTR lpszLayoutText
)
966 FIXME("(%s, %s): stub\n",
967 debugstr_w(lpszIMEFileName
), debugstr_w(lpszLayoutText
)
969 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
973 /***********************************************************************
976 BOOL WINAPI
ImmIsIME(HKL hKL
)
978 TRACE("(%p): semi-stub\n", hKL
);
980 * FIXME: Dead key locales will return TRUE here when they should not
981 * There is probably a more proper way to check this.
983 return (root_context
!= NULL
);
986 /***********************************************************************
987 * ImmIsUIMessageA (IMM32.@)
989 BOOL WINAPI
ImmIsUIMessageA(
990 HWND hWndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
994 TRACE("(%p, %x, %d, %ld)\n", hWndIME
, msg
, wParam
, lParam
);
995 if ((msg
>= WM_IME_STARTCOMPOSITION
&& msg
<= WM_IME_KEYLAST
) ||
996 (msg
>= WM_IME_SETCONTEXT
&& msg
<= WM_IME_KEYUP
) ||
997 (msg
== WM_MSIME_SERVICE
) ||
998 (msg
== WM_MSIME_RECONVERTOPTIONS
) ||
999 (msg
== WM_MSIME_MOUSE
) ||
1000 (msg
== WM_MSIME_RECONVERTREQUEST
) ||
1001 (msg
== WM_MSIME_RECONVERT
) ||
1002 (msg
== WM_MSIME_QUERYPOSITION
) ||
1003 (msg
== WM_MSIME_DOCUMENTFEED
))
1007 ImmGetDefaultIMEWnd(NULL
);
1009 if (hWndIME
== NULL
)
1010 PostMessageA(hwndDefault
, msg
, wParam
, lParam
);
1017 /***********************************************************************
1018 * ImmIsUIMessageW (IMM32.@)
1020 BOOL WINAPI
ImmIsUIMessageW(
1021 HWND hWndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
1024 TRACE("(%p, %d, %d, %ld): stub\n", hWndIME
, msg
, wParam
, lParam
);
1025 if ((msg
>= WM_IME_STARTCOMPOSITION
&& msg
<= WM_IME_KEYLAST
) ||
1026 (msg
>= WM_IME_SETCONTEXT
&& msg
<= WM_IME_KEYUP
) ||
1027 (msg
== WM_MSIME_SERVICE
) ||
1028 (msg
== WM_MSIME_RECONVERTOPTIONS
) ||
1029 (msg
== WM_MSIME_MOUSE
) ||
1030 (msg
== WM_MSIME_RECONVERTREQUEST
) ||
1031 (msg
== WM_MSIME_RECONVERT
) ||
1032 (msg
== WM_MSIME_QUERYPOSITION
) ||
1033 (msg
== WM_MSIME_DOCUMENTFEED
))
1038 /***********************************************************************
1039 * ImmNotifyIME (IMM32.@)
1041 BOOL WINAPI
ImmNotifyIME(
1042 HIMC hIMC
, DWORD dwAction
, DWORD dwIndex
, DWORD dwValue
)
1046 TRACE("(%p, %d, %d, %d)\n",
1047 hIMC
, dwAction
, dwIndex
, dwValue
);
1054 case NI_CHANGECANDIDATELIST
:
1055 FIXME("%s\n","NI_CHANGECANDIDATELIST");
1057 case NI_CLOSECANDIDATE
:
1058 FIXME("%s\n","NI_CLOSECANDIDATE");
1060 case NI_COMPOSITIONSTR
:
1064 TRACE("%s - %s\n","NI_COMPOSITIONSTR","CPS_CANCEL");
1065 if (pX11DRV_ForceXIMReset
)
1066 pX11DRV_ForceXIMReset(root_context
->hwnd
);
1067 if (root_context
->dwCompStringSize
)
1069 HeapFree(GetProcessHeap(),0,
1070 root_context
->CompositionString
);
1071 root_context
->dwCompStringSize
= 0;
1072 root_context
->dwCompStringLength
= 0;
1073 root_context
->CompositionString
= NULL
;
1074 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
, 0,
1080 TRACE("%s - %s\n","NI_COMPOSITIONSTR","CPS_COMPLETE");
1081 if (hIMC
!= (HIMC
)FROM_IME
&& pX11DRV_ForceXIMReset
)
1082 pX11DRV_ForceXIMReset(root_context
->hwnd
);
1084 if (root_context
->dwResultStringSize
)
1086 HeapFree(GetProcessHeap(),0,root_context
->ResultString
);
1087 root_context
->dwResultStringSize
= 0;
1088 root_context
->ResultString
= NULL
;
1090 if (root_context
->dwCompStringLength
)
1092 root_context
->ResultString
= HeapAlloc(
1093 GetProcessHeap(), 0, root_context
->dwCompStringLength
);
1094 root_context
->dwResultStringSize
=
1095 root_context
->dwCompStringLength
;
1097 memcpy(root_context
->ResultString
,
1098 root_context
->CompositionString
,
1099 root_context
->dwCompStringLength
);
1101 HeapFree(GetProcessHeap(),0,
1102 root_context
->CompositionString
);
1104 root_context
->dwCompStringSize
= 0;
1105 root_context
->dwCompStringLength
= 0;
1106 root_context
->CompositionString
= NULL
;
1107 root_context
->bRead
= FALSE
;
1109 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
, 0,
1112 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
,
1113 root_context
->ResultString
[0],
1114 GCS_RESULTSTR
|GCS_RESULTCLAUSE
);
1118 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_CONVERT");
1121 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_REVERT");
1124 ERR("%s - %s (%i)\n","NI_COMPOSITIONSTR","UNKNOWN",dwIndex
);
1128 case NI_IMEMENUSELECTED
:
1129 FIXME("%s\n", "NI_IMEMENUSELECTED");
1131 case NI_OPENCANDIDATE
:
1132 FIXME("%s\n", "NI_OPENCANDIDATE");
1134 case NI_SELECTCANDIDATESTR
:
1135 FIXME("%s\n", "NI_SELECTCANDIDATESTR");
1137 case NI_SETCANDIDATE_PAGESIZE
:
1138 FIXME("%s\n", "NI_SETCANDIDATE_PAGESIZE");
1140 case NI_SETCANDIDATE_PAGESTART
:
1141 FIXME("%s\n", "NI_SETCANDIDATE_PAGESTART");
1150 /***********************************************************************
1151 * ImmRegisterWordA (IMM32.@)
1153 BOOL WINAPI
ImmRegisterWordA(
1154 HKL hKL
, LPCSTR lpszReading
, DWORD dwStyle
, LPCSTR lpszRegister
)
1156 FIXME("(%p, %s, %d, %s): stub\n",
1157 hKL
, debugstr_a(lpszReading
), dwStyle
, debugstr_a(lpszRegister
)
1159 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1163 /***********************************************************************
1164 * ImmRegisterWordW (IMM32.@)
1166 BOOL WINAPI
ImmRegisterWordW(
1167 HKL hKL
, LPCWSTR lpszReading
, DWORD dwStyle
, LPCWSTR lpszRegister
)
1169 FIXME("(%p, %s, %d, %s): stub\n",
1170 hKL
, debugstr_w(lpszReading
), dwStyle
, debugstr_w(lpszRegister
)
1172 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1176 /***********************************************************************
1177 * ImmReleaseContext (IMM32.@)
1179 BOOL WINAPI
ImmReleaseContext(HWND hWnd
, HIMC hIMC
)
1181 FIXME("(%p, %p): stub\n", hWnd
, hIMC
);
1186 /***********************************************************************
1187 * ImmSetCandidateWindow (IMM32.@)
1189 BOOL WINAPI
ImmSetCandidateWindow(
1190 HIMC hIMC
, LPCANDIDATEFORM lpCandidate
)
1192 FIXME("(%p, %p): stub\n", hIMC
, lpCandidate
);
1193 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1197 /***********************************************************************
1198 * ImmSetCompositionFontA (IMM32.@)
1200 BOOL WINAPI
ImmSetCompositionFontA(HIMC hIMC
, LPLOGFONTA lplf
)
1202 InputContextData
*data
= (InputContextData
*)hIMC
;
1203 TRACE("(%p, %p)\n", hIMC
, lplf
);
1208 memcpy(&data
->font
,lplf
,sizeof(LOGFONTA
));
1209 MultiByteToWideChar(CP_ACP
, 0, lplf
->lfFaceName
, -1, data
->font
.lfFaceName
,
1212 SendMessageW(root_context
->hwnd
, WM_IME_NOTIFY
, IMN_SETCOMPOSITIONFONT
, 0);
1216 DeleteObject(data
->textfont
);
1217 data
->textfont
= NULL
;
1220 data
->textfont
= CreateFontIndirectW(&data
->font
);
1224 /***********************************************************************
1225 * ImmSetCompositionFontW (IMM32.@)
1227 BOOL WINAPI
ImmSetCompositionFontW(HIMC hIMC
, LPLOGFONTW lplf
)
1229 InputContextData
*data
= (InputContextData
*)hIMC
;
1230 TRACE("(%p, %p)\n", hIMC
, lplf
);
1235 memcpy(&data
->font
,lplf
,sizeof(LOGFONTW
));
1236 SendMessageW(root_context
->hwnd
, WM_IME_NOTIFY
, IMN_SETCOMPOSITIONFONT
, 0);
1240 DeleteObject(data
->textfont
);
1241 data
->textfont
= NULL
;
1243 data
->textfont
= CreateFontIndirectW(&data
->font
);
1247 /***********************************************************************
1248 * ImmSetCompositionStringA (IMM32.@)
1250 BOOL WINAPI
ImmSetCompositionStringA(
1251 HIMC hIMC
, DWORD dwIndex
,
1252 LPCVOID lpComp
, DWORD dwCompLen
,
1253 LPCVOID lpRead
, DWORD dwReadLen
)
1257 WCHAR
*CompBuffer
= NULL
;
1258 WCHAR
*ReadBuffer
= NULL
;
1261 TRACE("(%p, %d, %p, %d, %p, %d): stub\n",
1262 hIMC
, dwIndex
, lpComp
, dwCompLen
, lpRead
, dwReadLen
);
1264 comp_len
= MultiByteToWideChar(CP_ACP
, 0, lpComp
, dwCompLen
, NULL
, 0);
1267 CompBuffer
= HeapAlloc(GetProcessHeap(),0,comp_len
* sizeof(WCHAR
));
1268 MultiByteToWideChar(CP_ACP
, 0, lpComp
, dwCompLen
, CompBuffer
, comp_len
);
1271 read_len
= MultiByteToWideChar(CP_ACP
, 0, lpRead
, dwReadLen
, NULL
, 0);
1274 ReadBuffer
= HeapAlloc(GetProcessHeap(),0,read_len
* sizeof(WCHAR
));
1275 MultiByteToWideChar(CP_ACP
, 0, lpRead
, dwReadLen
, ReadBuffer
, read_len
);
1278 rc
= ImmSetCompositionStringW(hIMC
, dwIndex
, CompBuffer
, comp_len
,
1279 ReadBuffer
, read_len
);
1281 HeapFree(GetProcessHeap(), 0, CompBuffer
);
1282 HeapFree(GetProcessHeap(), 0, ReadBuffer
);
1287 /***********************************************************************
1288 * ImmSetCompositionStringW (IMM32.@)
1290 BOOL WINAPI
ImmSetCompositionStringW(
1291 HIMC hIMC
, DWORD dwIndex
,
1292 LPCVOID lpComp
, DWORD dwCompLen
,
1293 LPCVOID lpRead
, DWORD dwReadLen
)
1298 TRACE("(%p, %d, %p, %d, %p, %d): stub\n",
1299 hIMC
, dwIndex
, lpComp
, dwCompLen
, lpRead
, dwReadLen
);
1302 if (hIMC
!= (HIMC
)FROM_IME
)
1303 FIXME("PROBLEM: This only sets the wine level string\n");
1307 * this sets the composition string in the imm32.dll level
1308 * of the composition buffer. we cannot manipulate the xim level
1309 * buffer, which means that once the xim level buffer changes again
1310 * any call to this function from the application will be lost
1313 if (lpRead
&& dwReadLen
)
1314 FIXME("Reading string unimplemented\n");
1317 * app operating this api to also receive the message from xim
1320 if (dwIndex
== SCS_SETSTR
)
1322 flags
= GCS_COMPSTR
;
1324 if (root_context
->dwCompStringLength
)
1325 HeapFree(GetProcessHeap(),0,root_context
->CompositionString
);
1327 root_context
->dwCompStringLength
= dwCompLen
;
1328 root_context
->dwCompStringSize
= dwCompLen
;
1330 if (dwCompLen
&& lpComp
)
1332 root_context
->CompositionString
= HeapAlloc(GetProcessHeap(), 0,
1334 memcpy(root_context
->CompositionString
,lpComp
,dwCompLen
);
1336 wParam
= ((const WCHAR
*)lpComp
)[0];
1337 flags
|= GCS_COMPCLAUSE
| GCS_COMPATTR
;
1340 root_context
->CompositionString
= NULL
;
1344 UpdateDataInDefaultIMEWindow(hwndDefault
);
1346 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
, wParam
, flags
);
1351 /***********************************************************************
1352 * ImmSetCompositionWindow (IMM32.@)
1354 BOOL WINAPI
ImmSetCompositionWindow(
1355 HIMC hIMC
, LPCOMPOSITIONFORM lpCompForm
)
1357 BOOL reshow
= FALSE
;
1358 InputContextData
*data
= (InputContextData
*)hIMC
;
1360 TRACE("(%p, %p)\n", hIMC
, lpCompForm
);
1361 TRACE("\t%x, (%i,%i), (%i,%i - %i,%i)\n",lpCompForm
->dwStyle
,
1362 lpCompForm
->ptCurrentPos
.x
, lpCompForm
->ptCurrentPos
.y
, lpCompForm
->rcArea
.top
,
1363 lpCompForm
->rcArea
.left
, lpCompForm
->rcArea
.bottom
, lpCompForm
->rcArea
.right
);
1368 memcpy(&data
->CompForm
,lpCompForm
,sizeof(COMPOSITIONFORM
));
1370 if (IsWindowVisible(hwndDefault
))
1373 ShowWindow(hwndDefault
,SW_HIDE
);
1376 /* FIXME: this is a partial stub */
1379 ShowWindow(hwndDefault
,SW_SHOWNOACTIVATE
);
1381 SendMessageW(root_context
->hwnd
, WM_IME_NOTIFY
,IMN_SETCOMPOSITIONWINDOW
, 0);
1385 /***********************************************************************
1386 * ImmSetConversionStatus (IMM32.@)
1388 BOOL WINAPI
ImmSetConversionStatus(
1389 HIMC hIMC
, DWORD fdwConversion
, DWORD fdwSentence
)
1391 FIXME("(%p, %d, %d): stub\n",
1392 hIMC
, fdwConversion
, fdwSentence
1394 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1398 /***********************************************************************
1399 * ImmSetOpenStatus (IMM32.@)
1401 BOOL WINAPI
ImmSetOpenStatus(HIMC hIMC
, BOOL fOpen
)
1403 InputContextData
*data
= (InputContextData
*)hIMC
;
1405 TRACE("%p %d\n", hIMC
, fOpen
);
1407 if (hIMC
== (HIMC
)FROM_IME
)
1410 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION
, 0, 0);
1412 ImmInternalSetOpenStatus(fOpen
);
1415 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION
, 0, 0);
1423 if (fOpen
!= data
->bInternalState
)
1425 if (fOpen
== FALSE
&& pX11DRV_ForceXIMReset
)
1426 pX11DRV_ForceXIMReset(data
->hwnd
);
1429 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION
,0,0);
1431 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION
,0,0);
1433 ImmInternalSetOpenStatus(fOpen
);
1434 ImmInternalSetOpenStatus(!fOpen
);
1436 if (data
->bOpen
== FALSE
)
1437 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION
,0,0);
1439 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION
,0,0);
1446 /***********************************************************************
1447 * ImmSetStatusWindowPos (IMM32.@)
1449 BOOL WINAPI
ImmSetStatusWindowPos(HIMC hIMC
, LPPOINT lpptPos
)
1451 FIXME("(%p, %p): stub\n", hIMC
, lpptPos
);
1452 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1456 /***********************************************************************
1457 * ImmSimulateHotKey (IMM32.@)
1459 BOOL WINAPI
ImmSimulateHotKey(HWND hWnd
, DWORD dwHotKeyID
)
1461 FIXME("(%p, %d): stub\n", hWnd
, dwHotKeyID
);
1462 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1466 /***********************************************************************
1467 * ImmUnregisterWordA (IMM32.@)
1469 BOOL WINAPI
ImmUnregisterWordA(
1470 HKL hKL
, LPCSTR lpszReading
, DWORD dwStyle
, LPCSTR lpszUnregister
)
1472 FIXME("(%p, %s, %d, %s): stub\n",
1473 hKL
, debugstr_a(lpszReading
), dwStyle
, debugstr_a(lpszUnregister
)
1475 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1479 /***********************************************************************
1480 * ImmUnregisterWordW (IMM32.@)
1482 BOOL WINAPI
ImmUnregisterWordW(
1483 HKL hKL
, LPCWSTR lpszReading
, DWORD dwStyle
, LPCWSTR lpszUnregister
)
1485 FIXME("(%p, %s, %d, %s): stub\n",
1486 hKL
, debugstr_w(lpszReading
), dwStyle
, debugstr_w(lpszUnregister
)
1488 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1494 * Internal functions to help with IME window management
1496 static void PaintDefaultIMEWnd(HWND hwnd
)
1500 HDC hdc
= BeginPaint(hwnd
,&ps
);
1501 GetClientRect(hwnd
,&rect
);
1503 if (root_context
->dwCompStringLength
&& root_context
->CompositionString
)
1507 HFONT oldfont
= NULL
;
1509 if (root_context
->textfont
)
1510 oldfont
= SelectObject(hdc
,root_context
->textfont
);
1512 TextOutW(hdc
, 0,0,(LPWSTR
)root_context
->CompositionString
,
1513 root_context
->dwCompStringLength
/ sizeof(WCHAR
));
1515 GetTextExtentPoint32W(hdc
, (LPWSTR
)root_context
->CompositionString
,
1516 root_context
->dwCompStringLength
/ sizeof(WCHAR
),
1524 SelectObject(hdc
,oldfont
);
1526 FillRect(hdc
,&rect
, (HBRUSH
) (COLOR_WINDOW
+1));
1530 static void UpdateDataInDefaultIMEWindow(HWND hwnd
)
1532 RedrawWindow(hwnd
,NULL
,NULL
,RDW_ERASENOW
|RDW_INVALIDATE
);
1536 * The window proc for the default IME window
1538 static LRESULT WINAPI
IME_WindowProc(HWND hwnd
, UINT msg
, WPARAM wParam
,
1543 TRACE("Incoming Message 0x%x (0x%08x, 0x%08x)\n", msg
, (UINT
)wParam
,
1549 PaintDefaultIMEWnd(hwnd
);
1556 SetWindowTextA(hwnd
,"Wine Ime Active");
1561 SetFocus((HWND
)wParam
);
1563 FIXME("Received focus, should never have focus\n");
1565 case WM_IME_COMPOSITION
:
1566 TRACE("IME message %s, 0x%x, 0x%x (%i)\n",
1567 "WM_IME_COMPOSITION", (UINT
)wParam
, (UINT
)lParam
,
1568 root_context
->bRead
);
1569 if ((lParam
& GCS_RESULTSTR
) && (!root_context
->bRead
))
1570 IMM_PostResult(root_context
);
1572 UpdateDataInDefaultIMEWindow(hwnd
);
1574 case WM_IME_STARTCOMPOSITION
:
1575 TRACE("IME message %s, 0x%x, 0x%x\n",
1576 "WM_IME_STARTCOMPOSITION", (UINT
)wParam
, (UINT
)lParam
);
1577 root_context
->hwnd
= GetFocus();
1578 ShowWindow(hwndDefault
,SW_SHOWNOACTIVATE
);
1580 case WM_IME_ENDCOMPOSITION
:
1581 TRACE("IME message %s, 0x%x, 0x%x\n",
1582 "WM_IME_ENDCOMPOSITION", (UINT
)wParam
, (UINT
)lParam
);
1583 ShowWindow(hwndDefault
,SW_HIDE
);
1586 TRACE("IME message %s, 0x%x, 0x%x\n","WM_IME_SELECT",
1587 (UINT
)wParam
, (UINT
)lParam
);
1589 case WM_IME_CONTROL
:
1590 TRACE("IME message %s, 0x%x, 0x%x\n","WM_IME_CONTROL",
1591 (UINT
)wParam
, (UINT
)lParam
);
1595 TRACE("!! IME NOTIFY\n");
1598 TRACE("Non-standard message 0x%x\n",msg
);
1600 /* check the MSIME messages */
1601 if (msg
== WM_MSIME_SERVICE
)
1603 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_SERVICE",
1604 (UINT
)wParam
, (UINT
)lParam
);
1607 else if (msg
== WM_MSIME_RECONVERTOPTIONS
)
1609 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_RECONVERTOPTIONS",
1610 (UINT
)wParam
, (UINT
)lParam
);
1612 else if (msg
== WM_MSIME_MOUSE
)
1614 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_MOUSE",
1615 (UINT
)wParam
, (UINT
)lParam
);
1617 else if (msg
== WM_MSIME_RECONVERTREQUEST
)
1619 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_RECONVERTREQUEST",
1620 (UINT
)wParam
, (UINT
)lParam
);
1622 else if (msg
== WM_MSIME_RECONVERT
)
1624 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_RECONVERT",
1625 (UINT
)wParam
, (UINT
)lParam
);
1627 else if (msg
== WM_MSIME_QUERYPOSITION
)
1629 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_QUERYPOSITION",
1630 (UINT
)wParam
, (UINT
)lParam
);
1632 else if (msg
== WM_MSIME_DOCUMENTFEED
)
1634 TRACE("IME message %s, 0x%x, 0x%x\n","WM_MSIME_DOCUMENTFEED",
1635 (UINT
)wParam
, (UINT
)lParam
);
1637 /* DefWndProc if not an IME message */
1638 else if (!rc
&& !((msg
>= WM_IME_STARTCOMPOSITION
&& msg
<= WM_IME_KEYLAST
) ||
1639 (msg
>= WM_IME_SETCONTEXT
&& msg
<= WM_IME_KEYUP
)))
1640 rc
= DefWindowProcW(hwnd
,msg
,wParam
,lParam
);