From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/message.c | 11 ++++++++++- server/protocol.def | 1 + server/queue.c | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 87efad6202c..02f937715bf 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3181,7 +3181,16 @@ static BOOL is_queue_signaled(void)
BOOL process_driver_events( UINT mask ) { - user_driver->pProcessEvents( mask ); + if (user_driver->pProcessEvents( mask )) + { + SERVER_START_REQ( set_queue_mask ) + { + req->poll_events = 1; + wine_server_call( req ); + } + SERVER_END_REQ; + } + return is_queue_signaled(); }
diff --git a/server/protocol.def b/server/protocol.def index e0bd2ee5a07..4fc12225fdb 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2302,6 +2302,7 @@ struct process_info @REQ(set_queue_mask) unsigned int wake_mask; /* wakeup bits mask */ unsigned int changed_mask; /* changed bits mask */ + int poll_events; /* whether to poll queue fd */ @REPLY unsigned int wake_bits; /* current wake bits */ unsigned int changed_bits; /* current changed bits */ diff --git a/server/queue.c b/server/queue.c index ffb1d441e60..2d36e1568c0 100644 --- a/server/queue.c +++ b/server/queue.c @@ -3158,6 +3158,14 @@ DECL_HANDLER(set_queue_mask) if (!queue) return; queue_shm = queue->shared;
+ if (req->poll_events) + { + if (!queue->fd) return; + if (check_fd_events( queue->fd, POLLIN )) set_queue_bits( queue, QS_DRIVER ); + else clear_queue_bits( queue, QS_DRIVER ); + return; + } + SHARED_WRITE_BEGIN( queue_shm, queue_shm_t ) { shared->access_time = monotonic_time;