Author: akhaldi Date: Fri Jan 27 17:32:46 2012 New Revision: 55251 URL: http://svn.reactos.org/svn/reactos?rev=55251&view=rev Log: [MSCTF_WINETEST] * Sync to Wine 1.3.37.
Modified: trunk/rostests/winetests/msctf/inputprocessor.c Modified: trunk/rostests/winetests/msctf/inputprocessor.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/msctf/inputprocessor.c?rev=55251&r1=55250&r2=55251&view=diff ============================================================================== --- trunk/rostests/winetests/msctf/inputprocessor.c [iso-8859-1] (original) +++ trunk/rostests/winetests/msctf/inputprocessor.c [iso-8859-1] Fri Jan 27 17:32:46 2012 @@ -21,6 +21,7 @@ #include <stdio.h> #define COBJMACROS +#define CONST_VTABLE #include "wine/test.h" #include "winuser.h" #include "initguid.h" @@ -45,6 +46,7 @@ #define SINK_FIRED 2 #define SINK_IGNORE 3 #define SINK_OPTIONAL 4 +#define SINK_SAVE 5 #define SINK_ACTION_MASK 0xff #define SINK_OPTION_MASK 0xff00 @@ -53,6 +55,7 @@ #define SINK_OPTION_TODO 0x0100 #define FOCUS_IGNORE (ITfDocumentMgr*)0xffffffff +#define FOCUS_SAVE (ITfDocumentMgr*)0xfffffffe static BOOL test_ShouldActivate = FALSE; static BOOL test_ShouldDeactivate = FALSE; @@ -62,6 +65,8 @@ static DWORD documentStatus; static ITfDocumentMgr *test_CurrentFocus = NULL; static ITfDocumentMgr *test_PrevFocus = NULL; +static ITfDocumentMgr *test_LastCurrentFocus = FOCUS_SAVE; +static ITfDocumentMgr *test_FirstPrevFocus = FOCUS_SAVE; static INT test_OnSetFocus = SINK_UNEXPECTED; static INT test_OnInitDocumentMgr = SINK_UNEXPECTED; static INT test_OnPushContext = SINK_UNEXPECTED; @@ -107,6 +112,10 @@ case SINK_IGNORE: winetest_trace("Ignoring %s\n",name); return; + case SINK_SAVE: + count = expected_count(sink) + 1; + *sink = (*sink & ~SINK_EXPECTED_COUNT_MASK) + (count << 16); + return; default: if (todo) todo_wine winetest_ok(0, "Unexpected %s sink\n",name); @@ -122,6 +131,7 @@ { int action = *sink & SINK_ACTION_MASK; int todo = *sink & SINK_OPTION_TODO; + int count = expected_count(sink); switch (action) { @@ -132,6 +142,10 @@ break; case SINK_IGNORE: return; + case SINK_SAVE: + if (count == 0 && winetest_interactive) + winetest_trace("optional sink %s not fired\n",name); + break; default: if (todo) todo_wine winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink); @@ -143,16 +157,35 @@ #define sink_check_ok(a,b) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_check_ok(a,b) +static inline void _sink_check_saved(INT *sink, ITfDocumentMgr *PrevFocus, ITfDocumentMgr *CurrentFocus, const CHAR* name) +{ + int count = expected_count(sink); + _sink_check_ok(sink, name); + if (PrevFocus != FOCUS_IGNORE && count != 0) + winetest_ok(PrevFocus == test_FirstPrevFocus, "%s expected prev focus %p got %p\n", name, PrevFocus, test_FirstPrevFocus); + if (CurrentFocus != FOCUS_IGNORE && count != 0) + winetest_ok(CurrentFocus == test_LastCurrentFocus, "%s expected current focus %p got %p\n", name, CurrentFocus, test_LastCurrentFocus); + test_FirstPrevFocus = FOCUS_SAVE; + test_LastCurrentFocus = FOCUS_SAVE; +} + +#define sink_check_saved(s,p,c,n) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_check_saved(s,p,c,n) + /********************************************************************** * ITextStoreACP **********************************************************************/ typedef struct tagTextStoreACP { - const ITextStoreACPVtbl *TextStoreACPVtbl; + ITextStoreACP ITextStoreACP_iface; LONG refCount; } TextStoreACP; +static inline TextStoreACP *impl_from_ITextStoreACP(ITextStoreACP *iface) +{ + return CONTAINING_RECORD(iface, TextStoreACP, ITextStoreACP_iface); +} + static void TextStoreACP_Destructor(TextStoreACP *This) { HeapFree(GetProcessHeap(),0,This); @@ -160,7 +193,7 @@ static HRESULT WINAPI TextStoreACP_QueryInterface(ITextStoreACP *iface, REFIID iid, LPVOID *ppvOut) { - TextStoreACP *This = (TextStoreACP *)iface; + TextStoreACP *This = impl_from_ITextStoreACP(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITextStoreACP)) @@ -179,13 +212,13 @@ static ULONG WINAPI TextStoreACP_AddRef(ITextStoreACP *iface) { - TextStoreACP *This = (TextStoreACP *)iface; + TextStoreACP *This = impl_from_ITextStoreACP(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI TextStoreACP_Release(ITextStoreACP *iface) { - TextStoreACP *This = (TextStoreACP *)iface; + TextStoreACP *This = impl_from_ITextStoreACP(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -421,7 +454,7 @@ if (This == NULL) return E_OUTOFMEMORY; - This->TextStoreACPVtbl = &TextStoreACP_TextStoreACPVtbl; + This->ITextStoreACP_iface.lpVtbl = &TextStoreACP_TextStoreACPVtbl; This->refCount = 1; *ppOut = (IUnknown *)This; @@ -433,10 +466,15 @@ **********************************************************************/ typedef struct tagThreadMgrEventSink { - const ITfThreadMgrEventSinkVtbl *ThreadMgrEventSinkVtbl; + ITfThreadMgrEventSink ITfThreadMgrEventSink_iface; LONG refCount; } ThreadMgrEventSink; +static inline ThreadMgrEventSink *impl_from_ITfThreadMgrEventSink(ITfThreadMgrEventSink *iface) +{ + return CONTAINING_RECORD(iface, ThreadMgrEventSink, ITfThreadMgrEventSink_iface); +} + static void ThreadMgrEventSink_Destructor(ThreadMgrEventSink *This) { HeapFree(GetProcessHeap(),0,This); @@ -444,7 +482,7 @@ static HRESULT WINAPI ThreadMgrEventSink_QueryInterface(ITfThreadMgrEventSink *iface, REFIID iid, LPVOID *ppvOut) { - ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ThreadMgrEventSink *This = impl_from_ITfThreadMgrEventSink(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfThreadMgrEventSink)) @@ -463,14 +501,14 @@ static ULONG WINAPI ThreadMgrEventSink_AddRef(ITfThreadMgrEventSink *iface) { - ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ThreadMgrEventSink *This = impl_from_ITfThreadMgrEventSink(iface); ok (tmSinkRefCount == This->refCount,"ThreadMgrEventSink refcount off %i vs %i\n",This->refCount,tmSinkRefCount); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface) { - ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ThreadMgrEventSink *This = impl_from_ITfThreadMgrEventSink(iface); ULONG ret; ok (tmSinkRefCount == This->refCount,"ThreadMgrEventSink refcount off %i vs %i\n",This->refCount,tmSinkRefCount); @@ -498,9 +536,16 @@ ITfDocumentMgr *pdimFocus, ITfDocumentMgr *pdimPrevFocus) { sink_fire_ok(&test_OnSetFocus,"ThreadMgrEventSink_OnSetFocus"); - if (test_CurrentFocus != FOCUS_IGNORE) + if (test_CurrentFocus == FOCUS_SAVE) + test_LastCurrentFocus = pdimFocus; + else if (test_CurrentFocus != FOCUS_IGNORE) ok(pdimFocus == test_CurrentFocus,"Sink reports wrong focus\n"); - if (test_PrevFocus != FOCUS_IGNORE) + if (test_PrevFocus == FOCUS_SAVE) + { + if (test_FirstPrevFocus == FOCUS_SAVE) + test_FirstPrevFocus = pdimPrevFocus; + } + else if (test_PrevFocus != FOCUS_IGNORE) ok(pdimPrevFocus == test_PrevFocus,"Sink reports wrong previous focus\n"); return S_OK; } @@ -513,7 +558,7 @@ ITfContext *test; hr = ITfContext_GetDocumentMgr(pic,&docmgr); - ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + ok(SUCCEEDED(hr),"GetDocumentMgr failed\n"); test = (ITfContext*)0xdeadbeef; ITfDocumentMgr_Release(docmgr); hr = ITfDocumentMgr_GetTop(docmgr,&test); @@ -534,7 +579,7 @@ ITfContext *test; hr = ITfContext_GetDocumentMgr(pic,&docmgr); - ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + ok(SUCCEEDED(hr),"GetDocumentMgr failed\n"); ITfDocumentMgr_Release(docmgr); test = (ITfContext*)0xdeadbeef; hr = ITfDocumentMgr_GetTop(docmgr,&test); @@ -568,7 +613,7 @@ if (This == NULL) return E_OUTOFMEMORY; - This->ThreadMgrEventSinkVtbl = &ThreadMgrEventSink_ThreadMgrEventSinkVtbl; + This->ITfThreadMgrEventSink_iface.lpVtbl = &ThreadMgrEventSink_ThreadMgrEventSinkVtbl; This->refCount = 1; *ppOut = (IUnknown *)This; @@ -588,16 +633,26 @@ typedef struct tagClassFactory { - const IClassFactoryVtbl *vtbl; + IClassFactory IClassFactory_iface; LONG ref; LPFNCONSTRUCTOR ctor; } ClassFactory; +static inline ClassFactory *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, ClassFactory, IClassFactory_iface); +} + typedef struct tagTextService { - const ITfTextInputProcessorVtbl *TextInputProcessorVtbl; + ITfTextInputProcessor ITfTextInputProcessor_iface; LONG refCount; } TextService; + +static inline TextService *impl_from_ITfTextInputProcessor(ITfTextInputProcessor *iface) +{ + return CONTAINING_RECORD(iface, TextService, ITfTextInputProcessor_iface); +} static void ClassFactory_Destructor(ClassFactory *This) { @@ -620,13 +675,13 @@ static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); ULONG ret = InterlockedDecrement(&This->ref); if (ret == 0) @@ -636,7 +691,7 @@ static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID iid, LPVOID *ppvOut) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); HRESULT ret; IUnknown *obj; @@ -672,7 +727,7 @@ static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut) { ClassFactory *This = HeapAlloc(GetProcessHeap(),0,sizeof(ClassFactory)); - This->vtbl = &ClassFactoryVtbl; + This->IClassFactory_iface.lpVtbl = &ClassFactoryVtbl; This->ref = 1; This->ctor = ctor; *ppvOut = (LPVOID)This; @@ -687,7 +742,7 @@ static HRESULT WINAPI TextService_QueryInterface(ITfTextInputProcessor *iface, REFIID iid, LPVOID *ppvOut) { - TextService *This = (TextService *)iface; + TextService *This = impl_from_ITfTextInputProcessor(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextInputProcessor)) @@ -706,13 +761,13 @@ static ULONG WINAPI TextService_AddRef(ITfTextInputProcessor *iface) { - TextService *This = (TextService *)iface; + TextService *This = impl_from_ITfTextInputProcessor(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI TextService_Release(ITfTextInputProcessor *iface) { - TextService *This = (TextService *)iface; + TextService *This = impl_from_ITfTextInputProcessor(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -757,7 +812,7 @@ if (This == NULL) return E_OUTOFMEMORY; - This->TextInputProcessorVtbl= &TextService_TextInputProcessorVtbl; + This->ITfTextInputProcessor_iface.lpVtbl = &TextService_TextInputProcessorVtbl; This->refCount = 1; *ppOut = (IUnknown *)This; @@ -970,7 +1025,7 @@ ok(SUCCEEDED(hr),"Failed to Advise Sink\n"); ok(tmSinkCookie!=0,"Failed to get sink cookie\n"); - /* Advising the sink adds a ref, Relesing here lets the object be deleted + /* Advising the sink adds a ref, Releasing here lets the object be deleted when unadvised */ tmSinkRefCount = 2; IUnknown_Release(sink); @@ -998,10 +1053,15 @@ **********************************************************************/ typedef struct tagKeyEventSink { - const ITfKeyEventSinkVtbl *KeyEventSinkVtbl; + ITfKeyEventSink ITfKeyEventSink_iface; LONG refCount; } KeyEventSink; +static inline KeyEventSink *impl_from_ITfKeyEventSink(ITfKeyEventSink *iface) +{ + return CONTAINING_RECORD(iface, KeyEventSink, ITfKeyEventSink_iface); +} + static void KeyEventSink_Destructor(KeyEventSink *This) { HeapFree(GetProcessHeap(),0,This); @@ -1009,7 +1069,7 @@ static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut) { - KeyEventSink *This = (KeyEventSink *)iface; + KeyEventSink *This = impl_from_ITfKeyEventSink(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink)) @@ -1028,13 +1088,13 @@ static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface) { - KeyEventSink *This = (KeyEventSink *)iface; + KeyEventSink *This = impl_from_ITfKeyEventSink(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface) { - KeyEventSink *This = (KeyEventSink *)iface; + KeyEventSink *This = impl_from_ITfKeyEventSink(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -1107,10 +1167,10 @@ if (This == NULL) return E_OUTOFMEMORY; - This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl; + This->ITfKeyEventSink_iface.lpVtbl = &KeyEventSink_KeyEventSinkVtbl; This->refCount = 1; - *ppOut = (ITfKeyEventSink*)This; + *ppOut = &This->ITfKeyEventSink_iface; return S_OK; } @@ -1175,8 +1235,10 @@ { HRESULT hr; + test_ShouldActivate = TRUE; /* Win7 */ hr = ITfInputProcessorProfiles_ActivateLanguageProfile(g_ipp,&CLSID_FakeService,gLangid,&CLSID_FakeService); ok(SUCCEEDED(hr),"Failed to Activate text service\n"); + test_ShouldActivate = FALSE; } @@ -1253,10 +1315,15 @@ **********************************************************************/ typedef struct tagTextEditSink { - const ITfTextEditSinkVtbl *TextEditSinkVtbl; + ITfTextEditSink ITfTextEditSink_iface; LONG refCount; } TextEditSink; +static inline TextEditSink *impl_from_ITfTextEditSink(ITfTextEditSink *iface) +{ + return CONTAINING_RECORD(iface, TextEditSink, ITfTextEditSink_iface); +} + static void TextEditSink_Destructor(TextEditSink *This) { HeapFree(GetProcessHeap(),0,This); @@ -1264,7 +1331,7 @@ static HRESULT WINAPI TextEditSink_QueryInterface(ITfTextEditSink *iface, REFIID iid, LPVOID *ppvOut) { - TextEditSink *This = (TextEditSink *)iface; + TextEditSink *This = impl_from_ITfTextEditSink(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextEditSink)) @@ -1283,13 +1350,13 @@ static ULONG WINAPI TextEditSink_AddRef(ITfTextEditSink *iface) { - TextEditSink *This = (TextEditSink *)iface; + TextEditSink *This = impl_from_ITfTextEditSink(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI TextEditSink_Release(ITfTextEditSink *iface) { - TextEditSink *This = (TextEditSink *)iface; + TextEditSink *This = impl_from_ITfTextEditSink(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -1323,10 +1390,10 @@ if (This == NULL) return E_OUTOFMEMORY; - This->TextEditSinkVtbl = &TextEditSink_TextEditSinkVtbl; + This->ITfTextEditSink_iface.lpVtbl = &TextEditSink_TextEditSinkVtbl; This->refCount = 1; - *ppOut = (ITfTextEditSink*)This; + *ppOut = &This->ITfTextEditSink_iface; return S_OK; } @@ -1377,7 +1444,7 @@ test_CurrentFocus = g_dm; test_PrevFocus = NULL; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; /* Doesn't always fire on Win7 */ hr = ITfThreadMgr_SetFocus(g_tm,g_dm); ok(SUCCEEDED(hr),"SetFocus Failed\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); @@ -1386,18 +1453,19 @@ ok(SUCCEEDED(hr),"GetFocus Failed\n"); ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); - cnt = ITfDocumentMgr_Release(g_dm); - ok(cnt == 2,"DocumentMgr refcount not expected (2 vs %i)\n",cnt); + ITfDocumentMgr_Release(g_dm); hr = ITfThreadMgr_GetFocus(g_tm,&dmtest); ok(SUCCEEDED(hr),"GetFocus Failed\n"); ok(g_dm == dmtest,"Expected DocumentMgr not focused\n"); ITfDocumentMgr_Release(dmtest); - TextStoreACP_Constructor((IUnknown**)&ts); - - hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt, &editCookie); - ok(SUCCEEDED(hr),"CreateContext Failed\n"); + hr = TextStoreACP_Constructor((IUnknown**)&ts); + if (SUCCEEDED(hr)) + { + hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, (IUnknown*)ts, &cxt, &editCookie); + ok(SUCCEEDED(hr),"CreateContext Failed\n"); + } hr = ITfDocumentMgr_CreateContext(g_dm, cid, 0, NULL, &cxt2, &editCookie); ok(SUCCEEDED(hr),"CreateContext Failed\n"); @@ -1522,7 +1590,7 @@ test_ShouldDeactivate = TRUE; test_CurrentFocus = NULL; test_PrevFocus = g_dm; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; /* Doesn't fire on Win7 */ hr = ITfThreadMgr_Deactivate(g_tm); ok(SUCCEEDED(hr),"Failed to Deactivate\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); @@ -1603,10 +1671,15 @@ **********************************************************************/ typedef struct tagEditSession { - const ITfEditSessionVtbl *EditSessionVtbl; + ITfEditSession ITfEditSession_iface; LONG refCount; } EditSession; +static inline EditSession *impl_from_ITfEditSession(ITfEditSession *iface) +{ + return CONTAINING_RECORD(iface, EditSession, ITfEditSession_iface); +} + static void EditSession_Destructor(EditSession *This) { HeapFree(GetProcessHeap(),0,This); @@ -1614,7 +1687,7 @@ static HRESULT WINAPI EditSession_QueryInterface(ITfEditSession *iface, REFIID iid, LPVOID *ppvOut) { - EditSession *This = (EditSession *)iface; + EditSession *This = impl_from_ITfEditSession(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfEditSession)) @@ -1633,13 +1706,13 @@ static ULONG WINAPI EditSession_AddRef(ITfEditSession *iface) { - EditSession *This = (EditSession *)iface; + EditSession *This = impl_from_ITfEditSession(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI EditSession_Release(ITfEditSession *iface) { - EditSession *This = (EditSession *)iface; + EditSession *This = impl_from_ITfEditSession(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -1734,6 +1807,7 @@ selection.style.fInterimChar = FALSE; test_ACP_SetSelection = SINK_EXPECTED; hr = ITfContext_SetSelection(cxt, ec, 1, &selection); + ok(SUCCEEDED(hr),"ITfContext_SetSelection failed\n"); sink_check_ok(&test_ACP_SetSelection,"SetSelection"); ITfRange_Release(range); @@ -1760,10 +1834,10 @@ if (This == NULL) return E_OUTOFMEMORY; - This->EditSessionVtbl = &EditSession_EditSessionVtbl; + This->ITfEditSession_iface.lpVtbl = &EditSession_EditSessionVtbl; This->refCount = 1; - *ppOut = (ITfEditSession*)This; + *ppOut = &This->ITfEditSession_iface; return S_OK; } @@ -1792,7 +1866,7 @@ } hrSession = 0xfeedface; - /* Test no premissions flags */ + /* Test no permissions flags */ hr = ITfContext_RequestEditSession(cxt, tid, es, TF_ES_SYNC, &hrSession); ok(hr == E_INVALIDARG,"RequestEditSession should have failed with %x not %x\n",E_INVALIDARG,hr); ok(hrSession == E_FAIL,"hrSession should be %x not %x\n",E_FAIL,hrSession); @@ -1919,9 +1993,20 @@ static void processPendingMessages(void) { MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); + int diff = 200; + int min_timeout = 100; + DWORD time = GetTickCount() + diff; + + while (diff > 0) + { + if (MsgWaitForMultipleObjects(0, NULL, FALSE, min_timeout, QS_ALLINPUT) == WAIT_TIMEOUT) + break; + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + diff = time - GetTickCount(); } } @@ -1934,9 +2019,12 @@ ITfThreadMgr_GetFocus(g_tm, &dmorig); test_CurrentFocus = NULL; test_PrevFocus = dmorig; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; /* Doesn't always fire on Win7 */ + test_ACP_GetStatus = SINK_OPTIONAL; hr = ITfThreadMgr_SetFocus(g_tm,NULL); + ok(SUCCEEDED(hr),"ITfThreadMgr_SetFocus failed\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_ACP_GetStatus = SINK_UNEXPECTED; ITfDocumentMgr_Release(dmorig); hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dm1); @@ -1956,30 +2044,52 @@ test_OnInitDocumentMgr = SINK_OPTIONAL; /* Vista and greater */ test_OnPushContext = SINK_OPTIONAL; /* Vista and greater */ + test_OnSetFocus = SINK_OPTIONAL; /* Win7 */ + test_PrevFocus = NULL; + test_CurrentFocus = FOCUS_IGNORE; ShowWindow(wnd1,SW_SHOWNORMAL); + test_OnSetFocus = SINK_UNEXPECTED; SetFocus(wnd1); sink_check_ok(&test_OnInitDocumentMgr,"OnInitDocumentMgr"); sink_check_ok(&test_OnPushContext,"OnPushContext"); test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ + test_ACP_RequestLock = SINK_OPTIONAL; /* Win7 x64 */ + test_ACP_GetSelection = SINK_OPTIONAL; /* Win7 x64 */ ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); test_CurrentFocus = FOCUS_IGNORE; /* This is a default system context */ processPendingMessages(); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_ACP_RequestLock = SINK_UNEXPECTED; + test_ACP_GetSelection = SINK_UNEXPECTED; test_CurrentFocus = dm1; test_PrevFocus = FOCUS_IGNORE; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; + test_ShouldDeactivate = SINK_OPTIONAL; hr = ITfThreadMgr_AssociateFocus(g_tm,wnd1,dm1,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_ShouldDeactivate = SINK_UNEXPECTED; processPendingMessages(); ITfThreadMgr_GetFocus(g_tm, &dmcheck); - ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); - ITfDocumentMgr_Release(dmcheck); + if (dmcheck != NULL) + { + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + } + else + { + /* Sometimes we need to explicitly set focus on Win7 */ + test_CurrentFocus = dm1; + test_PrevFocus = FOCUS_IGNORE; + test_OnSetFocus = SINK_EXPECTED; + ITfThreadMgr_SetFocus(g_tm, dm1); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + } hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,dm2,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); @@ -1995,12 +2105,12 @@ ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); ITfDocumentMgr_Release(dmcheck); - test_CurrentFocus = dm2; - test_PrevFocus = dm1; - test_OnSetFocus = SINK_OPTIONAL; /* wine and Winxp */ + test_CurrentFocus = FOCUS_SAVE; + test_PrevFocus = FOCUS_SAVE; + test_OnSetFocus = SINK_SAVE; ShowWindow(wnd2,SW_SHOWNORMAL); SetFocus(wnd2); - sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_saved(&test_OnSetFocus,dm1,dm2,"OnSetFocus"); test_CurrentFocus = FOCUS_IGNORE; /* occasional wine race */ test_PrevFocus = FOCUS_IGNORE; /* occasional wine race */ test_OnSetFocus = SINK_IGNORE; /* occasional wine race */ @@ -2010,12 +2120,12 @@ SetFocus(wnd3); processPendingMessages(); - test_CurrentFocus = dm1; - test_PrevFocus = dm2; - test_OnSetFocus = SINK_EXPECTED; + test_CurrentFocus = FOCUS_SAVE; + test_PrevFocus = FOCUS_SAVE; + test_OnSetFocus = SINK_SAVE; SetFocus(wnd1); processPendingMessages(); - sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_saved(&test_OnSetFocus,dm2,dm1,"OnSetFocus"); hr = ITfThreadMgr_AssociateFocus(g_tm,wnd3,NULL,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); @@ -2025,16 +2135,16 @@ test_CurrentFocus = dmorig; test_PrevFocus = dm1; test_OnSetFocus = SINK_EXPECTED; - test_ACP_GetStatus = SINK_EXPECTED; + test_ACP_GetStatus = SINK_IGNORE; ITfThreadMgr_SetFocus(g_tm,dmorig); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); - test_CurrentFocus = FOCUS_IGNORE; /* NULL on XP, system default on Vista */ - test_PrevFocus = dmorig; - test_OnSetFocus = SINK_EXPECTED; + test_CurrentFocus = FOCUS_SAVE; + test_PrevFocus = FOCUS_SAVE; + test_OnSetFocus = SINK_SAVE; SetFocus(wnd3); processPendingMessages(); - sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_saved(&test_OnSetFocus,dmorig,FOCUS_IGNORE,"OnSetFocus"); /* CurrentFocus NULL on XP, system default on Vista */ hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,NULL,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); @@ -2045,28 +2155,38 @@ ok(olddm == dm1, "incorrect old DocumentMgr returned\n"); ITfDocumentMgr_Release(olddm); + test_OnSetFocus = SINK_IGNORE; /* OnSetFocus fires a couple of times on Win7 */ + test_CurrentFocus = FOCUS_IGNORE; + test_PrevFocus = FOCUS_IGNORE; SetFocus(wnd2); processPendingMessages(); SetFocus(wnd1); processPendingMessages(); + test_OnSetFocus = SINK_UNEXPECTED; ITfDocumentMgr_Release(dm1); ITfDocumentMgr_Release(dm2); test_CurrentFocus = dmorig; test_PrevFocus = FOCUS_IGNORE; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; test_ACP_GetStatus = SINK_IGNORE; ITfThreadMgr_SetFocus(g_tm,dmorig); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_OnSetFocus = SINK_IGNORE; /* OnSetFocus fires a couple of times on Win7 */ + test_CurrentFocus = FOCUS_IGNORE; + test_PrevFocus = FOCUS_IGNORE; DestroyWindow(wnd1); DestroyWindow(wnd2); + test_OnSetFocus = SINK_UNEXPECTED; test_OnPopContext = SINK_OPTIONAL; /* Vista and greater */ test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); test_CurrentFocus = NULL; + test_ShouldDeactivate = TRUE; /* Win7 */ DestroyWindow(wnd3); + test_ShouldDeactivate = FALSE; sink_check_ok(&test_OnSetFocus,"OnSetFocus"); sink_check_ok(&test_OnPopContext,"OnPopContext"); } @@ -2077,6 +2197,8 @@ { test_Register(); test_RegisterCategory(); + Sleep(2000); /* Win7 needs some time before the registrations become active */ + processPendingMessages(); test_EnumLanguageProfiles(); test_EnumInputProcessorInfo(); test_Enable();