diff --git a/dlls/msctf/documentmgr.c b/dlls/msctf/documentmgr.c index 6245037051c..eb6e4d2e82e 100644 --- a/dlls/msctf/documentmgr.c +++ b/dlls/msctf/documentmgr.c @@ -43,11 +43,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(msctf); typedef struct tagDocumentMgr { const ITfDocumentMgrVtbl *DocumentMgrVtbl; LONG refCount; + + ITfContext* contextStack[2]; /* limit of 2 contexts */ } DocumentMgr; static void DocumentMgr_Destructor(DocumentMgr *This) { TRACE("destroying %p\n", This); + if (This->contextStack[0]) + ITfContext_Release(This->contextStack[0]); + if (This->contextStack[1]) + ITfContext_Release(This->contextStack[1]); HeapFree(GetProcessHeap(),0,This); } @@ -104,8 +110,20 @@ static HRESULT WINAPI DocumentMgr_CreateContext(ITfDocumentMgr *iface, static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic) { DocumentMgr *This = (DocumentMgr *)iface; - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + ITfContext *check; + + TRACE("(%p) %p\n",This,pic); + + if (This->contextStack[1]) /* FUll */ + return TF_E_STACKFULL; + + if (!pic || FAILED(IUnknown_QueryInterface(pic,&IID_ITfContext,(LPVOID*) &check))) + return E_INVALIDARG; + + This->contextStack[1] = This->contextStack[0]; + This->contextStack[0] = check; + + return S_OK; } static HRESULT WINAPI DocumentMgr_Pop(ITfDocumentMgr *iface, DWORD dwFlags) diff --git a/include/msctf.idl b/include/msctf.idl index 29f3a80c631..fffac3333e0 100644 --- a/include/msctf.idl +++ b/include/msctf.idl @@ -23,6 +23,7 @@ import "textstor.idl"; /* import "ctfutb.idl"; */ #endif +cpp_quote("#define TF_E_STACKFULL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0501)") cpp_quote("EXTERN_C const CLSID CLSID_TF_ThreadMgr;") typedef [uuid(7213778c-7bb0-4270-b050-6189ee594e97)] DWORD TfEditCookie;