shell32: Fix the file version string of the version resource.
[wine/multimedia.git] / dlls / imm32 / imm.c
blobd6fce6c4aaf5b85f2c22ef814050925db7021108
1 /*
2 * IMM32 library
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
22 #include <stdarg.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "wingdi.h"
27 #include "winuser.h"
28 #include "winerror.h"
29 #include "wine/debug.h"
30 #include "imm.h"
31 #include "winnls.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;
43 LPBYTE ResultString;
44 LPBYTE ResultReadingString;
45 DWORD dwCompStringSize; /* buffer size */
46 DWORD dwCompStringLength; /* string length (in bytes) */
47 DWORD dwCompReadStringSize;
48 DWORD dwResultStringSize;
49 DWORD dwResultReadStringSize;
50 HWND hwnd;
51 BOOL bOpen;
52 BOOL bInternalState;
53 BOOL bRead;
54 LOGFONTW font;
55 HFONT textfont;
56 COMPOSITIONFORM CompForm;
57 } InputContextData;
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};
64 /* MSIME messages */
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;
74 * prototypes
76 static LRESULT WINAPI IME_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
77 LPARAM lParam);
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)
84 unsigned int i;
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],
89 1);
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)
100 WNDCLASSW wndClass;
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)
134 HMODULE x11drv;
136 TRACE("%p, %lx, %p\n",hInstDLL,fdwReason,lpReserved);
137 switch (fdwReason)
139 case DLL_PROCESS_ATTACH:
140 DisableThreadLibraryCalls(hInstDLL);
141 hImeInst = hInstDLL;
142 IMM_RegisterMessages();
143 x11drv = GetModuleHandleA("winex11.drv");
144 if (x11drv) pX11DRV_ForceXIMReset = (void *)GetProcAddress( x11drv, "ForceXIMReset");
145 break;
146 case DLL_PROCESS_DETACH:
147 if (hwndDefault)
149 DestroyWindow(hwndDefault);
150 hwndDefault = 0;
152 IMM_Unregister();
153 break;
155 return TRUE;
158 /* for posting messages as the IME */
159 static void ImmInternalPostIMEMessage(UINT msg, WPARAM wParam, LPARAM lParam)
161 HWND target = GetFocus();
162 if (!target)
163 PostMessageW(root_context->hwnd,msg,wParam,lParam);
164 else
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;
176 if (fOpen == FALSE)
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;
198 else
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);
214 if (!hIMC)
215 return NULL;
218 * WINE SPECIFIC! MAY CONFLICT
219 * associate the root context we have an XIM created
221 if (hWnd == 0x000)
223 root_context = (InputContextData*)hIMC;
227 * If already associated just return
229 if (data->hwnd == hWnd)
230 return hIMC;
232 if (IsWindow(data->hwnd))
235 * Post a message that your context is switching
237 SendMessageW(data->hwnd, WM_IME_SETCONTEXT, FALSE, ISC_SHOWUIALL);
240 data->hwnd = hWnd;
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;
254 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);
264 return FALSE;
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);
277 return FALSE;
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);
290 return FALSE;
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);
315 if (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);
326 if (data->textfont)
328 DeleteObject(data->textfont);
329 data->textfont = NULL;
332 HeapFree(GetProcessHeap(),0,data);
334 return TRUE;
337 /***********************************************************************
338 * ImmDisableIME (IMM32.@)
340 BOOL WINAPI ImmDisableIME(DWORD idThread)
342 FIXME("(%ld): stub\n", idThread);
343 return TRUE;
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",
355 hKL, lpfnEnumProc,
356 debugstr_a(lpszReading), dwStyle,
357 debugstr_a(lpszRegister), lpData
359 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
360 return 0;
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",
372 hKL, lpfnEnumProc,
373 debugstr_w(lpszReading), dwStyle,
374 debugstr_w(lpszRegister), lpData
376 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
377 return 0;
380 /***********************************************************************
381 * ImmEscapeA (IMM32.@)
383 LRESULT WINAPI ImmEscapeA(
384 HKL hKL, HIMC hIMC,
385 UINT uEscape, LPVOID lpData)
387 FIXME("(%p, %p, %d, %p): stub\n",
388 hKL, hIMC, uEscape, lpData
390 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
391 return 0;
394 /***********************************************************************
395 * ImmEscapeW (IMM32.@)
397 LRESULT WINAPI ImmEscapeW(
398 HKL hKL, HIMC hIMC,
399 UINT uEscape, LPVOID lpData)
401 FIXME("(%p, %p, %d, %p): stub\n",
402 hKL, hIMC, uEscape, lpData
404 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
405 return 0;
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",
416 hIMC, deIndex,
417 lpCandList, dwBufLen
419 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
420 return 0;
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);
431 return 0;
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);
442 return 0;
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",
453 hIMC, deIndex,
454 lpCandList, dwBufLen
456 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
457 return 0;
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);
468 return FALSE;
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);
478 return FALSE;
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);
488 return FALSE;
491 /***********************************************************************
492 * ImmGetCompositionStringA (IMM32.@)
494 LONG WINAPI ImmGetCompositionStringA(
495 HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
497 CHAR *buf;
498 LONG rc = 0;
499 InputContextData *data = (InputContextData*)hIMC;
501 TRACE("(%p, 0x%lx, %p, %ld)\n", hIMC, dwIndex, lpBuf, dwBufLen);
503 if (!data)
504 return FALSE;
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);
515 if (dwBufLen >= rc)
516 memcpy(lpBuf,buf,rc);
518 data->bRead = TRUE;
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);
530 if (dwBufLen >= rc)
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,
541 0, NULL, NULL);
543 if (dwBufLen >= rc)
545 int i=0;
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,
557 0, NULL, NULL);
559 if (dwBufLen >= sizeof(DWORD)*2)
561 ((LPDWORD)lpBuf)[0] = 0;
562 ((LPDWORD)lpBuf)[1] = rc;
564 rc = sizeof(DWORD)*2;
566 else
568 FIXME("Unhandled index 0x%lx\n",dwIndex);
571 return rc;
574 /***********************************************************************
575 * ImmGetCompositionStringW (IMM32.@)
577 LONG WINAPI ImmGetCompositionStringW(
578 HIMC hIMC, DWORD dwIndex,
579 LPVOID lpBuf, DWORD dwBufLen)
581 LONG rc = 0;
582 InputContextData *data = (InputContextData*)hIMC;
584 TRACE("(%p, 0x%lx, %p, %ld)\n", hIMC, dwIndex, lpBuf, dwBufLen);
586 if (!data)
587 return FALSE;
589 if (dwIndex == GCS_RESULTSTR)
591 data->bRead = TRUE;
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;
617 if (dwBufLen >= len)
619 unsigned int i=0;
620 for (i = 0; i < len; i++)
621 ((LPBYTE)lpBuf)[i] = ATTR_INPUT;
624 rc = len;
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;
643 else
645 FIXME("Unhandled index 0x%lx\n",dwIndex);
648 return rc;
651 /***********************************************************************
652 * ImmGetCompositionWindow (IMM32.@)
654 BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
656 InputContextData *data = (InputContextData*)hIMC;
658 TRACE("(%p, %p)\n", hIMC, lpCompForm);
660 if (!data)
661 return FALSE;
663 memcpy(lpCompForm,&(data->CompForm),sizeof(COMPOSITIONFORM));
664 return 1;
667 /***********************************************************************
668 * ImmGetContext (IMM32.@)
671 HIMC WINAPI ImmGetContext(HWND hWnd)
673 TRACE("%p\n", hWnd);
675 if (!root_context)
676 return NULL;
678 root_context->hwnd = hWnd;
679 return (HIMC)root_context;
682 /***********************************************************************
683 * ImmGetConversionListA (IMM32.@)
685 DWORD WINAPI ImmGetConversionListA(
686 HKL hKL, HIMC hIMC,
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);
694 return 0;
697 /***********************************************************************
698 * ImmGetConversionListW (IMM32.@)
700 DWORD WINAPI ImmGetConversionListW(
701 HKL hKL, HIMC hIMC,
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);
709 return 0;
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);
719 if (lpfdwConversion)
720 *lpfdwConversion = IME_CMODE_NATIVE;
721 if (lpfdwSentence)
722 *lpfdwSentence = IME_SMODE_NONE;
723 return TRUE;
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'};
737 IMM_Register();
738 hwndDefault = CreateWindowExW( WS_EX_CLIENTEDGE, WC_IMECLASSNAME,
739 the_name, WS_POPUPWINDOW|WS_CAPTION, 0, 0, 120, 55, 0, 0,
740 hImeInst, 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)
754 WCHAR *buf;
755 DWORD len;
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) );
764 if( !buf )
765 return 0;
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 );
776 return len;
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);
803 return 0;
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);
815 return 0;
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);
826 return 0;
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);
837 return 0;
840 /***********************************************************************
841 * ImmGetOpenStatus (IMM32.@)
843 BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
845 InputContextData *data = (InputContextData*)hIMC;
847 if (!data)
848 return FALSE;
849 FIXME("(%p): semi-stub\n", hIMC);
851 return data->bOpen;
854 /***********************************************************************
855 * ImmGetProperty (IMM32.@)
857 DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
859 DWORD rc = 0;
860 TRACE("(%p, %ld)\n", hKL, fdwIndex);
862 switch (fdwIndex)
864 case IGP_PROPERTY:
865 TRACE("(%s)\n", "IGP_PROPERTY");
866 rc = IME_PROP_UNICODE | IME_PROP_AT_CARET;
867 break;
868 case IGP_CONVERSION:
869 FIXME("(%s)\n", "IGP_CONVERSION");
870 rc = IME_CMODE_NATIVE;
871 break;
872 case IGP_SENTENCE:
873 FIXME("%s)\n", "IGP_SENTENCE");
874 rc = IME_SMODE_AUTOMATIC;
875 break;
876 case IGP_SETCOMPSTR:
877 TRACE("(%s)\n", "IGP_SETCOMPSTR");
878 rc = 0;
879 break;
880 case IGP_SELECT:
881 TRACE("(%s)\n", "IGP_SELECT");
882 rc = SELECT_CAP_CONVERSION | SELECT_CAP_SENTENCE;
883 break;
884 case IGP_GETIMEVERSION:
885 TRACE("(%s)\n", "IGP_GETIMEVERSION");
886 rc = IMEVER_0400;
887 break;
888 case IGP_UI:
889 TRACE("(%s)\n", "IGP_UI");
890 rc = 0;
891 break;
892 default:
893 rc = 0;
895 return rc;
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);
906 return 0;
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);
917 return 0;
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);
927 return FALSE;
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:
943 return 0;
944 default:
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);
960 return NULL;
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);
973 return NULL;
976 /***********************************************************************
977 * ImmIsIME (IMM32.@)
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)
995 BOOL rc = FALSE;
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))
1009 if (!hwndDefault)
1010 ImmGetDefaultIMEWnd(NULL);
1012 if (hWndIME == NULL)
1013 PostMessageA(hwndDefault, msg, wParam, lParam);
1015 rc = TRUE;
1017 return rc;
1020 /***********************************************************************
1021 * ImmIsUIMessageW (IMM32.@)
1023 BOOL WINAPI ImmIsUIMessageW(
1024 HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
1026 BOOL rc = FALSE;
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))
1037 rc = TRUE;
1038 return rc;
1041 /***********************************************************************
1042 * ImmNotifyIME (IMM32.@)
1044 BOOL WINAPI ImmNotifyIME(
1045 HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
1047 BOOL rc = FALSE;
1049 TRACE("(%p, %ld, %ld, %ld)\n",
1050 hIMC, dwAction, dwIndex, dwValue);
1052 if (!root_context)
1053 return rc;
1055 switch(dwAction)
1057 case NI_CHANGECANDIDATELIST:
1058 FIXME("%s\n","NI_CHANGECANDIDATELIST");
1059 break;
1060 case NI_CLOSECANDIDATE:
1061 FIXME("%s\n","NI_CLOSECANDIDATE");
1062 break;
1063 case NI_COMPOSITIONSTR:
1064 switch (dwIndex)
1066 case CPS_CANCEL:
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,
1078 GCS_COMPSTR);
1080 rc = TRUE;
1081 break;
1082 case CPS_COMPLETE:
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,
1113 GCS_COMPSTR);
1115 ImmInternalPostIMEMessage(WM_IME_COMPOSITION,
1116 root_context->ResultString[0],
1117 GCS_RESULTSTR|GCS_RESULTCLAUSE);
1119 break;
1120 case CPS_CONVERT:
1121 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_CONVERT");
1122 break;
1123 case CPS_REVERT:
1124 FIXME("%s - %s\n","NI_COMPOSITIONSTR","CPS_REVERT");
1125 break;
1126 default:
1127 ERR("%s - %s (%li)\n","NI_COMPOSITIONSTR","UNKNOWN",dwIndex);
1128 break;
1130 break;
1131 case NI_IMEMENUSELECTED:
1132 FIXME("%s\n", "NI_IMEMENUSELECTED");
1133 break;
1134 case NI_OPENCANDIDATE:
1135 FIXME("%s\n", "NI_OPENCANDIDATE");
1136 break;
1137 case NI_SELECTCANDIDATESTR:
1138 FIXME("%s\n", "NI_SELECTCANDIDATESTR");
1139 break;
1140 case NI_SETCANDIDATE_PAGESIZE:
1141 FIXME("%s\n", "NI_SETCANDIDATE_PAGESIZE");
1142 break;
1143 case NI_SETCANDIDATE_PAGESTART:
1144 FIXME("%s\n", "NI_SETCANDIDATE_PAGESTART");
1145 break;
1146 default:
1147 ERR("Unknown\n");
1150 return rc;
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);
1163 return FALSE;
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);
1176 return FALSE;
1179 /***********************************************************************
1180 * ImmReleaseContext (IMM32.@)
1182 BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
1184 FIXME("(%p, %p): stub\n", hWnd, hIMC);
1186 return TRUE;
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);
1197 return FALSE;
1200 /***********************************************************************
1201 * ImmSetCompositionFontA (IMM32.@)
1203 BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
1205 InputContextData *data = (InputContextData*)hIMC;
1206 TRACE("(%p, %p)\n", hIMC, lplf);
1208 if (!data)
1209 return FALSE;
1211 memcpy(&data->font,lplf,sizeof(LOGFONTA));
1212 MultiByteToWideChar(CP_ACP, 0, lplf->lfFaceName, -1, data->font.lfFaceName,
1213 LF_FACESIZE);
1215 SendMessageW(root_context->hwnd, WM_IME_NOTIFY, IMN_SETCOMPOSITIONFONT, 0);
1217 if (data->textfont)
1219 DeleteObject(data->textfont);
1220 data->textfont = NULL;
1223 data->textfont = CreateFontIndirectW(&data->font);
1224 return TRUE;
1227 /***********************************************************************
1228 * ImmSetCompositionFontW (IMM32.@)
1230 BOOL WINAPI ImmSetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
1232 InputContextData *data = (InputContextData*)hIMC;
1233 TRACE("(%p, %p)\n", hIMC, lplf);
1235 if (!data)
1236 return FALSE;
1238 memcpy(&data->font,lplf,sizeof(LOGFONTW));
1239 SendMessageW(root_context->hwnd, WM_IME_NOTIFY, IMN_SETCOMPOSITIONFONT, 0);
1241 if (data->textfont)
1243 DeleteObject(data->textfont);
1244 data->textfont = NULL;
1246 data->textfont = CreateFontIndirectW(&data->font);
1247 return TRUE;
1250 /***********************************************************************
1251 * ImmSetCompositionStringA (IMM32.@)
1253 BOOL WINAPI ImmSetCompositionStringA(
1254 HIMC hIMC, DWORD dwIndex,
1255 LPCVOID lpComp, DWORD dwCompLen,
1256 LPCVOID lpRead, DWORD dwReadLen)
1258 DWORD comp_len;
1259 DWORD read_len;
1260 WCHAR *CompBuffer = NULL;
1261 WCHAR *ReadBuffer = NULL;
1262 BOOL rc;
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);
1268 if (comp_len)
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);
1275 if (read_len)
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);
1287 return rc;
1290 /***********************************************************************
1291 * ImmSetCompositionStringW (IMM32.@)
1293 BOOL WINAPI ImmSetCompositionStringW(
1294 HIMC hIMC, DWORD dwIndex,
1295 LPCVOID lpComp, DWORD dwCompLen,
1296 LPCVOID lpRead, DWORD dwReadLen)
1298 DWORD flags = 0;
1299 WCHAR wParam = 0;
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");
1309 * Explanation:
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,
1336 dwCompLen);
1337 memcpy(root_context->CompositionString,lpComp,dwCompLen);
1339 wParam = ((const WCHAR*)lpComp)[0];
1340 flags |= GCS_COMPCLAUSE | GCS_COMPATTR;
1342 else
1343 root_context->CompositionString = NULL;
1347 UpdateDataInDefaultIMEWindow(hwndDefault);
1349 ImmInternalPostIMEMessage(WM_IME_COMPOSITION, wParam, flags);
1351 return TRUE;
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);
1368 if (!data)
1369 return FALSE;
1371 memcpy(&data->CompForm,lpCompForm,sizeof(COMPOSITIONFORM));
1373 if (IsWindowVisible(hwndDefault))
1375 reshow = TRUE;
1376 ShowWindow(hwndDefault,SW_HIDE);
1379 /* FIXME: this is a partial stub */
1381 if (reshow)
1382 ShowWindow(hwndDefault,SW_SHOWNOACTIVATE);
1384 SendMessageW(root_context->hwnd, WM_IME_NOTIFY,IMN_SETCOMPOSITIONWINDOW, 0);
1385 return TRUE;
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);
1398 return FALSE;
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)
1412 if (fOpen)
1413 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION, 0, 0);
1415 ImmInternalSetOpenStatus(fOpen);
1417 if (!fOpen)
1418 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION, 0, 0);
1420 return TRUE;
1423 if (!data)
1424 return FALSE;
1426 if (fOpen != data->bInternalState)
1428 if (fOpen == FALSE && pX11DRV_ForceXIMReset)
1429 pX11DRV_ForceXIMReset(data->hwnd);
1431 if (fOpen == FALSE)
1432 ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION,0,0);
1433 else
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);
1441 else
1442 ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION,0,0);
1444 return FALSE;
1446 return TRUE;
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);
1456 return FALSE;
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);
1466 return FALSE;
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);
1479 return FALSE;
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);
1492 return FALSE;
1496 /*****
1497 * Internal functions to help with IME window management
1499 static void PaintDefaultIMEWnd(HWND hwnd)
1501 PAINTSTRUCT ps;
1502 RECT rect;
1503 HDC hdc = BeginPaint(hwnd,&ps);
1504 GetClientRect(hwnd,&rect);
1506 if (root_context->dwCompStringLength && root_context->CompositionString)
1508 SIZE size;
1509 POINT pt;
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),
1520 &size);
1521 pt.x = size.cx;
1522 pt.y = size.cy;
1523 LPtoDP(hdc,&pt,1);
1524 rect.left = pt.x;
1526 if (oldfont)
1527 SelectObject(hdc,oldfont);
1529 FillRect(hdc,&rect, (HBRUSH) (COLOR_WINDOW+1));
1530 EndPaint(hwnd,&ps);
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,
1542 LPARAM lParam)
1544 LRESULT rc = 0;
1546 TRACE("Incoming Message 0x%x (0x%08x, 0x%08x)\n", msg, (UINT)wParam,
1547 (UINT)lParam);
1549 switch(msg)
1551 case WM_PAINT:
1552 PaintDefaultIMEWnd(hwnd);
1553 return FALSE;
1555 case WM_NCCREATE:
1556 return TRUE;
1558 case WM_CREATE:
1559 SetWindowTextA(hwnd,"Wine Ime Active");
1560 return TRUE;
1562 case WM_SETFOCUS:
1563 if (wParam)
1564 SetFocus((HWND)wParam);
1565 else
1566 FIXME("Received focus, should never have focus\n");
1567 break;
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);
1574 else
1575 UpdateDataInDefaultIMEWindow(hwnd);
1576 break;
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);
1582 break;
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);
1587 break;
1588 case WM_IME_SELECT:
1589 TRACE("IME message %s, 0x%x, 0x%x\n","WM_IME_SELECT",
1590 (UINT)wParam, (UINT)lParam);
1591 break;
1592 case WM_IME_CONTROL:
1593 TRACE("IME message %s, 0x%x, 0x%x\n","WM_IME_CONTROL",
1594 (UINT)wParam, (UINT)lParam);
1595 rc = 1;
1596 break;
1597 case WM_IME_NOTIFY:
1598 TRACE("!! IME NOTIFY\n");
1599 break;
1600 default:
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);
1608 rc = FALSE;
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);
1645 return rc;