Jacek Caban : user32: Introduce reply_message_result helper.

Alexandre Julliard julliard at winehq.org
Thu Mar 31 15:21:01 CDT 2022


Module: wine
Branch: master
Commit: f499b1a7abe92f54f4749f9f98981ada734b848a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f499b1a7abe92f54f4749f9f98981ada734b848a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Mar 31 15:35:51 2022 +0200

user32: Introduce reply_message_result helper.

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

---

 dlls/user32/message.c | 42 ++++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index 426352da584..6707565d5d7 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -261,6 +261,7 @@ struct received_message_info
     enum message_type type;
     MSG               msg;
     UINT              flags;  /* InSendMessageEx return flags */
+    struct received_message_info *prev;
 };
 
 /* structure to group all parameters for sent messages of the various kinds */
@@ -1824,10 +1825,11 @@ static void unpack_reply( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam,
  *
  * Send a reply to a sent message.
  */
-static void reply_message( struct received_message_info *info, LRESULT result, BOOL remove )
+static void reply_message( struct received_message_info *info, LRESULT result, MSG *msg )
 {
     struct packed_message data;
     int i, replied = info->flags & ISMEX_REPLIED;
+    BOOL remove = msg != NULL;
 
     if (info->flags & ISMEX_NOTIFY) return;  /* notify messages don't get replies */
     if (!remove && replied) return;  /* replied already */
@@ -1837,8 +1839,8 @@ static void reply_message( struct received_message_info *info, LRESULT result, B
 
     if (info->type == MSG_OTHER_PROCESS && !replied)
     {
-        pack_reply( info->msg.hwnd, info->msg.message, info->msg.wParam,
-                    info->msg.lParam, result, &data );
+        if (!msg) msg = &info->msg;
+        pack_reply( msg->hwnd, msg->message, msg->wParam, msg->lParam, result, &data );
     }
 
     SERVER_START_REQ( reply_message )
@@ -1852,6 +1854,22 @@ static void reply_message( struct received_message_info *info, LRESULT result, B
 }
 
 
+/***********************************************************************
+ *           reply_message_result
+ *
+ * Send a reply to a sent message and update thread receive info.
+ */
+static BOOL reply_message_result( LRESULT result, MSG *msg )
+{
+    struct received_message_info *info = get_user_thread_info()->receive_info;
+
+    if (!info) return FALSE;
+    reply_message( info, result, msg );
+    if (msg) get_user_thread_info()->receive_info = info->prev;
+    return TRUE;
+}
+
+
 /***********************************************************************
  *           handle_internal_message
  *
@@ -2665,7 +2683,7 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags,
     LRESULT result;
     struct user_thread_info *thread_info = get_user_thread_info();
     INPUT_MESSAGE_SOURCE prev_source = thread_info->msg_source;
-    struct received_message_info info, *old_info;
+    struct received_message_info info;
     unsigned int hw_id = 0;  /* id of previous hardware message */
     void *buffer;
     size_t buffer_size = 1024;
@@ -2810,7 +2828,7 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags,
                        hook.pt.x, hook.pt.y, hook.mouseData, hook.flags, hook.time, hook.dwExtraInfo );
                 result = HOOK_CallHooks( WH_MOUSE_LL, HC_ACTION, info.msg.wParam, (LPARAM)&hook, TRUE );
             }
-            reply_message( &info, result, TRUE );
+            reply_message( &info, result, &info.msg );
             continue;
         case MSG_OTHER_PROCESS:
             info.flags = ISMEX_SEND;
@@ -2818,7 +2836,7 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags,
                                  &info.msg.lParam, &buffer, size ))
             {
                 /* ignore it */
-                reply_message( &info, 0, TRUE );
+                reply_message( &info, 0, &info.msg );
                 continue;
             }
             break;
@@ -2878,14 +2896,14 @@ static int peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags,
         }
 
         /* if we get here, we have a sent message; call the window procedure */
-        old_info = thread_info->receive_info;
+        info.prev = thread_info->receive_info;
         thread_info->receive_info = &info;
         thread_info->msg_source = msg_source_unavailable;
         result = call_window_proc( info.msg.hwnd, info.msg.message, info.msg.wParam,
                                    info.msg.lParam, (info.type != MSG_ASCII), FALSE,
                                    WMCHAR_MAP_RECVMESSAGE );
-        reply_message( &info, result, TRUE );
-        thread_info->receive_info = old_info;
+        if (thread_info->receive_info == &info )
+            reply_message_result( result, &info.msg );
 
         /* if some PM_QS* flags were specified, only handle sent messages from now on */
         if (HIWORD(flags) && !changed_mask) flags = PM_QS_SENDMESSAGE | LOWORD(flags);
@@ -3573,11 +3591,7 @@ BOOL WINAPI SendMessageCallbackW( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa
  */
 BOOL WINAPI ReplyMessage( LRESULT result )
 {
-    struct received_message_info *info = get_user_thread_info()->receive_info;
-
-    if (!info) return FALSE;
-    reply_message( info, result, FALSE );
-    return TRUE;
+    return reply_message_result( result, NULL );
 }
 
 




More information about the wine-cvs mailing list