Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

848 lines
23 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // File: dimm.cpp
  4. //
  5. // Contents: CActiveIMM methods without win32 mappings.
  6. //
  7. //----------------------------------------------------------------------------
  8. #include "private.h"
  9. #include "cdimm.h"
  10. #include "globals.h"
  11. #include "util.h"
  12. //+---------------------------------------------------------------------------
  13. //
  14. // ctor
  15. //
  16. //----------------------------------------------------------------------------
  17. CActiveIMM::CActiveIMM()
  18. {
  19. _cRef = 1;
  20. }
  21. //+---------------------------------------------------------------------------
  22. //
  23. // _Init
  24. //
  25. //----------------------------------------------------------------------------
  26. HRESULT CActiveIMM::_Init()
  27. {
  28. extern HRESULT CIME_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj);
  29. HRESULT hr;
  30. if (FAILED(hr=CIME_CreateInstance(NULL, IID_IActiveIME_Private, (void **)&_pActiveIME)))
  31. {
  32. _pActiveIME = NULL;
  33. return hr;
  34. }
  35. _pActiveIME->ConnectIMM(this);
  36. _InputContext._Init(_pActiveIME);
  37. _ConnectTIM(_pActiveIME);
  38. return hr;
  39. }
  40. //+---------------------------------------------------------------------------
  41. //
  42. // dtor
  43. //
  44. //----------------------------------------------------------------------------
  45. CActiveIMM::~CActiveIMM()
  46. {
  47. //
  48. // unload the hooks
  49. //
  50. _UninitHooks();
  51. POSITION pos = _mapWndFocus.GetStartPosition();
  52. int index;
  53. for (index = 0; index < _mapWndFocus.GetCount(); index++) {
  54. HWND hWnd;
  55. ITfDocumentMgr* pdim;
  56. _mapWndFocus.GetNextAssoc(pos, hWnd, pdim);
  57. if (pdim)
  58. {
  59. pdim->Release();
  60. }
  61. }
  62. if (GetTimP())
  63. {
  64. _UnconnectTIM();
  65. }
  66. if (_pActiveIME != NULL)
  67. {
  68. _pActiveIME->UnconnectIMM();
  69. SafeReleaseClear(_pActiveIME);
  70. }
  71. IMTLS_SetActiveIMM(NULL);
  72. }
  73. //+---------------------------------------------------------------------------
  74. //
  75. // IsRealIme
  76. //
  77. //----------------------------------------------------------------------------
  78. inline BOOL _IsIMEHKL(HKL hkl)
  79. {
  80. return ((((DWORD)(UINT_PTR)hkl) & 0xf0000000) == 0xe0000000) ? TRUE : FALSE;
  81. }
  82. BOOL CActiveIMM::_IsRealIme(HKL hkl)
  83. {
  84. if (! hkl) {
  85. HRESULT hr = _GetKeyboardLayout(&hkl);
  86. if (FAILED(hr))
  87. return FALSE;
  88. }
  89. if (!_IsIMEHKL(hkl))
  90. return FALSE;
  91. BOOL fRet;
  92. if (_RealImeList.Lookup(hkl, fRet))
  93. return fRet;
  94. char szDesc[MAX_PATH +1];
  95. char szDumbDesc[MAX_PATH +1];
  96. UINT uCopied;
  97. if (FAILED(Imm32_GetDescription(hkl, ARRAYSIZE(szDesc), (CHARAW*)szDesc, &uCopied, FALSE)))
  98. return FALSE;
  99. szDesc[ARRAYSIZE(szDesc) -1] = '\0';
  100. wsprintf(szDumbDesc, "hkl%04x", LOWORD((UINT_PTR)hkl));
  101. fRet = lstrcmp(szDumbDesc, szDesc) ? TRUE : FALSE;
  102. _RealImeList.SetAt(hkl, fRet);
  103. return fRet;
  104. }
  105. HRESULT CActiveIMM::IsRealImePublic(BOOL *pfReal)
  106. {
  107. if (pfReal)
  108. {
  109. *pfReal = _IsRealIme(0);
  110. }
  111. return S_OK;
  112. }
  113. //+---------------------------------------------------------------------------
  114. //
  115. // QueryService
  116. //
  117. //----------------------------------------------------------------------------
  118. HRESULT CActiveIMM::QueryService(REFGUID guidService, REFIID riid, void **ppv)
  119. {
  120. HRESULT hr;
  121. IServiceProvider* pISP;
  122. Assert(ppv != NULL && *ppv == NULL);
  123. hr = E_FAIL;
  124. if (_pActiveIME->QueryInterface(IID_IServiceProvider, (void**)&pISP) == S_OK)
  125. {
  126. hr = pISP->QueryService(guidService, riid, ppv);
  127. pISP->Release();
  128. }
  129. return hr;
  130. }
  131. //+---------------------------------------------------------------------------
  132. //
  133. // _GetKeyboardLayout
  134. //
  135. //----------------------------------------------------------------------------
  136. HRESULT CActiveIMM::_GetKeyboardLayout(HKL* phkl)
  137. {
  138. extern HRESULT CAImmProfile_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj);
  139. HRESULT hr;
  140. if (_IsAlreadyActivate())
  141. {
  142. //
  143. // Already called IActiveIMMApp::Activate
  144. //
  145. if (_AImeProfile == NULL) {
  146. hr = CAImmProfile_CreateInstance(NULL, IID_IAImeProfile, (void**)&_AImeProfile);
  147. if (FAILED(hr)) {
  148. TraceMsg(TF_ERROR, "CreateInstance(CAImeProfile) failed");
  149. return hr;
  150. }
  151. }
  152. return _AImeProfile->GetKeyboardLayout(phkl);
  153. }
  154. else {
  155. //
  156. // Not yet called IActiveIMMApp::Activate
  157. // or
  158. // called IActiveIMMApp::Deactivate
  159. //
  160. if (_AImeProfile == NULL) {
  161. hr = CAImmProfile_CreateInstance(NULL, IID_IAImeProfile, (void**)&_AImeProfile);
  162. if (FAILED(hr)) {
  163. TraceMsg(TF_ERROR, "CreateInstance(CAImeProfile) failed");
  164. return hr;
  165. }
  166. hr = _AImeProfile->GetKeyboardLayout(phkl);
  167. //
  168. // Prevent memory leak when not ready Activate.
  169. //
  170. _AImeProfile->Release();
  171. _AImeProfile = NULL;
  172. //
  173. return hr;
  174. }
  175. else {
  176. return _AImeProfile->GetKeyboardLayout(phkl);
  177. }
  178. }
  179. }
  180. //+---------------------------------------------------------------------------
  181. //
  182. // _ImeSelectHandler
  183. //
  184. //----------------------------------------------------------------------------
  185. LRESULT CActiveIMM::_ImeSelectHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL fUnicode, HIMC hIMC)
  186. /*
  187. * If return TRUE: no call previous window procedure of IME window class.
  188. * In case of CCiceroIME::ActivateLayout/DeactivateLayout, return value might be
  189. * TRUE.
  190. * Otherwise, WM_IME_SELECT become from another module. In this case, should be
  191. * call previous window proc.
  192. */
  193. {
  194. //
  195. // on FE-Win98, IMS_ACTIVATETHREADLAYOUT needs to be generate at ImeSelect.
  196. // otherwise we may update InputContext before IME get ImeSelect(FALSE);
  197. //
  198. if (wParam && !IsOnNT() && IsOnImm())
  199. _DefaultIMEWindow.SendIMEMessage(WM_IME_SYSTEM, (WPARAM)IMS_ACTIVATETHREADLAYOUT, lParam, IsWindowUnicode(_hFocusWnd), FALSE);
  200. if (!_IsRealIme((HKL)lParam)) {
  201. /*
  202. * We must re-create UI window of newly selected IME.
  203. */
  204. if ((BOOL)wParam == TRUE) {
  205. //
  206. // Create IME UI window.
  207. //
  208. if (_UIWindow.CreateUIWindow((HKL)lParam)) {
  209. //
  210. // Set context and send notification to UI window.
  211. //
  212. _UIWindow.SetUIWindowContext(hIMC);
  213. _UIWindow.SendUIMessage(uMsg, wParam, lParam, fUnicode);
  214. }
  215. }
  216. else {
  217. _UIWindow.SendUIMessage(uMsg, wParam, lParam, fUnicode);
  218. _UIWindow.DestroyUIWindow();
  219. }
  220. return TRUE;
  221. }
  222. else if (_DefaultIMEWindow.IsAIMEHandler())
  223. return TRUE;
  224. else
  225. return FALSE;
  226. }
  227. //+---------------------------------------------------------------------------
  228. //
  229. // _ImeWndFinalDestroyHandler
  230. //
  231. //----------------------------------------------------------------------------
  232. void CActiveIMM::_ImeWndFinalDestroyHandler()
  233. {
  234. if (!_IsRealIme()) {
  235. //
  236. // Destroy IME UI window.
  237. //
  238. _UIWindow.DestroyUIWindow();
  239. }
  240. }
  241. //+---------------------------------------------------------------------------
  242. //
  243. // _ActivateLayout
  244. //
  245. //----------------------------------------------------------------------------
  246. void CActiveIMM::_ActivateLayout(HKL hSelKL, HKL hUnSelKL)
  247. {
  248. BOOL fUnicode = IsWindowUnicode(_hFocusWnd);
  249. BOOL bIsRealIme = _IsRealIme(hSelKL);
  250. /*
  251. * Select input context(s).
  252. */
  253. SCE sce;
  254. sce.hSelKL = hSelKL;
  255. sce.hUnSelKL = hUnSelKL;
  256. _InputContext.EnumInputContext(0, _SelectContextProc, (LPARAM)&sce);
  257. if (! bIsRealIme || ! IsOnImm()) {
  258. if (hSelKL == NULL) {
  259. HRESULT hr = _GetKeyboardLayout(&hSelKL);
  260. }
  261. _DefaultIMEWindow.SendIMEMessage(WM_IME_SELECT, TRUE, (LPARAM)(hSelKL), fUnicode);
  262. }
  263. }
  264. //+---------------------------------------------------------------------------
  265. //
  266. // _DeactivateLayout
  267. //
  268. //----------------------------------------------------------------------------
  269. void CActiveIMM::_DeactivateLayout(HKL hSelKL, HKL hUnSelKL)
  270. {
  271. BOOL fUnicode = IsWindowUnicode(_hFocusWnd);
  272. BOOL bIsRealIme = _IsRealIme(hUnSelKL);
  273. if ((! bIsRealIme || ! IsOnImm()) &&
  274. (hUnSelKL != hSelKL ||
  275. (hUnSelKL == NULL && hSelKL == NULL))) {
  276. #ifdef UNSELECTCHECK
  277. //
  278. // If hSelKL is real IME, All hIMC is already initialized by the IME
  279. // we can not touch them from now on. We should stop doing in next
  280. // NotifyIME calls.
  281. //
  282. if (_IsRealIme(hSelKL) && !IsOnNT())
  283. {
  284. _InputContext.EnumInputContext(0, _UnSelectCheckProc, 0);
  285. }
  286. #endif UNSELECTCHECK
  287. DWORD dwCPS = _GetIMEProperty(PROP_IME_PROPERTY) & IME_PROP_COMPLETE_ON_UNSELECT ? CPS_COMPLETE : CPS_CANCEL;
  288. _InputContext.EnumInputContext(0, _NotifyIMEProc, dwCPS);
  289. if (hUnSelKL == NULL) {
  290. HRESULT hr = _GetKeyboardLayout(&hUnSelKL);
  291. }
  292. _DefaultIMEWindow.SendIMEMessage(WM_IME_SELECT, FALSE, (LPARAM)(hUnSelKL), fUnicode);
  293. }
  294. /*
  295. * Unselect input context(s).
  296. */
  297. SCE sce;
  298. sce.hSelKL = hSelKL;
  299. sce.hUnSelKL = hUnSelKL;
  300. _InputContext.EnumInputContext(0, _UnSelectContextProc, (LPARAM)&sce);
  301. }
  302. //+---------------------------------------------------------------------------
  303. //
  304. // _InitHooks
  305. //
  306. //----------------------------------------------------------------------------
  307. BOOL CActiveIMM::_InitHooks()
  308. {
  309. GetTimP()->SetSysHookSink(this);
  310. DWORD dwThreadId = GetCurrentThreadId();
  311. #if 0
  312. if (!_hHook[TH_GETMSG]) {
  313. _hHook[TH_GETMSG] = SetWindowsHookEx(WH_GETMESSAGE, _GetMsgProc, NULL, dwThreadId);
  314. }
  315. #endif
  316. #ifdef CALLWNDPROC_HOOK
  317. if (!_hHook[TH_WNDPROC]) {
  318. _hHook[TH_WNDPROC] = SetWindowsHookEx(WH_CALLWNDPROC, _CallWndProc, NULL, dwThreadId);
  319. }
  320. #endif // CALLWNDPROC_HOOK
  321. #ifdef CALLWNDPROC_HOOK
  322. if (!_hHook[TH_DEFIMEWNDPROC] &&
  323. _DefaultIMEWindow.IsNeedRecovIMEWndProc())
  324. #else
  325. if (!_hHook[TH_DEFIMEWNDPROC])
  326. #endif // CALLWNDPROC_HOOK
  327. {
  328. _hHook[TH_DEFIMEWNDPROC] = SetWindowsHookEx(WH_CALLWNDPROCRET,
  329. _DefImeWnd_CallWndProc,
  330. NULL,
  331. dwThreadId);
  332. }
  333. #if 0
  334. if (g_uACP != 932 && g_uACP != 949 && g_uACP != 950 && g_uACP != 936 &&
  335. ! hShellHook) {
  336. hShellHook = SetWindowsHookEx(WH_SHELL, _ShellProc, NULL, dwThreadId);
  337. }
  338. #endif
  339. return TRUE;
  340. }
  341. //+---------------------------------------------------------------------------
  342. //
  343. // _UninitHooks
  344. //
  345. //----------------------------------------------------------------------------
  346. void CActiveIMM::_UninitHooks()
  347. {
  348. #if 0
  349. if (_hHook[TH_GETMSG]) {
  350. UnhookWindowsHookEx(_hHook[TH_GETMSG]);
  351. _hHook[TH_GETMSG] = NULL;
  352. }
  353. #endif
  354. #ifdef CALLWNDPROC_HOOK
  355. if (_hHook[TH_WNDPROC]) {
  356. UnhookWindowsHookEx(_hHook[TH_WNDPROC]);
  357. _hHook[TH_WNDPROC] = NULL;
  358. }
  359. #endif // CALLWNDPROC_HOOK
  360. if (_hHook[TH_DEFIMEWNDPROC]) {
  361. UnhookWindowsHookEx(_hHook[TH_DEFIMEWNDPROC]);
  362. _hHook[TH_DEFIMEWNDPROC] = NULL;
  363. }
  364. #if 0
  365. if (g_uACP != 932 && g_uACP != 949 && g_uACP != 950 && g_uACP != 936 &&
  366. hShellHook != NULL) {
  367. UnhookWindowsHookEx(hShellHook);
  368. hShellHook = NULL;
  369. }
  370. #endif
  371. if (GetTimP())
  372. {
  373. GetTimP()->SetSysHookSink(NULL);
  374. }
  375. }
  376. //+---------------------------------------------------------------------------
  377. //
  378. // _OnImeSelect
  379. //
  380. //----------------------------------------------------------------------------
  381. void CActiveIMM::_OnImeSelect(HKL hSelKL)
  382. {
  383. if (!_IsRealIme(hSelKL))
  384. {
  385. // Don't check IMM32
  386. _DefaultIMEWindow.SendIMEMessage(WM_IME_SELECT, TRUE, (LPARAM)(hSelKL), IsWindowUnicode(_hFocusWnd), FALSE);
  387. }
  388. }
  389. //+---------------------------------------------------------------------------
  390. //
  391. // _OnImeUnselect
  392. //
  393. //----------------------------------------------------------------------------
  394. void CActiveIMM::_OnImeUnselect(HKL hUnSelKL)
  395. {
  396. if (!_IsRealIme(hUnSelKL))
  397. {
  398. // Don't check IMM32
  399. _DefaultIMEWindow.SendIMEMessage(WM_IME_SELECT, FALSE, (LPARAM)(hUnSelKL), IsWindowUnicode(_hFocusWnd), FALSE);
  400. }
  401. }
  402. //+---------------------------------------------------------------------------
  403. //
  404. // _OnImeActivateThreadLayout
  405. //
  406. //----------------------------------------------------------------------------
  407. void CActiveIMM::_OnImeActivateThreadLayout(HKL hSelKL)
  408. {
  409. //
  410. // on FE-Win98, IMS_ACTIVATETHREADLAYOUT needs to be generate at ImeSelect.
  411. // otherwise we may update InputContext before IME get ImeSelect(FALSE);
  412. //
  413. if (!IsOnNT() && IsOnImm())
  414. return;
  415. // Don't check IMM32
  416. _DefaultIMEWindow.SendIMEMessage(WM_IME_SYSTEM, (WPARAM)IMS_ACTIVATETHREADLAYOUT, (LPARAM)(hSelKL), IsWindowUnicode(_hFocusWnd), FALSE);
  417. }
  418. //+---------------------------------------------------------------------------
  419. //
  420. // _AImeAssociateFocus
  421. //
  422. //----------------------------------------------------------------------------
  423. HRESULT CActiveIMM::_AImeAssociateFocus(HWND hWnd, HIMC hIMC, DWORD dwFlags)
  424. {
  425. if (hIMC)
  426. {
  427. DIMM_IMCLock lpIMC(hIMC);
  428. if (lpIMC.Invalid())
  429. return E_FAIL;
  430. lpIMC->hWnd = hWnd;
  431. }
  432. return _pActiveIME->AssociateFocus(hWnd, hIMC, dwFlags);
  433. }
  434. //+---------------------------------------------------------------------------
  435. //
  436. // _ResizePrivateIMCC
  437. //
  438. //----------------------------------------------------------------------------
  439. HRESULT CActiveIMM::_ResizePrivateIMCC(IN HIMC hIMC, IN DWORD dwPrivateSize)
  440. {
  441. /*
  442. * Resize private IMCC method.
  443. *
  444. * If IsRealIme() was true, should not resize private IMCC to ActiveIME's size.
  445. *
  446. */
  447. if (!_IsRealIme())
  448. return _InputContext.ResizePrivateIMCC(hIMC, dwPrivateSize);
  449. else
  450. return S_OK;
  451. }
  452. //+---------------------------------------------------------------------------
  453. //
  454. // _GetIMEWndClassName
  455. //
  456. //----------------------------------------------------------------------------
  457. DWORD CActiveIMM::_GetIMEWndClassName(HKL hKL, LPWSTR lpsz, DWORD dwBufLen, UINT_PTR *pulPrivate)
  458. {
  459. return (!_IsRealIme(hKL)) ? _GetIMEWndClassName(lpsz, dwBufLen, pulPrivate)
  460. : 0L;
  461. }
  462. DWORD CActiveIMM::_GetIMEWndClassName(LPWSTR lpsz, DWORD dwBufLen, UINT_PTR *pulPrivate)
  463. {
  464. DWORD len = wcslen(_IMEInfoEx.achWndClass);
  465. if (lpsz == NULL || dwBufLen < len) {
  466. return len;
  467. }
  468. else {
  469. wcscpy(lpsz, _IMEInfoEx.achWndClass);
  470. *pulPrivate = _IMEInfoEx.dwPrivate;
  471. }
  472. return len;
  473. }
  474. //+---------------------------------------------------------------------------
  475. //
  476. // _CallWindowProc
  477. //
  478. //----------------------------------------------------------------------------
  479. LRESULT CActiveIMM::_CallWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  480. {
  481. return _DefaultIMEWindow.CallWindowProc(hWnd, uMsg, wParam, lParam);
  482. }
  483. //+---------------------------------------------------------------------------
  484. //
  485. // _SendUIMessage
  486. //
  487. //----------------------------------------------------------------------------
  488. LRESULT CActiveIMM::_SendUIMessage(UINT Msg, WPARAM wParam, LPARAM lParam, BOOL fUnicode)
  489. {
  490. return (!_IsRealIme()) ? _UIWindow.SendUIMessage(Msg, wParam, lParam, fUnicode)
  491. : 0L;
  492. }
  493. //+---------------------------------------------------------------------------
  494. //
  495. // _SetHookWndList
  496. //
  497. //----------------------------------------------------------------------------
  498. BOOL CActiveIMM::_SetHookWndList(HWND hwnd)
  499. {
  500. TCHAR achMyClassName[MAX_PATH + 1];
  501. int lenMyClassName = ::GetClassName(hwnd, achMyClassName, ARRAYSIZE(achMyClassName) - 1);
  502. achMyClassName[ARRAYSIZE(achMyClassName) -1] = TEXT('\0');
  503. if (lenMyClassName) {
  504. CString cls(achMyClassName);
  505. if (cls.CompareNoCase(TEXT("IME")) == 0) {
  506. _HookWndList.SetAt(hwnd, TRUE);
  507. return TRUE;
  508. }
  509. }
  510. DWORD dwStyle = GetClassLong(hwnd, GCL_STYLE);
  511. if (dwStyle & CS_IME) {
  512. _HookWndList.SetAt(hwnd, TRUE);
  513. return TRUE;
  514. }
  515. _HookWndList.SetAt(hwnd, FALSE);
  516. return FALSE;
  517. }
  518. //+---------------------------------------------------------------------------
  519. //
  520. // OnPreFocusDIM
  521. //
  522. //----------------------------------------------------------------------------
  523. HRESULT CActiveIMM::OnPreFocusDIM(HWND hWnd)
  524. {
  525. HIMC hIMC;
  526. if (SUCCEEDED(_InputContext.GetContext(hWnd, &hIMC)))
  527. {
  528. if (IsPresent(hWnd, TRUE))
  529. {
  530. if (_InputContext._IsDefaultContext(hIMC))
  531. {
  532. DIMM_IMCLock pIMC(hIMC);
  533. if (pIMC.Valid())
  534. {
  535. // set the hWnd since this is a default context
  536. pIMC->hWnd = hWnd;
  537. }
  538. }
  539. _AImeAssociateFocus(hWnd, hIMC, AIMMP_AFF_SETFOCUS);
  540. _SetMapWndFocus(hWnd);
  541. }
  542. else if (hIMC)
  543. {
  544. _AImeAssociateFocus(hWnd, hIMC, AIMMP_AFF_SETFOCUS | AIMMP_AFF_SETNULLDIM);
  545. }
  546. else
  547. {
  548. _AImeAssociateFocus(hWnd, NULL, AIMMP_AFF_SETFOCUS);
  549. }
  550. }
  551. else
  552. {
  553. _AImeAssociateFocus(hWnd, NULL, AIMMP_AFF_SETFOCUS);
  554. }
  555. return S_OK;
  556. }
  557. //+---------------------------------------------------------------------------
  558. //
  559. // OnSysKeybaordProc
  560. //
  561. //----------------------------------------------------------------------------
  562. STDAPI CActiveIMM::OnSysKeyboardProc(WPARAM wParam, LPARAM lParam)
  563. {
  564. HRESULT hr = S_FALSE;
  565. CActiveIMM *_this = GetTLS();
  566. if (_this == NULL)
  567. return hr;
  568. BOOL bIsRealIme = _IsRealIme();
  569. BOOL fNoOnTrans;
  570. if ((wParam != VK_PROCESSKEY) && !bIsRealIme)
  571. {
  572. // fNoOnTrans = (pTS->uMsgPumpOwnerRef == 0); // check this once so it doesn't get changed during the op
  573. fNoOnTrans = TRUE;
  574. if (HIWORD(lParam) & KF_UP)
  575. {
  576. // if this a key up event, clear the KF_REPEAT flag
  577. lParam &= ~(KF_REPEAT << 16);
  578. }
  579. hr = _this->_ProcessKey(&wParam, &lParam, fNoOnTrans);
  580. // wParam will be set 0 if _ProcessKey wants to eat it without consulting the ime
  581. // (It might also be converted to VK_HANJA, etc.)
  582. if (hr == S_OK && fNoOnTrans && wParam)
  583. {
  584. // nobody's using OnTranslateMessage to finish off the key now
  585. hr = _this->_ToAsciiEx(wParam, lParam);
  586. }
  587. }
  588. #ifdef CICERO_3564
  589. else if ((wParam == VK_PROCESSKEY) &&
  590. ! bIsRealIme)
  591. {
  592. /*
  593. * KOREAN:
  594. * Send VK_PROCESSKEY to finalize current composition string (NT4 behavior)
  595. * Post private message (WM_IME_SYSTEM::IMS_FINALIZE_COMPSTR) to let IMM finalize the composition string (NT5)
  596. */
  597. IMTLS *ptls = IMTLS_GetOrAlloc();
  598. if (ptls == NULL)
  599. return hr;
  600. if (ptls->pAImeProfile == NULL)
  601. return hr;
  602. LANGID langid;
  603. ptls->pAImeProfile->GetLangId(&langid);
  604. if (PRIMARYLANGID(langid) == LANG_KOREAN)
  605. {
  606. hr = _this->_ToAsciiEx(wParam, lParam);
  607. }
  608. }
  609. #endif // CICERO_3564
  610. return hr;
  611. }
  612. //+---------------------------------------------------------------------------
  613. //
  614. // _SendIMENotify
  615. //
  616. // Inform IME and Apps Wnd about the change of composition window.
  617. //----------------------------------------------------------------------------
  618. HRESULT CActiveIMM::_SendIMENotify(
  619. HIMC hImc,
  620. HWND hWnd,
  621. DWORD dwAction,
  622. DWORD dwIndex,
  623. DWORD dwValue,
  624. WPARAM wParam,
  625. LPARAM lParam
  626. )
  627. {
  628. if (dwAction != 0) {
  629. _AImeNotifyIME(hImc, dwAction, dwIndex, dwValue);
  630. }
  631. if (hWnd != NULL && wParam != 0) {
  632. SendMessage(hWnd, WM_IME_NOTIFY, wParam, lParam);
  633. }
  634. return S_OK;
  635. }
  636. //+---------------------------------------------------------------------------
  637. //
  638. // _GetIMEProperty
  639. //
  640. //----------------------------------------------------------------------------
  641. DWORD CActiveIMM::_GetIMEProperty(PROPERTY_TYPE iType)
  642. {
  643. switch (iType) {
  644. case PROP_PRIVATE_DATA_SIZE: return _IMEInfoEx.ImeInfo.dwPrivateDataSize; break;
  645. case PROP_IME_PROPERTY: return _IMEInfoEx.ImeInfo.fdwProperty; break;
  646. case PROP_CONVERSION_CAPS: return _IMEInfoEx.ImeInfo.fdwConversionCaps; break;
  647. case PROP_SENTENCE_CAPS: return _IMEInfoEx.ImeInfo.fdwSentenceCaps; break;
  648. case PROP_UI_CAPS: return _IMEInfoEx.ImeInfo.fdwUICaps; break;
  649. case PROP_SCS_CAPS: return _IMEInfoEx.ImeInfo.fdwSCSCaps; break;
  650. case PROP_SELECT_CAPS: return _IMEInfoEx.ImeInfo.fdwSelectCaps; break;
  651. default: return 0;
  652. }
  653. }
  654. //+---------------------------------------------------------------------------
  655. //
  656. // HideOrRestoreToolbarWnd
  657. //
  658. //----------------------------------------------------------------------------
  659. void CActiveIMM::HideOrRestoreToolbarWnd(BOOL fRestore)
  660. {
  661. ITfLangBarMgr *plbm;
  662. if (SUCCEEDED(TF_CreateLangBarMgr(&plbm)))
  663. {
  664. if (fRestore)
  665. {
  666. if (_dwPrevToolbarStatus)
  667. {
  668. plbm->ShowFloating(_dwPrevToolbarStatus);
  669. _dwPrevToolbarStatus = 0;
  670. }
  671. }
  672. else
  673. {
  674. if (SUCCEEDED(plbm->GetShowFloatingStatus(&_dwPrevToolbarStatus)))
  675. {
  676. BOOL fHide = TRUE;
  677. if (_dwPrevToolbarStatus & TF_SFT_DESKBAND)
  678. fHide = FALSE;
  679. //
  680. // mask for show/hide
  681. //
  682. _dwPrevToolbarStatus &= (TF_SFT_SHOWNORMAL |
  683. TF_SFT_DOCK |
  684. TF_SFT_MINIMIZED |
  685. TF_SFT_HIDDEN);
  686. if (fHide)
  687. plbm->ShowFloating(TF_SFT_HIDDEN);
  688. }
  689. }
  690. plbm->Release();
  691. }
  692. }
  693. //+---------------------------------------------------------------------------
  694. //
  695. // OnSysShellProc
  696. //
  697. //----------------------------------------------------------------------------
  698. STDAPI CActiveIMM::OnSysShellProc(int nCode, WPARAM wParam, LPARAM lParam)
  699. {
  700. HRESULT hr = S_FALSE;
  701. CActiveIMM *_this = GetTLS();
  702. if (_this == NULL)
  703. return hr;
  704. switch (nCode) {
  705. case HSHELL_LANGUAGE:
  706. if (IsOn98() || IsOn95()) {
  707. //
  708. // Windows 9x platform
  709. // Alternative of WM_IME_SYSTEM::IMS_ACTIVATETHREADLAYOUT
  710. //
  711. _this->_OnImeActivateThreadLayout((HKL)lParam);
  712. }
  713. break;
  714. }
  715. return hr;
  716. }