4 * Copyright 1998 Patrik Stridvall
5 * Copyright 2002, 2003, 2007 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
30 #include "wine/debug.h"
35 #include "wine/list.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(imm
);
39 typedef struct tagIMCCInternal
45 #define MAKE_FUNCPTR(f) typeof(f) * p##f
46 typedef struct _tagImmHkl
{
51 WCHAR imeClassName
[17]; /* 16 character max */
54 /* Function Pointers */
55 MAKE_FUNCPTR(ImeInquire
);
56 MAKE_FUNCPTR(ImeConfigure
);
57 MAKE_FUNCPTR(ImeDestroy
);
58 MAKE_FUNCPTR(ImeEscape
);
59 MAKE_FUNCPTR(ImeSelect
);
60 MAKE_FUNCPTR(ImeSetActiveContext
);
61 MAKE_FUNCPTR(ImeToAsciiEx
);
62 MAKE_FUNCPTR(NotifyIME
);
63 MAKE_FUNCPTR(ImeRegisterWord
);
64 MAKE_FUNCPTR(ImeUnregisterWord
);
65 MAKE_FUNCPTR(ImeEnumRegisterWord
);
66 MAKE_FUNCPTR(ImeSetCompositionString
);
67 MAKE_FUNCPTR(ImeConversionList
);
68 MAKE_FUNCPTR(ImeProcessKey
);
69 MAKE_FUNCPTR(ImeGetRegisterWordStyle
);
70 MAKE_FUNCPTR(ImeGetImeMenuItems
);
74 typedef struct tagInputContextData
84 typedef struct _tagTRANSMSG
{
88 } TRANSMSG
, *LPTRANSMSG
;
90 typedef struct _tagIMMThreadData
{
95 static DWORD tlsIndex
= 0;
96 static struct list ImmHklList
= LIST_INIT(ImmHklList
);
99 static UINT WM_MSIME_SERVICE
;
100 static UINT WM_MSIME_RECONVERTOPTIONS
;
101 static UINT WM_MSIME_MOUSE
;
102 static UINT WM_MSIME_RECONVERTREQUEST
;
103 static UINT WM_MSIME_RECONVERT
;
104 static UINT WM_MSIME_QUERYPOSITION
;
105 static UINT WM_MSIME_DOCUMENTFEED
;
107 static const WCHAR szwWineIMCProperty
[] = {'W','i','n','e','I','m','m','H','I','M','C','P','r','o','p','e','r','t','y',0};
109 #define is_himc_ime_unicode(p) (p->immKbd->imeInfo.fdwProperty & IME_PROP_UNICODE)
110 #define is_kbd_ime_unicode(p) (p->imeInfo.fdwProperty & IME_PROP_UNICODE)
112 static BOOL
IMM_DestroyContext(HIMC hIMC
);
114 static inline WCHAR
*strdupAtoW( const char *str
)
119 DWORD len
= MultiByteToWideChar( CP_ACP
, 0, str
, -1, NULL
, 0 );
120 if ((ret
= HeapAlloc( GetProcessHeap(), 0, len
* sizeof(WCHAR
) )))
121 MultiByteToWideChar( CP_ACP
, 0, str
, -1, ret
, len
);
126 static inline CHAR
*strdupWtoA( const WCHAR
*str
)
131 DWORD len
= WideCharToMultiByte( CP_ACP
, 0, str
, -1, NULL
, 0, NULL
, NULL
);
132 if ((ret
= HeapAlloc( GetProcessHeap(), 0, len
)))
133 WideCharToMultiByte( CP_ACP
, 0, str
, -1, ret
, len
, NULL
, NULL
);
138 static IMMThreadData
* IMM_GetThreadData(void)
140 return (IMMThreadData
*)TlsGetValue(tlsIndex
);
143 static void IMM_InitThreadData(void)
145 IMMThreadData
* data
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
146 sizeof(IMMThreadData
));
147 TlsSetValue(tlsIndex
,data
);
149 TRACE("Thread Data Created\n");
152 static void IMM_FreeThreadData(void)
154 IMMThreadData
* data
= TlsGetValue(tlsIndex
);
155 IMM_DestroyContext(data
->defaultContext
);
156 DestroyWindow(data
->hwndDefault
);
157 HeapFree(GetProcessHeap(),0,data
);
158 TRACE("Thread Data Destroyed\n");
161 static HMODULE
LoadDefaultWineIME(void)
163 char buffer
[MAX_PATH
], libname
[32], *name
, *next
;
167 TRACE("Attempting to fall back to wine default IME\n");
169 strcpy( buffer
, "x11" ); /* default value */
170 /* @@ Wine registry key: HKCU\Software\Wine\Drivers */
171 if (!RegOpenKeyA( HKEY_CURRENT_USER
, "Software\\Wine\\Drivers", &hkey
))
173 DWORD type
, count
= sizeof(buffer
);
174 RegQueryValueExA( hkey
, "Ime", 0, &type
, (LPBYTE
) buffer
, &count
);
181 next
= strchr( name
, ',' );
182 if (next
) *next
++ = 0;
184 snprintf( libname
, sizeof(libname
), "wine%s.drv", name
);
185 if ((module
= LoadLibraryA( libname
)) != 0) break;
192 /* ImmHkl loading and freeing */
193 #define LOAD_FUNCPTR(f) if((ptr->p##f = (LPVOID)GetProcAddress(ptr->hIME, #f)) == NULL){WARN("Can't find function %s in ime\n", #f);}
194 static ImmHkl
*IMM_GetImmHkl(HKL hkl
)
197 WCHAR filename
[MAX_PATH
];
199 TRACE("Seeking ime for keyboard 0x%x\n",(unsigned)hkl
);
201 LIST_FOR_EACH_ENTRY(ptr
, &ImmHklList
, ImmHkl
, entry
)
206 /* not found... create it */
208 ptr
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(ImmHkl
));
211 if (ImmGetIMEFileNameW(hkl
, filename
, MAX_PATH
)) ptr
->hIME
= LoadLibraryW(filename
);
213 ptr
->hIME
= LoadDefaultWineIME();
216 LOAD_FUNCPTR(ImeInquire
);
217 if (!ptr
->pImeInquire
|| !ptr
->pImeInquire(&ptr
->imeInfo
, ptr
->imeClassName
, NULL
))
219 FreeLibrary(ptr
->hIME
);
224 LOAD_FUNCPTR(ImeDestroy
);
225 LOAD_FUNCPTR(ImeSelect
);
226 if (!ptr
->pImeSelect
|| !ptr
->pImeDestroy
)
228 FreeLibrary(ptr
->hIME
);
233 LOAD_FUNCPTR(ImeConfigure
);
234 LOAD_FUNCPTR(ImeEscape
);
235 LOAD_FUNCPTR(ImeSetActiveContext
);
236 LOAD_FUNCPTR(ImeToAsciiEx
);
237 LOAD_FUNCPTR(NotifyIME
);
238 LOAD_FUNCPTR(ImeRegisterWord
);
239 LOAD_FUNCPTR(ImeUnregisterWord
);
240 LOAD_FUNCPTR(ImeEnumRegisterWord
);
241 LOAD_FUNCPTR(ImeSetCompositionString
);
242 LOAD_FUNCPTR(ImeConversionList
);
243 LOAD_FUNCPTR(ImeProcessKey
);
244 LOAD_FUNCPTR(ImeGetRegisterWordStyle
);
245 LOAD_FUNCPTR(ImeGetImeMenuItems
);
246 /* make sure our classname is WCHAR */
247 if (!is_kbd_ime_unicode(ptr
))
250 MultiByteToWideChar(CP_ACP
, 0, (LPSTR
)ptr
->imeClassName
,
252 lstrcpyW(ptr
->imeClassName
, bufW
);
257 list_add_head(&ImmHklList
,&ptr
->entry
);
263 static void IMM_FreeAllImmHkl(void)
265 ImmHkl
*ptr
,*cursor2
;
267 LIST_FOR_EACH_ENTRY_SAFE(ptr
, cursor2
, &ImmHklList
, ImmHkl
, entry
)
269 list_remove(&ptr
->entry
);
273 FreeLibrary(ptr
->hIME
);
275 HeapFree(GetProcessHeap(),0,ptr
);
279 static void IMM_RegisterMessages(void)
281 WM_MSIME_SERVICE
= RegisterWindowMessageA("MSIMEService");
282 WM_MSIME_RECONVERTOPTIONS
= RegisterWindowMessageA("MSIMEReconvertOptions");
283 WM_MSIME_MOUSE
= RegisterWindowMessageA("MSIMEMouseOperation");
284 WM_MSIME_RECONVERTREQUEST
= RegisterWindowMessageA("MSIMEReconvertRequest");
285 WM_MSIME_RECONVERT
= RegisterWindowMessageA("MSIMEReconvert");
286 WM_MSIME_QUERYPOSITION
= RegisterWindowMessageA("MSIMEQueryPosition");
287 WM_MSIME_DOCUMENTFEED
= RegisterWindowMessageA("MSIMEDocumentFeed");
290 BOOL WINAPI
DllMain(HINSTANCE hInstDLL
, DWORD fdwReason
, LPVOID lpReserved
)
292 TRACE("%p, %x, %p\n",hInstDLL
,fdwReason
,lpReserved
);
295 case DLL_PROCESS_ATTACH
:
296 IMM_RegisterMessages();
297 tlsIndex
= TlsAlloc();
298 IMM_InitThreadData();
300 case DLL_THREAD_ATTACH
:
301 IMM_InitThreadData();
303 case DLL_THREAD_DETACH
:
304 IMM_FreeThreadData();
306 case DLL_PROCESS_DETACH
:
307 IMM_FreeThreadData();
315 /* for posting messages as the IME */
316 static void ImmInternalPostIMEMessage(InputContextData
*data
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
318 HWND target
= GetFocus();
320 PostMessageW(data
->IMC
.hWnd
,msg
,wParam
,lParam
);
322 PostMessageW(target
, msg
, wParam
, lParam
);
325 static LRESULT
ImmInternalSendIMENotify(InputContextData
*data
, WPARAM notify
, LPARAM lParam
)
329 target
= data
->IMC
.hWnd
;
330 if (!target
) target
= GetFocus();
333 return SendMessageW(target
, WM_IME_NOTIFY
, notify
, lParam
);
338 static HIMCC
ImmCreateBlankCompStr(void)
341 LPCOMPOSITIONSTRING ptr
;
342 rc
= ImmCreateIMCC(sizeof(COMPOSITIONSTRING
));
343 ptr
= (LPCOMPOSITIONSTRING
)ImmLockIMCC(rc
);
344 memset(ptr
,0,sizeof(COMPOSITIONSTRING
));
345 ptr
->dwSize
= sizeof(COMPOSITIONSTRING
);
350 /***********************************************************************
351 * ImmAssociateContext (IMM32.@)
353 HIMC WINAPI
ImmAssociateContext(HWND hWnd
, HIMC hIMC
)
356 InputContextData
*data
= (InputContextData
*)hIMC
;
358 TRACE("(%p, %p):\n", hWnd
, hIMC
);
360 if (!IMM_GetThreadData()->defaultContext
)
361 IMM_GetThreadData()->defaultContext
= ImmCreateContext();
364 * If already associated just return
366 if (hIMC
&& data
->IMC
.hWnd
== hWnd
)
371 old
= (HIMC
)RemovePropW(hWnd
,szwWineIMCProperty
);
374 old
= IMM_GetThreadData()->defaultContext
;
375 else if (old
== (HIMC
)-1)
378 if (hIMC
!= IMM_GetThreadData()->defaultContext
)
380 if (hIMC
== NULL
) /* Meaning disable imm for that window*/
381 SetPropW(hWnd
,szwWineIMCProperty
,(HANDLE
)-1);
383 SetPropW(hWnd
,szwWineIMCProperty
,(HANDLE
)hIMC
);
388 InputContextData
*old_data
= (InputContextData
*)old
;
389 if (old_data
->IMC
.hWnd
== hWnd
)
390 old_data
->IMC
.hWnd
= NULL
;
397 if (IsWindow(data
->IMC
.hWnd
))
400 * Post a message that your context is switching
402 SendMessageW(data
->IMC
.hWnd
, WM_IME_SETCONTEXT
, FALSE
, ISC_SHOWUIALL
);
405 data
->IMC
.hWnd
= hWnd
;
407 if (IsWindow(data
->IMC
.hWnd
))
410 * Post a message that your context is switching
412 SendMessageW(data
->IMC
.hWnd
, WM_IME_SETCONTEXT
, TRUE
, ISC_SHOWUIALL
);
418 /***********************************************************************
419 * ImmAssociateContextEx (IMM32.@)
421 BOOL WINAPI
ImmAssociateContextEx(HWND hWnd
, HIMC hIMC
, DWORD dwFlags
)
423 FIXME("(%p, %p, %d): stub\n", hWnd
, hIMC
, dwFlags
);
424 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
428 /***********************************************************************
429 * ImmConfigureIMEA (IMM32.@)
431 BOOL WINAPI
ImmConfigureIMEA(
432 HKL hKL
, HWND hWnd
, DWORD dwMode
, LPVOID lpData
)
434 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
436 TRACE("(%p, %p, %d, %p):\n", hKL
, hWnd
, dwMode
, lpData
);
438 if (immHkl
->hIME
&& immHkl
->pImeConfigure
)
440 if (dwMode
!= IME_CONFIG_REGISTERWORD
|| !is_kbd_ime_unicode(immHkl
))
441 return immHkl
->pImeConfigure(hKL
,hWnd
,dwMode
,lpData
);
445 REGISTERWORDA
*rwa
= (REGISTERWORDA
*)lpData
;
448 rww
.lpReading
= strdupAtoW(rwa
->lpReading
);
449 rww
.lpWord
= strdupAtoW(rwa
->lpWord
);
450 rc
= immHkl
->pImeConfigure(hKL
,hWnd
,dwMode
,&rww
);
451 HeapFree(GetProcessHeap(),0,rww
.lpReading
);
452 HeapFree(GetProcessHeap(),0,rww
.lpWord
);
460 /***********************************************************************
461 * ImmConfigureIMEW (IMM32.@)
463 BOOL WINAPI
ImmConfigureIMEW(
464 HKL hKL
, HWND hWnd
, DWORD dwMode
, LPVOID lpData
)
466 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
468 TRACE("(%p, %p, %d, %p):\n", hKL
, hWnd
, dwMode
, lpData
);
470 if (immHkl
->hIME
&& immHkl
->pImeConfigure
)
472 if (dwMode
!= IME_CONFIG_REGISTERWORD
|| is_kbd_ime_unicode(immHkl
))
473 return immHkl
->pImeConfigure(hKL
,hWnd
,dwMode
,lpData
);
476 REGISTERWORDW
*rww
= (REGISTERWORDW
*)lpData
;
480 rwa
.lpReading
= strdupWtoA(rww
->lpReading
);
481 rwa
.lpWord
= strdupWtoA(rww
->lpWord
);
482 rc
= immHkl
->pImeConfigure(hKL
,hWnd
,dwMode
,&rwa
);
483 HeapFree(GetProcessHeap(),0,rwa
.lpReading
);
484 HeapFree(GetProcessHeap(),0,rwa
.lpWord
);
492 /***********************************************************************
493 * ImmCreateContext (IMM32.@)
495 HIMC WINAPI
ImmCreateContext(void)
497 InputContextData
*new_context
;
501 new_context
= HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY
,sizeof(InputContextData
));
504 new_context
->immKbd
= IMM_GetImmHkl(GetKeyboardLayout(0));
506 if (!new_context
->immKbd
->hIME
)
508 TRACE("IME dll could not be loaded\n");
509 HeapFree(GetProcessHeap(),0,new_context
);
513 /* the HIMCCs are never NULL */
514 new_context
->IMC
.hCompStr
= ImmCreateBlankCompStr();
515 new_context
->IMC
.hMsgBuf
= ImmCreateIMCC(0);
516 new_context
->IMC
.hCandInfo
= ImmCreateIMCC(sizeof(CANDIDATEINFO
));
517 ci
= ImmLockIMCC(new_context
->IMC
.hCandInfo
);
518 memset(ci
,0,sizeof(CANDIDATEINFO
));
519 ci
->dwSize
= sizeof(CANDIDATEINFO
);
520 ImmUnlockIMCC(new_context
->IMC
.hCandInfo
);
521 new_context
->IMC
.hGuideLine
= ImmCreateIMCC(sizeof(GUIDELINE
));
522 gl
= ImmLockIMCC(new_context
->IMC
.hGuideLine
);
523 memset(gl
,0,sizeof(GUIDELINE
));
524 gl
->dwSize
= sizeof(GUIDELINE
);
525 ImmUnlockIMCC(new_context
->IMC
.hGuideLine
);
527 /* Initialize the IME Private */
528 new_context
->IMC
.hPrivate
= ImmCreateIMCC(new_context
->immKbd
->imeInfo
.dwPrivateDataSize
);
530 if (!new_context
->immKbd
->pImeSelect(new_context
, TRUE
))
532 TRACE("Selection of IME failed\n");
533 IMM_DestroyContext(new_context
);
537 new_context
->immKbd
->uSelected
++;
538 TRACE("Created context 0x%x\n",(UINT
)new_context
);
540 return (HIMC
)new_context
;
543 static BOOL
IMM_DestroyContext(HIMC hIMC
)
545 InputContextData
*data
= (InputContextData
*)hIMC
;
547 TRACE("Destroying %p\n",hIMC
);
551 data
->immKbd
->uSelected
--;
552 data
->immKbd
->pImeSelect(hIMC
, FALSE
);
554 if (IMM_GetThreadData()->hwndDefault
== data
->imeWnd
)
555 IMM_GetThreadData()->hwndDefault
= NULL
;
556 DestroyWindow(data
->imeWnd
);
558 ImmDestroyIMCC(data
->IMC
.hCompStr
);
559 ImmDestroyIMCC(data
->IMC
.hCandInfo
);
560 ImmDestroyIMCC(data
->IMC
.hGuideLine
);
561 ImmDestroyIMCC(data
->IMC
.hPrivate
);
562 ImmDestroyIMCC(data
->IMC
.hMsgBuf
);
564 HeapFree(GetProcessHeap(),0,data
);
569 /***********************************************************************
570 * ImmDestroyContext (IMM32.@)
572 BOOL WINAPI
ImmDestroyContext(HIMC hIMC
)
574 if (hIMC
!= IMM_GetThreadData()->defaultContext
)
575 return IMM_DestroyContext(hIMC
);
580 /***********************************************************************
581 * ImmDisableIME (IMM32.@)
583 BOOL WINAPI
ImmDisableIME(DWORD idThread
)
585 FIXME("(%d): stub\n", idThread
);
589 /***********************************************************************
590 * ImmEnumRegisterWordA (IMM32.@)
592 UINT WINAPI
ImmEnumRegisterWordA(
593 HKL hKL
, REGISTERWORDENUMPROCA lpfnEnumProc
,
594 LPCSTR lpszReading
, DWORD dwStyle
,
595 LPCSTR lpszRegister
, LPVOID lpData
)
597 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
598 TRACE("(%p, %p, %s, %d, %s, %p):\n", hKL
, lpfnEnumProc
,
599 debugstr_a(lpszReading
), dwStyle
, debugstr_a(lpszRegister
), lpData
);
600 if (immHkl
->hIME
&& immHkl
->pImeEnumRegisterWord
)
602 if (!is_kbd_ime_unicode(immHkl
))
603 return immHkl
->pImeEnumRegisterWord((REGISTERWORDENUMPROCW
)lpfnEnumProc
,
604 (LPCWSTR
)lpszReading
, dwStyle
, (LPCWSTR
)lpszRegister
, lpData
);
607 FIXME("A procedure called with W ime back end\n");
608 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
616 /***********************************************************************
617 * ImmEnumRegisterWordW (IMM32.@)
619 UINT WINAPI
ImmEnumRegisterWordW(
620 HKL hKL
, REGISTERWORDENUMPROCW lpfnEnumProc
,
621 LPCWSTR lpszReading
, DWORD dwStyle
,
622 LPCWSTR lpszRegister
, LPVOID lpData
)
624 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
625 TRACE("(%p, %p, %s, %d, %s, %p):\n", hKL
, lpfnEnumProc
,
626 debugstr_w(lpszReading
), dwStyle
, debugstr_w(lpszRegister
), lpData
);
627 if (immHkl
->hIME
&& immHkl
->pImeEnumRegisterWord
)
629 if (is_kbd_ime_unicode(immHkl
))
630 return immHkl
->pImeEnumRegisterWord(lpfnEnumProc
, lpszReading
, dwStyle
,
631 lpszRegister
, lpData
);
634 FIXME("W procedure called with A ime back end\n");
635 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
643 /***********************************************************************
644 * ImmEscapeA (IMM32.@)
646 LRESULT WINAPI
ImmEscapeA(
648 UINT uEscape
, LPVOID lpData
)
650 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
651 TRACE("(%p, %p, %d, %p):\n", hKL
, hIMC
, uEscape
, lpData
);
653 if (immHkl
->hIME
&& immHkl
->pImeEscape
)
655 if (!is_kbd_ime_unicode(immHkl
))
656 return immHkl
->pImeEscape(hIMC
,uEscape
,lpData
);
659 FIXME("A procedure called with W ime back end\n");
660 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
668 /***********************************************************************
669 * ImmEscapeW (IMM32.@)
671 LRESULT WINAPI
ImmEscapeW(
673 UINT uEscape
, LPVOID lpData
)
675 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
676 TRACE("(%p, %p, %d, %p):\n", hKL
, hIMC
, uEscape
, lpData
);
678 if (immHkl
->hIME
&& immHkl
->pImeEscape
)
680 if (is_kbd_ime_unicode(immHkl
))
681 return immHkl
->pImeEscape(hIMC
,uEscape
,lpData
);
684 FIXME("W procedure called with A ime back end\n");
685 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
693 /***********************************************************************
694 * ImmGetCandidateListA (IMM32.@)
696 DWORD WINAPI
ImmGetCandidateListA(
697 HIMC hIMC
, DWORD deIndex
,
698 LPCANDIDATELIST lpCandList
, DWORD dwBufLen
)
700 FIXME("(%p, %d, %p, %d): stub\n",
704 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
708 /***********************************************************************
709 * ImmGetCandidateListCountA (IMM32.@)
711 DWORD WINAPI
ImmGetCandidateListCountA(
712 HIMC hIMC
, LPDWORD lpdwListCount
)
714 FIXME("(%p, %p): stub\n", hIMC
, lpdwListCount
);
715 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
719 /***********************************************************************
720 * ImmGetCandidateListCountW (IMM32.@)
722 DWORD WINAPI
ImmGetCandidateListCountW(
723 HIMC hIMC
, LPDWORD lpdwListCount
)
725 FIXME("(%p, %p): stub\n", hIMC
, lpdwListCount
);
726 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
730 /***********************************************************************
731 * ImmGetCandidateListW (IMM32.@)
733 DWORD WINAPI
ImmGetCandidateListW(
734 HIMC hIMC
, DWORD deIndex
,
735 LPCANDIDATELIST lpCandList
, DWORD dwBufLen
)
737 FIXME("(%p, %d, %p, %d): stub\n",
741 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
745 /***********************************************************************
746 * ImmGetCandidateWindow (IMM32.@)
748 BOOL WINAPI
ImmGetCandidateWindow(
749 HIMC hIMC
, DWORD dwBufLen
, LPCANDIDATEFORM lpCandidate
)
751 FIXME("(%p, %d, %p): stub\n", hIMC
, dwBufLen
, lpCandidate
);
752 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
756 /***********************************************************************
757 * ImmGetCompositionFontA (IMM32.@)
759 BOOL WINAPI
ImmGetCompositionFontA(HIMC hIMC
, LPLOGFONTA lplf
)
764 TRACE("(%p, %p):\n", hIMC
, lplf
);
766 rc
= ImmGetCompositionFontW(hIMC
,&lfW
);
769 memcpy(lplf
,&lfW
,sizeof(LOGFONTA
));
770 WideCharToMultiByte(CP_ACP
, 0, lfW
.lfFaceName
, -1, lplf
->lfFaceName
,
771 LF_FACESIZE
, NULL
, NULL
);
776 /***********************************************************************
777 * ImmGetCompositionFontW (IMM32.@)
779 BOOL WINAPI
ImmGetCompositionFontW(HIMC hIMC
, LPLOGFONTW lplf
)
781 InputContextData
*data
= (InputContextData
*)hIMC
;
783 TRACE("(%p, %p):\n", hIMC
, lplf
);
788 *lplf
= data
->IMC
.lfFont
.W
;
793 /***********************************************************************
794 * ImmGetCompositionStringA (IMM32.@)
796 LONG WINAPI
ImmGetCompositionStringA(
797 HIMC hIMC
, DWORD dwIndex
, LPVOID lpBuf
, DWORD dwBufLen
)
801 InputContextData
*data
= (InputContextData
*)hIMC
;
802 LPCOMPOSITIONSTRING compstr
;
805 TRACE("(%p, 0x%x, %p, %d)\n", hIMC
, dwIndex
, lpBuf
, dwBufLen
);
810 if (!data
->IMC
.hCompStr
)
813 compdata
= ImmLockIMCC(data
->IMC
.hCompStr
);
814 compstr
= (LPCOMPOSITIONSTRING
)compdata
;
816 if (dwIndex
== GCS_RESULTSTR
&& compstr
->dwResultStrLen
> 0 &&
817 compstr
->dwResultStrOffset
> 0)
819 LPWSTR ResultStr
= (LPWSTR
)(compdata
+ compstr
->dwResultStrOffset
);
821 TRACE("GSC_RESULTSTR %p %i\n",ResultStr
,
822 compstr
->dwResultStrLen
);
824 buf
= HeapAlloc( GetProcessHeap(), 0, compstr
->dwResultStrLen
* 3 );
825 rc
= WideCharToMultiByte(CP_ACP
, 0, ResultStr
,
826 compstr
->dwResultStrLen
, buf
,
827 compstr
->dwResultStrLen
* 3, NULL
, NULL
);
829 memcpy(lpBuf
,buf
,rc
);
831 HeapFree( GetProcessHeap(), 0, buf
);
833 else if (dwIndex
== GCS_COMPSTR
&& compstr
->dwCompStrLen
> 0 &&
834 compstr
->dwCompStrOffset
> 0)
836 LPWSTR CompString
= (LPWSTR
)(compdata
+ compstr
->dwCompStrOffset
);
838 TRACE("GSC_COMPSTR %p %i\n", CompString
, compstr
->dwCompStrLen
);
840 buf
= HeapAlloc( GetProcessHeap(), 0, compstr
->dwCompStrLen
* 3 );
841 rc
= WideCharToMultiByte(CP_ACP
, 0, CompString
,
842 compstr
->dwCompStrLen
, buf
,
843 compstr
->dwCompStrLen
* 3, NULL
, NULL
);
845 memcpy(lpBuf
,buf
,rc
);
846 HeapFree( GetProcessHeap(), 0, buf
);
848 else if (dwIndex
== GCS_COMPATTR
&& compstr
->dwCompAttrLen
> 0 &&
849 compstr
->dwCompAttrOffset
> 0)
851 LPWSTR Compattr
= (LPWSTR
)(compdata
+ compstr
->dwCompAttrOffset
);
852 TRACE("GSC_COMPATTR %p %i\n", Compattr
, compstr
->dwCompAttrLen
);
854 rc
= compstr
->dwCompAttrLen
;
856 memcpy(lpBuf
,Compattr
,rc
);
858 else if (dwIndex
== GCS_COMPCLAUSE
&& compstr
->dwCompClauseLen
> 0 &&
859 compstr
->dwCompClauseOffset
> 0)
861 LPWSTR Compclause
= (LPWSTR
)(compdata
+ compstr
->dwCompClauseOffset
);
862 TRACE("GSC_COMPCLAUSE %p %i\n", Compclause
, compstr
->dwCompClauseLen
);
864 rc
= compstr
->dwCompClauseLen
;
865 if (dwBufLen
>= compstr
->dwCompClauseLen
)
866 memcpy(lpBuf
,Compclause
,rc
);
868 else if (dwIndex
== GCS_RESULTCLAUSE
&& compstr
->dwResultClauseLen
> 0 &&
869 compstr
->dwResultClauseOffset
> 0)
871 LPWSTR Resultclause
= (LPWSTR
)(compdata
+ compstr
->dwResultClauseOffset
);
872 TRACE("GSC_RESULTCLAUSE %p %i\n", Resultclause
, compstr
->dwResultClauseLen
);
874 rc
= compstr
->dwResultClauseLen
;
875 if (dwBufLen
>= compstr
->dwResultClauseLen
)
876 memcpy(lpBuf
,Resultclause
,rc
);
878 else if (dwIndex
== GCS_CURSORPOS
)
880 TRACE("GSC_CURSORPOS\n");
881 rc
= compstr
->dwCursorPos
;
883 else if (dwIndex
== GCS_DELTASTART
)
885 TRACE("GCS_DELTASTART\n");
886 rc
= compstr
->dwDeltaStart
;
890 FIXME("Unhandled index 0x%x\n",dwIndex
);
893 ImmUnlockIMCC(data
->IMC
.hCompStr
);
898 /***********************************************************************
899 * ImmGetCompositionStringW (IMM32.@)
901 LONG WINAPI
ImmGetCompositionStringW(
902 HIMC hIMC
, DWORD dwIndex
,
903 LPVOID lpBuf
, DWORD dwBufLen
)
906 InputContextData
*data
= (InputContextData
*)hIMC
;
907 LPCOMPOSITIONSTRING compstr
;
910 TRACE("(%p, 0x%x, %p, %d)\n", hIMC
, dwIndex
, lpBuf
, dwBufLen
);
915 if (!data
->IMC
.hCompStr
)
918 compdata
= ImmLockIMCC(data
->IMC
.hCompStr
);
919 compstr
= (LPCOMPOSITIONSTRING
)compdata
;
921 if (dwIndex
== GCS_RESULTSTR
&& compstr
->dwResultStrLen
> 0 &&
922 compstr
->dwResultStrOffset
> 0)
924 LPWSTR ResultStr
= (LPWSTR
)(compdata
+ compstr
->dwResultStrOffset
);
925 rc
= compstr
->dwResultStrLen
* sizeof(WCHAR
);
928 memcpy(lpBuf
,ResultStr
,rc
);
930 else if (dwIndex
== GCS_RESULTREADSTR
&& compstr
->dwResultReadStrLen
> 0 &&
931 compstr
->dwResultReadStrOffset
> 0)
933 LPWSTR ResultReadString
= (LPWSTR
)(compdata
+ compstr
->dwResultReadStrOffset
);
935 rc
= compstr
->dwResultReadStrLen
* sizeof(WCHAR
);
937 memcpy(lpBuf
,ResultReadString
,rc
);
939 else if (dwIndex
== GCS_COMPSTR
&& compstr
->dwCompStrLen
> 0 &&
940 compstr
->dwCompStrOffset
> 0)
942 LPWSTR CompString
= (LPWSTR
)(compdata
+ compstr
->dwCompStrOffset
);
943 rc
= compstr
->dwCompStrLen
* sizeof(WCHAR
);
945 memcpy(lpBuf
,CompString
,rc
);
947 else if (dwIndex
== GCS_COMPATTR
&& compstr
->dwCompAttrLen
> 0 &&
948 compstr
->dwCompAttrOffset
> 0)
951 LPWSTR Compattr
= (LPWSTR
)(compdata
+ compstr
->dwCompAttrOffset
);
953 rc
= compstr
->dwCompAttrLen
;
955 memcpy(lpBuf
,Compattr
,rc
);
957 else if (dwIndex
== GCS_COMPCLAUSE
&& compstr
->dwCompClauseLen
> 0 &&
958 compstr
->dwCompClauseOffset
> 0)
960 LPWSTR Compclause
= (LPWSTR
)(compdata
+ compstr
->dwCompClauseOffset
);
962 rc
= compstr
->dwCompClauseLen
;
963 if (dwBufLen
>= compstr
->dwCompClauseLen
)
964 memcpy(lpBuf
,Compclause
,rc
);
966 else if (dwIndex
== GCS_COMPREADSTR
&& compstr
->dwCompReadStrLen
> 0 &&
967 compstr
->dwCompReadStrOffset
> 0)
969 LPWSTR CompReadString
= (LPWSTR
)(compdata
+ compstr
->dwCompReadStrOffset
);
971 rc
= compstr
->dwCompReadStrLen
* sizeof(WCHAR
);
974 memcpy(lpBuf
,CompReadString
,rc
);
976 else if (dwIndex
== GCS_CURSORPOS
)
978 TRACE("GSC_CURSORPOS\n");
979 rc
= compstr
->dwCursorPos
;
981 else if (dwIndex
== GCS_DELTASTART
)
983 TRACE("GCS_DELTASTART\n");
984 rc
= compstr
->dwDeltaStart
;
988 FIXME("Unhandled index 0x%x\n",dwIndex
);
991 ImmUnlockIMCC(data
->IMC
.hCompStr
);
996 /***********************************************************************
997 * ImmGetCompositionWindow (IMM32.@)
999 BOOL WINAPI
ImmGetCompositionWindow(HIMC hIMC
, LPCOMPOSITIONFORM lpCompForm
)
1001 InputContextData
*data
= (InputContextData
*)hIMC
;
1003 TRACE("(%p, %p)\n", hIMC
, lpCompForm
);
1008 *lpCompForm
= data
->IMC
.cfCompForm
;
1012 /***********************************************************************
1013 * ImmGetContext (IMM32.@)
1016 HIMC WINAPI
ImmGetContext(HWND hWnd
)
1020 TRACE("%p\n", hWnd
);
1021 if (!IMM_GetThreadData()->defaultContext
)
1022 IMM_GetThreadData()->defaultContext
= ImmCreateContext();
1024 rc
= (HIMC
)GetPropW(hWnd
,szwWineIMCProperty
);
1027 else if (rc
== NULL
)
1028 rc
= IMM_GetThreadData()->defaultContext
;
1032 InputContextData
*data
= (InputContextData
*)rc
;
1033 data
->IMC
.hWnd
= hWnd
;
1035 TRACE("returning %p\n", rc
);
1040 /***********************************************************************
1041 * ImmGetConversionListA (IMM32.@)
1043 DWORD WINAPI
ImmGetConversionListA(
1045 LPCSTR pSrc
, LPCANDIDATELIST lpDst
,
1046 DWORD dwBufLen
, UINT uFlag
)
1048 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1049 TRACE("(%p, %p, %s, %p, %d, %d):\n", hKL
, hIMC
, debugstr_a(pSrc
), lpDst
,
1051 if (immHkl
->hIME
&& immHkl
->pImeConversionList
)
1053 if (!is_kbd_ime_unicode(immHkl
))
1054 return immHkl
->pImeConversionList(hIMC
,(LPCWSTR
)pSrc
,lpDst
,dwBufLen
,uFlag
);
1057 FIXME("A procedure called with W ime back end\n");
1058 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1066 /***********************************************************************
1067 * ImmGetConversionListW (IMM32.@)
1069 DWORD WINAPI
ImmGetConversionListW(
1071 LPCWSTR pSrc
, LPCANDIDATELIST lpDst
,
1072 DWORD dwBufLen
, UINT uFlag
)
1074 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1075 TRACE("(%p, %p, %s, %p, %d, %d):\n", hKL
, hIMC
, debugstr_w(pSrc
), lpDst
,
1077 if (immHkl
->hIME
&& immHkl
->pImeConversionList
)
1079 if (is_kbd_ime_unicode(immHkl
))
1080 return immHkl
->pImeConversionList(hIMC
,pSrc
,lpDst
,dwBufLen
,uFlag
);
1083 FIXME("W procedure called with A ime back end\n");
1084 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1092 /***********************************************************************
1093 * ImmGetConversionStatus (IMM32.@)
1095 BOOL WINAPI
ImmGetConversionStatus(
1096 HIMC hIMC
, LPDWORD lpfdwConversion
, LPDWORD lpfdwSentence
)
1098 InputContextData
*data
= (InputContextData
*)hIMC
;
1100 TRACE("%p %p %p\n", hIMC
, lpfdwConversion
, lpfdwSentence
);
1105 if (lpfdwConversion
)
1106 *lpfdwConversion
= data
->IMC
.fdwConversion
;
1108 *lpfdwSentence
= data
->IMC
.fdwSentence
;
1113 /***********************************************************************
1114 * ImmGetDefaultIMEWnd (IMM32.@)
1116 HWND WINAPI
ImmGetDefaultIMEWnd(HWND hWnd
)
1118 TRACE("Default is %x\n",(unsigned)IMM_GetThreadData()->hwndDefault
);
1119 return IMM_GetThreadData()->hwndDefault
;
1122 /***********************************************************************
1123 * ImmGetDescriptionA (IMM32.@)
1125 UINT WINAPI
ImmGetDescriptionA(
1126 HKL hKL
, LPSTR lpszDescription
, UINT uBufLen
)
1131 TRACE("%p %p %d\n", hKL
, lpszDescription
, uBufLen
);
1133 /* find out how many characters in the unicode buffer */
1134 len
= ImmGetDescriptionW( hKL
, NULL
, 0 );
1136 /* allocate a buffer of that size */
1137 buf
= HeapAlloc( GetProcessHeap(), 0, (len
+ 1) * sizeof (WCHAR
) );
1141 /* fetch the unicode buffer */
1142 len
= ImmGetDescriptionW( hKL
, buf
, len
+ 1 );
1144 /* convert it back to ASCII */
1145 len
= WideCharToMultiByte( CP_ACP
, 0, buf
, len
+ 1,
1146 lpszDescription
, uBufLen
, NULL
, NULL
);
1148 HeapFree( GetProcessHeap(), 0, buf
);
1153 /***********************************************************************
1154 * ImmGetDescriptionW (IMM32.@)
1156 UINT WINAPI
ImmGetDescriptionW(HKL hKL
, LPWSTR lpszDescription
, UINT uBufLen
)
1158 static const WCHAR name
[] = { 'W','i','n','e',' ','X','I','M',0 };
1160 FIXME("(%p, %p, %d): semi stub\n", hKL
, lpszDescription
, uBufLen
);
1162 if (!uBufLen
) return lstrlenW( name
);
1163 lstrcpynW( lpszDescription
, name
, uBufLen
);
1164 return lstrlenW( lpszDescription
);
1167 /***********************************************************************
1168 * ImmGetGuideLineA (IMM32.@)
1170 DWORD WINAPI
ImmGetGuideLineA(
1171 HIMC hIMC
, DWORD dwIndex
, LPSTR lpBuf
, DWORD dwBufLen
)
1173 FIXME("(%p, %d, %s, %d): stub\n",
1174 hIMC
, dwIndex
, debugstr_a(lpBuf
), dwBufLen
1176 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1180 /***********************************************************************
1181 * ImmGetGuideLineW (IMM32.@)
1183 DWORD WINAPI
ImmGetGuideLineW(HIMC hIMC
, DWORD dwIndex
, LPWSTR lpBuf
, DWORD dwBufLen
)
1185 FIXME("(%p, %d, %s, %d): stub\n",
1186 hIMC
, dwIndex
, debugstr_w(lpBuf
), dwBufLen
1188 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1192 /***********************************************************************
1193 * ImmGetIMEFileNameA (IMM32.@)
1195 UINT WINAPI
ImmGetIMEFileNameA( HKL hKL
, LPSTR lpszFileName
, UINT uBufLen
)
1198 UINT wBufLen
= uBufLen
;
1201 if (uBufLen
&& lpszFileName
)
1202 bufW
= HeapAlloc(GetProcessHeap(),0,uBufLen
* sizeof(WCHAR
));
1203 else /* We need this to get the number of byte required */
1205 bufW
= HeapAlloc(GetProcessHeap(),0,MAX_PATH
* sizeof(WCHAR
));
1209 rc
= ImmGetIMEFileNameW(hKL
,bufW
,wBufLen
);
1213 if (uBufLen
&& lpszFileName
)
1214 rc
= WideCharToMultiByte(CP_ACP
, 0, bufW
, -1, lpszFileName
,
1215 uBufLen
, NULL
, NULL
);
1216 else /* get the length */
1217 rc
= WideCharToMultiByte(CP_ACP
, 0, bufW
, -1, NULL
, 0, NULL
,
1221 HeapFree(GetProcessHeap(),0,bufW
);
1225 /***********************************************************************
1226 * ImmGetIMEFileNameW (IMM32.@)
1228 UINT WINAPI
ImmGetIMEFileNameW(HKL hKL
, LPWSTR lpszFileName
, UINT uBufLen
)
1230 static const WCHAR szImeFileW
[] = {'I','m','e',' ','F','i','l','e',0};
1231 static const WCHAR fmt
[] = {'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','C','o','n','t','r','o','l','\\','K','e','y','b','o','a','r','d',' ','L','a','y','o','u','t','s','\\','%','0','8','x',0};
1236 WCHAR regKey
[sizeof(fmt
)/sizeof(WCHAR
)+8];
1238 wsprintfW( regKey
, fmt
, (unsigned)hKL
);
1239 rc
= RegOpenKeyW( HKEY_LOCAL_MACHINE
, regKey
, &hkey
);
1240 if (rc
!= ERROR_SUCCESS
)
1247 rc
= RegGetValueW(hkey
, NULL
, szImeFileW
, RRF_RT_REG_SZ
, NULL
, NULL
, &length
);
1249 if (rc
!= ERROR_SUCCESS
)
1255 if (length
> uBufLen
* sizeof(WCHAR
) || !lpszFileName
)
1260 SetLastError(ERROR_INSUFFICIENT_BUFFER
);
1264 return length
/ sizeof(WCHAR
);
1267 RegGetValueW(hkey
, NULL
, szImeFileW
, RRF_RT_REG_SZ
, NULL
, lpszFileName
, &length
);
1271 return length
/ sizeof(WCHAR
);
1274 /***********************************************************************
1275 * ImmGetOpenStatus (IMM32.@)
1277 BOOL WINAPI
ImmGetOpenStatus(HIMC hIMC
)
1279 InputContextData
*data
= (InputContextData
*)hIMC
;
1283 FIXME("(%p): semi-stub\n", hIMC
);
1285 return data
->IMC
.fOpen
;
1288 /***********************************************************************
1289 * ImmGetProperty (IMM32.@)
1291 DWORD WINAPI
ImmGetProperty(HKL hKL
, DWORD fdwIndex
)
1296 TRACE("(%p, %d)\n", hKL
, fdwIndex
);
1297 kbd
= IMM_GetImmHkl(hKL
);
1299 if (kbd
&& kbd
->hIME
)
1303 case IGP_PROPERTY
: rc
= kbd
->imeInfo
.fdwProperty
; break;
1304 case IGP_CONVERSION
: rc
= kbd
->imeInfo
.fdwConversionCaps
; break;
1305 case IGP_SENTENCE
: rc
= kbd
->imeInfo
.fdwSentenceCaps
; break;
1306 case IGP_SETCOMPSTR
: rc
= kbd
->imeInfo
.fdwSCSCaps
; break;
1307 case IGP_SELECT
: rc
= kbd
->imeInfo
.fdwSelectCaps
; break;
1308 case IGP_GETIMEVERSION
: rc
= IMEVER_0400
; break;
1309 case IGP_UI
: rc
= 0; break;
1316 /***********************************************************************
1317 * ImmGetRegisterWordStyleA (IMM32.@)
1319 UINT WINAPI
ImmGetRegisterWordStyleA(
1320 HKL hKL
, UINT nItem
, LPSTYLEBUFA lpStyleBuf
)
1322 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1323 TRACE("(%p, %d, %p):\n", hKL
, nItem
, lpStyleBuf
);
1324 if (immHkl
->hIME
&& immHkl
->pImeGetRegisterWordStyle
)
1326 if (!is_kbd_ime_unicode(immHkl
))
1327 return immHkl
->pImeGetRegisterWordStyle(nItem
,(LPSTYLEBUFW
)lpStyleBuf
);
1333 rc
= immHkl
->pImeGetRegisterWordStyle(nItem
,&sbw
);
1334 WideCharToMultiByte(CP_ACP
, 0, sbw
.szDescription
, -1,
1335 lpStyleBuf
->szDescription
, 32, NULL
, NULL
);
1336 lpStyleBuf
->dwStyle
= sbw
.dwStyle
;
1344 /***********************************************************************
1345 * ImmGetRegisterWordStyleW (IMM32.@)
1347 UINT WINAPI
ImmGetRegisterWordStyleW(
1348 HKL hKL
, UINT nItem
, LPSTYLEBUFW lpStyleBuf
)
1350 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1351 TRACE("(%p, %d, %p):\n", hKL
, nItem
, lpStyleBuf
);
1352 if (immHkl
->hIME
&& immHkl
->pImeGetRegisterWordStyle
)
1354 if (is_kbd_ime_unicode(immHkl
))
1355 return immHkl
->pImeGetRegisterWordStyle(nItem
,lpStyleBuf
);
1361 rc
= immHkl
->pImeGetRegisterWordStyle(nItem
,(LPSTYLEBUFW
)&sba
);
1362 MultiByteToWideChar(CP_ACP
, 0, sba
.szDescription
, -1,
1363 lpStyleBuf
->szDescription
, 32);
1364 lpStyleBuf
->dwStyle
= sba
.dwStyle
;
1372 /***********************************************************************
1373 * ImmGetStatusWindowPos (IMM32.@)
1375 BOOL WINAPI
ImmGetStatusWindowPos(HIMC hIMC
, LPPOINT lpptPos
)
1377 FIXME("(%p, %p): stub\n", hIMC
, lpptPos
);
1378 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1382 /***********************************************************************
1383 * ImmGetVirtualKey (IMM32.@)
1385 UINT WINAPI
ImmGetVirtualKey(HWND hWnd
)
1387 OSVERSIONINFOA version
;
1388 FIXME("(%p): stub\n", hWnd
);
1389 GetVersionExA( &version
);
1390 switch(version
.dwPlatformId
)
1392 case VER_PLATFORM_WIN32_WINDOWS
:
1393 return VK_PROCESSKEY
;
1394 case VER_PLATFORM_WIN32_NT
:
1397 FIXME("%d not supported\n",version
.dwPlatformId
);
1398 return VK_PROCESSKEY
;
1402 /***********************************************************************
1403 * ImmInstallIMEA (IMM32.@)
1405 HKL WINAPI
ImmInstallIMEA(
1406 LPCSTR lpszIMEFileName
, LPCSTR lpszLayoutText
)
1408 FIXME("(%s, %s): stub\n",
1409 debugstr_a(lpszIMEFileName
), debugstr_a(lpszLayoutText
)
1411 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1415 /***********************************************************************
1416 * ImmInstallIMEW (IMM32.@)
1418 HKL WINAPI
ImmInstallIMEW(
1419 LPCWSTR lpszIMEFileName
, LPCWSTR lpszLayoutText
)
1421 FIXME("(%s, %s): stub\n",
1422 debugstr_w(lpszIMEFileName
), debugstr_w(lpszLayoutText
)
1424 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1428 /***********************************************************************
1429 * ImmIsIME (IMM32.@)
1431 BOOL WINAPI
ImmIsIME(HKL hKL
)
1434 TRACE("(%p):\n", hKL
);
1435 ptr
= IMM_GetImmHkl(hKL
);
1436 return (ptr
&& ptr
->hIME
);
1439 /***********************************************************************
1440 * ImmIsUIMessageA (IMM32.@)
1442 BOOL WINAPI
ImmIsUIMessageA(
1443 HWND hWndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
1447 TRACE("(%p, %x, %ld, %ld)\n", hWndIME
, msg
, wParam
, lParam
);
1448 if ((msg
>= WM_IME_STARTCOMPOSITION
&& msg
<= WM_IME_KEYLAST
) ||
1449 (msg
>= WM_IME_SETCONTEXT
&& msg
<= WM_IME_KEYUP
) ||
1450 (msg
== WM_MSIME_SERVICE
) ||
1451 (msg
== WM_MSIME_RECONVERTOPTIONS
) ||
1452 (msg
== WM_MSIME_MOUSE
) ||
1453 (msg
== WM_MSIME_RECONVERTREQUEST
) ||
1454 (msg
== WM_MSIME_RECONVERT
) ||
1455 (msg
== WM_MSIME_QUERYPOSITION
) ||
1456 (msg
== WM_MSIME_DOCUMENTFEED
))
1459 if (!IMM_GetThreadData()->hwndDefault
)
1460 ImmGetDefaultIMEWnd(NULL
);
1462 if (hWndIME
== NULL
)
1463 PostMessageA(IMM_GetThreadData()->hwndDefault
, msg
, wParam
, lParam
);
1470 /***********************************************************************
1471 * ImmIsUIMessageW (IMM32.@)
1473 BOOL WINAPI
ImmIsUIMessageW(
1474 HWND hWndIME
, UINT msg
, WPARAM wParam
, LPARAM lParam
)
1477 TRACE("(%p, %d, %ld, %ld):\n", hWndIME
, msg
, wParam
, lParam
);
1478 if ((msg
>= WM_IME_STARTCOMPOSITION
&& msg
<= WM_IME_KEYLAST
) ||
1479 (msg
>= WM_IME_SETCONTEXT
&& msg
<= WM_IME_KEYUP
) ||
1480 (msg
== WM_MSIME_SERVICE
) ||
1481 (msg
== WM_MSIME_RECONVERTOPTIONS
) ||
1482 (msg
== WM_MSIME_MOUSE
) ||
1483 (msg
== WM_MSIME_RECONVERTREQUEST
) ||
1484 (msg
== WM_MSIME_RECONVERT
) ||
1485 (msg
== WM_MSIME_QUERYPOSITION
) ||
1486 (msg
== WM_MSIME_DOCUMENTFEED
))
1491 /***********************************************************************
1492 * ImmNotifyIME (IMM32.@)
1494 BOOL WINAPI
ImmNotifyIME(
1495 HIMC hIMC
, DWORD dwAction
, DWORD dwIndex
, DWORD dwValue
)
1497 InputContextData
*data
= (InputContextData
*)hIMC
;
1499 TRACE("(%p, %d, %d, %d)\n",
1500 hIMC
, dwAction
, dwIndex
, dwValue
);
1502 if (!data
|| ! data
->immKbd
->pNotifyIME
)
1505 return data
->immKbd
->pNotifyIME(hIMC
,dwAction
,dwIndex
,dwValue
);
1508 /***********************************************************************
1509 * ImmRegisterWordA (IMM32.@)
1511 BOOL WINAPI
ImmRegisterWordA(
1512 HKL hKL
, LPCSTR lpszReading
, DWORD dwStyle
, LPCSTR lpszRegister
)
1514 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1515 TRACE("(%p, %s, %d, %s):\n", hKL
, debugstr_a(lpszReading
), dwStyle
,
1516 debugstr_a(lpszRegister
));
1517 if (immHkl
->hIME
&& immHkl
->pImeRegisterWord
)
1519 if (!is_kbd_ime_unicode(immHkl
))
1520 return immHkl
->pImeRegisterWord((LPCWSTR
)lpszReading
,dwStyle
,
1521 (LPCWSTR
)lpszRegister
);
1524 LPWSTR lpszwReading
= strdupAtoW(lpszReading
);
1525 LPWSTR lpszwRegister
= strdupAtoW(lpszRegister
);
1528 rc
= immHkl
->pImeRegisterWord(lpszwReading
,dwStyle
,lpszwRegister
);
1529 HeapFree(GetProcessHeap(),0,lpszwReading
);
1530 HeapFree(GetProcessHeap(),0,lpszwRegister
);
1538 /***********************************************************************
1539 * ImmRegisterWordW (IMM32.@)
1541 BOOL WINAPI
ImmRegisterWordW(
1542 HKL hKL
, LPCWSTR lpszReading
, DWORD dwStyle
, LPCWSTR lpszRegister
)
1544 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1545 TRACE("(%p, %s, %d, %s):\n", hKL
, debugstr_w(lpszReading
), dwStyle
,
1546 debugstr_w(lpszRegister
));
1547 if (immHkl
->hIME
&& immHkl
->pImeRegisterWord
)
1549 if (is_kbd_ime_unicode(immHkl
))
1550 return immHkl
->pImeRegisterWord(lpszReading
,dwStyle
,lpszRegister
);
1553 LPSTR lpszaReading
= strdupWtoA(lpszReading
);
1554 LPSTR lpszaRegister
= strdupWtoA(lpszRegister
);
1557 rc
= immHkl
->pImeRegisterWord((LPCWSTR
)lpszaReading
,dwStyle
,
1558 (LPCWSTR
)lpszaRegister
);
1559 HeapFree(GetProcessHeap(),0,lpszaReading
);
1560 HeapFree(GetProcessHeap(),0,lpszaRegister
);
1568 /***********************************************************************
1569 * ImmReleaseContext (IMM32.@)
1571 BOOL WINAPI
ImmReleaseContext(HWND hWnd
, HIMC hIMC
)
1573 static int shown
= 0;
1576 FIXME("(%p, %p): stub\n", hWnd
, hIMC
);
1582 /***********************************************************************
1583 * ImmRequestMessageA(IMM32.@)
1585 LRESULT WINAPI
ImmRequestMessageA(HIMC hIMC
, WPARAM wParam
, LPARAM lParam
)
1587 FIXME("(%p %ld %ld): stub\n", hIMC
, wParam
, wParam
);
1588 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1592 /***********************************************************************
1593 * ImmRequestMessageW(IMM32.@)
1595 LRESULT WINAPI
ImmRequestMessageW(HIMC hIMC
, WPARAM wParam
, LPARAM lParam
)
1597 FIXME("(%p %ld %ld): stub\n", hIMC
, wParam
, wParam
);
1598 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1602 /***********************************************************************
1603 * ImmSetCandidateWindow (IMM32.@)
1605 BOOL WINAPI
ImmSetCandidateWindow(
1606 HIMC hIMC
, LPCANDIDATEFORM lpCandidate
)
1608 FIXME("(%p, %p): stub\n", hIMC
, lpCandidate
);
1609 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1613 /***********************************************************************
1614 * ImmSetCompositionFontA (IMM32.@)
1616 BOOL WINAPI
ImmSetCompositionFontA(HIMC hIMC
, LPLOGFONTA lplf
)
1618 InputContextData
*data
= (InputContextData
*)hIMC
;
1619 TRACE("(%p, %p)\n", hIMC
, lplf
);
1624 memcpy(&data
->IMC
.lfFont
.W
,lplf
,sizeof(LOGFONTA
));
1625 MultiByteToWideChar(CP_ACP
, 0, lplf
->lfFaceName
, -1, data
->IMC
.lfFont
.W
.lfFaceName
,
1627 ImmInternalSendIMENotify(data
, IMN_SETCOMPOSITIONFONT
, 0);
1632 /***********************************************************************
1633 * ImmSetCompositionFontW (IMM32.@)
1635 BOOL WINAPI
ImmSetCompositionFontW(HIMC hIMC
, LPLOGFONTW lplf
)
1637 InputContextData
*data
= (InputContextData
*)hIMC
;
1638 TRACE("(%p, %p)\n", hIMC
, lplf
);
1643 data
->IMC
.lfFont
.W
= *lplf
;
1644 ImmInternalSendIMENotify(data
, IMN_SETCOMPOSITIONFONT
, 0);
1649 /***********************************************************************
1650 * ImmSetCompositionStringA (IMM32.@)
1652 BOOL WINAPI
ImmSetCompositionStringA(
1653 HIMC hIMC
, DWORD dwIndex
,
1654 LPCVOID lpComp
, DWORD dwCompLen
,
1655 LPCVOID lpRead
, DWORD dwReadLen
)
1659 WCHAR
*CompBuffer
= NULL
;
1660 WCHAR
*ReadBuffer
= NULL
;
1662 InputContextData
*data
= (InputContextData
*)hIMC
;
1664 TRACE("(%p, %d, %p, %d, %p, %d):\n",
1665 hIMC
, dwIndex
, lpComp
, dwCompLen
, lpRead
, dwReadLen
);
1670 if (!is_himc_ime_unicode(data
))
1671 return data
->immKbd
->pImeSetCompositionString(hIMC
, dwIndex
, lpComp
,
1672 dwCompLen
, lpRead
, dwReadLen
);
1674 comp_len
= MultiByteToWideChar(CP_ACP
, 0, lpComp
, dwCompLen
, NULL
, 0);
1677 CompBuffer
= HeapAlloc(GetProcessHeap(),0,comp_len
* sizeof(WCHAR
));
1678 MultiByteToWideChar(CP_ACP
, 0, lpComp
, dwCompLen
, CompBuffer
, comp_len
);
1681 read_len
= MultiByteToWideChar(CP_ACP
, 0, lpRead
, dwReadLen
, NULL
, 0);
1684 ReadBuffer
= HeapAlloc(GetProcessHeap(),0,read_len
* sizeof(WCHAR
));
1685 MultiByteToWideChar(CP_ACP
, 0, lpRead
, dwReadLen
, ReadBuffer
, read_len
);
1688 rc
= ImmSetCompositionStringW(hIMC
, dwIndex
, CompBuffer
, comp_len
,
1689 ReadBuffer
, read_len
);
1691 HeapFree(GetProcessHeap(), 0, CompBuffer
);
1692 HeapFree(GetProcessHeap(), 0, ReadBuffer
);
1697 /***********************************************************************
1698 * ImmSetCompositionStringW (IMM32.@)
1700 BOOL WINAPI
ImmSetCompositionStringW(
1701 HIMC hIMC
, DWORD dwIndex
,
1702 LPCVOID lpComp
, DWORD dwCompLen
,
1703 LPCVOID lpRead
, DWORD dwReadLen
)
1707 CHAR
*CompBuffer
= NULL
;
1708 CHAR
*ReadBuffer
= NULL
;
1710 InputContextData
*data
= (InputContextData
*)hIMC
;
1712 TRACE("(%p, %d, %p, %d, %p, %d):\n",
1713 hIMC
, dwIndex
, lpComp
, dwCompLen
, lpRead
, dwReadLen
);
1718 if (is_himc_ime_unicode(data
))
1719 return data
->immKbd
->pImeSetCompositionString(hIMC
, dwIndex
, lpComp
,
1720 dwCompLen
, lpRead
, dwReadLen
);
1722 comp_len
= WideCharToMultiByte(CP_ACP
, 0, lpComp
, dwCompLen
, NULL
, 0, NULL
,
1726 CompBuffer
= HeapAlloc(GetProcessHeap(),0,comp_len
);
1727 WideCharToMultiByte(CP_ACP
, 0, lpComp
, dwCompLen
, CompBuffer
, comp_len
,
1731 read_len
= WideCharToMultiByte(CP_ACP
, 0, lpRead
, dwReadLen
, NULL
, 0, NULL
,
1735 ReadBuffer
= HeapAlloc(GetProcessHeap(),0,read_len
);
1736 WideCharToMultiByte(CP_ACP
, 0, lpRead
, dwReadLen
, ReadBuffer
, read_len
,
1740 rc
= ImmSetCompositionStringA(hIMC
, dwIndex
, CompBuffer
, comp_len
,
1741 ReadBuffer
, read_len
);
1743 HeapFree(GetProcessHeap(), 0, CompBuffer
);
1744 HeapFree(GetProcessHeap(), 0, ReadBuffer
);
1749 /***********************************************************************
1750 * ImmSetCompositionWindow (IMM32.@)
1752 BOOL WINAPI
ImmSetCompositionWindow(
1753 HIMC hIMC
, LPCOMPOSITIONFORM lpCompForm
)
1755 BOOL reshow
= FALSE
;
1756 InputContextData
*data
= (InputContextData
*)hIMC
;
1758 TRACE("(%p, %p)\n", hIMC
, lpCompForm
);
1759 TRACE("\t%x, (%i,%i), (%i,%i - %i,%i)\n",lpCompForm
->dwStyle
,
1760 lpCompForm
->ptCurrentPos
.x
, lpCompForm
->ptCurrentPos
.y
, lpCompForm
->rcArea
.top
,
1761 lpCompForm
->rcArea
.left
, lpCompForm
->rcArea
.bottom
, lpCompForm
->rcArea
.right
);
1766 data
->IMC
.cfCompForm
= *lpCompForm
;
1768 if (IsWindowVisible(IMM_GetThreadData()->hwndDefault
))
1771 ShowWindow(IMM_GetThreadData()->hwndDefault
,SW_HIDE
);
1774 /* FIXME: this is a partial stub */
1777 ShowWindow(IMM_GetThreadData()->hwndDefault
,SW_SHOWNOACTIVATE
);
1779 ImmInternalSendIMENotify(data
, IMN_SETCOMPOSITIONWINDOW
, 0);
1783 /***********************************************************************
1784 * ImmSetConversionStatus (IMM32.@)
1786 BOOL WINAPI
ImmSetConversionStatus(
1787 HIMC hIMC
, DWORD fdwConversion
, DWORD fdwSentence
)
1789 DWORD oldConversion
, oldSentence
;
1790 InputContextData
*data
= (InputContextData
*)hIMC
;
1792 TRACE("%p %d %d\n", hIMC
, fdwConversion
, fdwSentence
);
1797 if ( fdwConversion
!= data
->IMC
.fdwConversion
)
1799 oldConversion
= data
->IMC
.fdwConversion
;
1800 data
->IMC
.fdwConversion
= fdwConversion
;
1801 ImmNotifyIME(hIMC
, NI_CONTEXTUPDATED
, oldConversion
, IMC_SETCONVERSIONMODE
);
1802 ImmInternalSendIMENotify(data
, IMN_SETCONVERSIONMODE
, 0);
1804 if ( fdwSentence
!= data
->IMC
.fdwSentence
)
1806 oldSentence
= data
->IMC
.fdwSentence
;
1807 data
->IMC
.fdwSentence
= fdwSentence
;
1808 ImmNotifyIME(hIMC
, NI_CONTEXTUPDATED
, oldSentence
, IMC_SETSENTENCEMODE
);
1809 ImmInternalSendIMENotify(data
, IMN_SETSENTENCEMODE
, 0);
1815 /***********************************************************************
1816 * ImmSetOpenStatus (IMM32.@)
1818 BOOL WINAPI
ImmSetOpenStatus(HIMC hIMC
, BOOL fOpen
)
1820 InputContextData
*data
= (InputContextData
*)hIMC
;
1822 TRACE("%p %d\n", hIMC
, fOpen
);
1827 if (data
->imeWnd
== NULL
)
1829 /* create the ime window */
1830 data
->imeWnd
= CreateWindowExW( WS_EX_TOOLWINDOW
,
1831 data
->immKbd
->imeClassName
, NULL
, WS_POPUP
, 0, 0, 1, 1, 0,
1832 0, data
->immKbd
->hIME
, 0);
1833 SetWindowLongW(data
->imeWnd
, IMMGWL_IMC
, (LONG
)data
);
1834 IMM_GetThreadData()->hwndDefault
= data
->imeWnd
;
1837 if (!fOpen
!= !data
->IMC
.fOpen
)
1839 data
->IMC
.fOpen
= fOpen
;
1840 ImmNotifyIME( hIMC
, NI_CONTEXTUPDATED
, 0, IMC_SETOPENSTATUS
);
1841 ImmInternalSendIMENotify(data
, IMN_SETSENTENCEMODE
, 0);
1847 /***********************************************************************
1848 * ImmSetStatusWindowPos (IMM32.@)
1850 BOOL WINAPI
ImmSetStatusWindowPos(HIMC hIMC
, LPPOINT lpptPos
)
1852 FIXME("(%p, %p): stub\n", hIMC
, lpptPos
);
1853 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1857 /***********************************************************************
1858 * ImmCreateSoftKeyboard(IMM32.@)
1860 HWND WINAPI
ImmCreateSoftKeyboard(UINT uType
, UINT hOwner
, int x
, int y
)
1862 FIXME("(%d, %d, %d, %d): stub\n", uType
, hOwner
, x
, y
);
1863 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1867 /***********************************************************************
1868 * ImmDestroySoftKeyboard(IMM32.@)
1870 BOOL WINAPI
ImmDestroySoftKeyboard(HWND hSoftWnd
)
1872 FIXME("(%p): stub\n", hSoftWnd
);
1873 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1877 /***********************************************************************
1878 * ImmShowSoftKeyboard(IMM32.@)
1880 BOOL WINAPI
ImmShowSoftKeyboard(HWND hSoftWnd
, int nCmdShow
)
1882 FIXME("(%p, %d): stub\n", hSoftWnd
, nCmdShow
);
1883 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1887 /***********************************************************************
1888 * ImmSimulateHotKey (IMM32.@)
1890 BOOL WINAPI
ImmSimulateHotKey(HWND hWnd
, DWORD dwHotKeyID
)
1892 FIXME("(%p, %d): stub\n", hWnd
, dwHotKeyID
);
1893 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
1897 /***********************************************************************
1898 * ImmUnregisterWordA (IMM32.@)
1900 BOOL WINAPI
ImmUnregisterWordA(
1901 HKL hKL
, LPCSTR lpszReading
, DWORD dwStyle
, LPCSTR lpszUnregister
)
1903 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1904 TRACE("(%p, %s, %d, %s):\n", hKL
, debugstr_a(lpszReading
), dwStyle
,
1905 debugstr_a(lpszUnregister
));
1906 if (immHkl
->hIME
&& immHkl
->pImeUnregisterWord
)
1908 if (!is_kbd_ime_unicode(immHkl
))
1909 return immHkl
->pImeUnregisterWord((LPCWSTR
)lpszReading
,dwStyle
,
1910 (LPCWSTR
)lpszUnregister
);
1913 LPWSTR lpszwReading
= strdupAtoW(lpszReading
);
1914 LPWSTR lpszwUnregister
= strdupAtoW(lpszUnregister
);
1917 rc
= immHkl
->pImeUnregisterWord(lpszwReading
,dwStyle
,lpszwUnregister
);
1918 HeapFree(GetProcessHeap(),0,lpszwReading
);
1919 HeapFree(GetProcessHeap(),0,lpszwUnregister
);
1927 /***********************************************************************
1928 * ImmUnregisterWordW (IMM32.@)
1930 BOOL WINAPI
ImmUnregisterWordW(
1931 HKL hKL
, LPCWSTR lpszReading
, DWORD dwStyle
, LPCWSTR lpszUnregister
)
1933 ImmHkl
*immHkl
= IMM_GetImmHkl(hKL
);
1934 TRACE("(%p, %s, %d, %s):\n", hKL
, debugstr_w(lpszReading
), dwStyle
,
1935 debugstr_w(lpszUnregister
));
1936 if (immHkl
->hIME
&& immHkl
->pImeUnregisterWord
)
1938 if (is_kbd_ime_unicode(immHkl
))
1939 return immHkl
->pImeUnregisterWord(lpszReading
,dwStyle
,lpszUnregister
);
1942 LPSTR lpszaReading
= strdupWtoA(lpszReading
);
1943 LPSTR lpszaUnregister
= strdupWtoA(lpszUnregister
);
1946 rc
= immHkl
->pImeUnregisterWord((LPCWSTR
)lpszaReading
,dwStyle
,
1947 (LPCWSTR
)lpszaUnregister
);
1948 HeapFree(GetProcessHeap(),0,lpszaReading
);
1949 HeapFree(GetProcessHeap(),0,lpszaUnregister
);
1957 /***********************************************************************
1958 * ImmGetImeMenuItemsA (IMM32.@)
1960 DWORD WINAPI
ImmGetImeMenuItemsA( HIMC hIMC
, DWORD dwFlags
, DWORD dwType
,
1961 LPIMEMENUITEMINFOA lpImeParentMenu
, LPIMEMENUITEMINFOA lpImeMenu
,
1964 InputContextData
*data
= (InputContextData
*)hIMC
;
1965 TRACE("(%p, %i, %i, %p, %p, %i):\n", hIMC
, dwFlags
, dwType
,
1966 lpImeParentMenu
, lpImeMenu
, dwSize
);
1967 if (data
->immKbd
->hIME
&& data
->immKbd
->pImeGetImeMenuItems
)
1969 if (!is_himc_ime_unicode(data
) || (!lpImeParentMenu
&& !lpImeMenu
))
1970 return data
->immKbd
->pImeGetImeMenuItems(hIMC
, dwFlags
, dwType
,
1971 (IMEMENUITEMINFOW
*)lpImeParentMenu
,
1972 (IMEMENUITEMINFOW
*)lpImeMenu
, dwSize
);
1975 IMEMENUITEMINFOW lpImeParentMenuW
;
1976 IMEMENUITEMINFOW
*lpImeMenuW
, *parent
= NULL
;
1979 if (lpImeParentMenu
)
1980 parent
= &lpImeParentMenuW
;
1983 int count
= dwSize
/ sizeof(LPIMEMENUITEMINFOA
);
1984 dwSize
= count
* sizeof(IMEMENUITEMINFOW
);
1985 lpImeMenuW
= HeapAlloc(GetProcessHeap(), 0, dwSize
);
1990 rc
= data
->immKbd
->pImeGetImeMenuItems(hIMC
, dwFlags
, dwType
,
1991 parent
, lpImeMenuW
, dwSize
);
1993 if (lpImeParentMenu
)
1995 memcpy(lpImeParentMenu
,&lpImeParentMenuW
,sizeof(IMEMENUITEMINFOA
));
1996 lpImeParentMenu
->hbmpItem
= lpImeParentMenuW
.hbmpItem
;
1997 WideCharToMultiByte(CP_ACP
, 0, lpImeParentMenuW
.szString
,
1998 -1, lpImeParentMenu
->szString
, IMEMENUITEM_STRING_SIZE
,
2001 if (lpImeMenu
&& rc
)
2004 for (i
= 0; i
< rc
; i
++)
2006 memcpy(&lpImeMenu
[i
],&lpImeMenuW
[1],sizeof(IMEMENUITEMINFOA
));
2007 lpImeMenu
[i
].hbmpItem
= lpImeMenuW
[i
].hbmpItem
;
2008 WideCharToMultiByte(CP_ACP
, 0, lpImeMenuW
[i
].szString
,
2009 -1, lpImeMenu
[i
].szString
, IMEMENUITEM_STRING_SIZE
,
2013 HeapFree(GetProcessHeap(),0,lpImeMenuW
);
2021 /***********************************************************************
2022 * ImmGetImeMenuItemsW (IMM32.@)
2024 DWORD WINAPI
ImmGetImeMenuItemsW( HIMC hIMC
, DWORD dwFlags
, DWORD dwType
,
2025 LPIMEMENUITEMINFOW lpImeParentMenu
, LPIMEMENUITEMINFOW lpImeMenu
,
2028 InputContextData
*data
= (InputContextData
*)hIMC
;
2029 TRACE("(%p, %i, %i, %p, %p, %i):\n", hIMC
, dwFlags
, dwType
,
2030 lpImeParentMenu
, lpImeMenu
, dwSize
);
2031 if (data
->immKbd
->hIME
&& data
->immKbd
->pImeGetImeMenuItems
)
2033 if (is_himc_ime_unicode(data
) || (!lpImeParentMenu
&& !lpImeMenu
))
2034 return data
->immKbd
->pImeGetImeMenuItems(hIMC
, dwFlags
, dwType
,
2035 lpImeParentMenu
, lpImeMenu
, dwSize
);
2038 IMEMENUITEMINFOA lpImeParentMenuA
;
2039 IMEMENUITEMINFOA
*lpImeMenuA
, *parent
= NULL
;
2042 if (lpImeParentMenu
)
2043 parent
= &lpImeParentMenuA
;
2046 int count
= dwSize
/ sizeof(LPIMEMENUITEMINFOW
);
2047 dwSize
= count
* sizeof(IMEMENUITEMINFOA
);
2048 lpImeMenuA
= HeapAlloc(GetProcessHeap(), 0, dwSize
);
2053 rc
= data
->immKbd
->pImeGetImeMenuItems(hIMC
, dwFlags
, dwType
,
2054 (IMEMENUITEMINFOW
*)parent
,
2055 (IMEMENUITEMINFOW
*)lpImeMenuA
, dwSize
);
2057 if (lpImeParentMenu
)
2059 memcpy(lpImeParentMenu
,&lpImeParentMenuA
,sizeof(IMEMENUITEMINFOA
));
2060 lpImeParentMenu
->hbmpItem
= lpImeParentMenuA
.hbmpItem
;
2061 MultiByteToWideChar(CP_ACP
, 0, lpImeParentMenuA
.szString
,
2062 -1, lpImeParentMenu
->szString
, IMEMENUITEM_STRING_SIZE
);
2064 if (lpImeMenu
&& rc
)
2067 for (i
= 0; i
< rc
; i
++)
2069 memcpy(&lpImeMenu
[i
],&lpImeMenuA
[1],sizeof(IMEMENUITEMINFOA
));
2070 lpImeMenu
[i
].hbmpItem
= lpImeMenuA
[i
].hbmpItem
;
2071 MultiByteToWideChar(CP_ACP
, 0, lpImeMenuA
[i
].szString
,
2072 -1, lpImeMenu
[i
].szString
, IMEMENUITEM_STRING_SIZE
);
2075 HeapFree(GetProcessHeap(),0,lpImeMenuA
);
2083 /***********************************************************************
2084 * ImmLockIMC(IMM32.@)
2086 LPINPUTCONTEXT WINAPI
ImmLockIMC(HIMC hIMC
)
2088 InputContextData
*data
= (InputContextData
*)hIMC
;
2096 /***********************************************************************
2097 * ImmUnlockIMC(IMM32.@)
2099 BOOL WINAPI
ImmUnlockIMC(HIMC hIMC
)
2101 InputContextData
*data
= (InputContextData
*)hIMC
;
2103 return (data
->dwLock
!=0);
2106 /***********************************************************************
2107 * ImmGetIMCLockCount(IMM32.@)
2109 DWORD WINAPI
ImmGetIMCLockCount(HIMC hIMC
)
2111 InputContextData
*data
= (InputContextData
*)hIMC
;
2112 return data
->dwLock
;
2115 /***********************************************************************
2116 * ImmCreateIMCC(IMM32.@)
2118 HIMCC WINAPI
ImmCreateIMCC(DWORD size
)
2120 IMCCInternal
*internal
;
2121 int real_size
= size
+ sizeof(IMCCInternal
);
2123 internal
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, real_size
);
2124 if (internal
== NULL
)
2127 internal
->dwSize
= size
;
2128 return (HIMCC
)internal
;
2131 /***********************************************************************
2132 * ImmDestroyIMCC(IMM32.@)
2134 HIMCC WINAPI
ImmDestroyIMCC(HIMCC block
)
2136 HeapFree(GetProcessHeap(),0,block
);
2140 /***********************************************************************
2141 * ImmLockIMCC(IMM32.@)
2143 LPVOID WINAPI
ImmLockIMCC(HIMCC imcc
)
2145 IMCCInternal
*internal
;
2146 internal
= (IMCCInternal
*) imcc
;
2148 internal
->dwLock
++;
2149 return internal
+ 1;
2152 /***********************************************************************
2153 * ImmUnlockIMCC(IMM32.@)
2155 BOOL WINAPI
ImmUnlockIMCC(HIMCC imcc
)
2157 IMCCInternal
*internal
;
2158 internal
= (IMCCInternal
*) imcc
;
2160 internal
->dwLock
--;
2161 return (internal
->dwLock
!=0);
2164 /***********************************************************************
2165 * ImmGetIMCCLockCount(IMM32.@)
2167 DWORD WINAPI
ImmGetIMCCLockCount(HIMCC imcc
)
2169 IMCCInternal
*internal
;
2170 internal
= (IMCCInternal
*) imcc
;
2172 return internal
->dwLock
;
2175 /***********************************************************************
2176 * ImmReSizeIMCC(IMM32.@)
2178 HIMCC WINAPI
ImmReSizeIMCC(HIMCC imcc
, DWORD size
)
2180 IMCCInternal
*internal
,*newone
;
2181 int real_size
= size
+ sizeof(IMCCInternal
);
2183 internal
= (IMCCInternal
*) imcc
;
2185 newone
= HeapReAlloc(GetProcessHeap(), 0, internal
, real_size
);
2186 newone
->dwSize
= size
;
2191 /***********************************************************************
2192 * ImmGetIMCCSize(IMM32.@)
2194 DWORD WINAPI
ImmGetIMCCSize(HIMCC imcc
)
2196 IMCCInternal
*internal
;
2197 internal
= (IMCCInternal
*) imcc
;
2199 return internal
->dwSize
;
2202 /***********************************************************************
2203 * ImmGenerateMessage(IMM32.@)
2205 BOOL WINAPI
ImmGenerateMessage(HIMC hIMC
)
2207 InputContextData
*data
= (InputContextData
*)hIMC
;
2209 TRACE("%i messages queued\n",data
->IMC
.dwNumMsgBuf
);
2210 if (data
->IMC
.dwNumMsgBuf
> 0)
2212 LPTRANSMSG lpTransMsg
;
2215 lpTransMsg
= (LPTRANSMSG
)ImmLockIMCC(data
->IMC
.hMsgBuf
);
2216 for (i
= 0; i
< data
->IMC
.dwNumMsgBuf
; i
++)
2217 ImmInternalPostIMEMessage(data
, lpTransMsg
[i
].message
, lpTransMsg
[i
].wParam
, lpTransMsg
[i
].lParam
);
2219 ImmUnlockIMCC(data
->IMC
.hMsgBuf
);
2221 data
->IMC
.dwNumMsgBuf
= 0;
2227 /***********************************************************************
2228 * ImmTranslateMessage(IMM32.@)
2229 * ( Undocumented, call internally and from user32.dll )
2231 BOOL WINAPI
ImmTranslateMessage(HWND hwnd
, UINT msg
, WCHAR chr
, LPARAM lKeyData
)
2233 InputContextData
*data
;
2234 HIMC imc
= ImmGetContext(hwnd
);
2240 static const int list_count
= 10;
2242 TRACE("%p %x '%c' %x\n",hwnd
, msg
, chr
, (UINT
)lKeyData
);
2245 data
= (InputContextData
*)imc
;
2249 if (!data
->immKbd
->hIME
|| !data
->immKbd
->pImeToAsciiEx
)
2252 GetKeyboardState(state
);
2253 scancode
= lKeyData
>> 0x10 & 0xff;
2255 list
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, list_count
* sizeof(TRANSMSG
) + sizeof(DWORD
));
2256 ((DWORD
*)list
)[0] = list_count
;
2258 if (data
->immKbd
->imeInfo
.fdwProperty
& IME_PROP_KBD_CHAR_FIRST
)
2260 if (!is_himc_ime_unicode(data
))
2261 ToAscii(data
->lastVK
, scancode
, state
, &chr
, 0);
2262 uVirtKey
= MAKELONG(data
->lastVK
,chr
);
2265 uVirtKey
= data
->lastVK
;
2267 msg_count
= data
->immKbd
->pImeToAsciiEx(uVirtKey
, scancode
, state
, list
, 0, imc
);
2268 TRACE("%i messages generated\n",msg_count
);
2269 if (msg_count
&& msg_count
<= list_count
)
2272 LPTRANSMSG msgs
= (LPTRANSMSG
)((LPBYTE
)list
+ sizeof(DWORD
));
2274 for (i
= 0; i
< msg_count
; i
++)
2275 ImmInternalPostIMEMessage(data
, msgs
[i
].message
, msgs
[i
].wParam
, msgs
[i
].lParam
);
2277 else if (msg_count
> list_count
)
2278 ImmGenerateMessage(imc
);
2280 HeapFree(GetProcessHeap(),0,list
);
2282 return (msg_count
> 0);
2285 /***********************************************************************
2286 * ImmProcessKey(IMM32.@)
2287 * ( Undocumented, called from user32.dll )
2289 BOOL WINAPI
ImmProcessKey(HWND hwnd
, HKL hKL
, UINT vKey
, LPARAM lKeyData
, DWORD unknown
)
2291 InputContextData
*data
;
2292 HIMC imc
= ImmGetContext(hwnd
);
2295 TRACE("%p %p %x %x %x\n",hwnd
, hKL
, vKey
, (UINT
)lKeyData
, unknown
);
2298 data
= (InputContextData
*)imc
;
2302 if (!data
->immKbd
->hIME
|| !data
->immKbd
->pImeProcessKey
)
2305 GetKeyboardState(state
);
2306 data
->lastVK
= vKey
;
2308 if (data
->immKbd
->pImeProcessKey(imc
, vKey
, lKeyData
, state
))
2313 scancode
= lKeyData
>> 0x10 & 0xff;
2314 ToUnicodeEx(vKey
, scancode
, state
, &key
, 1, 0, hKL
);
2315 return ImmTranslateMessage(hwnd
, WM_KEYDOWN
, key
, lKeyData
);