[PATCH v2 5/8] server: Support filtering sent internal messages.

Rémi Bernon rbernon at codeweavers.com
Thu Oct 1 05:20:01 CDT 2020


We will need this to process only a specific internal message type
without processing any of the other messages.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 server/queue.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/server/queue.c b/server/queue.c
index 2c780a94e2c..85491675abb 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -2496,8 +2496,8 @@ DECL_HANDLER(post_quit_message)
 /* get a message from the current queue */
 DECL_HANDLER(get_message)
 {
+    struct message *msg;
     struct timer *timer;
-    struct list *ptr;
     struct msg_queue *queue = get_current_queue();
     user_handle_t get_win = get_user_full_handle( req->get_win );
     unsigned int filter = req->flags >> 16;
@@ -2515,9 +2515,12 @@ DECL_HANDLER(get_message)
     if (!filter) filter = QS_ALLINPUT;
 
     /* first check for sent messages */
-    if ((ptr = list_head( &queue->msg_list[SEND_MESSAGE] )))
+    LIST_FOR_EACH_ENTRY( msg, &queue->msg_list[SEND_MESSAGE], struct message, entry )
     {
-        struct message *msg = LIST_ENTRY( ptr, struct message, entry );
+        /* skip filtered internal messages */
+        if ((req->get_first & 0x80000000) && (req->get_last & 0x80000000) &&
+            !check_msg_filter( msg->msg, req->get_first, req->get_last ))
+            continue;
         receive_message( queue, msg, reply );
         return;
     }
-- 
2.28.0




More information about the wine-devel mailing list