diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 6f9a869d..8c667973 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -333,6 +333,7 @@ patch_enable_all () enable_server_Stored_ACLs="$1" enable_server_Timestamp_Compat="$1" enable_server_device_manager_destroy="$1" + enable_server_send_hardware_message="$1" enable_setupapi_DelReg="$1" enable_setupapi_DiskSpaceList="$1" enable_setupapi_Display_Device="$1" @@ -1246,6 +1247,9 @@ patch_enable () server-device_manager_destroy) enable_server_device_manager_destroy="$2" ;; + server-send_hardware_message) + enable_server_send_hardware_message="$2" + ;; setupapi-DelReg) enable_setupapi_DelReg="$2" ;; @@ -7289,6 +7293,21 @@ if test "$enable_server_device_manager_destroy" -eq 1; then ) >> "$patchlist" fi +# Patchset server-send_hardware_message +# | +# | This patchset fixes the following Wine bugs: +# | * [#43102] Improve handling of hooks for normal (non-injected) hardware messages +# | +# | Modified files: +# | * server/queue.c +# | +if test "$enable_server_send_hardware_message" -eq 1; then + patch_apply server-send_hardware_message/0001-server-Improve-handling-of-hooks-for-normal-non-inje.patch + ( + printf '%s\n' '+ { "Michael Müller", "server: Improve handling of hooks for normal (non-injected) hardware messages.", 1 },'; + ) >> "$patchlist" +fi + # Patchset setupapi-DelReg # | # | This patchset fixes the following Wine bugs: diff --git a/patches/server-send_hardware_message/0001-server-Improve-handling-of-hooks-for-normal-non-inje.patch b/patches/server-send_hardware_message/0001-server-Improve-handling-of-hooks-for-normal-non-inje.patch new file mode 100644 index 00000000..583e6756 --- /dev/null +++ b/patches/server-send_hardware_message/0001-server-Improve-handling-of-hooks-for-normal-non-inje.patch @@ -0,0 +1,73 @@ +From 02879d85a14dd6fff5c473cf38f92dab1305f573 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Tue, 27 Jun 2017 02:08:50 +0200 +Subject: server: Improve handling of hooks for normal (non-injected) hardware + messages. + +--- + server/queue.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/server/queue.c b/server/queue.c +index 941fcb6a307..ee8e5255848 100644 +--- a/server/queue.c ++++ b/server/queue.c +@@ -1715,7 +1715,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons + struct hardware_msg_data *msg_data; + struct message *msg; + unsigned int i, time, flags; +- int wait = 0, x, y; ++ int hooked = 0, x, y; + + static const unsigned int messages[] = + { +@@ -1821,13 +1821,13 @@ 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 << sizeof(messages)/sizeof(messages[0])) - 1))) + { +- if (!(wait = send_hook_ll_message( desktop, msg, input, sender ))) ++ if (!(hooked = send_hook_ll_message( desktop, msg, input, sender ))) + queue_hardware_message( desktop, msg, 0 ); + } + else if (!send_hook_ll_message( desktop, msg, input, NULL )) + queue_hardware_message( desktop, msg, 0 ); + } +- return wait; ++ return hooked && sender; + } + + /* queue a hardware message for a keyboard event */ +@@ -1839,7 +1839,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c + struct message *msg; + unsigned char vkey = input->kbd.vkey; + unsigned int message_code, time; +- int wait; ++ int hooked; + + if (!(time = input->kbd.time)) time = get_tick_count(); + +@@ -1972,10 +1972,10 @@ 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 (!(hooked = send_hook_ll_message( desktop, msg, input, sender ))) + queue_hardware_message( desktop, msg, 1 ); + +- return wait; ++ return hooked && sender; + } + + /* queue a hardware message for a custom type of event */ +@@ -2493,7 +2493,7 @@ DECL_HANDLER(send_hardware_message) + { + struct thread *thread = NULL; + struct desktop *desktop; +- struct msg_queue *sender = get_current_queue(); ++ struct msg_queue *sender = (req->flags & SEND_HWMSG_INJECTED) ? get_current_queue() : NULL; + data_size_t size = min( 256, get_reply_max_size() ); + + if (!(desktop = get_thread_desktop( current, 0 ))) return; +-- +2.13.1 + diff --git a/patches/server-send_hardware_message/definition b/patches/server-send_hardware_message/definition new file mode 100644 index 00000000..bda013a5 --- /dev/null +++ b/patches/server-send_hardware_message/definition @@ -0,0 +1 @@ +Fixes: [43102] Improve handling of hooks for normal (non-injected) hardware messages