xref: /reactos/win32ss/user/ntuser/ime.c (revision 1f446936)
1c2c66affSColin Finck /*
2c2c66affSColin Finck  * COPYRIGHT:        See COPYING in the top level directory
3c2c66affSColin Finck  * PROJECT:          ReactOS Win32k subsystem
4c2c66affSColin Finck  * PURPOSE:          Input Method Editor and Input Method Manager support
5c2c66affSColin Finck  * FILE:             win32ss/user/ntuser/ime.c
63d78601fSKatayama Hirofumi MZ  * PROGRAMERS:       Casper S. Hornstrup (chorns@users.sourceforge.net)
73d78601fSKatayama Hirofumi MZ  *                   Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
8c2c66affSColin Finck  */
9c2c66affSColin Finck 
10c2c66affSColin Finck #include <win32k.h>
11c2c66affSColin Finck DBG_DEFAULT_CHANNEL(UserMisc);
12c2c66affSColin Finck 
13fcc222c2SKatayama Hirofumi MZ #define INVALID_THREAD_ID  ((ULONG)-1)
14c2c66affSColin Finck 
15c2c66affSColin Finck UINT FASTCALL
16c2c66affSColin Finck IntImmProcessKey(PUSER_MESSAGE_QUEUE MessageQueue, PWND pWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
17c2c66affSColin Finck {
18c2c66affSColin Finck     PKL pKbdLayout;
19c2c66affSColin Finck 
20c2c66affSColin Finck     ASSERT_REFS_CO(pWnd);
21c2c66affSColin Finck 
22c2c66affSColin Finck     if ( Msg == WM_KEYDOWN ||
23c2c66affSColin Finck          Msg == WM_SYSKEYDOWN ||
24c2c66affSColin Finck          Msg == WM_KEYUP ||
25c2c66affSColin Finck          Msg == WM_SYSKEYUP )
26c2c66affSColin Finck     {
27c2c66affSColin Finck        //Vk = wParam & 0xff;
28c2c66affSColin Finck        pKbdLayout = pWnd->head.pti->KeyboardLayout;
29c2c66affSColin Finck        if (pKbdLayout == NULL) return 0;
30c2c66affSColin Finck        //
31c2c66affSColin Finck        if (!(gpsi->dwSRVIFlags & SRVINFO_IMM32)) return 0;
32c2c66affSColin Finck        // need ime.h!
33c2c66affSColin Finck     }
34c2c66affSColin Finck     // Call User32:
35c2c66affSColin Finck     // Anything but BOOL!
36c2c66affSColin Finck     //ImmRet = co_IntImmProcessKey(UserHMGetHandle(pWnd), pKbdLayout->hkl, Vk, lParam, HotKey);
37c2c66affSColin Finck     FIXME(" is UNIMPLEMENTED.\n");
38c2c66affSColin Finck     return 0;
39c2c66affSColin Finck }
40c2c66affSColin Finck 
41ec9d277dSKatayama Hirofumi MZ BOOL WINAPI
42ec9d277dSKatayama Hirofumi MZ NtUserGetImeHotKey(IN DWORD dwHotKey,
43ec9d277dSKatayama Hirofumi MZ                    OUT LPUINT lpuModifiers,
44ec9d277dSKatayama Hirofumi MZ                    OUT LPUINT lpuVKey,
45ec9d277dSKatayama Hirofumi MZ                    OUT LPHKL lphKL)
46c2c66affSColin Finck {
47c2c66affSColin Finck    STUB
48c2c66affSColin Finck 
49ec9d277dSKatayama Hirofumi MZ    return FALSE;
50c2c66affSColin Finck }
51c2c66affSColin Finck 
52c2c66affSColin Finck DWORD
53c2c66affSColin Finck APIENTRY
549adc538cSKatayama Hirofumi MZ NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
55c2c66affSColin Finck {
569adc538cSKatayama Hirofumi MZ     TRACE("NtUserNotifyIMEStatus(%p, %d, 0x%lX)\n", hwnd, fOpen, dwConversion);
57c2c66affSColin Finck     return 0;
58c2c66affSColin Finck }
59c2c66affSColin Finck 
60c2c66affSColin Finck DWORD
61c2c66affSColin Finck APIENTRY
62c2c66affSColin Finck NtUserSetImeHotKey(
63c2c66affSColin Finck    DWORD Unknown0,
64c2c66affSColin Finck    DWORD Unknown1,
65c2c66affSColin Finck    DWORD Unknown2,
66c2c66affSColin Finck    DWORD Unknown3,
67c2c66affSColin Finck    DWORD Unknown4)
68c2c66affSColin Finck {
69c2c66affSColin Finck    STUB
70c2c66affSColin Finck 
71c2c66affSColin Finck    return 0;
72c2c66affSColin Finck }
73c2c66affSColin Finck 
74c2c66affSColin Finck DWORD
75c2c66affSColin Finck APIENTRY
76c2c66affSColin Finck NtUserCheckImeHotKey(
77c2c66affSColin Finck     DWORD  VirtualKey,
78c2c66affSColin Finck     LPARAM lParam)
79c2c66affSColin Finck {
80c2c66affSColin Finck     STUB;
81c2c66affSColin Finck     return 0;
82c2c66affSColin Finck }
83c2c66affSColin Finck 
84fcc222c2SKatayama Hirofumi MZ BOOL
85c2c66affSColin Finck APIENTRY
86c2c66affSColin Finck NtUserDisableThreadIme(
87fcc222c2SKatayama Hirofumi MZ     DWORD dwThreadID)
88c2c66affSColin Finck {
89fcc222c2SKatayama Hirofumi MZ     PTHREADINFO pti, ptiCurrent;
90fcc222c2SKatayama Hirofumi MZ     PPROCESSINFO ppi;
91fcc222c2SKatayama Hirofumi MZ     BOOL ret = FALSE;
92fcc222c2SKatayama Hirofumi MZ 
93fcc222c2SKatayama Hirofumi MZ     UserEnterExclusive();
94fcc222c2SKatayama Hirofumi MZ 
95fcc222c2SKatayama Hirofumi MZ     if (!IS_IMM_MODE())
96fcc222c2SKatayama Hirofumi MZ     {
97fcc222c2SKatayama Hirofumi MZ         EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
98fcc222c2SKatayama Hirofumi MZ         goto Quit;
99fcc222c2SKatayama Hirofumi MZ     }
100fcc222c2SKatayama Hirofumi MZ 
101fcc222c2SKatayama Hirofumi MZ     ptiCurrent = GetW32ThreadInfo();
102fcc222c2SKatayama Hirofumi MZ 
103fcc222c2SKatayama Hirofumi MZ     if (dwThreadID == INVALID_THREAD_ID)
104fcc222c2SKatayama Hirofumi MZ     {
105fcc222c2SKatayama Hirofumi MZ         ppi = ptiCurrent->ppi;
106fcc222c2SKatayama Hirofumi MZ         ppi->W32PF_flags |= W32PF_DISABLEIME;
107fcc222c2SKatayama Hirofumi MZ 
108fcc222c2SKatayama Hirofumi MZ Retry:
109fcc222c2SKatayama Hirofumi MZ         for (pti = ppi->ptiList; pti; pti = pti->ptiSibling)
110fcc222c2SKatayama Hirofumi MZ         {
111fcc222c2SKatayama Hirofumi MZ             pti->TIF_flags |= TIF_DISABLEIME;
112fcc222c2SKatayama Hirofumi MZ 
113fcc222c2SKatayama Hirofumi MZ             if (pti->spwndDefaultIme)
114fcc222c2SKatayama Hirofumi MZ             {
115fcc222c2SKatayama Hirofumi MZ                 co_UserDestroyWindow(pti->spwndDefaultIme);
116fcc222c2SKatayama Hirofumi MZ                 pti->spwndDefaultIme = NULL;
117fcc222c2SKatayama Hirofumi MZ                 goto Retry; /* The contents of ppi->ptiList may be changed. */
118fcc222c2SKatayama Hirofumi MZ             }
119fcc222c2SKatayama Hirofumi MZ         }
120fcc222c2SKatayama Hirofumi MZ     }
121fcc222c2SKatayama Hirofumi MZ     else
122fcc222c2SKatayama Hirofumi MZ     {
123fcc222c2SKatayama Hirofumi MZ         if (dwThreadID == 0)
124fcc222c2SKatayama Hirofumi MZ         {
125fcc222c2SKatayama Hirofumi MZ             pti = ptiCurrent;
126fcc222c2SKatayama Hirofumi MZ         }
127fcc222c2SKatayama Hirofumi MZ         else
128fcc222c2SKatayama Hirofumi MZ         {
129fcc222c2SKatayama Hirofumi MZ             pti = IntTID2PTI(UlongToHandle(dwThreadID));
130fcc222c2SKatayama Hirofumi MZ 
131fcc222c2SKatayama Hirofumi MZ             /* The thread needs to reside in the current process. */
132fcc222c2SKatayama Hirofumi MZ             if (!pti || pti->ppi != ptiCurrent->ppi)
133fcc222c2SKatayama Hirofumi MZ                 goto Quit;
134fcc222c2SKatayama Hirofumi MZ         }
135fcc222c2SKatayama Hirofumi MZ 
136fcc222c2SKatayama Hirofumi MZ         pti->TIF_flags |= TIF_DISABLEIME;
137fcc222c2SKatayama Hirofumi MZ 
138fcc222c2SKatayama Hirofumi MZ         if (pti->spwndDefaultIme)
139fcc222c2SKatayama Hirofumi MZ         {
140fcc222c2SKatayama Hirofumi MZ             co_UserDestroyWindow(pti->spwndDefaultIme);
141fcc222c2SKatayama Hirofumi MZ             pti->spwndDefaultIme = NULL;
142fcc222c2SKatayama Hirofumi MZ         }
143fcc222c2SKatayama Hirofumi MZ     }
144fcc222c2SKatayama Hirofumi MZ 
145fcc222c2SKatayama Hirofumi MZ     ret = TRUE;
146fcc222c2SKatayama Hirofumi MZ 
147fcc222c2SKatayama Hirofumi MZ Quit:
148fcc222c2SKatayama Hirofumi MZ     UserLeave();
149fcc222c2SKatayama Hirofumi MZ     return ret;
150c2c66affSColin Finck }
151c2c66affSColin Finck 
152c2c66affSColin Finck DWORD
153c2c66affSColin Finck APIENTRY
154f4bc74edSKatayama Hirofumi MZ NtUserGetAppImeLevel(HWND hWnd)
155c2c66affSColin Finck {
156c2c66affSColin Finck     STUB;
157c2c66affSColin Finck     return 0;
158c2c66affSColin Finck }
159c2c66affSColin Finck 
16036740ca9SKatayama Hirofumi MZ BOOL FASTCALL UserGetImeInfoEx(LPVOID pUnknown, PIMEINFOEX pInfoEx, IMEINFOEXCLASS SearchType)
16136740ca9SKatayama Hirofumi MZ {
16236740ca9SKatayama Hirofumi MZ     PKL pkl, pklHead;
16336740ca9SKatayama Hirofumi MZ 
16436740ca9SKatayama Hirofumi MZ     if (!gspklBaseLayout)
16536740ca9SKatayama Hirofumi MZ         return FALSE;
16636740ca9SKatayama Hirofumi MZ 
16736740ca9SKatayama Hirofumi MZ     pkl = pklHead = gspklBaseLayout;
16836740ca9SKatayama Hirofumi MZ 
16936740ca9SKatayama Hirofumi MZ     /* Find the matching entry from the list and get info */
17036740ca9SKatayama Hirofumi MZ     if (SearchType == ImeInfoExKeyboardLayout)
17136740ca9SKatayama Hirofumi MZ     {
17236740ca9SKatayama Hirofumi MZ         do
17336740ca9SKatayama Hirofumi MZ         {
17436740ca9SKatayama Hirofumi MZ             if (pInfoEx->hkl == pkl->hkl) /* Matched */
17536740ca9SKatayama Hirofumi MZ             {
17636740ca9SKatayama Hirofumi MZ                 if (!pkl->piiex)
17736740ca9SKatayama Hirofumi MZ                     break;
17836740ca9SKatayama Hirofumi MZ 
17936740ca9SKatayama Hirofumi MZ                 *pInfoEx = *pkl->piiex; /* Get */
18036740ca9SKatayama Hirofumi MZ                 return TRUE; /* Found */
18136740ca9SKatayama Hirofumi MZ             }
18236740ca9SKatayama Hirofumi MZ 
18336740ca9SKatayama Hirofumi MZ             pkl = pkl->pklNext;
18436740ca9SKatayama Hirofumi MZ         } while (pkl != pklHead);
18536740ca9SKatayama Hirofumi MZ     }
18636740ca9SKatayama Hirofumi MZ     else if (SearchType == ImeInfoExImeFileName)
18736740ca9SKatayama Hirofumi MZ     {
18836740ca9SKatayama Hirofumi MZ         do
18936740ca9SKatayama Hirofumi MZ         {
19036740ca9SKatayama Hirofumi MZ             if (pkl->piiex &&
19136740ca9SKatayama Hirofumi MZ                 _wcsnicmp(pkl->piiex->wszImeFile, pInfoEx->wszImeFile,
19236740ca9SKatayama Hirofumi MZ                           RTL_NUMBER_OF(pkl->piiex->wszImeFile)) == 0) /* Matched */
19336740ca9SKatayama Hirofumi MZ             {
19436740ca9SKatayama Hirofumi MZ                 *pInfoEx = *pkl->piiex; /* Get */
19536740ca9SKatayama Hirofumi MZ                 return TRUE; /* Found */
19636740ca9SKatayama Hirofumi MZ             }
19736740ca9SKatayama Hirofumi MZ 
19836740ca9SKatayama Hirofumi MZ             pkl = pkl->pklNext;
19936740ca9SKatayama Hirofumi MZ         } while (pkl != pklHead);
20036740ca9SKatayama Hirofumi MZ     }
20136740ca9SKatayama Hirofumi MZ     else
20236740ca9SKatayama Hirofumi MZ     {
20336740ca9SKatayama Hirofumi MZ         /* Do nothing */
20436740ca9SKatayama Hirofumi MZ     }
20536740ca9SKatayama Hirofumi MZ 
20636740ca9SKatayama Hirofumi MZ     return FALSE; /* Not found */
20736740ca9SKatayama Hirofumi MZ }
20836740ca9SKatayama Hirofumi MZ 
2094b038ec8SKatayama Hirofumi MZ BOOL
210c2c66affSColin Finck APIENTRY
211c2c66affSColin Finck NtUserGetImeInfoEx(
212c2c66affSColin Finck     PIMEINFOEX pImeInfoEx,
2134b038ec8SKatayama Hirofumi MZ     IMEINFOEXCLASS SearchType)
214c2c66affSColin Finck {
21536740ca9SKatayama Hirofumi MZ     IMEINFOEX ImeInfoEx;
21636740ca9SKatayama Hirofumi MZ     BOOL ret = FALSE;
21736740ca9SKatayama Hirofumi MZ 
21836740ca9SKatayama Hirofumi MZ     UserEnterShared();
21936740ca9SKatayama Hirofumi MZ 
22036740ca9SKatayama Hirofumi MZ     if (!IS_IMM_MODE())
22136740ca9SKatayama Hirofumi MZ         goto Quit;
22236740ca9SKatayama Hirofumi MZ 
22336740ca9SKatayama Hirofumi MZ     _SEH2_TRY
22436740ca9SKatayama Hirofumi MZ     {
22536740ca9SKatayama Hirofumi MZ         ProbeForWrite(pImeInfoEx, sizeof(*pImeInfoEx), 1);
22636740ca9SKatayama Hirofumi MZ         ImeInfoEx = *pImeInfoEx;
22736740ca9SKatayama Hirofumi MZ     }
22836740ca9SKatayama Hirofumi MZ     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
22936740ca9SKatayama Hirofumi MZ     {
23036740ca9SKatayama Hirofumi MZ         goto Quit;
23136740ca9SKatayama Hirofumi MZ     }
23236740ca9SKatayama Hirofumi MZ     _SEH2_END;
23336740ca9SKatayama Hirofumi MZ 
23436740ca9SKatayama Hirofumi MZ     ret = UserGetImeInfoEx(NULL, &ImeInfoEx, SearchType);
23536740ca9SKatayama Hirofumi MZ     if (ret)
23636740ca9SKatayama Hirofumi MZ     {
23736740ca9SKatayama Hirofumi MZ         _SEH2_TRY
23836740ca9SKatayama Hirofumi MZ         {
23936740ca9SKatayama Hirofumi MZ             *pImeInfoEx = ImeInfoEx;
24036740ca9SKatayama Hirofumi MZ         }
24136740ca9SKatayama Hirofumi MZ         _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
24236740ca9SKatayama Hirofumi MZ         {
24336740ca9SKatayama Hirofumi MZ             ret = FALSE;
24436740ca9SKatayama Hirofumi MZ         }
24536740ca9SKatayama Hirofumi MZ         _SEH2_END;
246c2c66affSColin Finck     }
247c2c66affSColin Finck 
24836740ca9SKatayama Hirofumi MZ Quit:
24936740ca9SKatayama Hirofumi MZ     UserLeave();
25036740ca9SKatayama Hirofumi MZ     return ret;
25136740ca9SKatayama Hirofumi MZ }
252c2c66affSColin Finck 
253c2c66affSColin Finck DWORD
254c2c66affSColin Finck APIENTRY
255c2c66affSColin Finck NtUserSetAppImeLevel(
256c2c66affSColin Finck     DWORD dwUnknown1,
257c2c66affSColin Finck     DWORD dwUnknown2)
258c2c66affSColin Finck {
259c2c66affSColin Finck     STUB;
260c2c66affSColin Finck     return 0;
261c2c66affSColin Finck }
262c2c66affSColin Finck 
263*1f446936SKatayama Hirofumi MZ BOOL FASTCALL UserSetImeInfoEx(LPVOID pUnknown, PIMEINFOEX pImeInfoEx)
264c2c66affSColin Finck {
265*1f446936SKatayama Hirofumi MZ     PKL pklHead, pkl;
266*1f446936SKatayama Hirofumi MZ 
267*1f446936SKatayama Hirofumi MZ     pkl = pklHead = gspklBaseLayout;
268*1f446936SKatayama Hirofumi MZ 
269*1f446936SKatayama Hirofumi MZ     do
270*1f446936SKatayama Hirofumi MZ     {
271*1f446936SKatayama Hirofumi MZ         if (pkl->hkl != pImeInfoEx->hkl)
272*1f446936SKatayama Hirofumi MZ         {
273*1f446936SKatayama Hirofumi MZ             pkl = pkl->pklNext;
274*1f446936SKatayama Hirofumi MZ             continue;
275*1f446936SKatayama Hirofumi MZ         }
276*1f446936SKatayama Hirofumi MZ 
277*1f446936SKatayama Hirofumi MZ         if (!pkl->piiex)
278*1f446936SKatayama Hirofumi MZ             return FALSE;
279*1f446936SKatayama Hirofumi MZ 
280*1f446936SKatayama Hirofumi MZ         if (!pkl->piiex->fLoadFlag)
281*1f446936SKatayama Hirofumi MZ             *pkl->piiex = *pImeInfoEx;
282*1f446936SKatayama Hirofumi MZ 
283*1f446936SKatayama Hirofumi MZ         return TRUE;
284*1f446936SKatayama Hirofumi MZ     } while (pkl != pklHead);
285*1f446936SKatayama Hirofumi MZ 
286*1f446936SKatayama Hirofumi MZ     return FALSE;
287*1f446936SKatayama Hirofumi MZ }
288*1f446936SKatayama Hirofumi MZ 
289*1f446936SKatayama Hirofumi MZ BOOL
290*1f446936SKatayama Hirofumi MZ APIENTRY
291*1f446936SKatayama Hirofumi MZ NtUserSetImeInfoEx(PIMEINFOEX pImeInfoEx)
292*1f446936SKatayama Hirofumi MZ {
293*1f446936SKatayama Hirofumi MZ     BOOL ret = FALSE;
294*1f446936SKatayama Hirofumi MZ     IMEINFOEX ImeInfoEx;
295*1f446936SKatayama Hirofumi MZ 
296*1f446936SKatayama Hirofumi MZ     UserEnterExclusive();
297*1f446936SKatayama Hirofumi MZ 
298*1f446936SKatayama Hirofumi MZ     if (!IS_IMM_MODE())
299*1f446936SKatayama Hirofumi MZ         goto Quit;
300*1f446936SKatayama Hirofumi MZ 
301*1f446936SKatayama Hirofumi MZ     _SEH2_TRY
302*1f446936SKatayama Hirofumi MZ     {
303*1f446936SKatayama Hirofumi MZ         ProbeForRead(pImeInfoEx, sizeof(*pImeInfoEx), 1);
304*1f446936SKatayama Hirofumi MZ         ImeInfoEx = *pImeInfoEx;
305*1f446936SKatayama Hirofumi MZ     }
306*1f446936SKatayama Hirofumi MZ     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
307*1f446936SKatayama Hirofumi MZ     {
308*1f446936SKatayama Hirofumi MZ         goto Quit;
309*1f446936SKatayama Hirofumi MZ     }
310*1f446936SKatayama Hirofumi MZ     _SEH2_END;
311*1f446936SKatayama Hirofumi MZ 
312*1f446936SKatayama Hirofumi MZ     ret = UserSetImeInfoEx(NULL, &ImeInfoEx);
313*1f446936SKatayama Hirofumi MZ 
314*1f446936SKatayama Hirofumi MZ Quit:
315*1f446936SKatayama Hirofumi MZ     UserLeave();
316*1f446936SKatayama Hirofumi MZ     return ret;
317c2c66affSColin Finck }
318c2c66affSColin Finck 
319c2c66affSColin Finck DWORD APIENTRY
320692a30a8SKatayama Hirofumi MZ NtUserSetImeOwnerWindow(PIMEINFOEX pImeInfoEx, BOOL fFlag)
321c2c66affSColin Finck {
322c2c66affSColin Finck    STUB
323c2c66affSColin Finck    return 0;
324c2c66affSColin Finck }
325c2c66affSColin Finck 
3263d78601fSKatayama Hirofumi MZ PVOID
3273d78601fSKatayama Hirofumi MZ AllocInputContextObject(PDESKTOP pDesk,
3283d78601fSKatayama Hirofumi MZ                         PTHREADINFO pti,
3293d78601fSKatayama Hirofumi MZ                         SIZE_T Size,
3303d78601fSKatayama Hirofumi MZ                         PVOID* HandleOwner)
3313d78601fSKatayama Hirofumi MZ {
3323d78601fSKatayama Hirofumi MZ     PTHRDESKHEAD ObjHead;
3333d78601fSKatayama Hirofumi MZ 
3343d78601fSKatayama Hirofumi MZ     ASSERT(Size > sizeof(*ObjHead));
3353d78601fSKatayama Hirofumi MZ     ASSERT(pti != NULL);
3363d78601fSKatayama Hirofumi MZ 
3373d78601fSKatayama Hirofumi MZ     ObjHead = UserHeapAlloc(Size);
3383d78601fSKatayama Hirofumi MZ     if (!ObjHead)
3393d78601fSKatayama Hirofumi MZ         return NULL;
3403d78601fSKatayama Hirofumi MZ 
3413d78601fSKatayama Hirofumi MZ     RtlZeroMemory(ObjHead, Size);
3423d78601fSKatayama Hirofumi MZ 
3433d78601fSKatayama Hirofumi MZ     ObjHead->pSelf = ObjHead;
3443d78601fSKatayama Hirofumi MZ     ObjHead->rpdesk = pDesk;
3453d78601fSKatayama Hirofumi MZ     ObjHead->pti = pti;
3463d78601fSKatayama Hirofumi MZ     IntReferenceThreadInfo(pti);
3473d78601fSKatayama Hirofumi MZ     *HandleOwner = pti;
3483d78601fSKatayama Hirofumi MZ     pti->ppi->UserHandleCount++;
3493d78601fSKatayama Hirofumi MZ 
3503d78601fSKatayama Hirofumi MZ     return ObjHead;
3513d78601fSKatayama Hirofumi MZ }
3523d78601fSKatayama Hirofumi MZ 
3533d78601fSKatayama Hirofumi MZ VOID UserFreeInputContext(PVOID Object)
3543d78601fSKatayama Hirofumi MZ {
3553d78601fSKatayama Hirofumi MZ     PIMC pIMC = Object, pImc0;
356757bed81SKatayama Hirofumi MZ     PTHREADINFO pti;
3573d78601fSKatayama Hirofumi MZ 
358757bed81SKatayama Hirofumi MZ     if (!pIMC)
359757bed81SKatayama Hirofumi MZ         return;
3603d78601fSKatayama Hirofumi MZ 
361757bed81SKatayama Hirofumi MZ     pti = pIMC->head.pti;
362757bed81SKatayama Hirofumi MZ 
363757bed81SKatayama Hirofumi MZ     /* Find the IMC in the list and remove it */
3643d78601fSKatayama Hirofumi MZ     for (pImc0 = pti->spDefaultImc; pImc0; pImc0 = pImc0->pImcNext)
3653d78601fSKatayama Hirofumi MZ     {
3663d78601fSKatayama Hirofumi MZ         if (pImc0->pImcNext == pIMC)
3673d78601fSKatayama Hirofumi MZ         {
3683d78601fSKatayama Hirofumi MZ             pImc0->pImcNext = pIMC->pImcNext;
3693d78601fSKatayama Hirofumi MZ             break;
3703d78601fSKatayama Hirofumi MZ         }
3713d78601fSKatayama Hirofumi MZ     }
3723d78601fSKatayama Hirofumi MZ 
373757bed81SKatayama Hirofumi MZ     UserHeapFree(pIMC);
3743d78601fSKatayama Hirofumi MZ 
3753d78601fSKatayama Hirofumi MZ     pti->ppi->UserHandleCount--;
3763d78601fSKatayama Hirofumi MZ     IntDereferenceThreadInfo(pti);
3773d78601fSKatayama Hirofumi MZ }
3783d78601fSKatayama Hirofumi MZ 
3793d78601fSKatayama Hirofumi MZ BOOLEAN UserDestroyInputContext(PVOID Object)
3803d78601fSKatayama Hirofumi MZ {
3813d78601fSKatayama Hirofumi MZ     PIMC pIMC = Object;
382757bed81SKatayama Hirofumi MZ     if (pIMC)
383757bed81SKatayama Hirofumi MZ     {
384757bed81SKatayama Hirofumi MZ         UserMarkObjectDestroy(pIMC);
3853d78601fSKatayama Hirofumi MZ         UserDeleteObject(pIMC->head.h, TYPE_INPUTCONTEXT);
386757bed81SKatayama Hirofumi MZ     }
3873d78601fSKatayama Hirofumi MZ     return TRUE;
3883d78601fSKatayama Hirofumi MZ }
3893d78601fSKatayama Hirofumi MZ 
3903d78601fSKatayama Hirofumi MZ BOOL APIENTRY NtUserDestroyInputContext(HIMC hIMC)
3913d78601fSKatayama Hirofumi MZ {
3923d78601fSKatayama Hirofumi MZ     PIMC pIMC;
3933d78601fSKatayama Hirofumi MZ     BOOL ret = FALSE;
3943d78601fSKatayama Hirofumi MZ 
3953d78601fSKatayama Hirofumi MZ     UserEnterExclusive();
3963d78601fSKatayama Hirofumi MZ 
3973d78601fSKatayama Hirofumi MZ     if (!(gpsi->dwSRVIFlags & SRVINFO_IMM32))
3983d78601fSKatayama Hirofumi MZ     {
3993d78601fSKatayama Hirofumi MZ         EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
4003d78601fSKatayama Hirofumi MZ         UserLeave();
4013d78601fSKatayama Hirofumi MZ         return FALSE;
4023d78601fSKatayama Hirofumi MZ     }
4033d78601fSKatayama Hirofumi MZ 
4043d78601fSKatayama Hirofumi MZ     pIMC = UserGetObject(gHandleTable, hIMC, TYPE_INPUTCONTEXT);
4053d78601fSKatayama Hirofumi MZ     if (pIMC)
4063d78601fSKatayama Hirofumi MZ         ret = UserDereferenceObject(pIMC);
4073d78601fSKatayama Hirofumi MZ 
4083d78601fSKatayama Hirofumi MZ     UserLeave();
4093d78601fSKatayama Hirofumi MZ     return ret;
4103d78601fSKatayama Hirofumi MZ }
411c2c66affSColin Finck 
412c2c66affSColin Finck /* EOF */
413