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