msctf: Add ITfThreadMgrEventSink to ThreadMgr.
diff --git a/dlls/msctf/threadmgr.c b/dlls/msctf/threadmgr.c
index eb5918e..080c023 100644
--- a/dlls/msctf/threadmgr.c
+++ b/dlls/msctf/threadmgr.c
@@ -32,6 +32,7 @@
 #include "shlwapi.h"
 #include "winerror.h"
 #include "objbase.h"
+#include "olectl.h"
 
 #include "wine/unicode.h"
 #include "wine/list.h"
@@ -51,7 +52,7 @@
         /* ITfKeyTraceEventSink *pITfKeyTraceEventSink; */
         /* ITfPreservedKeyNotifySink *pITfPreservedKeyNotifySink; */
         /* ITfThreadFocusSink *pITfThreadFocusSink; */
-        /* ITfThreadMgrEventSink *pITfThreadMgrEventSink; */
+        ITfThreadMgrEventSink *pITfThreadMgrEventSink;
     } interfaces;
 } ThreadMgrSink;
 
@@ -327,9 +328,36 @@
 static WINAPI HRESULT ThreadMgrSource_AdviseSink(ITfSource *iface,
         REFIID riid, IUnknown *punk, DWORD *pdwCookie)
 {
+    ThreadMgrSink *tms;
     ThreadMgr *This = impl_from_ITfSourceVtbl(iface);
-    FIXME("STUB:(%p)\n",This);
-    return E_NOTIMPL;
+
+    TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie);
+
+    if (!riid || !punk || !pdwCookie)
+        return E_INVALIDARG;
+
+    if (IsEqualIID(riid, &IID_ITfThreadMgrEventSink))
+    {
+        tms = HeapAlloc(GetProcessHeap(),0,sizeof(ThreadMgrSink));
+        if (!tms)
+            return E_OUTOFMEMORY;
+        if (!SUCCEEDED(IUnknown_QueryInterface(punk, riid, (LPVOID*)&tms->interfaces.pITfThreadMgrEventSink)))
+        {
+            HeapFree(GetProcessHeap(),0,tms);
+            return CONNECT_E_CANNOTCONNECT;
+        }
+        list_add_head(&This->ThreadMgrEventSink,&tms->entry);
+        *pdwCookie = (DWORD)tms;
+    }
+    else
+    {
+        FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
+        return E_NOTIMPL;
+    }
+
+    TRACE("cookie %x\n",*pdwCookie);
+
+    return S_OK;
 }
 
 static WINAPI HRESULT ThreadMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)
diff --git a/include/msctf.idl b/include/msctf.idl
index d9c9710..c81c0da 100644
--- a/include/msctf.idl
+++ b/include/msctf.idl
@@ -486,3 +486,27 @@
 
     HRESULT Deactivate();
 };
+
+[
+  object,
+  uuid(aa80e80e-2021-11d2-93e0-0060b067b86e),
+  pointer_default(unique)
+]
+interface ITfThreadMgrEventSink : IUnknown
+{
+    HRESULT OnInitDocumentMgr(
+        [in] ITfDocumentMgr *pdim);
+
+    HRESULT OnUninitDocumentMgr(
+        [in] ITfDocumentMgr *pdim);
+
+    HRESULT OnSetFocus(
+        [in] ITfDocumentMgr *pdimFocus,
+        [in] ITfDocumentMgr *pdimPrevFocus);
+
+    HRESULT OnPushContext(
+        [in] ITfContext *pic);
+
+    HRESULT OnPopContext(
+        [in] ITfContext *pic);
+};