Aric Stewart : msctf: TfContext intitalization and uninitialization on Push and Pop.
Alexandre Julliard
julliard at winehq.org
Mon May 18 08:13:17 CDT 2009
Module: wine
Branch: master
Commit: 7d4e1336247bb701e9e23ef4f36909793e70c25a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d4e1336247bb701e9e23ef4f36909793e70c25a
Author: Aric Stewart <aric at codeweavers.com>
Date: Fri May 15 14:09:58 2009 -0500
msctf: TfContext intitalization and uninitialization on Push and Pop.
---
dlls/msctf/context.c | 39 ++++++++++++++++++++++++++++++++-------
dlls/msctf/documentmgr.c | 4 ++++
dlls/msctf/msctf_internal.h | 3 +++
3 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c
index dff4fd8..42ae71e 100644
--- a/dlls/msctf/context.c
+++ b/dlls/msctf/context.c
@@ -66,6 +66,7 @@ typedef struct tagContext {
/* const ITfQueryEmbeddedVtbl *QueryEmbeddedVtbl; */
/* const ITfSourceSingleVtbl *SourceSingleVtbl; */
LONG refCount;
+ BOOL connected;
TfClientId tidOwner;
@@ -446,16 +447,12 @@ HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **pp
This->SourceVtbl = &Context_SourceVtbl;
This->refCount = 1;
This->tidOwner = tidOwner;
+ This->connected = FALSE;
if (punk)
{
- if (SUCCEEDED(IUnknown_QueryInterface(punk, &IID_ITextStoreACP,
- (LPVOID*)&This->pITextStoreACP)))
- {
- if (SUCCEEDED(TextStoreACPSink_Constructor(&This->pITextStoreACPSink, This)))
- ITextStoreACP_AdviseSink(This->pITextStoreACP, &IID_ITextStoreACPSink,
- (IUnknown*)This->pITextStoreACPSink, TS_AS_ALL_SINKS);
- }
+ IUnknown_QueryInterface(punk, &IID_ITextStoreACP,
+ (LPVOID*)&This->pITextStoreACP);
IUnknown_QueryInterface(punk, &IID_ITfContextOwnerCompositionSink,
(LPVOID*)&This->pITfContextOwnerCompositionSink);
@@ -478,6 +475,34 @@ HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **pp
return S_OK;
}
+HRESULT Context_Initialize(ITfContext *iface)
+{
+ Context *This = (Context *)iface;
+
+ if (This->pITextStoreACP)
+ {
+ if (SUCCEEDED(TextStoreACPSink_Constructor(&This->pITextStoreACPSink, This)))
+ ITextStoreACP_AdviseSink(This->pITextStoreACP, &IID_ITextStoreACPSink,
+ (IUnknown*)This->pITextStoreACPSink, TS_AS_ALL_SINKS);
+ }
+ This->connected = TRUE;
+ return S_OK;
+}
+
+HRESULT Context_Uninitialize(ITfContext *iface)
+{
+ Context *This = (Context *)iface;
+
+ if (This->pITextStoreACPSink)
+ {
+ ITextStoreACP_UnadviseSink(This->pITextStoreACP, (IUnknown*)This->pITextStoreACPSink);
+ if (ITextStoreACPSink_Release(This->pITextStoreACPSink) == 0)
+ This->pITextStoreACPSink = NULL;
+ }
+ This->connected = FALSE;
+ return S_OK;
+}
+
/**************************************************************************
* ITextStoreACPSink
**************************************************************************/
diff --git a/dlls/msctf/documentmgr.c b/dlls/msctf/documentmgr.c
index e1e5b19..7fd354a 100644
--- a/dlls/msctf/documentmgr.c
+++ b/dlls/msctf/documentmgr.c
@@ -138,6 +138,7 @@ static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic)
This->contextStack[0] = check;
ITfThreadMgrEventSink_OnPushContext(This->ThreadMgrSink,check);
+ Context_Initialize(check);
return S_OK;
}
@@ -153,11 +154,13 @@ static HRESULT WINAPI DocumentMgr_Pop(ITfDocumentMgr *iface, DWORD dwFlags)
{
ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[0]);
ITfContext_Release(This->contextStack[0]);
+ Context_Uninitialize(This->contextStack[0]);
}
if (This->contextStack[1])
{
ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[1]);
ITfContext_Release(This->contextStack[1]);
+ Context_Uninitialize(This->contextStack[1]);
}
This->contextStack[0] = This->contextStack[1] = NULL;
ITfThreadMgrEventSink_OnUninitDocumentMgr(This->ThreadMgrSink, iface);
@@ -172,6 +175,7 @@ static HRESULT WINAPI DocumentMgr_Pop(ITfDocumentMgr *iface, DWORD dwFlags)
ITfThreadMgrEventSink_OnPopContext(This->ThreadMgrSink,This->contextStack[0]);
ITfContext_Release(This->contextStack[0]);
+ Context_Uninitialize(This->contextStack[0]);
This->contextStack[0] = This->contextStack[1];
This->contextStack[1] = NULL;
diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h
index 15950ed..3dce778 100644
--- a/dlls/msctf/msctf_internal.h
+++ b/dlls/msctf/msctf_internal.h
@@ -35,6 +35,9 @@ extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfConte
extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut);
+extern HRESULT Context_Initialize(ITfContext *cxt);
+extern HRESULT Context_Uninitialize(ITfContext *cxt);
+
/* cookie function */
extern DWORD generate_Cookie(DWORD magic, LPVOID data);
extern DWORD get_Cookie_magic(DWORD id);
More information about the wine-cvs
mailing list