Jacek Caban : msctf: Added a helper macro for interating sink list.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 5 10:29:33 CDT 2016


Module: wine
Branch: master
Commit: 7c1c94c25848e569dc106f2cd65377040bbc4074
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7c1c94c25848e569dc106f2cd65377040bbc4074

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed May  4 19:41:29 2016 +0200

msctf: Added a helper macro for interating sink list.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msctf/msctf_internal.h |  6 ++++++
 dlls/msctf/threadmgr.c      | 40 ++++++++++++++++++++--------------------
 2 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h
index e4da480..3467f1c 100644
--- a/dlls/msctf/msctf_internal.h
+++ b/dlls/msctf/msctf_internal.h
@@ -75,6 +75,12 @@ typedef struct {
     } interfaces;
 } Sink;
 
+#define SINK_ENTRY(cursor,type) (LIST_ENTRY(cursor,Sink,entry)->interfaces.p##type)
+#define SINK_FOR_EACH(cursor,list,type,elem) \
+    for ((cursor) = (list)->next, elem = SINK_ENTRY(cursor,type); \
+         (cursor) != (list); \
+         (cursor) = (cursor)->next, elem = SINK_ENTRY(cursor,type))
+
 HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie) DECLSPEC_HIDDEN;
 HRESULT unadvise_sink(DWORD cookie) DECLSPEC_HIDDEN;
 void free_sinks(struct list *sink_list) DECLSPEC_HIDDEN;
diff --git a/dlls/msctf/threadmgr.c b/dlls/msctf/threadmgr.c
index 62508b9..e645619 100644
--- a/dlls/msctf/threadmgr.c
+++ b/dlls/msctf/threadmgr.c
@@ -1079,15 +1079,15 @@ static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface)
 static HRESULT WINAPI ThreadMgrEventSink_OnInitDocumentMgr(
         ITfThreadMgrEventSink *iface,ITfDocumentMgr *pdim)
 {
-    struct list *cursor;
     ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+    ITfThreadMgrEventSink *sink;
+    struct list *cursor;
 
     TRACE("(%p) %p\n",This,pdim);
 
-    LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+    SINK_FOR_EACH(cursor, &This->ThreadMgrEventSink, ITfThreadMgrEventSink, sink)
     {
-        Sink* sink = LIST_ENTRY(cursor,Sink,entry);
-        ITfThreadMgrEventSink_OnInitDocumentMgr(sink->interfaces.pITfThreadMgrEventSink,pdim);
+        ITfThreadMgrEventSink_OnInitDocumentMgr(sink, pdim);
     }
 
     return S_OK;
@@ -1096,15 +1096,15 @@ static HRESULT WINAPI ThreadMgrEventSink_OnInitDocumentMgr(
 static HRESULT WINAPI ThreadMgrEventSink_OnUninitDocumentMgr(
         ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdim)
 {
-    struct list *cursor;
     ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+    ITfThreadMgrEventSink *sink;
+    struct list *cursor;
 
     TRACE("(%p) %p\n",This,pdim);
 
-    LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+    SINK_FOR_EACH(cursor, &This->ThreadMgrEventSink, ITfThreadMgrEventSink, sink)
     {
-        Sink* sink = LIST_ENTRY(cursor,Sink,entry);
-        ITfThreadMgrEventSink_OnUninitDocumentMgr(sink->interfaces.pITfThreadMgrEventSink,pdim);
+        ITfThreadMgrEventSink_OnUninitDocumentMgr(sink, pdim);
     }
 
     return S_OK;
@@ -1114,15 +1114,15 @@ static HRESULT WINAPI ThreadMgrEventSink_OnSetFocus(
         ITfThreadMgrEventSink *iface, ITfDocumentMgr *pdimFocus,
         ITfDocumentMgr *pdimPrevFocus)
 {
-    struct list *cursor;
     ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+    ITfThreadMgrEventSink *sink;
+    struct list *cursor;
 
     TRACE("(%p) %p %p\n",This,pdimFocus, pdimPrevFocus);
 
-    LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+    SINK_FOR_EACH(cursor, &This->ThreadMgrEventSink, ITfThreadMgrEventSink, sink)
     {
-        Sink* sink = LIST_ENTRY(cursor,Sink,entry);
-        ITfThreadMgrEventSink_OnSetFocus(sink->interfaces.pITfThreadMgrEventSink, pdimFocus, pdimPrevFocus);
+        ITfThreadMgrEventSink_OnSetFocus(sink, pdimFocus, pdimPrevFocus);
     }
 
     return S_OK;
@@ -1131,15 +1131,15 @@ static HRESULT WINAPI ThreadMgrEventSink_OnSetFocus(
 static HRESULT WINAPI ThreadMgrEventSink_OnPushContext(
         ITfThreadMgrEventSink *iface, ITfContext *pic)
 {
-    struct list *cursor;
     ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+    ITfThreadMgrEventSink *sink;
+    struct list *cursor;
 
     TRACE("(%p) %p\n",This,pic);
 
-    LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+    SINK_FOR_EACH(cursor, &This->ThreadMgrEventSink, ITfThreadMgrEventSink, sink)
     {
-        Sink* sink = LIST_ENTRY(cursor,Sink,entry);
-        ITfThreadMgrEventSink_OnPushContext(sink->interfaces.pITfThreadMgrEventSink,pic);
+        ITfThreadMgrEventSink_OnPushContext(sink, pic);
     }
 
     return S_OK;
@@ -1148,15 +1148,15 @@ static HRESULT WINAPI ThreadMgrEventSink_OnPushContext(
 static HRESULT WINAPI ThreadMgrEventSink_OnPopContext(
         ITfThreadMgrEventSink *iface, ITfContext *pic)
 {
-    struct list *cursor;
     ThreadMgr *This = impl_from_ITfThreadMgrEventSink(iface);
+    ITfThreadMgrEventSink *sink;
+    struct list *cursor;
 
     TRACE("(%p) %p\n",This,pic);
 
-    LIST_FOR_EACH(cursor, &This->ThreadMgrEventSink)
+    SINK_FOR_EACH(cursor, &This->ThreadMgrEventSink, ITfThreadMgrEventSink, sink)
     {
-        Sink* sink = LIST_ENTRY(cursor,Sink,entry);
-        ITfThreadMgrEventSink_OnPopContext(sink->interfaces.pITfThreadMgrEventSink,pic);
+        ITfThreadMgrEventSink_OnPopContext(sink, pic);
     }
 
     return S_OK;




More information about the wine-cvs mailing list