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 3cd01af3aa7..2934d649813 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -3184,7 +3184,16 @@ static BOOL has_hardware_messages(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 has_hardware_messages(); }
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 0d11eb35f9e..734f56a3731 100644 --- a/server/queue.c +++ b/server/queue.c @@ -3163,6 +3163,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;