Module: wine Branch: master Commit: b053e924e8e13b3637f2a5a8ffe88d84c2d17075 URL: https://gitlab.winehq.org/wine/wine/-/commit/b053e924e8e13b3637f2a5a8ffe88d8...
Author: Rémi Bernon rbernon@codeweavers.com Date: Fri Mar 15 13:11:09 2024 +0100
server: Process internal messages when checking queue status.
---
dlls/dinput/tests/device8.c | 11 +++++++++++ dlls/win32u/input.c | 9 +++++++++ dlls/win32u/message.c | 13 +++---------- dlls/win32u/ntuser_private.h | 11 +++++++++++ include/wine/server_protocol.h | 4 +++- server/protocol.def | 1 + server/queue.c | 6 ++++++ server/request.h | 3 ++- server/trace.c | 1 + 9 files changed, 47 insertions(+), 12 deletions(-)
diff --git a/dlls/dinput/tests/device8.c b/dlls/dinput/tests/device8.c index 7fb0ef538e0..6bfc88f01cc 100644 --- a/dlls/dinput/tests/device8.c +++ b/dlls/dinput/tests/device8.c @@ -2038,6 +2038,9 @@ static void test_hid_touch_screen(void) ret = RegisterRawInputDevices( &rawdevice, 1, sizeof(RAWINPUTDEVICE) ); ok( ret, "RegisterRawInputDevices failed, error %lu\n", GetLastError() );
+ res = GetQueueStatus( QS_RAWINPUT ); + ok( res == 0, "got res %#lx\n", res ); + bus_send_hid_input( file, &desc, &touch_multiple, sizeof(touch_multiple) ); bus_wait_hid_input( file, &desc, 5000 ); bus_send_hid_input( file, &desc, &touch_release, sizeof(touch_release) ); @@ -2046,6 +2049,10 @@ static void test_hid_touch_screen(void) res = MsgWaitForMultipleObjects( 0, NULL, FALSE, 500, QS_POINTER ); ok( !res, "MsgWaitForMultipleObjects returned %#lx\n", res );
+ res = GetQueueStatus( QS_RAWINPUT ); + ok( LOWORD(res) == QS_RAWINPUT, "got res %#lx\n", res ); + ok( HIWORD(res) == QS_RAWINPUT, "got res %#lx\n", res ); + memset( rawbuffer, 0, sizeof(rawbuffer) ); rawinput = (RAWINPUT *)rawbuffer; rawbuffer_size = sizeof(rawbuffer); @@ -2064,6 +2071,10 @@ static void test_hid_touch_screen(void) ok( !memcmp( rawinput->data.hid.bRawData, touch_multiple.report_buf, desc.caps.InputReportByteLength ), "got unexpected report data\n" );
+ res = GetQueueStatus( QS_RAWINPUT ); + ok( LOWORD(res) == 0, "got res %#lx\n", res ); + ok( HIWORD(res) == 0, "got res %#lx\n", res ); + rawdevice.dwFlags = RIDEV_REMOVE; rawdevice.hwndTarget = 0; ret = RegisterRawInputDevices( &rawdevice, 1, sizeof(RAWINPUTDEVICE) ); diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 4a7c04f66c5..1886ff979d7 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -791,8 +791,17 @@ BOOL WINAPI NtUserGetCursorInfo( CURSORINFO *info )
static void check_for_events( UINT flags ) { + struct peek_message_filter filter = + { + .internal = TRUE, + .flags = PM_REMOVE, + }; + MSG msg; + if (!user_driver->pProcessEvents( flags )) flush_window_surfaces( TRUE ); + + peek_message( &msg, &filter ); }
/********************************************************************** diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 25b8c3c48f0..2b416f39241 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -2695,15 +2695,6 @@ static BOOL process_hardware_message( MSG *msg, UINT hw_id, const struct hardwar return ret; }
-struct peek_message_filter -{ - HWND hwnd; - UINT first; - UINT last; - UINT mask; - UINT flags; -}; - /*********************************************************************** * peek_message * @@ -2711,7 +2702,7 @@ struct peek_message_filter * available; -1 on error. * All pending sent messages are processed before returning. */ -static int peek_message( MSG *msg, const struct peek_message_filter *filter ) +int peek_message( MSG *msg, const struct peek_message_filter *filter ) { LRESULT result; HWND hwnd = filter->hwnd; @@ -2738,6 +2729,7 @@ static int peek_message( MSG *msg, const struct peek_message_filter *filter )
SERVER_START_REQ( get_message ) { + req->internal = filter->internal; req->flags = flags; req->get_win = wine_server_user_handle( hwnd ); req->get_first = first; @@ -2923,6 +2915,7 @@ static int peek_message( MSG *msg, const struct peek_message_filter *filter ) .first = info.msg.message, .last = info.msg.message, .mask = filter->mask, + .internal = filter->internal, }; peek_message( msg, &new_filter ); } diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h index 3b6cab5bdc9..bb2169998b6 100644 --- a/dlls/win32u/ntuser_private.h +++ b/dlls/win32u/ntuser_private.h @@ -238,6 +238,17 @@ extern void free_dce( struct dce *dce, HWND hwnd ); extern void invalidate_dce( WND *win, const RECT *extra_rect );
/* message.c */ +struct peek_message_filter +{ + HWND hwnd; + UINT first; + UINT last; + UINT mask; + UINT flags; + BOOL internal; +}; + +extern int peek_message( MSG *msg, const struct peek_message_filter *filter ); extern BOOL set_keyboard_auto_repeat( BOOL enable );
/* systray.c */ diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index f9b591ef207..d5b9867a0a7 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -2877,6 +2877,8 @@ struct get_message_request unsigned int hw_id; unsigned int wake_mask; unsigned int changed_mask; + unsigned int internal; + char __pad_44[4]; }; struct get_message_reply { @@ -6507,7 +6509,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 797 +#define SERVER_PROTOCOL_VERSION 798
/* ### protocol_version end ### */
diff --git a/server/protocol.def b/server/protocol.def index 814ad741f9a..55dda2d7636 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2150,6 +2150,7 @@ enum message_type unsigned int hw_id; /* id of the previous hardware message (or 0) */ unsigned int wake_mask; /* wakeup bits mask */ unsigned int changed_mask; /* changed bits mask */ + unsigned int internal; /* get internal messages only */ @REPLY user_handle_t win; /* window handle */ unsigned int msg; /* message code */ diff --git a/server/queue.c b/server/queue.c index c884e9f7f55..ed099b3b989 100644 --- a/server/queue.c +++ b/server/queue.c @@ -2994,6 +2994,12 @@ DECL_HANDLER(get_message) WM_WINE_LAST_DRIVER_MSG, req->flags, reply )) return;
+ if (req->internal) /* check for internal messages only, leave queue flags unchanged */ + { + set_error( STATUS_PENDING ); + return; + } + queue->last_get_msg = current_time; if (!filter) filter = QS_ALLINPUT;
diff --git a/server/request.h b/server/request.h index 69d10bcb138..0f5c03023bb 100644 --- a/server/request.h +++ b/server/request.h @@ -1412,7 +1412,8 @@ C_ASSERT( FIELD_OFFSET(struct get_message_request, get_last) == 24 ); C_ASSERT( FIELD_OFFSET(struct get_message_request, hw_id) == 28 ); C_ASSERT( FIELD_OFFSET(struct get_message_request, wake_mask) == 32 ); C_ASSERT( FIELD_OFFSET(struct get_message_request, changed_mask) == 36 ); -C_ASSERT( sizeof(struct get_message_request) == 40 ); +C_ASSERT( FIELD_OFFSET(struct get_message_request, internal) == 40 ); +C_ASSERT( sizeof(struct get_message_request) == 48 ); C_ASSERT( FIELD_OFFSET(struct get_message_reply, win) == 8 ); C_ASSERT( FIELD_OFFSET(struct get_message_reply, msg) == 12 ); C_ASSERT( FIELD_OFFSET(struct get_message_reply, wparam) == 16 ); diff --git a/server/trace.c b/server/trace.c index 2852770a5d2..fea0f2b3784 100644 --- a/server/trace.c +++ b/server/trace.c @@ -2735,6 +2735,7 @@ static void dump_get_message_request( const struct get_message_request *req ) fprintf( stderr, ", hw_id=%08x", req->hw_id ); fprintf( stderr, ", wake_mask=%08x", req->wake_mask ); fprintf( stderr, ", changed_mask=%08x", req->changed_mask ); + fprintf( stderr, ", internal=%08x", req->internal ); }
static void dump_get_message_reply( const struct get_message_reply *req )