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.

627 lines
22 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // File: cdimm.h
  4. //
  5. // Contents: CActiveIMM
  6. //
  7. //----------------------------------------------------------------------------
  8. #ifndef CDIMM_H
  9. #define CDIMM_H
  10. #include "msctfp.h"
  11. #include "cimm32.h"
  12. #include "uiwnd.h"
  13. #include "context.h"
  14. #include "imewnd.h"
  15. #include "globals.h"
  16. typedef struct tagSELECTCONTEXT_ENUM SCE, *PSCE;
  17. #define CALLWNDPROC_HOOK
  18. /*
  19. * Windows hook
  20. */
  21. typedef enum {
  22. // array indices for thread hooks
  23. #if 0
  24. TH_GETMSG,
  25. #endif
  26. TH_DEFIMEWNDPROC,
  27. #ifdef CALLWNDPROC_HOOK
  28. TH_WNDPROC,
  29. #endif // CALLWNDPROC_HOOK
  30. TH_NUMHOOKS
  31. } HookType;
  32. typedef struct tagIMEINFOEX
  33. {
  34. IMEINFO ImeInfo; // IMEINFO structure.
  35. WCHAR achWndClass[16];
  36. DWORD dwPrivate;
  37. } IMEINFOEX;
  38. //+---------------------------------------------------------------------------
  39. //
  40. // CActiveIMM
  41. //
  42. //----------------------------------------------------------------------------
  43. class CActiveIMM : public IActiveIMMIME_Private,
  44. public ITfSysHookSink
  45. {
  46. public:
  47. CActiveIMM();
  48. ~CActiveIMM();
  49. //
  50. // IUnknown methods
  51. //
  52. STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj);
  53. STDMETHODIMP_(ULONG) AddRef(void);
  54. STDMETHODIMP_(ULONG) Release(void);
  55. //
  56. // IActiveIMMApp/IActiveIMM methods
  57. //
  58. /*
  59. * AIMM Input Context (hIMC) Methods.
  60. */
  61. STDMETHODIMP CreateContext(HIMC *phIMC);
  62. STDMETHODIMP DestroyContext(HIMC hIME);
  63. STDMETHODIMP AssociateContext(HWND hWnd, HIMC hIME, HIMC *phPrev);
  64. STDMETHODIMP AssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags);
  65. STDMETHODIMP GetContext(HWND hWnd, HIMC *phIMC);
  66. STDMETHODIMP ReleaseContext(HWND hWnd, HIMC hIMC);
  67. STDMETHODIMP GetIMCLockCount(HIMC hIMC, DWORD *pdwLockCount);
  68. STDMETHODIMP LockIMC(HIMC hIMC, INPUTCONTEXT **ppIMC);
  69. STDMETHODIMP UnlockIMC(HIMC hIMC);
  70. /*
  71. * AIMM Input Context Components (hIMCC) API Methods.
  72. */
  73. STDMETHODIMP CreateIMCC(DWORD dwSize, HIMCC *phIMCC);
  74. STDMETHODIMP DestroyIMCC(HIMCC hIMCC);
  75. STDMETHODIMP GetIMCCSize(HIMCC hIMCC, DWORD *pdwSize);
  76. STDMETHODIMP ReSizeIMCC(HIMCC hIMCC, DWORD dwSize, HIMCC *phIMCC);
  77. STDMETHODIMP GetIMCCLockCount(HIMCC hIMCC, DWORD *pdwLockCount);
  78. STDMETHODIMP LockIMCC(HIMCC hIMCC, void **ppv);
  79. STDMETHODIMP UnlockIMCC(HIMCC hIMCC);
  80. /*
  81. * AIMM Open Status API Methods
  82. */
  83. STDMETHODIMP GetOpenStatus(HIMC hIMC);
  84. STDMETHODIMP SetOpenStatus(HIMC hIMC, BOOL fOpen);
  85. /*
  86. * AIMM Conversion Status API Methods
  87. */
  88. STDMETHODIMP GetConversionStatus(HIMC hIMC, DWORD *lpfdwConversion, DWORD *lpfdwSentence);
  89. STDMETHODIMP SetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence);
  90. /*
  91. * AIMM Status Window Pos API Methods
  92. */
  93. STDMETHODIMP GetStatusWindowPos(HIMC hIMC, POINT *lpptPos);
  94. STDMETHODIMP SetStatusWindowPos(HIMC hIMC, POINT *lpptPos);
  95. /*
  96. * AIMM Composition String API Methods
  97. */
  98. STDMETHODIMP GetCompositionStringA(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LONG *plCopied, LPVOID lpBuf);
  99. STDMETHODIMP GetCompositionStringW(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LONG *plCopied, LPVOID lpBuf);
  100. STDMETHODIMP SetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwCompLen, LPVOID lpRead, DWORD dwReadLen);
  101. STDMETHODIMP SetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwCompLen, LPVOID lpRead, DWORD dwReadLen);
  102. /*
  103. * AIMM Composition Font API Methods
  104. */
  105. STDMETHODIMP GetCompositionFontA(HIMC hIMC, LOGFONTA *lplf);
  106. STDMETHODIMP GetCompositionFontW(HIMC hIMC, LOGFONTW *lplf);
  107. STDMETHODIMP SetCompositionFontA(HIMC hIMC, LOGFONTA *lplf);
  108. STDMETHODIMP SetCompositionFontW(HIMC hIMC, LOGFONTW *lplf);
  109. /*
  110. * AIMM Composition Window API Methods
  111. */
  112. STDMETHODIMP GetCompositionWindow(HIMC hIMC, COMPOSITIONFORM *lpCompForm);
  113. STDMETHODIMP SetCompositionWindow(HIMC hIMC, COMPOSITIONFORM *lpCompForm);
  114. /*
  115. * AIMM Candidate List API Methods
  116. */
  117. STDMETHODIMP GetCandidateListA(HIMC hIMC, DWORD dwIndex, UINT uBufLen, CANDIDATELIST *lpCandList, UINT *puCopied);
  118. STDMETHODIMP GetCandidateListW(HIMC hIMC, DWORD dwIndex, UINT uBufLen, CANDIDATELIST *lpCandList, UINT *puCopied);
  119. STDMETHODIMP GetCandidateListCountA(HIMC hIMC, DWORD *lpdwListSize, DWORD *pdwBufLen);
  120. STDMETHODIMP GetCandidateListCountW(HIMC hIMC, DWORD *lpdwListSize, DWORD *pdwBufLen);
  121. /*
  122. * AIMM Candidate Window API Methods
  123. */
  124. STDMETHODIMP GetCandidateWindow(HIMC hIMC, DWORD dwBufLen, CANDIDATEFORM *lpCandidate);
  125. STDMETHODIMP SetCandidateWindow(HIMC hIMC, CANDIDATEFORM *lpCandidate);
  126. /*
  127. * AIMM Guide Line API Methods
  128. */
  129. STDMETHODIMP GetGuideLineA(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LPSTR pBuf, DWORD *pdwResult);
  130. STDMETHODIMP GetGuideLineW(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LPWSTR pBuf, DWORD *pdwResult);
  131. /*
  132. * AIMM Notify IME API Method
  133. */
  134. STDMETHODIMP NotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue);
  135. /*
  136. * AIMM Menu Items API Methods
  137. */
  138. STDMETHODIMP GetImeMenuItemsA(HIMC hIMC, DWORD dwFlags, DWORD dwType, IMEMENUITEMINFOA *pImeParentMenu, IMEMENUITEMINFOA *pImeMenu, DWORD dwSize, DWORD *pdwResult);
  139. STDMETHODIMP GetImeMenuItemsW(HIMC hIMC, DWORD dwFlags, DWORD dwType, IMEMENUITEMINFOW *pImeParentMenu, IMEMENUITEMINFOW *pImeMenu, DWORD dwSize, DWORD *pdwResult);
  140. /*
  141. * AIMM Register Word API Methods
  142. */
  143. STDMETHODIMP RegisterWordA(HKL hKL, LPSTR lpszReading, DWORD dwStyle, LPSTR lpszRegister);
  144. STDMETHODIMP RegisterWordW(HKL hKL, LPWSTR lpszReading, DWORD dwStyle, LPWSTR lpszRegister);
  145. STDMETHODIMP UnregisterWordA(HKL hKL, LPSTR lpszReading, DWORD dwStyle, LPSTR lpszUnregister);
  146. STDMETHODIMP UnregisterWordW(HKL hKL, LPWSTR lpszReading, DWORD dwStyle, LPWSTR lpszUnregister);
  147. STDMETHODIMP EnumRegisterWordA(HKL hKL, LPSTR szReading, DWORD dwStyle, LPSTR szRegister, LPVOID lpData, IEnumRegisterWordA **pEnum);
  148. STDMETHODIMP EnumRegisterWordW(HKL hKL, LPWSTR szReading, DWORD dwStyle, LPWSTR szRegister, LPVOID lpData, IEnumRegisterWordW **pEnum);
  149. STDMETHODIMP GetRegisterWordStyleA(HKL hKL, UINT nItem, STYLEBUFA *lpStyleBuf, UINT *puCopied);
  150. STDMETHODIMP GetRegisterWordStyleW(HKL hKL, UINT nItem, STYLEBUFW *lpStyleBuf, UINT *puCopied);
  151. /*
  152. * AIMM Configuration API Methods.
  153. */
  154. STDMETHODIMP ConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDA *lpdata);
  155. STDMETHODIMP ConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDW *lpdata);
  156. STDMETHODIMP GetDescriptionA(HKL hKL, UINT uBufLen, LPSTR lpszDescription, UINT *puCopied);
  157. STDMETHODIMP GetDescriptionW(HKL hKL, UINT uBufLen, LPWSTR lpszDescription, UINT *puCopied);
  158. STDMETHODIMP GetIMEFileNameA(HKL hKL, UINT uBufLen, LPSTR lpszFileName, UINT *puCopied);
  159. STDMETHODIMP GetIMEFileNameW(HKL hKL, UINT uBufLen, LPWSTR lpszFileName, UINT *puCopied);
  160. STDMETHODIMP InstallIMEA(LPSTR lpszIMEFileName, LPSTR lpszLayoutText, HKL *phKL);
  161. STDMETHODIMP InstallIMEW(LPWSTR lpszIMEFileName, LPWSTR lpszLayoutText, HKL *phKL);
  162. STDMETHODIMP GetProperty(HKL hKL, DWORD fdwIndex, DWORD *pdwProperty);
  163. STDMETHODIMP IsIME(HKL hKL);
  164. // others
  165. STDMETHODIMP EscapeA(HKL hKL, HIMC hIMC, UINT uEscape, LPVOID lpData, LRESULT *plResult);
  166. STDMETHODIMP EscapeW(HKL hKL, HIMC hIMC, UINT uEscape, LPVOID lpData, LRESULT *plResult);
  167. STDMETHODIMP GetConversionListA(HKL hKL, HIMC hIMC, LPSTR lpSrc, UINT uBufLen, UINT uFlag, CANDIDATELIST *lpDst, UINT *puCopied);
  168. STDMETHODIMP GetConversionListW(HKL hKL, HIMC hIMC, LPWSTR lpSrc, UINT uBufLen, UINT uFlag, CANDIDATELIST *lpDst, UINT *puCopied);
  169. STDMETHODIMP GetDefaultIMEWnd(HWND hWnd, HWND *phDefWnd);
  170. STDMETHODIMP GetVirtualKey(HWND hWnd, UINT *puVirtualKey);
  171. STDMETHODIMP IsUIMessageA(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam);
  172. STDMETHODIMP IsUIMessageW(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam);
  173. // ime helper methods
  174. STDMETHODIMP GenerateMessage(HIMC hIMC);
  175. // hot key manipulation api's
  176. STDMETHODIMP GetHotKey(DWORD dwHotKeyID, UINT *puModifiers, UINT *puVKey, HKL *phKL);
  177. STDMETHODIMP SetHotKey(DWORD dwHotKeyID, UINT uModifiers, UINT uVKey, HKL hKL);
  178. STDMETHODIMP SimulateHotKey(HWND hWnd, DWORD dwHotKeyID);
  179. // win98/nt5 apis
  180. STDMETHODIMP DisableIME(DWORD idThread);
  181. STDMETHODIMP RequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
  182. STDMETHODIMP RequestMessageW(HIMC hIMC, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
  183. STDMETHODIMP EnumInputContext(DWORD idThread, IEnumInputContext **ppEnum);
  184. // methods without corresponding IMM APIs
  185. //
  186. // IActiveIMMApp methods
  187. //
  188. HRESULT Activate(BOOL fRestoreLayout);
  189. HRESULT Deactivate();
  190. HRESULT OnDefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
  191. //
  192. // ITfPreFocusDIM methods
  193. //
  194. STDMETHODIMP OnPreFocusDIM(HWND hWnd);
  195. STDMETHODIMP OnSysKeyboardProc(WPARAM wParam, LPARAM lParam);
  196. STDMETHODIMP OnSysShellProc(int nCode, WPARAM wParam, LPARAM lParam);
  197. HRESULT QueryService(REFGUID guidService, REFIID riid, void **ppv);
  198. //
  199. // IActiveIMMAppEx
  200. //
  201. STDMETHODIMP FilterClientWindowsEx(HWND hWnd, BOOL fGuidMap);
  202. STDMETHODIMP FilterClientWindows(ATOM *aaWindowClasses, UINT uSize, BOOL *aaGuidMap);
  203. STDMETHODIMP GetGuidAtom(HIMC hImc, BYTE bAttr, TfGuidAtom *pGuidAtom);
  204. STDMETHODIMP UnfilterClientWindowsEx(HWND hWnd);
  205. HRESULT SetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar)
  206. {
  207. if (!_pActiveIME)
  208. return E_FAIL;
  209. return _pActiveIME->SetThreadCompartmentValue(rguid, pvar);
  210. }
  211. HRESULT GetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar)
  212. {
  213. if (!_pActiveIME)
  214. return E_FAIL;
  215. return _pActiveIME->GetThreadCompartmentValue(rguid, pvar);
  216. }
  217. HRESULT _Init();
  218. void _ActivateLayout(HKL hSelKL = NULL, HKL hUnSelKL = NULL);
  219. void _DeactivateLayout(HKL hSelKL = NULL, HKL hUnSelKL = NULL);
  220. HRESULT _GetKeyboardLayout(HKL* phkl);
  221. HRESULT _AImeAssociateFocus(HWND hWnd, HIMC hIMC, DWORD dwFlags);
  222. BOOL _ContextLookup(HIMC hIMC, DWORD* pdwProcess, BOOL* pfUnicode = NULL)
  223. {
  224. return _InputContext.ContextLookup(hIMC, pdwProcess, pfUnicode);
  225. }
  226. BOOL _ContextLookup(HIMC hIMC, HWND* phImeWnd)
  227. {
  228. return _InputContext.ContextLookup(hIMC, phImeWnd);
  229. }
  230. void _ContextUpdate(HIMC hIMC, HWND& hImeWnd)
  231. {
  232. if (!_IsRealIme())
  233. {
  234. _InputContext.ContextUpdate(hIMC, hImeWnd);
  235. }
  236. }
  237. HRESULT GetContextInternal(HWND hWnd, HIMC *phIMC, BOOL fGetDefIMC);
  238. HRESULT _ResizePrivateIMCC(IN HIMC hIMC, IN DWORD dwPrivateSize);
  239. DWORD _GetIMEWndClassName(HKL hKL, LPWSTR lpsz, DWORD dwBufLen, UINT_PTR *pulPrivate);
  240. LRESULT _CallWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  241. LRESULT _ImeSelectHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL fUnicode, HIMC hIMC);
  242. void _ImeWndFinalDestroyHandler();
  243. LRESULT _SendUIMessage(UINT Msg, WPARAM wParam, LPARAM lParam, BOOL fUnicode = TRUE);
  244. BOOL _IsRealIme(HKL hkl = NULL);
  245. STDMETHODIMP IsRealImePublic(BOOL *pfReal);
  246. private:
  247. // windows hooks
  248. #if 0
  249. static LRESULT CALLBACK _GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam);
  250. #endif
  251. static LRESULT CALLBACK _CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
  252. // windows WH_CALLWNDPROCRET hook for Default IME Window
  253. static LRESULT CALLBACK _DefImeWnd_CallWndProc(int nCode, WPARAM wParam, LPARAM lParam);
  254. // EnumInputContext call back methods
  255. static BOOL _SelectContextProc(HIMC hIMC, LPARAM lParam);
  256. static BOOL _UnSelectContextProc(HIMC hIMC, LPARAM lParam);
  257. static BOOL _NotifyIMEProc(HIMC hIMC, LPARAM lParam);
  258. static BOOL _EnumContextProc(HIMC hIMC, LPARAM lParam);
  259. #ifdef UNSELECTCHECK
  260. static BOOL _UnSelectCheckProc(HIMC hIMC, LPARAM lParam);
  261. #endif UNSELECTCHECK
  262. HRESULT _ProcessKey(WPARAM *pwParam, LPARAM *plParam, BOOL fNoMsgPump);
  263. HRESULT _ToAsciiEx(WPARAM wParam, LPARAM lParam);
  264. void _KbdTouchUp(BYTE *abKbdState, WPARAM wParam, LPARAM lParam);
  265. void _AimmPostMessage(HWND, INT, LPTRANSMSG, DIMM_IMCLock&);
  266. void _AimmSendMessage(HWND, INT, LPTRANSMSG, DIMM_IMCLock&);
  267. void _AimmPostSendMessageA(HWND, UINT, WPARAM, LPARAM, DIMM_IMCLock&, BOOL fPost = FALSE);
  268. BOOL IsPresent(HWND hWnd, BOOL fExcludeAIMM)
  269. {
  270. BOOL fGuidMap;
  271. if (_mapFilterWndEx.Lookup(hWnd, fGuidMap)) {
  272. return TRUE;
  273. }
  274. if (g_ProcessIMM)
  275. {
  276. return g_ProcessIMM->_FilterList._IsPresent(hWnd, _mapWndFocus, fExcludeAIMM, GetAssociated(hWnd));
  277. }
  278. return FALSE;
  279. }
  280. BOOL IsGuidMapEnable(HWND hWnd)
  281. {
  282. if (_fEnableGuidMap) {
  283. BOOL fGuidMap;
  284. if (_mapFilterWndEx.Lookup(hWnd, fGuidMap)) {
  285. return fGuidMap;
  286. }
  287. if (g_ProcessIMM &&
  288. g_ProcessIMM->_FilterList._IsGuidMapEnable(hWnd, fGuidMap)) {
  289. return fGuidMap;
  290. }
  291. }
  292. return FALSE;
  293. }
  294. HIMC _GetActiveContext()
  295. {
  296. HIMC hIMC;
  297. if (_hFocusWnd == 0)
  298. return 0;
  299. return _InputContext.GetContext(_hFocusWnd, &hIMC) == S_OK ? hIMC : 0;
  300. }
  301. void _OnImeSelect(HKL hSelKL);
  302. void _OnImeUnselect(HKL hUnSelKL);
  303. void _OnImeActivateThreadLayout(HKL hSelKL);
  304. BOOL _InitHooks();
  305. void _UninitHooks();
  306. HRESULT _AImeSelect(HIMC hIMC, DWORD fSelect, BOOL bIsRealIme_SelKL = TRUE, BOOL bIsRealIme_UnSelKL = TRUE)
  307. {
  308. DWORD dwFlags = 0;
  309. if (hIMC == DEFAULT_HIMC)
  310. hIMC = _InputContext._GetDefaultHIMC();
  311. if (fSelect)
  312. dwFlags |= AIMMP_SE_SELECT;
  313. if (hIMC)
  314. {
  315. HRESULT hr;
  316. DIMM_IMCLock lpIMC(hIMC);
  317. if (FAILED(hr = lpIMC.GetResult()))
  318. return hr;
  319. if (IsPresent(lpIMC->hWnd, TRUE))
  320. dwFlags |= AIMMP_SE_ISPRESENT;
  321. }
  322. else
  323. {
  324. //
  325. // Select NULL-hIMC, aimm won't do nothing... So we don't need to
  326. // set this flag.
  327. //
  328. // dwFlags |= AIMMP_SE_ISPRESENT;
  329. }
  330. return _pActiveIME->SelectEx(hIMC, dwFlags, bIsRealIme_SelKL, bIsRealIme_UnSelKL);
  331. }
  332. #ifdef UNSELECTCHECK
  333. HRESULT _AImeUnSelectCheck(HIMC hIMC)
  334. {
  335. if (hIMC == DEFAULT_HIMC)
  336. hIMC = _InputContext._GetDefaultHIMC();
  337. return _pActiveIME->UnSelectCheck(hIMC);
  338. }
  339. #endif UNSELECTCHECK
  340. HRESULT _AImeNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
  341. {
  342. return _pActiveIME->Notify(hIMC == DEFAULT_HIMC ? _InputContext._GetDefaultHIMC() : hIMC,
  343. dwAction, dwIndex, dwValue);
  344. }
  345. HRESULT _ToIMEWindow(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT*& plResult, BOOL fUnicode, BOOL fChkIMC = TRUE);
  346. void _SetMapWndFocus(HWND hWnd);
  347. void _ResetMapWndFocus(HWND hWnd);
  348. BOOL _SetHookWndList(HWND hwnd);
  349. void _RemoveHookWndList(HWND hwnd)
  350. {
  351. _HookWndList.RemoveKey(hwnd);
  352. }
  353. typedef enum {
  354. PROP_PRIVATE_DATA_SIZE,
  355. PROP_IME_PROPERTY,
  356. PROP_CONVERSION_CAPS,
  357. PROP_SENTENCE_CAPS,
  358. PROP_UI_CAPS,
  359. PROP_SCS_CAPS,
  360. PROP_SELECT_CAPS
  361. } PROPERTY_TYPE;
  362. DWORD _GetIMEProperty(PROPERTY_TYPE iType);
  363. DWORD _GetIMEWndClassName(LPWSTR lpsz, DWORD dwBufLen, UINT_PTR *pulPrivate);
  364. BOOL _IsImeClass(HWND hwnd)
  365. {
  366. BOOL bIsImeClass;
  367. if (_HookWndList.Lookup(hwnd, bIsImeClass))
  368. {
  369. return bIsImeClass;
  370. }
  371. return _SetHookWndList(hwnd);
  372. }
  373. LONG _AddActivate() { return InterlockedIncrement(&_ActivateRefCount); }
  374. LONG _ReleaseActivate() { return InterlockedDecrement(&_ActivateRefCount); }
  375. BOOL _IsAlreadyActivate() { return (_ActivateRefCount != 0); }
  376. BOOL _OnSetFocus(HWND hWnd, BOOL bIsRealIme);
  377. void _OnKillFocus(HWND hWnd, BOOL bIsRealIme);
  378. BOOL _OnFocusMessage(UINT uMsg, HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL bIsRealIme);
  379. HRESULT _SendIMENotify(HIMC hImc, HWND hWnd, DWORD dwAction, DWORD dwIndex, DWORD dwValue, WPARAM wParam, LPARAM lParam);
  380. HRESULT _GetCompositionString(HIMC hIMC,
  381. DWORD dwIndex,
  382. DWORD dwCompLen, LONG* lpCopied, LPVOID lpBuf,
  383. BOOL fUnicode);
  384. HRESULT _SetCompositionString(HIMC hIMC,
  385. DWORD dwIndex,
  386. LPVOID lpComp, DWORD dwCompLen,
  387. LPVOID lpRead, DWORD dwReadLen,
  388. BOOL fUnicode);
  389. HRESULT _Internal_SetCompositionString(HIMC hIMC,
  390. DWORD dwIndex,
  391. LPVOID lpComp, DWORD dwCompLen,
  392. LPVOID lpRead, DWORD dwReadLen,
  393. BOOL fUnicode,BOOL fNeedAWConversion);
  394. HRESULT _Internal_SetCompositionAttribute(HIMC hIMC,
  395. DWORD dwIndex,
  396. LPVOID lpComp, DWORD dwCompLen,
  397. LPVOID lpRead, DWORD dwReadLen,
  398. BOOL fUnicode, BOOL fNeedAWConversion);
  399. HRESULT _Internal_SetCompositionClause(HIMC hIMC,
  400. DWORD dwIndex,
  401. LPVOID lpComp, DWORD dwCompLen,
  402. LPVOID lpRead, DWORD dwReadLen,
  403. BOOL fUnicode, BOOL fNeedAWConversion);
  404. HRESULT _Internal_ReconvertString(HIMC hIMC,
  405. DWORD dwIndex,
  406. LPVOID lpComp, DWORD dwCompLen,
  407. LPVOID lpRead, DWORD dwReadLen,
  408. BOOL fUnicode, BOOL fNeedAWConversion,
  409. LRESULT* plResult = NULL);
  410. HRESULT _Internal_CompositionFont(DIMM_IMCLock& imc,
  411. WPARAM wParam, LPARAM lParam,
  412. BOOL fUnicode, BOOL fNeedAWConversion,
  413. LRESULT* plResult);
  414. HRESULT _Internal_QueryCharPosition(DIMM_IMCLock& imc,
  415. WPARAM wParam, LPARAM lParam,
  416. BOOL fUnicode, BOOL fNeedAWConversion,
  417. LRESULT* plResult);
  418. HRESULT _GetCompositionFont(HIMC hIMC, LOGFONTAW* lplf, BOOL fUnicode);
  419. HRESULT _SetCompositionFont(HIMC hIMC, LOGFONTAW* lplf, BOOL fUnicode);
  420. HRESULT _Escape(HKL hKL, HIMC hIMC, UINT uEscape, LPVOID lpData, LRESULT *plResult, BOOL fUnicode);
  421. HRESULT _ConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDA *lpdata);
  422. HRESULT _ConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDW *lpdata);
  423. HRESULT _RequestMessage(HIMC hIMC, WPARAM wParam, LPARAM lParam, LRESULT *plResult, BOOL fUnicode);
  424. BOOL _CreateActiveIME();
  425. BOOL _DestroyActiveIME();
  426. void LFontAtoLFontW(LPLOGFONTA lpLogFontA, LPLOGFONTW lpLogFontW, UINT uCodePage);
  427. void LFontWtoLFontA(LPLOGFONTW lpLogFontW, LPLOGFONTA lpLogFontA, UINT uCodePage);
  428. CMap<HWND, HWND, ITfDocumentMgr *, ITfDocumentMgr *> _mapWndFocus;
  429. public:
  430. void HideOrRestoreToolbarWnd(BOOL fRestore);
  431. VOID _EnableGuidMap(BOOL fEnableGuidMap)
  432. {
  433. _fEnableGuidMap = fEnableGuidMap;
  434. }
  435. public:
  436. BOOL _ConnectTIM(IUnknown *punk)
  437. {
  438. ITfThreadMgr *tim = NULL;
  439. IServiceProvider *psp;
  440. Assert(_timp == NULL);
  441. if (punk->QueryInterface(IID_IServiceProvider, (void **)&psp) == S_OK)
  442. {
  443. psp->QueryService(GUID_SERVICE_TF, IID_ITfThreadMgr, (void **)&tim);
  444. psp->Release();
  445. }
  446. if (tim)
  447. {
  448. tim->QueryInterface(IID_ITfThreadMgr_P, (void **)&_timp);
  449. tim->Release();
  450. }
  451. return _timp != NULL;
  452. }
  453. void _UnconnectTIM()
  454. {
  455. SafeReleaseClear(_timp);
  456. }
  457. ITfDocumentMgr *GetAssociated(HWND hWnd)
  458. {
  459. ITfDocumentMgr *dim = NULL;
  460. if (_timp != NULL)
  461. {
  462. _timp->GetAssociated(hWnd, &dim);
  463. }
  464. return dim;
  465. }
  466. VOID OnExceptionKillFocus()
  467. {
  468. if (_timp != NULL)
  469. {
  470. _timp->SetFocus(NULL);
  471. }
  472. }
  473. ITfThreadMgr_P *GetTimP() {return _timp;}
  474. private:
  475. ITfThreadMgr_P *_timp;
  476. public:
  477. LONG SetUIWindowContext(HIMC hIMC) {
  478. return _UIWindow.SetUIWindowContext(hIMC);
  479. }
  480. private:
  481. CMap<HWND, HWND, BOOL, BOOL> _mapFilterWndEx;
  482. LONG _ActivateRefCount; // Activate reference count.
  483. #if 0
  484. BOOL _fMenuSelected : 1; // TRUE: windows menu is opened
  485. #endif
  486. BOOL _fEnableGuidMap : 1; // TRUE: Enable GUID Map attribute
  487. HWND _hFocusWnd;
  488. HHOOK _hHook[TH_NUMHOOKS];
  489. CMap<HKL, HKL, BOOL, BOOL> _RealImeList;
  490. IAImeProfile* _AImeProfile;
  491. IActiveIME_Private * _pActiveIME;
  492. CMap<HWND, HWND, BOOL, BOOL> _HookWndList;
  493. CUIWindow _UIWindow;
  494. CDefaultIMEWindow _DefaultIMEWindow;
  495. CInputContext _InputContext; // consider: take a back pointer, make this a derived class or merge
  496. IMEINFOEX _IMEInfoEx;
  497. LONG _cRef;
  498. // for HideOrRestoreToolbar
  499. DWORD _dwPrevToolbarStatus;
  500. };
  501. #endif // CDIMM_H