Author: dchapyshev
Date: Mon Apr 6 19:43:12 2009
New Revision: 40399
URL:
http://svn.reactos.org/svn/reactos?rev=40399&view=rev
Log:
- Sync mscms, mscoree, msctf with Wine
- Remove unneeded mscoree_ros.diff
Removed:
trunk/reactos/dll/win32/mscoree/mscoree_ros.diff
Modified:
trunk/reactos/dll/win32/mscms/mscms_main.c
trunk/reactos/dll/win32/mscoree/mscoree.rbuild
trunk/reactos/dll/win32/mscoree/mscoree.spec
trunk/reactos/dll/win32/mscoree/mscoree_main.c
trunk/reactos/dll/win32/msctf/documentmgr.c
trunk/reactos/dll/win32/msctf/msctf_internal.h
trunk/reactos/dll/win32/msctf/threadmgr.c
Modified: trunk/reactos/dll/win32/mscms/mscms_main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscms/mscms_main…
==============================================================================
--- trunk/reactos/dll/win32/mscms/mscms_main.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mscms/mscms_main.c [iso-8859-1] Mon Apr 6 19:43:12 2009
@@ -36,6 +36,23 @@
WINE_DEFAULT_DEBUG_CHANNEL(mscms);
+#ifdef HAVE_LCMS
+static int lcms_error_handler( int error, const char *text )
+{
+ switch (error)
+ {
+ case LCMS_ERRC_WARNING:
+ case LCMS_ERRC_RECOVERABLE:
+ case LCMS_ERRC_ABORTED:
+ WARN("%d %s\n", error, debugstr_a(text));
+ return 1;
+ default:
+ ERR("unknown error %d %s\n", error, debugstr_a(text));
+ return 0;
+ }
+}
+#endif
+
BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
{
TRACE( "(%p, %d, %p)\n", hinst, reason, reserved );
@@ -44,6 +61,9 @@
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls( hinst );
+#ifdef HAVE_LCMS
+ cmsSetErrorHandler( lcms_error_handler );
+#endif
break;
case DLL_PROCESS_DETACH:
#ifdef HAVE_LCMS
Modified: trunk/reactos/dll/win32/mscoree/mscoree.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree.…
==============================================================================
--- trunk/reactos/dll/win32/mscoree/mscoree.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mscoree/mscoree.rbuild [iso-8859-1] Mon Apr 6 19:43:12 2009
@@ -1,6 +1,8 @@
<module name="mscoree" type="win32dll"
baseaddress="${BASEADDRESS_MSCOREE}" installbase="system32"
installname="mscoree.dll">
<importlibrary definition="mscoree.spec" />
<include base="mscoree">.</include>
+ <include base="ReactOS">include/reactos/wine</include>
+ <define name="__WINESRC__" />
<library>wine</library>
<library>kernel32</library>
<library>advapi32</library>
Modified: trunk/reactos/dll/win32/mscoree/mscoree.spec
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree.…
==============================================================================
--- trunk/reactos/dll/win32/mscoree/mscoree.spec [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mscoree/mscoree.spec [iso-8859-1] Mon Apr 6 19:43:12 2009
@@ -70,7 +70,7 @@
@ stdcall LoadLibraryShim(ptr ptr ptr ptr)
@ stub LoadLibraryWithPolicyShim
@ stdcall LoadStringRCEx(long long ptr long long ptr)
-@ stub LockClrVersion
+@ stdcall LockClrVersion(ptr ptr ptr)
@ stub MetaDataGetDispenser
@ stdcall ND_CopyObjDst(ptr ptr long long)
@ stdcall ND_CopyObjSrc(ptr long ptr long)
Modified: trunk/reactos/dll/win32/mscoree/mscoree_main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree_…
==============================================================================
--- trunk/reactos/dll/win32/mscoree/mscoree_main.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mscoree/mscoree_main.c [iso-8859-1] Mon Apr 6 19:43:12 2009
@@ -112,6 +112,8 @@
switch (fdwReason)
{
+ case DLL_WINE_PREATTACH:
+ return FALSE; /* prefer native version */
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
break;
@@ -252,6 +254,12 @@
FIXME("(%p %s, %p, %p, %p): semi-stub\n", szDllName, debugstr_w(szDllName),
szVersion, pvReserved, phModDll);
if (phModDll) *phModDll = LoadLibraryW(szDllName);
+ return S_OK;
+}
+
+HRESULT WINAPI LockClrVersion(FLockClrVersionCallback hostCallback,
FLockClrVersionCallback *pBeginHostSetup, FLockClrVersionCallback *pEndHostSetup)
+{
+ FIXME("(%p %p %p): stub\n", hostCallback, pBeginHostSetup, pEndHostSetup);
return S_OK;
}
Removed: trunk/reactos/dll/win32/mscoree/mscoree_ros.diff
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/mscoree/mscoree_…
==============================================================================
--- trunk/reactos/dll/win32/mscoree/mscoree_ros.diff [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/mscoree/mscoree_ros.diff (removed)
@@ -1,11 +1,0 @@
---- mscoree_main.c Tue Jun 10 13:29:52 2008
-+++ mscoree_main.c Sun Sep 07 16:53:09 2008
-@@ -112,8 +112,6 @@
-
- switch (fdwReason)
- {
-- case DLL_WINE_PREATTACH:
-- return FALSE; /* prefer native version */
- case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls(hinstDLL);
- break;
Modified: trunk/reactos/dll/win32/msctf/documentmgr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msctf/documentmg…
==============================================================================
--- trunk/reactos/dll/win32/msctf/documentmgr.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msctf/documentmgr.c [iso-8859-1] Mon Apr 6 19:43:12 2009
@@ -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,9 +170,13 @@
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;
Modified: trunk/reactos/dll/win32/msctf/msctf_internal.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msctf/msctf_inte…
==============================================================================
--- trunk/reactos/dll/win32/msctf/msctf_internal.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msctf/msctf_internal.h [iso-8859-1] Mon Apr 6 19:43:12 2009
@@ -23,7 +23,7 @@
extern DWORD tlsIndex;
extern HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
-extern HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut);
+extern HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink*, ITfDocumentMgr **ppOut);
extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext
**ppOut, TfEditCookie *pecTextStore);
extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown
**ppOut);
extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
Modified: trunk/reactos/dll/win32/msctf/threadmgr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msctf/threadmgr.…
==============================================================================
--- trunk/reactos/dll/win32/msctf/threadmgr.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msctf/threadmgr.c [iso-8859-1] Mon Apr 6 19:43:12 2009
@@ -32,20 +32,46 @@
#include "shlwapi.h"
#include "winerror.h"
#include "objbase.h"
+#include "olectl.h"
#include "wine/unicode.h"
+#include "wine/list.h"
#include "msctf.h"
#include "msctf_internal.h"
WINE_DEFAULT_DEBUG_CHANNEL(msctf);
+
+typedef struct tagThreadMgrSink {
+ struct list entry;
+ union {
+ /* ThreadMgr Sinks */
+ IUnknown *pIUnknown;
+ /* ITfActiveLanguageProfileNotifySink *pITfActiveLanguageProfileNotifySink; */
+ /* ITfDisplayAttributeNotifySink *pITfDisplayAttributeNotifySink; */
+ /* ITfKeyTraceEventSink *pITfKeyTraceEventSink; */
+ /* ITfPreservedKeyNotifySink *pITfPreservedKeyNotifySink; */
+ /* ITfThreadFocusSink *pITfThreadFocusSink; */
+ ITfThreadMgrEventSink *pITfThreadMgrEventSink;
+ } interfaces;
+} ThreadMgrSink;
typedef struct tagACLMulti {
const ITfThreadMgrVtbl *ThreadMgrVtbl;
const ITfSourceVtbl *SourceVtbl;
LONG refCount;
+ const ITfThreadMgrEventSinkVtbl *ThreadMgrEventSinkVtbl; /* internal */
+
ITfDocumentMgr *focus;
+
+ /* kept as separate lists to reduce unnecessary iterations */
+ struct list ActiveLanguageProfileNotifySink;
+ struct list DisplayAttributeNotifySink;
+ struct list KeyTraceEventSink;
+ struct list PreservedKeyNotifySink;
+ struct list ThreadFocusSink;
+ struct list ThreadMgrEventSink;
} ThreadMgr;
static inline ThreadMgr *impl_from_ITfSourceVtbl(ITfSource *iface)
@@ -53,12 +79,64 @@
return (ThreadMgr *)((char *)iface - FIELD_OFFSET(ThreadMgr,SourceVtbl));
}
+static inline ThreadMgr *impl_from_ITfThreadMgrEventSink(ITfThreadMgrEventSink *iface)
+{
+ return (ThreadMgr *)((char *)iface -
FIELD_OFFSET(ThreadMgr,ThreadMgrEventSinkVtbl));
+}
+
+static void free_sink(ThreadMgrSink *sink)
+{
+ IUnknown_Release(sink->interfaces.pIUnknown);
+ HeapFree(GetProcessHeap(),0,sink);
+}
+
static void ThreadMgr_Destructor(ThreadMgr *This)
{
+ struct list *cursor, *cursor2;
+
TlsSetValue(tlsIndex,NULL);
TRACE("destroying %p\n", This);
if (This->focus)
ITfDocumentMgr_Release(This->focus);
+
+ /* free sinks */
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->ActiveLanguageProfileNotifySink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+ list_remove(cursor);
+ free_sink(sink);
+ }
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->DisplayAttributeNotifySink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+ list_remove(cursor);
+ free_sink(sink);
+ }
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->KeyTraceEventSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+ list_remove(cursor);
+ free_sink(sink);
+ }
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->PreservedKeyNotifySink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+ list_remove(cursor);
+ free_sink(sink);
+ }
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->ThreadFocusSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+ list_remove(cursor);
+ free_sink(sink);
+ }
+ LIST_FOR_EACH_SAFE(cursor, cursor2, &This->ThreadMgrEventSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+ list_remove(cursor);
+ free_sink(sink);
+ }
+
HeapFree(GetProcessHeap(),0,This);
}
@@ -124,8 +202,9 @@
static HRESULT WINAPI ThreadMgr_CreateDocumentMgr( ITfThreadMgr* iface, ITfDocumentMgr
**ppdim)
{
+ ThreadMgr *This = (ThreadMgr *)iface;
TRACE("(%p)\n",iface);
- return DocumentMgr_Constructor(ppdim);
+ return
DocumentMgr_Constructor((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl,
ppdim);
}
static HRESULT WINAPI ThreadMgr_EnumDocumentMgrs( ITfThreadMgr* iface,
IEnumTfDocumentMgrs
@@ -166,6 +245,8 @@
if (!pdimFocus ||
FAILED(IUnknown_QueryInterface(pdimFocus,&IID_ITfDocumentMgr,(LPVOID*) &check)))
return E_INVALIDARG;
+
+
ITfThreadMgrEventSink_OnSetFocus((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl,
This->focus, check);
if (This->focus)
ITfDocumentMgr_Release(This->focus);
@@ -257,16 +338,48 @@
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)
{
+ ThreadMgrSink *sink = (ThreadMgrSink*)pdwCookie;
ThreadMgr *This = impl_from_ITfSourceVtbl(iface);
- FIXME("STUB:(%p)\n",This);
- return E_NOTIMPL;
+ TRACE("(%p) %x\n",This,pdwCookie);
+
+ list_remove(&sink->entry);
+ free_sink(sink);
+
+ return S_OK;
}
static const ITfSourceVtbl ThreadMgr_SourceVtbl =
@@ -279,6 +392,127 @@
ThreadMgrSource_UnadviseSink,
};
+/*****************************************************
+ * ITfThreadMgrEventSink functions (internal)
+ *****************************************************/
+static HRESULT WINAPI ThreadMgrEventSink_QueryInterface(ITfThreadMgrEventSink *iface,
REFIID iid, LPVOID *ppvOut)
+{
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+ return ThreadMgr_QueryInterface((ITfThreadMgr *)This, iid, *ppvOut);
+}
+
+static ULONG WINAPI ThreadMgrEventSink_AddRef(ITfThreadMgrEventSink *iface)
+{
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+ return ThreadMgr_AddRef((ITfThreadMgr*)This);
+}
+
+static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface)
+{
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+ return ThreadMgr_Release((ITfThreadMgr *)This);
+}
+
+
+static WINAPI HRESULT ThreadMgrEventSink_OnInitDocumentMgr(
+ ITfThreadMgrEventSink *iface,ITfDocumentMgr *pdim)
+{
+ struct list *cursor;
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+
+ TRACE("(%p) %p\n",This,pdim);
+
+ LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+
ITfThreadMgrEventSink_OnInitDocumentMgr(sink->interfaces.pITfThreadMgrEventSink,pdim);
+ }
+
+ return S_OK;
+}
+
+static WINAPI HRESULT ThreadMgrEventSink_OnUninitDocumentMgr(
+ ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdim)
+{
+ struct list *cursor;
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+
+ TRACE("(%p) %p\n",This,pdim);
+
+ LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+
ITfThreadMgrEventSink_OnUninitDocumentMgr(sink->interfaces.pITfThreadMgrEventSink,pdim);
+ }
+
+ return S_OK;
+}
+
+static WINAPI HRESULT ThreadMgrEventSink_OnSetFocus(
+ ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdimFocus,
+ ITfDocumentMgr *pdimPrevFocus)
+{
+ struct list *cursor;
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+
+ TRACE("(%p) %p %p\n",This,pdimFocus, pdimPrevFocus);
+
+ LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+ ITfThreadMgrEventSink_OnSetFocus(sink->interfaces.pITfThreadMgrEventSink,
pdimFocus, pdimPrevFocus);
+ }
+
+ return S_OK;
+}
+
+static WINAPI HRESULT ThreadMgrEventSink_OnPushContext(
+ ITfThreadMgrEventSink *iface, ITfContext *pic)
+{
+ struct list *cursor;
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+
+ TRACE("(%p) %p\n",This,pic);
+
+ LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+
ITfThreadMgrEventSink_OnPushContext(sink->interfaces.pITfThreadMgrEventSink,pic);
+ }
+
+ return S_OK;
+}
+
+static WINAPI HRESULT ThreadMgrEventSink_OnPopContext(
+ ITfThreadMgrEventSink *iface, ITfContext *pic)
+{
+ struct list *cursor;
+ ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+
+ TRACE("(%p) %p\n",This,pic);
+
+ LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+ {
+ ThreadMgrSink* sink = LIST_ENTRY(cursor,ThreadMgrSink,entry);
+
ITfThreadMgrEventSink_OnPopContext(sink->interfaces.pITfThreadMgrEventSink,pic);
+ }
+
+ return S_OK;
+}
+
+static const ITfThreadMgrEventSinkVtbl ThreadMgr_ThreadMgrEventSinkVtbl =
+{
+ ThreadMgrEventSink_QueryInterface,
+ ThreadMgrEventSink_AddRef,
+ ThreadMgrEventSink_Release,
+
+ ThreadMgrEventSink_OnInitDocumentMgr,
+ ThreadMgrEventSink_OnUninitDocumentMgr,
+ ThreadMgrEventSink_OnSetFocus,
+ ThreadMgrEventSink_OnPushContext,
+ ThreadMgrEventSink_OnPopContext
+};
+
HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
{
ThreadMgr *This;
@@ -300,9 +534,17 @@
This->ThreadMgrVtbl= &ThreadMgr_ThreadMgrVtbl;
This->SourceVtbl = &ThreadMgr_SourceVtbl;
+ This->ThreadMgrEventSinkVtbl = &ThreadMgr_ThreadMgrEventSinkVtbl;
This->refCount = 1;
TlsSetValue(tlsIndex,This);
+ list_init(&This->ActiveLanguageProfileNotifySink);
+ list_init(&This->DisplayAttributeNotifySink);
+ list_init(&This->KeyTraceEventSink);
+ list_init(&This->PreservedKeyNotifySink);
+ list_init(&This->ThreadFocusSink);
+ list_init(&This->ThreadMgrEventSink);
+
TRACE("returning %p\n", This);
*ppOut = (IUnknown *)This;
return S_OK;