From: Piotr Caban Subject: [PATCH v2] server: Don't wait for low level hook result when queuing hardware message. Message-Id: Date: Tue, 21 Sep 2021 15:51:35 +0200 Without the change graphic drivers are blocking until low level hooks are processed when injecting keyboard and mouse events. Causes 2-seconds (timeout) freeze in GtaV. Signed-off-by: Piotr Caban --- v2: - don't specify sender in send_hook_ll_message to avoid queuing result server/queue.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/server/queue.c b/server/queue.c index e4903bcb79f..5c19348eeba 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1839,7 +1839,12 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons /* specify a sender only when sending the last message */ if (!(flags & ((1 << ARRAY_SIZE( messages )) - 1))) { - if (!(wait = send_hook_ll_message( desktop, msg, input, sender ))) + if (origin == IMO_HARDWARE) + { + if (!send_hook_ll_message( desktop, msg, input, NULL )) + queue_hardware_message( desktop, msg, 0 ); + } + else if (!(wait = send_hook_ll_message( desktop, msg, input, sender ))) queue_hardware_message( desktop, msg, 0 ); } else if (!send_hook_ll_message( desktop, msg, input, NULL )) @@ -1860,7 +1865,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c struct thread *foreground; unsigned char vkey = input->kbd.vkey; unsigned int message_code, time; - int wait; + int wait = 0; if (!(time = input->kbd.time)) time = get_tick_count(); @@ -1981,7 +1986,12 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c msg_data->flags |= (flags & (KF_EXTENDED | KF_ALTDOWN | KF_UP)) >> 8; } - if (!(wait = send_hook_ll_message( desktop, msg, input, sender ))) + if (origin == IMO_HARDWARE) + { + if (!send_hook_ll_message( desktop, msg, input, NULL )) + queue_hardware_message( desktop, msg, 1 ); + } + else if (!(wait = send_hook_ll_message( desktop, msg, input, sender ))) queue_hardware_message( desktop, msg, 1 ); return wait;