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, %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
);