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("x11drv.dll");
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
);
266 /***********************************************************************
267 * ImmConfigureIMEA (IMM32.@)
269 BOOL WINAPI
ImmConfigureIMEA(
270 HKL hKL
, HWND hWnd
, DWORD dwMode
, LPVOID lpData
)
272 FIXME("(%p, %p, %ld, %p): stub\n",
273 hKL
, hWnd
, dwMode
, lpData
275 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
279 /***********************************************************************
280 * ImmConfigureIMEW (IMM32.@)
282 BOOL WINAPI
ImmConfigureIMEW(
283 HKL hKL
, HWND hWnd
, DWORD dwMode
, LPVOID lpData
)
285 FIXME("(%p, %p, %ld, %p): stub\n",
286 hKL
, hWnd
, dwMode
, lpData
288 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
292 /***********************************************************************
293 * ImmCreateContext (IMM32.@)
295 HIMC WINAPI
ImmCreateContext(void)
297 InputContextData
*new_context
;
299 new_context
= HeapAlloc(GetProcessHeap(),0,sizeof(InputContextData
));
300 ZeroMemory(new_context
,sizeof(InputContextData
));
302 return (HIMC
)new_context
;
305 /***********************************************************************
306 * ImmDestroyContext (IMM32.@)
308 BOOL WINAPI
ImmDestroyContext(HIMC hIMC
)
310 InputContextData
*data
= (InputContextData
*)hIMC
;
312 TRACE("Destroying %p\n",hIMC
);
316 if (data
->dwCompStringSize
)
317 HeapFree(GetProcessHeap(),0,data
->CompositionString
);
318 if (data
->dwCompReadStringSize
)
319 HeapFree(GetProcessHeap(),0,data
->CompositionReadingString
);
320 if (data
->dwResultStringSize
)
321 HeapFree(GetProcessHeap(),0,data
->ResultString
);
322 if (data
->dwResultReadStringSize
)
323 HeapFree(GetProcessHeap(),0,data
->ResultReadingString
);
327 DeleteObject(data
->textfont
);
328 data
->textfont
= NULL
;
331 HeapFree(GetProcessHeap(),0,data
);
336 /***********************************************************************
337 * ImmDisableIME (IMM32.@)
339 BOOL WINAPI
ImmDisableIME(DWORD idThread
)
341 FIXME("(%ld): stub\n", idThread
);
345 /***********************************************************************
346 * ImmEnumRegisterWordA (IMM32.@)
348 UINT WINAPI
ImmEnumRegisterWordA(
349 HKL hKL
, REGISTERWORDENUMPROCA lpfnEnumProc
,
350 LPCSTR lpszReading
, DWORD dwStyle
,
351 LPCSTR lpszRegister
, LPVOID lpData
)
353 FIXME("(%p, %p, %s, %ld, %s, %p): stub\n",
355 debugstr_a(lpszReading
), dwStyle
,
356 debugstr_a(lpszRegister
), lpData
358 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
362 /***********************************************************************
363 * ImmEnumRegisterWordW (IMM32.@)
365 UINT WINAPI
ImmEnumRegisterWordW(
366 HKL hKL
, REGISTERWORDENUMPROCW lpfnEnumProc
,
367 LPCWSTR lpszReading
, DWORD dwStyle
,
368 LPCWSTR lpszRegister
, LPVOID lpData
)
370 FIXME("(%p, %p, %s, %ld, %s, %p): stub\n",
372 debugstr_w(lpszReading
), dwStyle
,
373 debugstr_w(lpszRegister
), lpData
375 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
379 /***********************************************************************
380 * ImmEscapeA (IMM32.@)
382 LRESULT WINAPI
ImmEscapeA(
384 UINT uEscape
, LPVOID lpData
)
386 FIXME("(%p, %p, %d, %p): stub\n",
387 hKL
, hIMC
, uEscape
, lpData
389 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
393 /***********************************************************************
394 * ImmEscapeW (IMM32.@)
396 LRESULT WINAPI
ImmEscapeW(
398 UINT uEscape
, LPVOID lpData
)
400 FIXME("(%p, %p, %d, %p): stub\n",
401 hKL
, hIMC
, uEscape
, lpData
403 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
407 /***********************************************************************
408 * ImmGetCandidateListA (IMM32.@)
410 DWORD WINAPI
ImmGetCandidateListA(
411 HIMC hIMC
, DWORD deIndex
,
412 LPCANDIDATELIST lpCandList
, DWORD dwBufLen
)
414 FIXME("(%p, %ld, %p, %ld): stub\n",
418 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
422 /***********************************************************************
423 * ImmGetCandidateListCountA (IMM32.@)
425 DWORD WINAPI
ImmGetCandidateListCountA(
426 HIMC hIMC
, LPDWORD lpdwListCount
)
428 FIXME("(%p, %p): stub\n", hIMC
, lpdwListCount
);
429 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
433 /***********************************************************************
434 * ImmGetCandidateListCountW (IMM32.@)
436 DWORD WINAPI
ImmGetCandidateListCountW(
437 HIMC hIMC
, LPDWORD lpdwListCount
)
439 FIXME("(%p, %p): stub\n", hIMC
, lpdwListCount
);
440 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
444 /***********************************************************************
445 * ImmGetCandidateListW (IMM32.@)
447 DWORD WINAPI
ImmGetCandidateListW(
448 HIMC hIMC
, DWORD deIndex
,
449 LPCANDIDATELIST lpCandList
, DWORD dwBufLen
)
451 FIXME("(%p, %ld, %p, %ld): stub\n",
455 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
459 /***********************************************************************
460 * ImmGetCandidateWindow (IMM32.@)
462 BOOL WINAPI
ImmGetCandidateWindow(
463 HIMC hIMC
, DWORD dwBufLen
, LPCANDIDATEFORM lpCandidate
)
465 FIXME("(%p, %ld, %p): stub\n", hIMC
, dwBufLen
, lpCandidate
);
466 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
470 /***********************************************************************
471 * ImmGetCompositionFontA (IMM32.@)
473 BOOL WINAPI
ImmGetCompositionFontA(HIMC hIMC
, LPLOGFONTA lplf
)
475 FIXME("(%p, %p): stub\n", hIMC
, lplf
);
476 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
480 /***********************************************************************
481 * ImmGetCompositionFontW (IMM32.@)
483 BOOL WINAPI
ImmGetCompositionFontW(HIMC hIMC
, LPLOGFONTW lplf
)
485 FIXME("(%p, %p): stub\n", hIMC
, lplf
);
486 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
490 /***********************************************************************
491 * ImmGetCompositionStringA (IMM32.@)
493 LONG WINAPI
ImmGetCompositionStringA(
494 HIMC hIMC
, DWORD dwIndex
, LPVOID lpBuf
, DWORD dwBufLen
)
498 InputContextData
*data
= (InputContextData
*)hIMC
;
500 TRACE("(%p, 0x%lx, %p, %ld)\n", hIMC
, dwIndex
, lpBuf
, dwBufLen
);
505 if (dwIndex
== GCS_RESULTSTR
)
507 TRACE("GSC_RESULTSTR %p %li\n",data
->ResultString
,
508 data
->dwResultStringSize
);
510 buf
= HeapAlloc( GetProcessHeap(), 0, data
->dwResultStringSize
* 3 );
511 rc
= WideCharToMultiByte(CP_ACP
, 0, (LPWSTR
)data
->ResultString
,
512 data
->dwResultStringSize
/ sizeof(WCHAR
), buf
,
513 data
->dwResultStringSize
* 3, NULL
, NULL
);
515 memcpy(lpBuf
,buf
,rc
);
518 HeapFree( GetProcessHeap(), 0, buf
);
520 else if (dwIndex
== GCS_COMPSTR
)
522 TRACE("GSC_COMPSTR %p %li\n",data
->CompositionString
,
523 data
->dwCompStringLength
/ sizeof(WCHAR
));
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 %li\n",data
->CompositionString
,
536 data
->dwCompStringLength
/ sizeof(WCHAR
));
538 rc
= WideCharToMultiByte(CP_ACP
, 0, (LPWSTR
)data
->CompositionString
,
539 data
->dwCompStringLength
/ sizeof(WCHAR
), NULL
,
545 for (i
= 0; i
< rc
; i
++)
546 ((LPBYTE
)lpBuf
)[i
] = ATTR_INPUT
;
549 else if (dwIndex
== GCS_COMPCLAUSE
)
551 TRACE("GSC_COMPCLAUSE %p %li\n",data
->CompositionString
,
552 data
->dwCompStringLength
/ sizeof(WCHAR
));
554 rc
= WideCharToMultiByte(CP_ACP
, 0, (LPWSTR
)data
->CompositionString
,
555 data
->dwCompStringLength
/ sizeof(WCHAR
), NULL
,
558 if (dwBufLen
>= sizeof(DWORD
)*2)
560 ((LPDWORD
)lpBuf
)[0] = 0;
561 ((LPDWORD
)lpBuf
)[1] = rc
;
563 rc
= sizeof(DWORD
)*2;
567 FIXME("Unhandled index 0x%lx\n",dwIndex
);
573 /***********************************************************************
574 * ImmGetCompositionStringW (IMM32.@)
576 LONG WINAPI
ImmGetCompositionStringW(
577 HIMC hIMC
, DWORD dwIndex
,
578 LPVOID lpBuf
, DWORD dwBufLen
)
581 InputContextData
*data
= (InputContextData
*)hIMC
;
583 TRACE("(%p, 0x%lx, %p, %ld)\n",
584 hIMC
, dwIndex
, lpBuf
, dwBufLen
590 if (dwIndex
== GCS_RESULTSTR
)
594 if (dwBufLen
>= data
->dwResultStringSize
)
595 memcpy(lpBuf
,data
->ResultString
,data
->dwResultStringSize
);
597 rc
= data
->dwResultStringSize
;
599 else if (dwIndex
== GCS_RESULTREADSTR
)
601 if (dwBufLen
>= data
->dwResultReadStringSize
)
602 memcpy(lpBuf
,data
->ResultReadingString
,
603 data
->dwResultReadStringSize
);
605 rc
= data
->dwResultReadStringSize
;
607 else if (dwIndex
== GCS_COMPSTR
)
609 if (dwBufLen
>= data
->dwCompStringLength
)
610 memcpy(lpBuf
,data
->CompositionString
,data
->dwCompStringLength
);
612 rc
= data
->dwCompStringLength
;
614 else if (dwIndex
== GCS_COMPATTR
)
616 int len
= data
->dwCompStringLength
;
621 for (i
= 0; i
< len
; i
++)
622 ((LPBYTE
)lpBuf
)[i
] = ATTR_INPUT
;
627 else if (dwIndex
== GCS_COMPCLAUSE
)
629 if (dwBufLen
>= sizeof(DWORD
)*2)
631 ((LPDWORD
)lpBuf
)[0] = 0;
632 ((LPDWORD
)lpBuf
)[1] = data
->dwCompStringLength
/sizeof(WCHAR
);
634 rc
= sizeof(DWORD
)*2;
636 else if (dwIndex
== GCS_COMPREADSTR
)
638 if (dwBufLen
>= data
->dwCompReadStringSize
)
639 memcpy(lpBuf
,data
->CompositionReadingString
,
640 data
->dwCompReadStringSize
);
642 rc
= data
->dwCompReadStringSize
;
646 FIXME("Unhandled index 0x%lx\n",dwIndex
);
652 /***********************************************************************
653 * ImmGetCompositionWindow (IMM32.@)
655 BOOL WINAPI
ImmGetCompositionWindow(HIMC hIMC
, LPCOMPOSITIONFORM lpCompForm
)
657 InputContextData
*data
= (InputContextData
*)hIMC
;
659 TRACE("(%p, %p)\n", hIMC
, lpCompForm
);
664 memcpy(lpCompForm
,&(data
->CompForm
),sizeof(COMPOSITIONFORM
));
668 /***********************************************************************
669 * ImmGetContext (IMM32.@)
672 HIMC WINAPI
ImmGetContext(HWND hWnd
)
674 FIXME("(%p): stub\n", hWnd
);
679 root_context
->hwnd
= hWnd
;
680 return (HIMC
)root_context
;
683 /***********************************************************************
684 * ImmGetConversionListA (IMM32.@)
686 DWORD WINAPI
ImmGetConversionListA(
688 LPCSTR pSrc
, LPCANDIDATELIST lpDst
,
689 DWORD dwBufLen
, UINT uFlag
)
691 FIXME("(%p, %p, %s, %p, %ld, %d): stub\n",
692 hKL
, hIMC
, debugstr_a(pSrc
), lpDst
, dwBufLen
, uFlag
694 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
698 /***********************************************************************
699 * ImmGetConversionListW (IMM32.@)
701 DWORD WINAPI
ImmGetConversionListW(
703 LPCWSTR pSrc
, LPCANDIDATELIST lpDst
,
704 DWORD dwBufLen
, UINT uFlag
)
706 FIXME("(%p, %p, %s, %p, %ld, %d): stub\n",
707 hKL
, hIMC
, debugstr_w(pSrc
), lpDst
, dwBufLen
, uFlag
709 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
713 /***********************************************************************
714 * ImmGetConversionStatus (IMM32.@)
716 BOOL WINAPI
ImmGetConversionStatus(
717 HIMC hIMC
, LPDWORD lpfdwConversion
, LPDWORD lpfdwSentence
)
719 TRACE("(%p, %p, %p): best guess\n", hIMC
, lpfdwConversion
, lpfdwSentence
);
721 *lpfdwConversion
= IME_CMODE_NATIVE
;
723 *lpfdwSentence
= IME_SMODE_NONE
;
727 /***********************************************************************
728 * ImmGetDefaultIMEWnd (IMM32.@)
730 HWND WINAPI
ImmGetDefaultIMEWnd(HWND hWnd
)
732 FIXME("(%p - %p %p ): semi-stub\n", hWnd
,hwndDefault
, root_context
);
734 if (hwndDefault
== NULL
)
736 static const WCHAR the_name
[] = {'I','M','E','\0'};
739 hwndDefault
= CreateWindowExW( WS_EX_CLIENTEDGE
, WC_IMECLASSNAME
,
740 the_name
, WS_POPUPWINDOW
|WS_CAPTION
, 0, 0, 120, 55, 0, 0,
743 TRACE("Default created (0x%x)\n",(INT
)hwndDefault
);
746 return (HWND
)hwndDefault
;
749 /***********************************************************************
750 * ImmGetDescriptionA (IMM32.@)
752 UINT WINAPI
ImmGetDescriptionA(
753 HKL hKL
, LPSTR lpszDescription
, UINT uBufLen
)
758 TRACE("%p %p %d\n", hKL
, lpszDescription
, uBufLen
);
760 /* find out how many characters in the unicode buffer */
761 len
= ImmGetDescriptionW( hKL
, NULL
, 0 );
763 /* allocate a buffer of that size */
764 buf
= HeapAlloc( GetProcessHeap(), 0, (len
+ 1) * sizeof (WCHAR
) );
768 /* fetch the unicode buffer */
769 len
= ImmGetDescriptionW( hKL
, buf
, len
+ 1 );
771 /* convert it back to ASCII */
772 len
= WideCharToMultiByte( CP_ACP
, 0, buf
, len
+ 1,
773 lpszDescription
, uBufLen
, NULL
, NULL
);
775 HeapFree( GetProcessHeap(), 0, buf
);
780 /***********************************************************************
781 * ImmGetDescriptionW (IMM32.@)
783 UINT WINAPI
ImmGetDescriptionW(HKL hKL
, LPWSTR lpszDescription
, UINT uBufLen
)
785 static const WCHAR name
[] = { 'W','i','n','e',' ','X','I','M',0 };
787 FIXME("(%p, %p, %d): semi stub\n", hKL
, lpszDescription
, uBufLen
);
789 if (!uBufLen
) return lstrlenW( name
);
790 lstrcpynW( lpszDescription
, name
, uBufLen
);
791 return lstrlenW( lpszDescription
);
794 /***********************************************************************
795 * ImmGetGuideLineA (IMM32.@)
797 DWORD WINAPI
ImmGetGuideLineA(
798 HIMC hIMC
, DWORD dwIndex
, LPSTR lpBuf
, DWORD dwBufLen
)
800 FIXME("(%p, %ld, %s, %ld): stub\n",
801 hIMC
, dwIndex
, debugstr_a(lpBuf
), dwBufLen
803 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
807 /***********************************************************************
808 * ImmGetGuideLineW (IMM32.@)
810 DWORD WINAPI
ImmGetGuideLineW(HIMC hIMC
, DWORD dwIndex
, LPWSTR lpBuf
, DWORD dwBufLen
)
812 FIXME("(%p, %ld, %s, %ld): stub\n",
813 hIMC
, dwIndex
, debugstr_w(lpBuf
), dwBufLen
815 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
819 /***********************************************************************
820 * ImmGetIMEFileNameA (IMM32.@)
822 UINT WINAPI
ImmGetIMEFileNameA(
823 HKL hKL
, LPSTR lpszFileName
, UINT uBufLen
)
825 FIXME("(%p, %p, %d): stub\n", hKL
, lpszFileName
, uBufLen
);
826 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
830 /***********************************************************************
831 * ImmGetIMEFileNameW (IMM32.@)
833 UINT WINAPI
ImmGetIMEFileNameW(
834 HKL hKL
, LPWSTR lpszFileName
, UINT uBufLen
)
836 FIXME("(%p, %p, %d): stub\n", hKL
, lpszFileName
, uBufLen
);
837 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
841 /***********************************************************************
842 * ImmGetOpenStatus (IMM32.@)
844 BOOL WINAPI
ImmGetOpenStatus(HIMC hIMC
)
846 InputContextData
*data
= (InputContextData
*)hIMC
;
850 FIXME("(%p): semi-stub\n", hIMC
);
855 /***********************************************************************
856 * ImmGetProperty (IMM32.@)
858 DWORD WINAPI
ImmGetProperty(HKL hKL
, DWORD fdwIndex
)
861 TRACE("(%p, %ld)\n", hKL
, fdwIndex
);
866 TRACE("(%s)\n", "IGP_PROPERTY");
867 rc
= IME_PROP_UNICODE
| IME_PROP_AT_CARET
;
870 FIXME("(%s)\n", "IGP_CONVERSION");
871 rc
= IME_CMODE_NATIVE
;
874 FIXME("%s)\n", "IGP_SENTENCE");
875 rc
= IME_SMODE_AUTOMATIC
;
878 TRACE("(%s)\n", "IGP_SETCOMPSTR");
882 TRACE("(%s)\n", "IGP_SELECT");
883 rc
= SELECT_CAP_CONVERSION
| SELECT_CAP_SENTENCE
;
885 case IGP_GETIMEVERSION
:
886 TRACE("(%s)\n", "IGP_GETIMEVERSION");
890 TRACE("(%s)\n", "IGP_UI");
899 /***********************************************************************
900 * ImmGetRegisterWordStyleA (IMM32.@)
902 UINT WINAPI
ImmGetRegisterWordStyleA(
903 HKL hKL
, UINT nItem
, LPSTYLEBUFA lpStyleBuf
)
905 FIXME("(%p, %d, %p): stub\n", hKL
, nItem
, lpStyleBuf
);
906 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
910 /***********************************************************************
911 * ImmGetRegisterWordStyleW (IMM32.@)
913 UINT WINAPI
ImmGetRegisterWordStyleW(
914 HKL hKL
, UINT nItem
, LPSTYLEBUFW lpStyleBuf
)
916 FIXME("(%p, %d, %p): stub\n", hKL
, nItem
, lpStyleBuf
);
917 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
921 /***********************************************************************
922 * ImmGetStatusWindowPos (IMM32.@)
924 BOOL WINAPI
ImmGetStatusWindowPos(HIMC hIMC
, LPPOINT lpptPos
)
926 FIXME("(%p, %p): stub\n", hIMC
, lpptPos
);
927 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
931 /***********************************************************************
932 * ImmGetVirtualKey (IMM32.@)
934 UINT WINAPI
ImmGetVirtualKey(HWND hWnd
)
936 OSVERSIONINFOA version
;
937 FIXME("(%p): stub\n", hWnd
);
938 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
939 GetVersionExA( &version
);
940 switch(version
.dwPlatformId
)
942 case VER_PLATFORM_WIN32_WINDOWS
:
943 return VK_PROCESSKEY
;
944 case VER_PLATFORM_WIN32_NT
:
947 FIXME("%ld not supported\n",version
.dwPlatformId
);
948 return VK_PROCESSKEY
;
952 /***********************************************************************
953 * ImmInstallIMEA (IMM32.@)
955 HKL WINAPI
ImmInstallIMEA(
956 LPCSTR lpszIMEFileName
, LPCSTR lpszLayoutText
)
958 FIXME("(%s, %s): stub\n",
959 debugstr_a(lpszIMEFileName
), debugstr_a(lpszLayoutText
)
961 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
965 /***********************************************************************
966 * ImmInstallIMEW (IMM32.@)
968 HKL WINAPI
ImmInstallIMEW(
969 LPCWSTR lpszIMEFileName
, LPCWSTR lpszLayoutText
)
971 FIXME("(%s, %s): stub\n",
972 debugstr_w(lpszIMEFileName
), debugstr_w(lpszLayoutText
)
974 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
978 /***********************************************************************
981 BOOL WINAPI
ImmIsIME(HKL hKL
)
983 FIXME("(%p): semi-stub\n", hKL
);
985 * Dead key locales will return TRUE here when they should not
986 * There is probably a more proper way to check this.
988 return (root_context
!= NULL
);
991 /***********************************************************************
992 * ImmIsUIMessageA (IMM32.@)
994 BOOL WINAPI
ImmIsUIMessageA(
995 HWND hWndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
999 TRACE("(%p, %x, %d, %ld)\n", hWndIME
, msg
, wParam
, lParam
);
1000 if ((msg
>= WM_IME_STARTCOMPOSITION
&& msg
<= WM_IME_KEYLAST
) ||
1001 (msg
>= WM_IME_SETCONTEXT
&& msg
<= WM_IME_KEYUP
) ||
1002 (msg
== WM_MSIME_SERVICE
) ||
1003 (msg
== WM_MSIME_RECONVERTOPTIONS
) ||
1004 (msg
== WM_MSIME_MOUSE
) ||
1005 (msg
== WM_MSIME_RECONVERTREQUEST
) ||
1006 (msg
== WM_MSIME_RECONVERT
) ||
1007 (msg
== WM_MSIME_QUERYPOSITION
) ||
1008 (msg
== WM_MSIME_DOCUMENTFEED
))
1012 ImmGetDefaultIMEWnd(NULL
);
1014 if (hWndIME
== NULL
)
1015 PostMessageA(hwndDefault
, msg
, wParam
, lParam
);
1022 /***********************************************************************
1023 * ImmIsUIMessageW (IMM32.@)
1025 BOOL WINAPI
ImmIsUIMessageW(
1026 HWND hWndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
1029 TRACE("(%p, %d, %d, %ld): stub\n", hWndIME
, msg
, wParam
, lParam
);
1030 if ((msg
>= WM_IME_STARTCOMPOSITION
&& msg
<= WM_IME_KEYLAST
) ||
1031 (msg
>= WM_IME_SETCONTEXT
&& msg
<= WM_IME_KEYUP
) ||
1032 (msg
== WM_MSIME_SERVICE
) ||
1033 (msg
== WM_MSIME_RECONVERTOPTIONS
) ||
1034 (msg
== WM_MSIME_MOUSE
) ||
1035 (msg
== WM_MSIME_RECONVERTREQUEST
) ||
1036 (msg
== WM_MSIME_RECONVERT
) ||
1037 (msg
== WM_MSIME_QUERYPOSITION
) ||
1038 (msg
== WM_MSIME_DOCUMENTFEED
))
1043 /***********************************************************************
1044 * ImmNotifyIME (IMM32.@)
1046 BOOL WINAPI
ImmNotifyIME(
1047 HIMC hIMC
, DWORD dwAction
, DWORD dwIndex
, DWORD dwValue
)
1050 FIXME("(%p, %ld, %ld, %ld): stub\n",
1051 hIMC
, dwAction
, dwIndex
, dwValue
);
1055 case NI_CHANGECANDIDATELIST
:
1056 FIXME("%s\n","NI_CHANGECANDIDATELIST");
1058 case NI_CLOSECANDIDATE
:
1059 FIXME("%s\n","NI_CLOSECANDIDATE");
1061 case NI_COMPOSITIONSTR
:
1065 TRACE("%s - %s\n","NI_COMPOSITIONSTR","CPS_CANCEL");
1066 if (pX11DRV_ForceXIMReset
)
1067 pX11DRV_ForceXIMReset(root_context
->hwnd
);
1068 if (root_context
->dwCompStringSize
)
1070 HeapFree(GetProcessHeap(),0,
1071 root_context
->CompositionString
);
1072 root_context
->dwCompStringSize
= 0;
1073 root_context
->dwCompStringLength
= 0;
1074 root_context
->CompositionString
= NULL
;
1075 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
, 0,
1081 TRACE("%s - %s\n","NI_COMPOSITIONSTR","CPS_COMPLETE");
1082 if (hIMC
!= (HIMC
)FROM_IME
&& pX11DRV_ForceXIMReset
)
1083 pX11DRV_ForceXIMReset(root_context
->hwnd
);
1085 if (root_context
->dwResultStringSize
)
1087 HeapFree(GetProcessHeap(),0,root_context
->ResultString
);
1088 root_context
->dwResultStringSize
= 0;
1089 root_context
->ResultString
= NULL
;
1091 if (root_context
->dwCompStringLength
)
1093 root_context
->ResultString
= HeapAlloc(
1094 GetProcessHeap(), 0, root_context
->dwCompStringLength
);
1095 root_context
->dwResultStringSize
=
1096 root_context
->dwCompStringLength
;
1098 memcpy(root_context
->ResultString
,
1099 root_context
->CompositionString
,
1100 root_context
->dwCompStringLength
);
1102 HeapFree(GetProcessHeap(),0,
1103 root_context
->CompositionString
);
1105 root_context
->dwCompStringSize
= 0;
1106 root_context
->dwCompStringLength
= 0;
1107 root_context
->CompositionString
= NULL
;
1108 root_context
->bRead
= FALSE
;
1110 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
, 0,
1113 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
,
1114 root_context
->ResultString
[0],
1115 GCS_RESULTSTR
|GCS_RESULTCLAUSE
);
1119 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_CONVERT");
1122 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_REVERT");
1125 ERR("%s - %s (%li)\n","NI_COMPOSITIONSTR","UNKNOWN",dwIndex
);
1129 case NI_IMEMENUSELECTED
:
1130 FIXME("%s\n", "NI_IMEMENUSELECTED");
1132 case NI_OPENCANDIDATE
:
1133 FIXME("%s\n", "NI_OPENCANDIDATE");
1135 case NI_SELECTCANDIDATESTR
:
1136 FIXME("%s\n", "NI_SELECTCANDIDATESTR");
1138 case NI_SETCANDIDATE_PAGESIZE
:
1139 FIXME("%s\n", "NI_SETCANDIDATE_PAGESIZE");
1141 case NI_SETCANDIDATE_PAGESTART
:
1142 FIXME("%s\n", "NI_SETCANDIDATE_PAGESTART");
1151 /***********************************************************************
1152 * ImmRegisterWordA (IMM32.@)
1154 BOOL WINAPI
ImmRegisterWordA(
1155 HKL hKL
, LPCSTR lpszReading
, DWORD dwStyle
, LPCSTR lpszRegister
)
1157 FIXME("(%p, %s, %ld, %s): stub\n",
1158 hKL
, debugstr_a(lpszReading
), dwStyle
, debugstr_a(lpszRegister
)
1160 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1164 /***********************************************************************
1165 * ImmRegisterWordW (IMM32.@)
1167 BOOL WINAPI
ImmRegisterWordW(
1168 HKL hKL
, LPCWSTR lpszReading
, DWORD dwStyle
, LPCWSTR lpszRegister
)
1170 FIXME("(%p, %s, %ld, %s): stub\n",
1171 hKL
, debugstr_w(lpszReading
), dwStyle
, debugstr_w(lpszRegister
)
1173 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1177 /***********************************************************************
1178 * ImmReleaseContext (IMM32.@)
1180 BOOL WINAPI
ImmReleaseContext(HWND hWnd
, HIMC hIMC
)
1182 FIXME("(%p, %p): stub\n", hWnd
, hIMC
);
1187 /***********************************************************************
1188 * ImmSetCandidateWindow (IMM32.@)
1190 BOOL WINAPI
ImmSetCandidateWindow(
1191 HIMC hIMC
, LPCANDIDATEFORM lpCandidate
)
1193 FIXME("(%p, %p): stub\n", hIMC
, lpCandidate
);
1194 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1198 /***********************************************************************
1199 * ImmSetCompositionFontA (IMM32.@)
1201 BOOL WINAPI
ImmSetCompositionFontA(HIMC hIMC
, LPLOGFONTA lplf
)
1203 InputContextData
*data
= (InputContextData
*)hIMC
;
1204 TRACE("(%p, %p)\n", hIMC
, lplf
);
1209 memcpy(&data
->font
,lplf
,sizeof(LOGFONTA
));
1210 MultiByteToWideChar(CP_ACP
, 0, lplf
->lfFaceName
, -1, data
->font
.lfFaceName
,
1213 SendMessageW(root_context
->hwnd
, WM_IME_NOTIFY
, IMN_SETCOMPOSITIONFONT
, 0);
1217 DeleteObject(data
->textfont
);
1218 data
->textfont
= NULL
;
1221 data
->textfont
= CreateFontIndirectW(&data
->font
);
1225 /***********************************************************************
1226 * ImmSetCompositionFontW (IMM32.@)
1228 BOOL WINAPI
ImmSetCompositionFontW(HIMC hIMC
, LPLOGFONTW lplf
)
1230 InputContextData
*data
= (InputContextData
*)hIMC
;
1231 TRACE("(%p, %p)\n", hIMC
, lplf
);
1236 memcpy(&data
->font
,lplf
,sizeof(LOGFONTW
));
1237 SendMessageW(root_context
->hwnd
, WM_IME_NOTIFY
, IMN_SETCOMPOSITIONFONT
, 0);
1241 DeleteObject(data
->textfont
);
1242 data
->textfont
= NULL
;
1244 data
->textfont
= CreateFontIndirectW(&data
->font
);
1248 /***********************************************************************
1249 * ImmSetCompositionStringA (IMM32.@)
1251 BOOL WINAPI
ImmSetCompositionStringA(
1252 HIMC hIMC
, DWORD dwIndex
,
1253 LPCVOID lpComp
, DWORD dwCompLen
,
1254 LPCVOID lpRead
, DWORD dwReadLen
)
1258 WCHAR
*CompBuffer
= NULL
;
1259 WCHAR
*ReadBuffer
= NULL
;
1262 TRACE("(%p, %ld, %p, %ld, %p, %ld): stub\n",
1263 hIMC
, dwIndex
, lpComp
, dwCompLen
, lpRead
, dwReadLen
);
1265 comp_len
= MultiByteToWideChar(CP_ACP
, 0, lpComp
, dwCompLen
, NULL
, 0);
1268 CompBuffer
= (WCHAR
*)HeapAlloc(GetProcessHeap(),0,comp_len
* sizeof(WCHAR
));
1269 MultiByteToWideChar(CP_ACP
, 0, lpComp
, dwCompLen
, CompBuffer
, comp_len
);
1272 read_len
= MultiByteToWideChar(CP_ACP
, 0, lpRead
, dwReadLen
, NULL
, 0);
1275 ReadBuffer
= (WCHAR
*)HeapAlloc(GetProcessHeap(),0,read_len
* sizeof(WCHAR
));
1276 MultiByteToWideChar(CP_ACP
, 0, lpRead
, dwReadLen
, ReadBuffer
, read_len
);
1279 rc
= ImmSetCompositionStringW(hIMC
, dwIndex
, CompBuffer
, comp_len
,
1280 ReadBuffer
, read_len
);
1283 HeapFree(GetProcessHeap(), 0, CompBuffer
);
1286 HeapFree(GetProcessHeap(), 0, ReadBuffer
);
1291 /***********************************************************************
1292 * ImmSetCompositionStringW (IMM32.@)
1294 BOOL WINAPI
ImmSetCompositionStringW(
1295 HIMC hIMC
, DWORD dwIndex
,
1296 LPCVOID lpComp
, DWORD dwCompLen
,
1297 LPCVOID lpRead
, DWORD dwReadLen
)
1302 TRACE("(%p, %ld, %p, %ld, %p, %ld): stub\n",
1303 hIMC
, dwIndex
, lpComp
, dwCompLen
, lpRead
, dwReadLen
);
1306 if (hIMC
!= (HIMC
)FROM_IME
)
1307 FIXME("PROBLEM: This only sets the wine level string\n");
1311 * this sets the composition string in the imm32.dll level
1312 * of the composition buffer. we cannot manipulate the xim level
1313 * buffer, which means that once the xim level buffer changes again
1314 * any call to this function from the application will be lost
1317 if (lpRead
&& dwReadLen
)
1318 FIXME("Reading string unimplemented\n");
1321 * app operating this api to also receive the message from xim
1324 if (dwIndex
== SCS_SETSTR
)
1326 flags
= GCS_COMPSTR
;
1328 if (root_context
->dwCompStringLength
)
1329 HeapFree(GetProcessHeap(),0,root_context
->CompositionString
);
1331 root_context
->dwCompStringLength
= dwCompLen
;
1332 root_context
->dwCompStringSize
= dwCompLen
;
1334 if (dwCompLen
&& lpComp
)
1336 root_context
->CompositionString
= HeapAlloc(GetProcessHeap(), 0,
1338 memcpy(root_context
->CompositionString
,lpComp
,dwCompLen
);
1340 wParam
= ((WCHAR
*)lpComp
)[0];
1341 flags
|= GCS_COMPCLAUSE
| GCS_COMPATTR
;
1344 root_context
->CompositionString
= NULL
;
1348 UpdateDataInDefaultIMEWindow(hwndDefault
);
1350 ImmInternalPostIMEMessage(WM_IME_COMPOSITION
, wParam
, flags
);
1355 /***********************************************************************
1356 * ImmSetCompositionWindow (IMM32.@)
1358 BOOL WINAPI
ImmSetCompositionWindow(
1359 HIMC hIMC
, LPCOMPOSITIONFORM lpCompForm
)
1361 BOOL reshow
= FALSE
;
1362 InputContextData
*data
= (InputContextData
*)hIMC
;
1364 TRACE("(%p, %p)\n", hIMC
, lpCompForm
);
1365 TRACE("\t%lx, (%li,%li), (%li,%li - %li,%li)\n",lpCompForm
->dwStyle
,
1366 lpCompForm
->ptCurrentPos
.x
, lpCompForm
->ptCurrentPos
.y
, lpCompForm
->rcArea
.top
,
1367 lpCompForm
->rcArea
.left
, lpCompForm
->rcArea
.bottom
, lpCompForm
->rcArea
.right
);
1372 memcpy(&data
->CompForm
,lpCompForm
,sizeof(COMPOSITIONFORM
));
1374 if (IsWindowVisible(hwndDefault
))
1377 ShowWindow(hwndDefault
,SW_HIDE
);
1383 ShowWindow(hwndDefault
,SW_SHOWNOACTIVATE
);
1385 SendMessageW(root_context
->hwnd
, WM_IME_NOTIFY
,IMN_SETCOMPOSITIONWINDOW
, 0);
1389 /***********************************************************************
1390 * ImmSetConversionStatus (IMM32.@)
1392 BOOL WINAPI
ImmSetConversionStatus(
1393 HIMC hIMC
, DWORD fdwConversion
, DWORD fdwSentence
)
1395 FIXME("(%p, %ld, %ld): stub\n",
1396 hIMC
, fdwConversion
, fdwSentence
1398 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1402 /***********************************************************************
1403 * ImmSetOpenStatus (IMM32.@)
1405 BOOL WINAPI
ImmSetOpenStatus(HIMC hIMC
, BOOL fOpen
)
1407 InputContextData
*data
= (InputContextData
*)hIMC
;
1408 FIXME("Semi-Stub\n");
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
);