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;