[PATCH 1/2] msctf: Accept ITfUIElementSink in ThreadMgr AdviseSink
Andrew Eikum
aeikum at codeweavers.com
Mon Jul 22 11:39:06 CDT 2019
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
dlls/msctf/msctf_internal.h | 1 +
dlls/msctf/tests/inputprocessor.c | 71 ++++++++++++++++++++++++++++---
dlls/msctf/threadmgr.c | 12 +++++-
include/msctf.idl | 19 +++++++++
4 files changed, 97 insertions(+), 6 deletions(-)
diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h
index 9d375483616..71ed10bb8dd 100644
--- a/dlls/msctf/msctf_internal.h
+++ b/dlls/msctf/msctf_internal.h
@@ -32,6 +32,7 @@
#define COOKIE_MAGIC_DMSINK 0x0070
#define COOKIE_MAGIC_THREADFOCUSSINK 0x0080
#define COOKIE_MAGIC_KEYTRACESINK 0x0090
+#define COOKIE_MAGIC_UIELEMENTSINK 0x00a0
extern DWORD tlsIndex DECLSPEC_HIDDEN;
extern TfClientId processId DECLSPEC_HIDDEN;
diff --git a/dlls/msctf/tests/inputprocessor.c b/dlls/msctf/tests/inputprocessor.c
index 0d03ce3a8a1..d440b536764 100644
--- a/dlls/msctf/tests/inputprocessor.c
+++ b/dlls/msctf/tests/inputprocessor.c
@@ -64,7 +64,7 @@ static DWORD tmSinkCookie;
static DWORD tmSinkRefCount;
static DWORD dmSinkCookie;
static DWORD documentStatus;
-static DWORD key_trace_sink_cookie;
+static DWORD key_trace_sink_cookie, ui_element_sink_cookie;
static ITfDocumentMgr *test_CurrentFocus = NULL;
static ITfDocumentMgr *test_PrevFocus = NULL;
static ITfDocumentMgr *test_LastCurrentFocus = FOCUS_SAVE;
@@ -671,6 +671,60 @@ static const ITfKeyTraceEventSinkVtbl TfKeyTraceEventSinkVtbl = {
static ITfKeyTraceEventSink TfKeyTraceEventSink = { &TfKeyTraceEventSinkVtbl };
+static HRESULT WINAPI TfUIElementSink_QueryInterface(ITfUIElementSink *iface,
+ REFIID riid, void **ppvObject)
+{
+ if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITfUIElementSink, riid)){
+ *ppvObject = iface;
+ return S_OK;
+ }
+
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI TfUIElementSink_AddRef(ITfUIElementSink *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI TfUIElementSink_Release(ITfUIElementSink *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI TfUIElementSink_BeginUIElement(ITfUIElementSink *iface,
+ DWORD id, BOOL *show)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TfUIElementSink_UpdateUIElement(ITfUIElementSink *iface,
+ DWORD id)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TfUIElementSink_EndUIElement(ITfUIElementSink *iface,
+ DWORD id)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const ITfUIElementSinkVtbl TfUIElementSinkVtbl = {
+ TfUIElementSink_QueryInterface,
+ TfUIElementSink_AddRef,
+ TfUIElementSink_Release,
+ TfUIElementSink_BeginUIElement,
+ TfUIElementSink_UpdateUIElement,
+ TfUIElementSink_EndUIElement
+};
+
+static ITfUIElementSink TfUIElementSink = { &TfUIElementSinkVtbl };
+
static HRESULT WINAPI TfTransitoryExtensionSink_QueryInterface(ITfTransitoryExtensionSink *iface, REFIID riid, void **ppv)
{
if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITfTransitoryExtensionSink, riid)) {
@@ -1128,7 +1182,7 @@ static void test_ThreadMgrAdviseSinks(void)
tmSinkRefCount = 1;
tmSinkCookie = 0;
hr = ITfSource_AdviseSink(source,&IID_ITfThreadMgrEventSink, sink, &tmSinkCookie);
- ok(hr == S_OK, "Failed to Advise Sink\n");
+ ok(hr == S_OK, "Failed to Advise ITfThreadMgrEventSink\n");
ok(tmSinkCookie!=0,"Failed to get sink cookie\n");
/* Advising the sink adds a ref, Releasing here lets the object be deleted
@@ -1138,7 +1192,11 @@ static void test_ThreadMgrAdviseSinks(void)
hr = ITfSource_AdviseSink(source, &IID_ITfKeyTraceEventSink, (IUnknown*)&TfKeyTraceEventSink,
&key_trace_sink_cookie);
- ok(hr == S_OK, "Failed to Advise Sink\n");
+ ok(hr == S_OK, "Failed to Advise ITfKeyTraceEventSink\n");
+
+ hr = ITfSource_AdviseSink(source, &IID_ITfUIElementSink, (IUnknown*)&TfUIElementSink,
+ &ui_element_sink_cookie);
+ ok(hr == S_OK, "Failed to Advise ITfUIElementSink\n");
ITfSource_Release(source);
}
@@ -1155,10 +1213,13 @@ static void test_ThreadMgrUnadviseSinks(void)
tmSinkRefCount = 1;
hr = ITfSource_UnadviseSink(source, tmSinkCookie);
- ok(hr == S_OK, "Failed to unadvise Sink\n");
+ ok(hr == S_OK, "Failed to unadvise ITfThreadMgrEventSink\n");
hr = ITfSource_UnadviseSink(source, key_trace_sink_cookie);
- ok(hr == S_OK, "Failed to unadvise Sink\n");
+ ok(hr == S_OK, "Failed to unadvise ITfKeyTraceEventSink\n");
+
+ hr = ITfSource_UnadviseSink(source, ui_element_sink_cookie);
+ ok(hr == S_OK, "Failed to unadvise ITfUIElementSink\n");
ITfSource_Release(source);
}
diff --git a/dlls/msctf/threadmgr.c b/dlls/msctf/threadmgr.c
index a9fcb5cd15c..7afef3cdd53 100644
--- a/dlls/msctf/threadmgr.c
+++ b/dlls/msctf/threadmgr.c
@@ -96,6 +96,7 @@ typedef struct tagACLMulti {
struct list PreservedKeyNotifySink;
struct list ThreadFocusSink;
struct list ThreadMgrEventSink;
+ struct list UIElementSink;
} ThreadMgr;
typedef struct tagEnumTfDocumentMgr {
@@ -172,6 +173,7 @@ static void ThreadMgr_Destructor(ThreadMgr *This)
free_sinks(&This->PreservedKeyNotifySink);
free_sinks(&This->ThreadFocusSink);
free_sinks(&This->ThreadMgrEventSink);
+ free_sinks(&This->UIElementSink);
LIST_FOR_EACH_SAFE(cursor, cursor2, &This->CurrentPreservedKeys)
{
@@ -624,6 +626,13 @@ static HRESULT WINAPI ThreadMgrSource_AdviseSink(ITfSource *iface,
COOKIE_MAGIC_KEYTRACESINK, punk, pdwCookie);
}
+ if (IsEqualIID(riid, &IID_ITfUIElementSink))
+ {
+ WARN("semi-stub for ITfUIElementSink: sink won't be used.\n");
+ return advise_sink(&This->UIElementSink, &IID_ITfUIElementSink,
+ COOKIE_MAGIC_UIELEMENTSINK, punk, pdwCookie);
+ }
+
FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
return E_NOTIMPL;
}
@@ -637,7 +646,7 @@ static HRESULT WINAPI ThreadMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCo
magic = get_Cookie_magic(pdwCookie);
if (magic != COOKIE_MAGIC_TMSINK && magic != COOKIE_MAGIC_THREADFOCUSSINK
- && magic != COOKIE_MAGIC_KEYTRACESINK)
+ && magic != COOKIE_MAGIC_KEYTRACESINK && magic != COOKIE_MAGIC_UIELEMENTSINK)
return E_INVALIDARG;
return unadvise_sink(pdwCookie);
@@ -1354,6 +1363,7 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
list_init(&This->PreservedKeyNotifySink);
list_init(&This->ThreadFocusSink);
list_init(&This->ThreadMgrEventSink);
+ list_init(&This->UIElementSink);
TRACE("returning %p\n", This);
*ppOut = (IUnknown *)&This->ITfThreadMgrEx_iface;
diff --git a/include/msctf.idl b/include/msctf.idl
index 01e944cf5df..5ef33119fd8 100644
--- a/include/msctf.idl
+++ b/include/msctf.idl
@@ -1136,6 +1136,25 @@ interface ITfKeyTraceEventSink : IUnknown
[in] LPARAM lParam);
}
+[
+ object,
+ local,
+ uuid(ea1ea136-19df-11d7-a6d2-00065b84435c),
+ pointer_default(unique)
+]
+interface ITfUIElementSink : IUnknown
+{
+ HRESULT BeginUIElement(
+ [in] DWORD id,
+ [in, out] BOOL *show);
+
+ HRESULT UpdateUIElement(
+ [in] DWORD id);
+
+ HRESULT EndUIElement(
+ [in] DWORD id);
+}
+
[
object,
local,
--
2.22.0
More information about the wine-devel
mailing list