msctf: Hook up the DocumentMgr to be able to forward ITfThreadMgrEventSink events to sinks advised to the ThreadMgr.
diff --git a/dlls/msctf/documentmgr.c b/dlls/msctf/documentmgr.c
index c875145..ab250cb 100644
--- a/dlls/msctf/documentmgr.c
+++ b/dlls/msctf/documentmgr.c
@@ -46,6 +46,7 @@
LONG refCount;
ITfContext* contextStack[2]; /* limit of 2 contexts */
+ ITfThreadMgrEventSink* ThreadMgrSink;
} DocumentMgr;
static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface)
@@ -130,9 +131,14 @@
if (!pic || FAILED(IUnknown_QueryInterface(pic,&IID_ITfContext,(LPVOID*) &check)))
return E_INVALIDARG;
+ if (This->contextStack[0] == NULL)
+ ITfThreadMgrEventSink_OnInitDocumentMgr(This->ThreadMgrSink,iface);
+
This->contextStack[1] = This->contextStack[0];
This->contextStack[0] = check;
+ ITfThreadMgrEventSink_OnPushContext(This->ThreadMgrSink,check);
+
return S_OK;
}
@@ -144,10 +150,17 @@
if (dwFlags == TF_POPF_ALL)
{
if (This->contextStack[0])
+ {
+ ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[0]);
ITfContext_Release(This->contextStack[0]);
+ }
if (This->contextStack[1])
+ {
+ ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[1]);
ITfContext_Release(This->contextStack[1]);
+ }
This->contextStack[0] = This->contextStack[1] = NULL;
+ ITfThreadMgrEventSink_OnUninitDocumentMgr(This->ThreadMgrSink, iface);
return S_OK;
}
@@ -157,10 +170,14 @@
if (This->contextStack[0] == NULL) /* Cannot pop last context */
return E_FAIL;
+ ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[0]);
ITfContext_Release(This->contextStack[0]);
This->contextStack[0] = This->contextStack[1];
This->contextStack[1] = NULL;
+ if (This->contextStack[0] == NULL)
+ ITfThreadMgrEventSink_OnUninitDocumentMgr(This->ThreadMgrSink, iface);
+
return S_OK;
}
@@ -262,7 +279,7 @@
DocumentMgrSource_UnadviseSink,
};
-HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut)
+HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink *ThreadMgrSink, ITfDocumentMgr **ppOut)
{
DocumentMgr *This;
@@ -273,6 +290,7 @@
This->DocumentMgrVtbl= &DocumentMgr_DocumentMgrVtbl;
This->SourceVtbl = &DocumentMgr_SourceVtbl;
This->refCount = 1;
+ This->ThreadMgrSink = ThreadMgrSink;
TRACE("returning %p\n", This);
*ppOut = (ITfDocumentMgr*)This;