ReactOS 0.4.16-dev-1541-g7e1d9ef
threadmgr.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS CTF
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: ITfThreadMgr implementation
5 * COPYRIGHT: Copyright 2008 Aric Stewart, CodeWeavers
6 * Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9#include "precomp.h"
10
11#include <wine/debug.h>
13
15
16typedef struct tagPreservedKey
17{
18 struct list entry;
24
25typedef struct tagDocumentMgrs
26{
27 struct list entry;
30
31typedef struct tagAssociatedWindow
32{
33 struct list entry;
37
39
41 : public ITfThreadMgrEx
42 , public ITfSource
43 , public ITfKeystrokeMgr
44 , public ITfMessagePump
45 , public ITfClientId
46 // , public ITfConfigureSystemKeystrokeFeed
47 // , public ITfLangBarItemMgr
48 , public ITfUIElementMgr
49 , public ITfSourceSingle
51{
52public:
53 CThreadMgr();
54 virtual ~CThreadMgr();
55
56 static HRESULT CreateInstance(IUnknown *pUnkOuter, CThreadMgr **ppOut);
58
59 // ** IUnknown methods **
60 STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObject) override;
63
64 // ** ITfThreadMgr methods **
65 STDMETHODIMP Activate(_Out_ TfClientId *ptid) override;
66 STDMETHODIMP Deactivate() override;
69 STDMETHODIMP GetFocus(_Out_ ITfDocumentMgr **ppdimFocus) override;
70 STDMETHODIMP SetFocus(_In_ ITfDocumentMgr *pdimFocus) override;
73 _In_ ITfDocumentMgr *pdimNew,
74 _Out_ ITfDocumentMgr **ppdimPrev) override;
75 STDMETHODIMP IsThreadFocus(_Out_ BOOL *pfThreadFocus) override;
78 _Out_ ITfFunctionProvider **ppFuncProv) override;
81
82 // ** ITfThreadMgrEx methods **
84 _Out_ TfClientId *id,
85 _In_ DWORD flags) override;
87
88 // ** ITfSource methods **
91 _In_ IUnknown *punk,
92 _Out_ DWORD *pdwCookie) override;
93 STDMETHODIMP UnadviseSink(_In_ DWORD dwCookie) override;
94
95 // ** ITfKeystrokeMgr methods **
98 _In_ ITfKeyEventSink *pSink,
99 _In_ BOOL fForeground) override;
101 STDMETHODIMP GetForeground(_Out_ CLSID *pclsid) override;
105 _Out_ BOOL *pfEaten) override;
109 _Out_ BOOL *pfEaten) override;
113 _Out_ BOOL *pfEaten) override;
117 _Out_ BOOL *pfEaten) override;
119 _In_ ITfContext *pic,
120 _In_ const TF_PRESERVEDKEY *pprekey,
121 _Out_ GUID *pguid) override;
123 _In_ REFGUID rguid,
124 _In_ const TF_PRESERVEDKEY *pprekey,
125 _Out_ BOOL *pfRegistered) override;
128 _In_ REFGUID rguid,
129 _In_ const TF_PRESERVEDKEY *prekey,
130 _In_ const WCHAR *pchDesc,
131 _In_ ULONG cchDesc) override;
133 _In_ REFGUID rguid,
134 _In_ const TF_PRESERVEDKEY *pprekey) override;
136 _In_ REFGUID rguid,
137 _In_ const WCHAR *pchDesc,
138 _In_ ULONG cchDesc) override;
140 _In_ REFGUID rguid,
141 _Out_ BSTR *pbstrDesc) override;
143 _In_ ITfContext *pic,
144 _In_ REFGUID rguid,
145 _Out_ BOOL *pfEaten) override;
146
147 // ** ITfMessagePump methods **
149 _Out_ LPMSG pMsg,
150 _In_ HWND hwnd,
151 _In_ UINT wMsgFilterMin,
152 _In_ UINT wMsgFilterMax,
153 _In_ UINT wRemoveMsg,
154 _Out_ BOOL *pfResult) override;
156 _Out_ LPMSG pMsg,
157 _In_ HWND hwnd,
158 _In_ UINT wMsgFilterMin,
159 _In_ UINT wMsgFilterMax,
160 _Out_ BOOL *pfResult) override;
162 _Out_ LPMSG pMsg,
163 _In_ HWND hwnd,
164 _In_ UINT wMsgFilterMin,
165 _In_ UINT wMsgFilterMax,
166 _In_ UINT wRemoveMsg,
167 _Out_ BOOL *pfResult) override;
169 _Out_ LPMSG pMsg,
170 _In_ HWND hwnd,
171 _In_ UINT wMsgFilterMin,
172 _In_ UINT wMsgFilterMax,
173 _Out_ BOOL *pfResult) override;
174
175 // ** ITfClientId methods **
177 _In_ REFCLSID rclsid,
178 _Out_ TfClientId *ptid) override;
179
180 // ** ITfUIElementMgr methods **
183 _Inout_ BOOL *show,
184 _Out_ DWORD *id) override;
186 STDMETHODIMP EndUIElement(_In_ DWORD id) override;
188 _In_ DWORD id,
189 _Out_ ITfUIElement **element) override;
190 STDMETHODIMP EnumUIElements(_Out_ IEnumTfUIElements **enum_elements) override;
191
192 // ** ITfSourceSingle methods **
196 _In_ IUnknown *punk) override;
199 _In_ REFIID riid) override;
200
201 // ** ITfThreadMgrEventSink methods **
205 _In_ ITfDocumentMgr *pdimFocus,
206 _In_ ITfDocumentMgr *pdimPrevFocus) override;
209
210protected:
212
213 /* Aggregation */
215
218
221
224
227
228 /* kept as separate lists to reduce unnecessary iterations */
237
240
242};
243
245
247 : public IEnumTfDocumentMgrs
248{
249public:
251 virtual ~CEnumTfDocumentMgr();
252
253 static HRESULT CreateInstance(struct list* head, CEnumTfDocumentMgr **ppOut);
254
255 // ** IUnknown methods **
256 STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObject) override;
259
260 // ** IEnumTfDocumentMgrs methods **
261 STDMETHODIMP Clone(_Out_ IEnumTfDocumentMgrs **ppEnum) override;
263 _In_ ULONG ulCount,
264 _Out_ ITfDocumentMgr **rgDocumentMgr,
265 _Out_ ULONG *pcFetched) override;
266 STDMETHODIMP Reset() override;
267 STDMETHODIMP Skip(_In_ ULONG ulCount) override;
268
269protected:
271 struct list *m_index;
272 struct list *m_head;
273};
274
276
278 : m_cRefs(1)
279 , m_CompartmentMgr(NULL)
280 , m_focus(NULL)
281 , m_activationCount(0)
282 , m_foregroundKeyEventSink(NULL)
283{
285
288
291
292 /* kept as separate lists to reduce unnecessary iterations */
301}
302
304{
305 struct list *cursor, *cursor2;
306
307 /* unhook right away */
308 if (m_focusHook)
310
312 TRACE("destroying %p\n", this);
313
314 if (m_focus)
315 m_focus->Release();
316
325
327 {
330 cicMemFree(key->description);
332 }
333
335 {
338 FIXME("Left Over ITfDocumentMgr. Should we do something with it?\n");
339 cicMemFree(mgr);
340 }
341
343 {
346 cicMemFree(wnd);
347 }
348
350}
351
353{
354 *ppvObject = NULL;
355
356 IUnknown *pUnk = NULL;
357 if (iid == IID_IUnknown || iid == IID_ITfThreadMgr || iid == IID_ITfThreadMgrEx)
358 pUnk = static_cast<ITfThreadMgrEx *>(this);
359 else if (iid == IID_ITfSource)
360 pUnk = static_cast<ITfSource *>(this);
361 else if (iid == IID_ITfKeystrokeMgr)
362 pUnk = static_cast<ITfKeystrokeMgr *>(this);
363 else if (iid == IID_ITfMessagePump)
364 pUnk = static_cast<ITfMessagePump *>(this);
365 else if (iid == IID_ITfClientId)
366 pUnk = static_cast<ITfClientId *>(this);
367 else if (iid == IID_ITfCompartmentMgr)
369 else if (iid == IID_ITfUIElementMgr)
370 pUnk = static_cast<ITfUIElementMgr *>(this);
371 else if (iid == IID_ITfSourceSingle)
372 pUnk = static_cast<ITfSourceSingle *>(this);
373
374 if (pUnk)
375 {
376 *ppvObject = pUnk;
377 pUnk->AddRef();
378 return S_OK;
379 }
380
381 WARN("unsupported interface: %s\n", debugstr_guid(&iid));
382 return E_NOINTERFACE;
383}
384
386{
387 return ::InterlockedIncrement(&m_cRefs);
388}
389
391{
393 if (!ret)
394 delete this;
395 return ret;
396}
397
399{
400 TRACE("(%p) %p\n", this, ptid);
401 return ActivateEx(ptid, 0);
402}
403
405{
406 TRACE("(%p)\n", this);
407
408 if (m_activationCount == 0)
409 return E_UNEXPECTED;
410
412
413 if (m_activationCount == 0)
414 {
415 if (m_focus)
416 {
418 m_focus->Release();
419 m_focus = NULL;
420 }
421 }
422
424 return S_OK;
425}
426
428{
429 TRACE("(%p)\n", this);
430
431 if (!ppdim)
432 return E_INVALIDARG;
433
435 if (!mgrentry)
436 return E_OUTOFMEMORY;
437
438 HRESULT hr = DocumentMgr_Constructor(this, ppdim);
439 if (SUCCEEDED(hr))
440 {
441 mgrentry->docmgr = *ppdim;
443 }
444 else
445 {
446 cicMemFree(mgrentry);
447 }
448
449 return hr;
450}
451
453{
454 TRACE("(%p) %p\n", this, ppEnum);
455
456 if (!ppEnum)
457 return E_INVALIDARG;
458
460}
461
463{
464 TRACE("(%p)\n", this);
465
466 if (!ppdimFocus)
467 return E_INVALIDARG;
468
469 *ppdimFocus = m_focus;
470
471 TRACE("->%p\n", m_focus);
472
473 if (!m_focus)
474 return S_FALSE;
475
476 m_focus->AddRef();
477 return S_OK;
478}
479
481{
483
484 TRACE("(%p) %p\n", this, pdimFocus);
485
486 if (!pdimFocus)
487 check = NULL;
488 else if (FAILED(pdimFocus->QueryInterface(IID_ITfDocumentMgr, (LPVOID*)&check)))
489 return E_INVALIDARG;
490
492
493 if (m_focus)
494 m_focus->Release();
495
496 m_focus = check;
497 return S_OK;
498}
499
501{
502 if (!m_focusHook)
503 {
504 ERR("Hook proc but no ThreadMgr focus Hook. Serious Error\n");
505 return 0;
506 }
507
508 if (nCode == HCBT_SETFOCUS) /* focus change within our thread */
509 {
510 struct list *cursor;
511
513 {
515 if (wnd->hwnd == (HWND)wParam)
516 {
517 TRACE("Triggering Associated window focus\n");
518 if (m_focus != wnd->docmgr)
519 SetFocus(wnd->docmgr);
520 break;
521 }
522 }
523 }
524
525 return CallNextHookEx(m_focusHook, nCode, wParam, lParam);
526}
527
529{
531 if (!This)
532 {
533 ERR("Hook proc but no ThreadMgr for this thread. Serious Error\n");
534 return 0;
535 }
536 return This->_ThreadFocusHookProc(nCode, wParam, lParam);
537}
538
540{
541 if (!m_focusHook)
542 {
544 if (!m_focusHook)
545 {
546 ERR("Unable to set focus hook\n");
547 return E_FAIL;
548 }
549 return S_OK;
550 }
551 return S_FALSE;
552}
553
555 _In_ HWND hwnd,
556 _In_ ITfDocumentMgr *pdimNew,
557 _Out_ ITfDocumentMgr **ppdimPrev)
558{
559 struct list *cursor, *cursor2;
560 AssociatedWindow *wnd;
561
562 TRACE("(%p) %p %p %p\n", this, hwnd, pdimNew, ppdimPrev);
563
564 if (!ppdimPrev)
565 return E_INVALIDARG;
566
567 *ppdimPrev = NULL;
568
570 {
572 if (wnd->hwnd == hwnd)
573 {
574 if (wnd->docmgr)
575 wnd->docmgr->AddRef();
576 *ppdimPrev = wnd->docmgr;
577 wnd->docmgr = pdimNew;
578 if (::GetFocus() == hwnd)
579 SetFocus(pdimNew);
580 return S_OK;
581 }
582 }
583
585 wnd->hwnd = hwnd;
586 wnd->docmgr = pdimNew;
588
589 if (::GetFocus() == hwnd)
590 SetFocus(pdimNew);
591
592 this->SetupWindowsHook();
593 return S_OK;
594}
595
597{
598 TRACE("(%p) %p\n", this, pfThreadFocus);
599
600 if (!pfThreadFocus)
601 return E_INVALIDARG;
602
603 HWND focus = ::GetFocus();
604 *pfThreadFocus = !focus;
605 return S_OK;
606}
607
610 _Out_ ITfFunctionProvider **ppFuncProv)
611{
612 FIXME("STUB:(%p)\n", this);
613 return E_NOTIMPL;
614}
615
617{
618 FIXME("STUB:(%p)\n", this);
619 return E_NOTIMPL;
620}
621
623{
624 HRESULT hr;
625 TRACE("(%p) %p\n", this, ppCompMgr);
626
627 if (!ppCompMgr)
628 return E_INVALIDARG;
629
631 {
632 hr = CompartmentMgr_Constructor(NULL, IID_ITfCompartmentMgr, (IUnknown **)&g_globalCompartmentMgr);
633 if (FAILED(hr))
634 return hr;
635 }
636
638 *ppCompMgr = g_globalCompartmentMgr;
639 return S_OK;
640}
641
643 _Out_ TfClientId *id,
645{
646 TRACE("(%p) %p, %#x\n", this, id, flags);
647
648 if (!id)
649 return E_INVALIDARG;
650
651 if (flags)
652 FIXME("Unimplemented flags %#x\n", flags);
653
654 if (!g_processId)
655 {
656 GUID guid;
659 }
660
663 *id = g_processId;
664 return S_OK;
665}
666
668{
669 FIXME("STUB:(%p)\n", this);
670 return E_NOTIMPL;
671}
672
675 _In_ IUnknown *punk,
676 _Out_ DWORD *pdwCookie)
677{
678 TRACE("(%p) %s %p %p\n", this, debugstr_guid(&riid), punk, pdwCookie);
679
680 if (cicIsNullPtr(&riid) || !punk || !pdwCookie)
681 return E_INVALIDARG;
682
683 if (riid == IID_ITfThreadMgrEventSink)
684 return advise_sink(&m_ThreadMgrEventSink, IID_ITfThreadMgrEventSink, COOKIE_MAGIC_TMSINK, punk, pdwCookie);
685
686 if (riid == IID_ITfThreadFocusSink)
687 {
688 WARN("semi-stub for ITfThreadFocusSink: sink won't be used.\n");
689 return advise_sink(&m_ThreadFocusSink, IID_ITfThreadFocusSink, COOKIE_MAGIC_THREADFOCUSSINK, punk, pdwCookie);
690 }
691
692 if (riid == IID_ITfActiveLanguageProfileNotifySink)
693 {
694 WARN("semi-stub for ITfActiveLanguageProfileNotifySink: sink won't be used.\n");
695 return advise_sink(&m_ActiveLanguageProfileNotifySink, IID_ITfActiveLanguageProfileNotifySink,
696 COOKIE_MAGIC_ACTIVELANGSINK, punk, pdwCookie);
697 }
698
699 if (riid == IID_ITfKeyTraceEventSink)
700 {
701 WARN("semi-stub for ITfKeyTraceEventSink: sink won't be used.\n");
702 return advise_sink(&m_KeyTraceEventSink, IID_ITfKeyTraceEventSink,
703 COOKIE_MAGIC_KEYTRACESINK, punk, pdwCookie);
704 }
705
706 if (riid == IID_ITfUIElementSink)
707 {
708 WARN("semi-stub for ITfUIElementSink: sink won't be used.\n");
709 return advise_sink(&m_UIElementSink, IID_ITfUIElementSink,
710 COOKIE_MAGIC_UIELEMENTSINK, punk, pdwCookie);
711 }
712
713 if (riid == IID_ITfInputProcessorProfileActivationSink)
714 {
715 WARN("semi-stub for ITfInputProcessorProfileActivationSink: sink won't be used.\n");
716 return advise_sink(&m_InputProcessorProfileActivationSink, IID_ITfInputProcessorProfileActivationSink,
718 }
719
720 FIXME("(%p) Unhandled Sink: %s\n", this, debugstr_guid(&riid));
721 return E_NOTIMPL;
722}
723
725{
726 DWORD magic;
727
728 TRACE("(%p) %x\n", this, dwCookie);
729
730 magic = get_Cookie_magic(dwCookie);
731 if (magic != COOKIE_MAGIC_TMSINK &&
733 magic != COOKIE_MAGIC_KEYTRACESINK &&
736 {
737 return E_INVALIDARG;
738 }
739
740 return unadvise_sink(dwCookie);
741}
742
745 _In_ ITfKeyEventSink *pSink,
746 _In_ BOOL fForeground)
747{
748 CLSID textservice;
750
751 TRACE("(%p) %x %p %i\n", this, tid, pSink, fForeground);
752
753 if (!tid || !pSink)
754 return E_INVALIDARG;
755
756 textservice = get_textservice_clsid(tid);
757 if (GUID_NULL == textservice)
758 return E_INVALIDARG;
759
760 get_textservice_sink(tid, IID_ITfKeyEventSink, (IUnknown **)&check);
761 if (check)
763
764 if (FAILED(pSink->QueryInterface(IID_ITfKeyEventSink, (LPVOID*)&check)))
765 return E_INVALIDARG;
766
767 set_textservice_sink(tid, IID_ITfKeyEventSink, check);
768
769 if (fForeground)
770 {
772 {
775 }
776 check->AddRef();
777 check->OnSetFocus(TRUE);
779 m_foregroundTextService = textservice;
780 }
781 return S_OK;
782}
783
785{
786 CLSID textservice;
788 TRACE("(%p) %x\n", this, tid);
789
790 if (!tid)
791 return E_INVALIDARG;
792
793 textservice = get_textservice_clsid(tid);
794 if (GUID_NULL == textservice)
795 return E_INVALIDARG;
796
797 get_textservice_sink(tid, IID_ITfKeyEventSink, (IUnknown **)&check);
798
799 if (!check)
801
802 set_textservice_sink(tid, IID_ITfKeyEventSink, NULL);
803 check->Release();
804
806 {
810 }
811 return S_OK;
812}
813
815{
816 TRACE("(%p) %p\n", this, pclsid);
817 if (!pclsid)
818 return E_INVALIDARG;
819
821 return S_FALSE;
822
823 *pclsid = m_foregroundTextService;
824 return S_OK;
825}
826
830 _Out_ BOOL *pfEaten)
831{
832 FIXME("STUB:(%p)\n", this);
833 if (!pfEaten)
834 return E_INVALIDARG;
835 *pfEaten = FALSE;
836 return S_OK;
837}
838
842 _Out_ BOOL *pfEaten)
843{
844 FIXME("STUB:(%p)\n", this);
845 if (!pfEaten)
846 return E_INVALIDARG;
847 *pfEaten = FALSE;
848 return S_OK;
849}
850
854 _Out_ BOOL *pfEaten)
855{
856 FIXME("STUB:(%p)\n", this);
857 if (!pfEaten)
858 return E_INVALIDARG;
859 *pfEaten = FALSE;
860 return E_NOTIMPL;
861}
862
866 _Out_ BOOL *pfEaten)
867{
868 FIXME("STUB:(%p)\n", this);
869 if (!pfEaten)
870 return E_INVALIDARG;
871 *pfEaten = FALSE;
872 return E_NOTIMPL;
873}
874
876 _In_ ITfContext *pic,
877 _In_ const TF_PRESERVEDKEY *pprekey,
878 _Out_ GUID *pguid)
879{
880 FIXME("STUB:(%p)\n", this);
881 return E_NOTIMPL;
882}
883
885 _In_ REFGUID rguid,
886 _In_ const TF_PRESERVEDKEY *pprekey,
887 _Out_ BOOL *pfRegistered)
888{
889 struct list *cursor;
890
891 TRACE("(%p) %s (%x %x) %p\n", this, debugstr_guid(&rguid), (pprekey ? pprekey->uVKey : 0), (pprekey ? pprekey->uModifiers : 0), pfRegistered);
892
893 if (cicIsNullPtr(&rguid) || !pprekey || !pfRegistered)
894 return E_INVALIDARG;
895
897 {
899 if (rguid == key->guid && pprekey->uVKey == key->prekey.uVKey && pprekey->uModifiers == key->prekey.uModifiers)
900 {
901 *pfRegistered = TRUE;
902 return S_OK;
903 }
904 }
905
906 *pfRegistered = FALSE;
907 return S_FALSE;
908}
909
912 _In_ REFGUID rguid,
913 _In_ const TF_PRESERVEDKEY *prekey,
914 _In_ const WCHAR *pchDesc,
915 _In_ ULONG cchDesc)
916{
917 struct list *cursor;
918
919 TRACE("(%p) %x %s (%x,%x) %s\n", this, tid, debugstr_guid(&rguid), (prekey ? prekey->uVKey : 0), (prekey ? prekey->uModifiers : 0), debugstr_wn(pchDesc, cchDesc));
920
921 if (!tid || cicIsNullPtr(&rguid) || !prekey || (cchDesc && !pchDesc))
922 return E_INVALIDARG;
923
925 {
927 if (rguid == key->guid && prekey->uVKey == key->prekey.uVKey && prekey->uModifiers == key->prekey.uModifiers)
928 return TF_E_ALREADY_EXISTS;
929 }
930
932 if (!newkey)
933 return E_OUTOFMEMORY;
934
935 newkey->guid = rguid;
936 newkey->prekey = *prekey;
937 newkey->tid = tid;
938 newkey->description = NULL;
939 if (cchDesc)
940 {
941 newkey->description = (LPWSTR)cicMemAlloc((cchDesc + 1) * sizeof(WCHAR));
942 if (!newkey->description)
943 {
944 cicMemFree(newkey);
945 return E_OUTOFMEMORY;
946 }
947 CopyMemory(newkey->description, pchDesc, cchDesc * sizeof(WCHAR));
948 newkey->description[cchDesc] = UNICODE_NULL;
949 }
950
952 return S_OK;
953}
954
956 _In_ REFGUID rguid,
957 _In_ const TF_PRESERVEDKEY *pprekey)
958{
960 struct list *cursor;
961 TRACE("(%p) %s (%x %x)\n", this, debugstr_guid(&rguid), (pprekey ? pprekey->uVKey : 0), (pprekey ? pprekey->uModifiers : 0));
962
963 if (!pprekey || cicIsNullPtr(&rguid))
964 return E_INVALIDARG;
965
967 {
969 if (rguid == key->guid && pprekey->uVKey == key->prekey.uVKey && pprekey->uModifiers == key->prekey.uModifiers)
970 break;
971 key = NULL;
972 }
973
974 if (!key)
976
977 list_remove(&key->entry);
978 cicMemFree(key->description);
980
981 return S_OK;
982}
983
985 _In_ REFGUID rguid,
986 _In_ const WCHAR *pchDesc,
987 _In_ ULONG cchDesc)
988{
989 FIXME("STUB:(%p)\n", this);
990 return E_NOTIMPL;
991}
992
994 _In_ REFGUID rguid,
995 _Out_ BSTR *pbstrDesc)
996{
997 FIXME("STUB:(%p)\n", this);
998 return E_NOTIMPL;
999}
1000
1002 _In_ ITfContext *pic,
1003 _In_ REFGUID rguid,
1004 _Out_ BOOL *pfEaten)
1005{
1006 FIXME("STUB:(%p)\n", this);
1007 if (!pfEaten)
1008 return E_INVALIDARG;
1009 *pfEaten = FALSE;
1010 return E_NOTIMPL;
1011}
1012
1014 _Out_ LPMSG pMsg,
1015 _In_ HWND hwnd,
1016 _In_ UINT wMsgFilterMin,
1017 _In_ UINT wMsgFilterMax,
1018 _In_ UINT wRemoveMsg,
1019 _Out_ BOOL *pfResult)
1020{
1021 if (!pfResult)
1022 return E_INVALIDARG;
1023 *pfResult = ::PeekMessageA(pMsg, hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
1024 return S_OK;
1025}
1026
1028 _Out_ LPMSG pMsg,
1029 _In_ HWND hwnd,
1030 _In_ UINT wMsgFilterMin,
1031 _In_ UINT wMsgFilterMax,
1032 _Out_ BOOL *pfResult)
1033{
1034 if (!pfResult)
1035 return E_INVALIDARG;
1036 *pfResult = ::GetMessageA(pMsg, hwnd, wMsgFilterMin, wMsgFilterMax);
1037 return S_OK;
1038}
1039
1041 _Out_ LPMSG pMsg,
1042 _In_ HWND hwnd,
1043 _In_ UINT wMsgFilterMin,
1044 _In_ UINT wMsgFilterMax,
1045 _In_ UINT wRemoveMsg,
1046 _Out_ BOOL *pfResult)
1047{
1048 if (!pfResult)
1049 return E_INVALIDARG;
1050 *pfResult = ::PeekMessageW(pMsg, hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg);
1051 return S_OK;
1052}
1053
1055 _Out_ LPMSG pMsg,
1056 _In_ HWND hwnd,
1057 _In_ UINT wMsgFilterMin,
1058 _In_ UINT wMsgFilterMax,
1059 _Out_ BOOL *pfResult)
1060{
1061 if (!pfResult)
1062 return E_INVALIDARG;
1063 *pfResult = ::GetMessageW(pMsg, hwnd, wMsgFilterMin, wMsgFilterMax);
1064 return S_OK;
1065}
1066
1068 _In_ REFCLSID rclsid,
1069 _Out_ TfClientId *ptid)
1070{
1071 HRESULT hr;
1072 ITfCategoryMgr *catmgr;
1073
1074 TRACE("(%p) %s\n", this, debugstr_guid(&rclsid));
1075
1077 hr = catmgr->RegisterGUID(rclsid, ptid);
1078 catmgr->Release();
1079
1080 return hr;
1081}
1082
1084{
1086 struct list *cursor;
1087
1088 TRACE("(%p) %p\n", this, pdim);
1089
1091 {
1092 sink->OnInitDocumentMgr(pdim);
1093 }
1094
1095 return S_OK;
1096}
1097
1099{
1101 struct list *cursor;
1102
1103 TRACE("(%p) %p\n", this, pdim);
1104
1106 {
1107 sink->OnUninitDocumentMgr(pdim);
1108 }
1109
1110 return S_OK;
1111}
1112
1114 _In_ ITfDocumentMgr *pdimFocus,
1115 _In_ ITfDocumentMgr *pdimPrevFocus)
1116{
1118 struct list *cursor;
1119
1120 TRACE("(%p) %p %p\n", this, pdimFocus, pdimPrevFocus);
1121
1123 {
1124 sink->OnSetFocus(pdimFocus, pdimPrevFocus);
1125 }
1126
1127 return S_OK;
1128}
1129
1131{
1133 struct list *cursor;
1134
1135 TRACE("(%p) %p\n", this, pic);
1136
1138 {
1139 sink->OnPushContext(pic);
1140 }
1141
1142 return S_OK;
1143}
1144
1146{
1148 struct list *cursor;
1149
1150 TRACE("(%p) %p\n", this, pic);
1151
1153 {
1154 sink->OnPopContext(pic);
1155 }
1156
1157 return S_OK;
1158}
1159
1162 _Inout_ BOOL *show,
1163 _Out_ DWORD *id)
1164{
1165 FIXME("STUB:(%p)\n", this);
1166 return E_NOTIMPL;
1167}
1168
1170{
1171 FIXME("STUB:(%p)\n", this);
1172 return E_NOTIMPL;
1173}
1174
1176{
1177 FIXME("STUB:(%p)\n", this);
1178 return E_NOTIMPL;
1179}
1180
1182 _In_ DWORD id,
1184{
1185 FIXME("STUB:(%p)\n", this);
1186 return E_NOTIMPL;
1187}
1188
1190{
1191 FIXME("STUB:(%p)\n", this);
1192 return E_NOTIMPL;
1193}
1194
1198 _In_ IUnknown *punk)
1199{
1200 FIXME("STUB:(%p) %i %s %p\n", this, tid, debugstr_guid(&riid), punk);
1201 return E_NOTIMPL;
1202}
1203
1207{
1208 FIXME("STUB:(%p) %i %s\n", this, tid, debugstr_guid(&riid));
1209 return E_NOTIMPL;
1210}
1211
1213{
1214 if (pUnkOuter)
1215 return CLASS_E_NOAGGREGATION;
1216
1217 /* Only 1 ThreadMgr is created per thread */
1219 if (This)
1220 {
1221 This->AddRef();
1222 *ppOut = This;
1223 return S_OK;
1224 }
1225
1226 This = new(cicNoThrow) CThreadMgr();
1227 if (!This)
1228 return E_OUTOFMEMORY;
1229
1231
1234 This->m_CompartmentMgr = pCompMgr;
1235
1236 TRACE("returning %p\n", This);
1237 *ppOut = This;
1238 return S_OK;
1239}
1240
1242{
1243 struct list *cursor;
1245 {
1247 if (mgrentry->docmgr == mgr)
1248 {
1250 cicMemFree(mgrentry);
1251 return;
1252 }
1253 }
1254 FIXME("ITfDocumentMgr %p not found in this thread\n", mgr);
1255}
1256
1258
1260 : m_cRefs(1)
1261 , m_index(NULL)
1262 , m_head(NULL)
1263{
1264}
1265
1267{
1268 TRACE("destroying %p\n", this);
1269}
1270
1272{
1273 *ppvObject = NULL;
1274
1275 if (iid == IID_IUnknown || iid == IID_IEnumTfDocumentMgrs)
1276 *ppvObject = static_cast<IEnumTfDocumentMgrs *>(this);
1277
1278 if (*ppvObject)
1279 {
1280 AddRef();
1281 return S_OK;
1282 }
1283
1284 WARN("unsupported interface: %s\n", debugstr_guid(&iid));
1285 return E_NOINTERFACE;
1286}
1287
1289{
1291}
1292
1294{
1296 if (!ret)
1297 delete this;
1298 return ret;
1299}
1300
1302{
1303 TRACE("(%p)\n", this);
1304
1305 if (!ppEnum)
1306 return E_POINTER;
1307
1308 *ppEnum = NULL;
1309
1310 CEnumTfDocumentMgr *cloned;
1312 if (SUCCEEDED(hr))
1313 {
1314 *ppEnum = static_cast<IEnumTfDocumentMgrs *>(cloned);
1315 cloned->m_index = m_index;
1316 }
1317
1318 return hr;
1319}
1320
1322 _In_ ULONG ulCount,
1323 _Out_ ITfDocumentMgr **rgDocumentMgr,
1324 _Out_ ULONG *pcFetched)
1325{
1326 ULONG fetched = 0;
1327
1328 TRACE("(%p)\n", this);
1329
1330 if (!rgDocumentMgr)
1331 return E_POINTER;
1332
1333 while (fetched < ulCount)
1334 {
1335 DocumentMgrEntry *mgrentry;
1336 if (!m_index)
1337 break;
1338
1340 if (!mgrentry)
1341 break;
1342
1343 *rgDocumentMgr = mgrentry->docmgr;
1344 (*rgDocumentMgr)->AddRef();
1345
1347 ++fetched;
1348 ++rgDocumentMgr;
1349 }
1350
1351 if (pcFetched)
1352 *pcFetched = fetched;
1353 return fetched == ulCount ? S_OK : S_FALSE;
1354}
1355
1357{
1358 TRACE("(%p)\n", this);
1360 return S_OK;
1361}
1362
1364{
1365 TRACE("(%p)\n", this);
1366 for (ULONG i = 0; i < ulCount && m_index; ++i)
1368 return S_OK;
1369}
1370
1372{
1374 if (!This)
1375 return E_OUTOFMEMORY;
1376
1377 This->m_head = head;
1378 This->m_index = list_head(This->m_head);
1379
1380 *ppOut = This;
1381 TRACE("returning %p\n", *ppOut);
1382 return S_OK;
1383}
1384
1386
1389{
1390 return CThreadMgr::CreateInstance(pUnkOuter, (CThreadMgr **)ppOut);
1391}
1392
1395{
1396 CThreadMgr *This = static_cast<CThreadMgr *>(iface);
1397 This->OnDocumentMgrDestruction(mgr);
1398}
struct outqueuenode * head
Definition: adnsresfilter.c:66
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define COOKIE_MAGIC_INPUTPROCESSORPROFILEACTIVATIONSINK
Definition: precomp.h:43
#define SINK_FOR_EACH(cursor, list, type, elem)
Definition: precomp.h:96
#define COOKIE_MAGIC_KEYTRACESINK
Definition: precomp.h:41
#define COOKIE_MAGIC_UIELEMENTSINK
Definition: precomp.h:42
#define COOKIE_MAGIC_THREADFOCUSSINK
Definition: precomp.h:40
#define COOKIE_MAGIC_TMSINK
Definition: precomp.h:33
#define COOKIE_MAGIC_ACTIVELANGSINK
Definition: precomp.h:44
DWORD g_dwTLSIndex
Definition: utils.cpp:33
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
#define STDMETHODIMP_(t)
Definition: basetyps.h:44
const GUID IID_IUnknown
EXTERN_C HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
static LPVOID cicMemAlloc(SIZE_T size)
Definition: cicbase.h:10
#define cicNoThrow
Definition: cicbase.h:46
static void cicMemFree(LPVOID ptr)
Definition: cicbase.h:20
static bool cicIsNullPtr(LPCVOID ptr)
Definition: cicbase.h:40
STDMETHODIMP Clone(_Out_ IEnumTfDocumentMgrs **ppEnum) override
Definition: threadmgr.cpp:1301
virtual ~CEnumTfDocumentMgr()
Definition: threadmgr.cpp:1266
STDMETHODIMP_(ULONG) Release() override
struct list * m_head
Definition: threadmgr.cpp:272
STDMETHODIMP Reset() override
Definition: threadmgr.cpp:1356
STDMETHODIMP Next(_In_ ULONG ulCount, _Out_ ITfDocumentMgr **rgDocumentMgr, _Out_ ULONG *pcFetched) override
Definition: threadmgr.cpp:1321
static HRESULT CreateInstance(struct list *head, CEnumTfDocumentMgr **ppOut)
Definition: threadmgr.cpp:1371
STDMETHODIMP Skip(_In_ ULONG ulCount) override
Definition: threadmgr.cpp:1363
STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObject) override
Definition: threadmgr.cpp:1271
STDMETHODIMP_(ULONG) AddRef() override
struct list * m_index
Definition: threadmgr.cpp:271
STDMETHODIMP EnumDocumentMgrs(_Out_ IEnumTfDocumentMgrs **ppEnum) override
Definition: threadmgr.cpp:452
STDMETHODIMP AssociateFocus(_In_ HWND hwnd, _In_ ITfDocumentMgr *pdimNew, _Out_ ITfDocumentMgr **ppdimPrev) override
Definition: threadmgr.cpp:554
STDMETHODIMP OnPopContext(_In_ ITfContext *pic) override
Definition: threadmgr.cpp:1145
STDMETHODIMP GetMessageA(_Out_ LPMSG pMsg, _In_ HWND hwnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax, _Out_ BOOL *pfResult) override
Definition: threadmgr.cpp:1027
STDMETHODIMP AdviseSink(_In_ REFIID riid, _In_ IUnknown *punk, _Out_ DWORD *pdwCookie) override
Definition: threadmgr.cpp:673
STDMETHODIMP UnadviseKeyEventSink(_In_ TfClientId tid) override
Definition: threadmgr.cpp:784
HRESULT SetupWindowsHook()
Definition: threadmgr.cpp:539
STDMETHODIMP ActivateEx(_Out_ TfClientId *id, _In_ DWORD flags) override
Definition: threadmgr.cpp:642
STDMETHODIMP GetFocus(_Out_ ITfDocumentMgr **ppdimFocus) override
Definition: threadmgr.cpp:462
STDMETHODIMP PeekMessageA(_Out_ LPMSG pMsg, _In_ HWND hwnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax, _In_ UINT wRemoveMsg, _Out_ BOOL *pfResult) override
Definition: threadmgr.cpp:1013
STDMETHODIMP TestKeyUp(_In_ WPARAM wParam, _In_ LPARAM lParam, _Out_ BOOL *pfEaten) override
Definition: threadmgr.cpp:839
LONG m_cRefs
Definition: threadmgr.cpp:211
static LRESULT CALLBACK ThreadFocusHookProc(INT nCode, WPARAM wParam, LPARAM lParam)
Definition: threadmgr.cpp:528
STDMETHODIMP BeginUIElement(_In_ ITfUIElement *element, _Inout_ BOOL *show, _Out_ DWORD *id) override
Definition: threadmgr.cpp:1160
static HRESULT CreateInstance(IUnknown *pUnkOuter, CThreadMgr **ppOut)
Definition: threadmgr.cpp:1212
STDMETHODIMP GetForeground(_Out_ CLSID *pclsid) override
Definition: threadmgr.cpp:814
LONG m_activationCount
Definition: threadmgr.cpp:217
STDMETHODIMP AdviseKeyEventSink(_In_ TfClientId tid, _In_ ITfKeyEventSink *pSink, _In_ BOOL fForeground) override
Definition: threadmgr.cpp:743
STDMETHODIMP GetMessageW(_Out_ LPMSG pMsg, _In_ HWND hwnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax, _Out_ BOOL *pfResult) override
Definition: threadmgr.cpp:1054
struct list m_PreservedKeyNotifySink
Definition: threadmgr.cpp:232
struct list m_UIElementSink
Definition: threadmgr.cpp:235
STDMETHODIMP EnumFunctionProviders(_Out_ IEnumTfFunctionProviders **ppEnum) override
Definition: threadmgr.cpp:616
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP GetClientId(_In_ REFCLSID rclsid, _Out_ TfClientId *ptid) override
Definition: threadmgr.cpp:1067
STDMETHODIMP UnpreserveKey(_In_ REFGUID rguid, _In_ const TF_PRESERVEDKEY *pprekey) override
Definition: threadmgr.cpp:955
STDMETHODIMP OnInitDocumentMgr(_In_ ITfDocumentMgr *pdim) override
Definition: threadmgr.cpp:1083
struct list m_AssociatedFocusWindows
Definition: threadmgr.cpp:225
struct list m_DisplayAttributeNotifySink
Definition: threadmgr.cpp:230
STDMETHODIMP IsThreadFocus(_Out_ BOOL *pfThreadFocus) override
Definition: threadmgr.cpp:596
STDMETHODIMP GetUIElement(_In_ DWORD id, _Out_ ITfUIElement **element) override
Definition: threadmgr.cpp:1181
STDMETHODIMP OnPushContext(_In_ ITfContext *pic) override
Definition: threadmgr.cpp:1130
STDMETHODIMP GetActiveFlags(_Out_ DWORD *flags) override
Definition: threadmgr.cpp:667
ITfKeyEventSink * m_foregroundKeyEventSink
Definition: threadmgr.cpp:219
virtual ~CThreadMgr()
Definition: threadmgr.cpp:303
STDMETHODIMP OnSetFocus(_In_ ITfDocumentMgr *pdimFocus, _In_ ITfDocumentMgr *pdimPrevFocus) override
Definition: threadmgr.cpp:1113
ITfCompartmentMgr * m_CompartmentMgr
Definition: threadmgr.cpp:214
STDMETHODIMP KeyUp(_In_ WPARAM wParam, _In_ LPARAM lParam, _Out_ BOOL *pfEaten) override
Definition: threadmgr.cpp:863
STDMETHODIMP EndUIElement(_In_ DWORD id) override
Definition: threadmgr.cpp:1175
STDMETHODIMP SetPreservedKeyDescription(_In_ REFGUID rguid, _In_ const WCHAR *pchDesc, _In_ ULONG cchDesc) override
Definition: threadmgr.cpp:984
struct list m_ThreadMgrEventSink
Definition: threadmgr.cpp:234
STDMETHODIMP GetPreservedKeyDescription(_In_ REFGUID rguid, _Out_ BSTR *pbstrDesc) override
Definition: threadmgr.cpp:993
STDMETHODIMP GetPreservedKey(_In_ ITfContext *pic, _In_ const TF_PRESERVEDKEY *pprekey, _Out_ GUID *pguid) override
Definition: threadmgr.cpp:875
STDMETHODIMP SimulatePreservedKey(_In_ ITfContext *pic, _In_ REFGUID rguid, _Out_ BOOL *pfEaten) override
Definition: threadmgr.cpp:1001
STDMETHODIMP Activate(_Out_ TfClientId *ptid) override
Definition: threadmgr.cpp:398
STDMETHODIMP EnumUIElements(_Out_ IEnumTfUIElements **enum_elements) override
Definition: threadmgr.cpp:1189
struct list m_KeyTraceEventSink
Definition: threadmgr.cpp:231
STDMETHODIMP KeyDown(_In_ WPARAM wParam, _In_ LPARAM lParam, _Out_ BOOL *pfEaten) override
Definition: threadmgr.cpp:851
struct list m_CurrentPreservedKeys
Definition: threadmgr.cpp:222
STDMETHODIMP GetGlobalCompartment(_Out_ ITfCompartmentMgr **ppCompMgr) override
Definition: threadmgr.cpp:622
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP UpdateUIElement(_In_ DWORD id) override
Definition: threadmgr.cpp:1169
STDMETHODIMP PeekMessageW(_Out_ LPMSG pMsg, _In_ HWND hwnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax, _In_ UINT wRemoveMsg, _Out_ BOOL *pfResult) override
Definition: threadmgr.cpp:1040
STDMETHODIMP GetFunctionProvider(_In_ REFCLSID clsid, _Out_ ITfFunctionProvider **ppFuncProv) override
Definition: threadmgr.cpp:608
STDMETHODIMP PreserveKey(_In_ TfClientId tid, _In_ REFGUID rguid, _In_ const TF_PRESERVEDKEY *prekey, _In_ const WCHAR *pchDesc, _In_ ULONG cchDesc) override
Definition: threadmgr.cpp:910
STDMETHODIMP SetFocus(_In_ ITfDocumentMgr *pdimFocus) override
Definition: threadmgr.cpp:480
STDMETHODIMP OnUninitDocumentMgr(_In_ ITfDocumentMgr *pdim) override
Definition: threadmgr.cpp:1098
STDMETHODIMP CreateDocumentMgr(_Out_ ITfDocumentMgr **ppdim) override
Definition: threadmgr.cpp:427
LRESULT _ThreadFocusHookProc(INT nCode, WPARAM wParam, LPARAM lParam)
Definition: threadmgr.cpp:500
STDMETHODIMP UnadviseSingleSink(_In_ TfClientId tid, _In_ REFIID riid) override
Definition: threadmgr.cpp:1204
void OnDocumentMgrDestruction(ITfDocumentMgr *mgr)
Definition: threadmgr.cpp:1241
struct list m_ActiveLanguageProfileNotifySink
Definition: threadmgr.cpp:229
STDMETHODIMP Deactivate() override
Definition: threadmgr.cpp:404
STDMETHODIMP TestKeyDown(_In_ WPARAM wParam, _In_ LPARAM lParam, _Out_ BOOL *pfEaten) override
Definition: threadmgr.cpp:827
struct list m_InputProcessorProfileActivationSink
Definition: threadmgr.cpp:236
struct list m_ThreadFocusSink
Definition: threadmgr.cpp:233
STDMETHODIMP AdviseSingleSink(_In_ TfClientId tid, _In_ REFIID riid, _In_ IUnknown *punk) override
Definition: threadmgr.cpp:1195
ITfDocumentMgr * m_focus
Definition: threadmgr.cpp:216
struct list m_CreatedDocumentMgrs
Definition: threadmgr.cpp:223
STDMETHODIMP IsPreservedKey(_In_ REFGUID rguid, _In_ const TF_PRESERVEDKEY *pprekey, _Out_ BOOL *pfRegistered) override
Definition: threadmgr.cpp:884
HHOOK m_focusHook
Definition: threadmgr.cpp:226
STDMETHODIMP QueryInterface(REFIID iid, LPVOID *ppvObject) override
Definition: threadmgr.cpp:352
STDMETHODIMP UnadviseSink(_In_ DWORD dwCookie) override
Definition: threadmgr.cpp:724
CLSID m_foregroundTextService
Definition: threadmgr.cpp:220
Definition: list.h:37
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
EXTERN_C HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
OLECHAR * BSTR
Definition: compat.h:2293
#define CALLBACK
Definition: compat.h:35
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1240
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1276
GUID guid
Definition: version.c:147
HRESULT WINAPI CoCreateGuid(GUID *pguid)
Definition: compobj.c:2206
EXTERN_C HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink *pThreadMgrSink, ITfDocumentMgr **ppOut)
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
#define check(expected, result)
Definition: dplayx.c:32
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLbitfield flags
Definition: glext.h:7161
GLsizei GLenum GLboolean sink
Definition: glext.h:5672
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
const char cursor[]
Definition: icontest.c:13
REFIID riid
Definition: atlbase.h:39
static CInternetFolder * CreateInstance(void)
Definition: inetfolder.c:330
static TfClientId tid
HRESULT RegisterGUID([in] REFGUID rguid, [out] TfGuidAtom *pguidatom)
HRESULT OnSetFocus([in] BOOL fForeground)
ULONG AddRef()
ULONG Release()
nsrefcnt AddRef()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_wn
Definition: kernel32.h:33
#define GUID_NULL
Definition: ks.h:106
static IAdviseSinkEx AdviseSink
Definition: htmldoc.c:5184
EXTERN_C HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie)
Definition: msctf.cpp:259
ITfCompartmentMgr * g_globalCompartmentMgr
Definition: msctf.cpp:45
EXTERN_C DWORD get_Cookie_magic(DWORD id)
Definition: msctf.cpp:203
EXTERN_C HRESULT set_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown *sink)
Definition: msctf.cpp:517
EXTERN_C HRESULT unadvise_sink(DWORD cookie)
Definition: msctf.cpp:286
TfClientId g_processId
Definition: msctf.cpp:44
const CLSID * clsid
Definition: msctf.cpp:50
EXTERN_C HRESULT deactivate_textservices(void)
Definition: msctf.cpp:468
EXTERN_C void free_sinks(struct list *sink_list)
Definition: msctf.cpp:297
EXTERN_C HRESULT activate_textservices(ITfThreadMgrEx *tm)
Definition: msctf.cpp:449
EXTERN_C CLSID get_textservice_clsid(TfClientId tid)
Definition: msctf.cpp:484
EXTERN_C HRESULT get_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown **sink)
Definition: msctf.cpp:497
DWORD TfClientId
Definition: msctf.idl:87
unsigned int UINT
Definition: ndis.h:50
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
static nsIComponentManager * pCompMgr
Definition: nsembed.c:62
#define UNICODE_NULL
#define CONNECT_E_ADVISELIMIT
Definition: olectl.h:252
#define CONNECT_E_NOCONNECTION
Definition: olectl.h:251
long LONG
Definition: pedump.c:60
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
__WINE_SERVER_LIST_INLINE struct list * list_next(const struct list *list, const struct list *elem)
Definition: list.h:115
#define LIST_FOR_EACH(cursor, list)
Definition: list.h:188
#define LIST_FOR_EACH_SAFE(cursor, cursor2, list)
Definition: list.h:192
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
Definition: copy.c:22
Definition: list.h:15
struct list entry
Definition: threadmgr.cpp:33
ITfDocumentMgr * docmgr
Definition: threadmgr.cpp:35
ITfDocumentMgr * docmgr
Definition: threadmgr.cpp:28
struct list entry
Definition: threadmgr.cpp:27
struct list entry
Definition: threadmgr.cpp:18
TF_PRESERVEDKEY prekey
Definition: threadmgr.cpp:20
LPWSTR description
Definition: threadmgr.cpp:21
TfClientId tid
Definition: threadmgr.cpp:22
#define LIST_ENTRY(type)
Definition: queue.h:175
struct tagAssociatedWindow AssociatedWindow
struct tagDocumentMgrs DocumentMgrEntry
EXTERN_C void ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *iface, ITfDocumentMgr *mgr)
Definition: threadmgr.cpp:1394
EXTERN_C HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
Definition: threadmgr.cpp:1388
struct tagPreservedKey PreservedKey
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
#define CopyMemory
Definition: winbase.h:1751
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define S_FALSE
Definition: winerror.h:3452
#define E_NOINTERFACE
Definition: winerror.h:3480
#define CLASS_E_NOAGGREGATION
Definition: winerror.h:3772
#define E_UNEXPECTED
Definition: winerror.h:3529
#define E_POINTER
Definition: winerror.h:3481
HWND WINAPI GetFocus(void)
Definition: window.c:1863
HHOOK WINAPI SetWindowsHookExW(_In_ int, _In_ HOOKPROC, _In_opt_ HINSTANCE, _In_ DWORD)
#define WH_CBT
Definition: winuser.h:35
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK)
#define HCBT_SETFOCUS
Definition: winuser.h:64
LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK, _In_ int, _In_ WPARAM, _In_ LPARAM)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184