From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dinput/tests/device8.c | 11 +++++++++++ server/queue.c | 7 +++++++ 2 files changed, 18 insertions(+)
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/server/queue.c b/server/queue.c index 27fcd74e996..2eb8ece4dbc 100644 --- a/server/queue.c +++ b/server/queue.c @@ -3720,6 +3720,7 @@ DECL_HANDLER(get_rawinput_buffer) else if ((buffer = mem_alloc( buffer_size ))) { size_t total_size = 0, next_size = 0; + int clear = 1;
reply->next_size = get_reply_max_size();
@@ -3734,6 +3735,7 @@ DECL_HANDLER(get_rawinput_buffer) if (total_size + sizeof(RAWINPUTHEADER) + data_size > buffer_size) { next_size = sizeof(RAWINPUTHEADER) + data_size; + clear = 0; break; }
@@ -3748,6 +3750,10 @@ DECL_HANDLER(get_rawinput_buffer) free_message( msg ); count++; } + else if (get_hardware_msg_bit( msg->msg ) == QS_RAWINPUT) + { + clear = 0; + } }
if (!next_size) @@ -3764,6 +3770,7 @@ DECL_HANDLER(get_rawinput_buffer)
reply->count = count; set_reply_data_ptr( buffer, total_size ); + if (clear) clear_queue_bits( current->queue, QS_RAWINPUT ); } }