From 87a5dcecb72de837bc2180c2a6aeebe414b7a438 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Sat, 8 Jun 2024 08:26:32 +1000 Subject: [PATCH] Rebase against 7eb72b7bb3d3ea771efddcb5273e8a69456548ff. --- ...rver-objects-for-eventfd-based-synch.patch | 27 +++++--- ...uest-to-get-the-eventfd-file-descrip.patch | 28 ++++++--- ...server-ntdll-Implement-message-waits.patch | 40 +++++++----- ...dll-server-Implement-alertable-waits.patch | 60 +++++++++--------- ...hardware_message-flags-for-rawinput-.patch | 61 ++++++++++++------- staging/upstream-commit | 2 +- 6 files changed, 130 insertions(+), 88 deletions(-) diff --git a/patches/eventfd_synchronization/0002-server-Create-server-objects-for-eventfd-based-synch.patch b/patches/eventfd_synchronization/0002-server-Create-server-objects-for-eventfd-based-synch.patch index d94913bd..f2247b68 100644 --- a/patches/eventfd_synchronization/0002-server-Create-server-objects-for-eventfd-based-synch.patch +++ b/patches/eventfd_synchronization/0002-server-Create-server-objects-for-eventfd-based-synch.patch @@ -1,4 +1,4 @@ -From ec18233558b62aa736b5ecf20d2f7487e2823286 Mon Sep 17 00:00:00 2001 +From 9b9b36ccc66866ba142ce1f0d12190025ac2e7f7 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Thu, 7 Jun 2018 20:09:59 -0500 Subject: [PATCH] server: Create server objects for eventfd-based @@ -15,10 +15,10 @@ Subject: [PATCH] server: Create server objects for eventfd-based create mode 100644 server/esync.h diff --git a/server/Makefile.in b/server/Makefile.in -index 3b9446fe224..776faec63e4 100644 +index ae502dbf17d..b164193ef20 100644 --- a/server/Makefile.in +++ b/server/Makefile.in -@@ -11,6 +11,7 @@ C_SRCS = \ +@@ -11,6 +11,7 @@ SOURCES = \ debugger.c \ device.c \ directory.c \ @@ -381,7 +381,7 @@ index 00000000000..00f9e638d83 +extern int do_esync(void); +void esync_init(void); diff --git a/server/main.c b/server/main.c -index a134d811d82..3436b0871b4 100644 +index ddda5f4e86e..5062d0999fa 100644 --- a/server/main.c +++ b/server/main.c @@ -34,6 +34,7 @@ @@ -403,10 +403,10 @@ index a134d811d82..3436b0871b4 100644 set_current_time(); init_scheduler(); diff --git a/server/protocol.def b/server/protocol.def -index 99df502e398..9e15ada5bd0 100644 +index e86d3414247..03bc0aeb11e 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -3777,7 +3777,6 @@ struct handle_info +@@ -3867,7 +3867,6 @@ struct handle_info obj_handle_t handle; /* process handle */ @END @@ -414,11 +414,10 @@ index 99df502e398..9e15ada5bd0 100644 /* Iterate thread list for process */ @REQ(get_next_thread) obj_handle_t process; /* process handle */ -@@ -3788,3 +3787,27 @@ struct handle_info - @REPLY +@@ -3879,6 +3878,29 @@ struct handle_info obj_handle_t handle; /* next thread handle */ @END -+ + +enum esync_type +{ + ESYNC_SEMAPHORE = 1, @@ -442,6 +441,14 @@ index 99df502e398..9e15ada5bd0 100644 + int type; /* actual type (may be different for events) */ + unsigned int shm_idx; +@END + + /* Setup keyboard auto-repeat */ + @REQ(set_keyboard_repeat) +@@ -3888,3 +3910,4 @@ struct handle_info + @REPLY + int enable; /* previous state of auto-repeat enable */ + @END ++ -- -2.38.1 +2.43.0 diff --git a/patches/eventfd_synchronization/0012-server-Add-a-request-to-get-the-eventfd-file-descrip.patch b/patches/eventfd_synchronization/0012-server-Add-a-request-to-get-the-eventfd-file-descrip.patch index 11ee26b0..cf011c95 100644 --- a/patches/eventfd_synchronization/0012-server-Add-a-request-to-get-the-eventfd-file-descrip.patch +++ b/patches/eventfd_synchronization/0012-server-Add-a-request-to-get-the-eventfd-file-descrip.patch @@ -1,4 +1,4 @@ -From 193c44f510beed365640159cbdaeb0cb8186a7b0 Mon Sep 17 00:00:00 2001 +From 2f23f37d5a1ba0d59d367729d96285ac7c470e8d Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Fri, 8 Jun 2018 18:55:49 -0500 Subject: [PATCH] server: Add a request to get the eventfd file descriptor @@ -6,14 +6,14 @@ Subject: [PATCH] server: Add a request to get the eventfd file descriptor --- server/esync.c | 37 +++++++++++++++++++++++++++++++++++++ - server/protocol.def | 8 ++++++++ - 2 files changed, 45 insertions(+) + server/protocol.def | 9 ++++++++- + 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/server/esync.c b/server/esync.c -index d646cb52bc2..cfbbcf55c48 100644 +index f95dc5a391f..85f7f1e060f 100644 --- a/server/esync.c +++ b/server/esync.c -@@ -335,3 +335,40 @@ DECL_HANDLER(create_esync) +@@ -333,3 +333,40 @@ DECL_HANDLER(create_esync) if (root) release_object( root ); } @@ -55,14 +55,13 @@ index d646cb52bc2..cfbbcf55c48 100644 + release_object( obj ); +} diff --git a/server/protocol.def b/server/protocol.def -index 552d504cc8d..9062a5020c2 100644 +index 03bc0aeb11e..4ab6b97ba93 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -3689,3 +3689,11 @@ enum esync_type - int type; /* actual type (may be different for events) */ +@@ -3902,6 +3902,14 @@ enum esync_type unsigned int shm_idx; @END -+ + +/* Retrieve the esync fd for an object. */ +@REQ(get_esync_fd) + obj_handle_t handle; /* handle to the object */ @@ -70,6 +69,15 @@ index 552d504cc8d..9062a5020c2 100644 + int type; + unsigned int shm_idx; +@END ++ + /* Setup keyboard auto-repeat */ + @REQ(set_keyboard_repeat) + int enable; /* whether to enable auto-repeat */ +@@ -3910,4 +3918,3 @@ enum esync_type + @REPLY + int enable; /* previous state of auto-repeat enable */ + @END +- -- -2.28.0 +2.43.0 diff --git a/patches/eventfd_synchronization/0021-server-ntdll-Implement-message-waits.patch b/patches/eventfd_synchronization/0021-server-ntdll-Implement-message-waits.patch index 2ed83251..3da65f6b 100644 --- a/patches/eventfd_synchronization/0021-server-ntdll-Implement-message-waits.patch +++ b/patches/eventfd_synchronization/0021-server-ntdll-Implement-message-waits.patch @@ -1,4 +1,4 @@ -From d7b142aa0b60d99bd225849439cd49119a6e3e80 Mon Sep 17 00:00:00 2001 +From 465a4772356f406552cc20bddec820a4e197b667 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 6 Jul 2020 16:11:23 -0500 Subject: [PATCH] server, ntdll: Implement message waits. @@ -6,8 +6,8 @@ Subject: [PATCH] server, ntdll: Implement message waits. --- dlls/ntdll/unix/esync.c | 51 +++++++++++++++++++++++++++++++++++++++-- server/protocol.def | 5 ++++ - server/queue.c | 21 +++++++++++++++++ - 3 files changed, 75 insertions(+), 2 deletions(-) + server/queue.c | 22 ++++++++++++++++++ + 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/unix/esync.c b/dlls/ntdll/unix/esync.c index 399930c444b..06d7d8babc6 100644 @@ -105,23 +105,25 @@ index 399930c444b..06d7d8babc6 100644 { struct stat st; diff --git a/server/protocol.def b/server/protocol.def -index a2700b043ba..fb290c7964c 100644 +index 4ab6b97ba93..d28c1a6f5fa 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -3907,3 +3907,8 @@ enum esync_type - int type; +@@ -3910,6 +3910,10 @@ enum esync_type unsigned int shm_idx; @END -+ -+/* Notify the server that we are doing a message wait or done with one. */ + +@REQ(esync_msgwait) + int in_msgwait; /* are we in a message wait? */ +@END ++ + /* Setup keyboard auto-repeat */ + @REQ(set_keyboard_repeat) + int enable; /* whether to enable auto-repeat */ diff --git a/server/queue.c b/server/queue.c -index 936a6309683..fc13b1cf6eb 100644 +index 1568355104c..b68774d7524 100644 --- a/server/queue.c +++ b/server/queue.c -@@ -148,6 +148,7 @@ struct msg_queue +@@ -149,6 +149,7 @@ struct msg_queue int keystate_lock; /* owns an input keystate lock */ unsigned int ignore_post_msg; /* ignore post messages newer than this unique id */ int esync_fd; /* esync file descriptor (signalled on message) */ @@ -129,7 +131,7 @@ index 936a6309683..fc13b1cf6eb 100644 }; struct hotkey -@@ -321,6 +322,7 @@ static struct msg_queue *create_msg_queue( struct thread *thread, struct thread_ +@@ -322,6 +323,7 @@ static struct msg_queue *create_msg_queue( struct thread *thread, struct thread_ queue->keystate_lock = 0; queue->ignore_post_msg = 0; queue->esync_fd = -1; @@ -137,7 +139,7 @@ index 936a6309683..fc13b1cf6eb 100644 list_init( &queue->send_result ); list_init( &queue->callback_result ); list_init( &queue->pending_timers ); -@@ -1108,6 +1110,10 @@ static int is_queue_hung( struct msg_queue *queue ) +@@ -1115,6 +1117,10 @@ static int is_queue_hung( struct msg_queue *queue ) if (get_wait_queue_thread(entry)->queue == queue) return 0; /* thread is waiting on queue -> not hung */ } @@ -148,11 +150,10 @@ index 936a6309683..fc13b1cf6eb 100644 return 1; } -@@ -3735,3 +3741,18 @@ DECL_HANDLER(update_rawinput_devices) - release_object( desktop ); +@@ -3923,6 +3929,21 @@ DECL_HANDLER(update_rawinput_devices) } } -+ + +DECL_HANDLER(esync_msgwait) +{ + struct msg_queue *queue = get_current_queue(); @@ -167,6 +168,15 @@ index 936a6309683..fc13b1cf6eb 100644 + if (queue->fd) + set_fd_events( queue->fd, req->in_msgwait ? POLLIN : 0 ); +} ++ + DECL_HANDLER(set_keyboard_repeat) + { + struct desktop *desktop; +@@ -3941,3 +3962,4 @@ DECL_HANDLER(set_keyboard_repeat) + + release_object( desktop ); + } ++ -- 2.43.0 diff --git a/patches/eventfd_synchronization/0035-ntdll-server-Implement-alertable-waits.patch b/patches/eventfd_synchronization/0035-ntdll-server-Implement-alertable-waits.patch index b1954533..ecdafb92 100644 --- a/patches/eventfd_synchronization/0035-ntdll-server-Implement-alertable-waits.patch +++ b/patches/eventfd_synchronization/0035-ntdll-server-Implement-alertable-waits.patch @@ -1,4 +1,4 @@ -From 2d3957bbd6fb87e30bde05713c97ad42d57b3cf1 Mon Sep 17 00:00:00 2001 +From 5f5cfac7099cf4e5be912f07a66665f8217f57f3 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 6 Jul 2020 17:17:31 -0500 Subject: [PATCH] ntdll, server: Implement alertable waits. @@ -15,10 +15,10 @@ Subject: [PATCH] ntdll, server: Implement alertable waits. 8 files changed, 109 insertions(+), 9 deletions(-) diff --git a/dlls/ntdll/unix/esync.c b/dlls/ntdll/unix/esync.c -index d1a282c65e9..2a7c3865617 100644 +index 2844f9f760c..aeeea1731ce 100644 --- a/dlls/ntdll/unix/esync.c +++ b/dlls/ntdll/unix/esync.c -@@ -607,17 +607,42 @@ static void update_grabbed_object( struct esync *obj ) +@@ -599,17 +599,42 @@ static void update_grabbed_object( struct esync *obj ) static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEAN wait_any, BOOLEAN alertable, const LARGE_INTEGER *timeout ) { @@ -62,7 +62,7 @@ index d1a282c65e9..2a7c3865617 100644 NtQuerySystemTime( &now ); if (timeout) { -@@ -656,6 +681,8 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA +@@ -648,6 +673,8 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA if (msgwait) TRACE(" or driver events"); @@ -71,7 +71,7 @@ index d1a282c65e9..2a7c3865617 100644 if (!timeout) TRACE(", timeout = INFINITE.\n"); -@@ -692,12 +719,27 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA +@@ -684,12 +711,27 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA fds[i].fd = obj ? obj->fd : -1; fds[i].events = POLLIN; } @@ -100,7 +100,7 @@ index d1a282c65e9..2a7c3865617 100644 /* Find out which object triggered the wait. */ for (i = 0; i < count; i++) { -@@ -771,6 +813,14 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA +@@ -763,6 +805,14 @@ static NTSTATUS __esync_wait_objects( DWORD count, const HANDLE *handles, BOOLEA tryagain: /* First step: try to poll on each object in sequence. */ fds[0].events = POLLIN; @@ -115,7 +115,7 @@ index d1a282c65e9..2a7c3865617 100644 for (i = 0; i < count; i++) { struct esync *obj = objs[i]; -@@ -786,9 +836,11 @@ tryagain: +@@ -778,9 +828,11 @@ tryagain: continue; } @@ -128,7 +128,7 @@ index d1a282c65e9..2a7c3865617 100644 if (fds[0].revents & (POLLHUP | POLLERR | POLLNVAL)) { -@@ -804,10 +856,12 @@ tryagain: +@@ -796,10 +848,12 @@ tryagain: fds[i].fd = objs[i] ? objs[i]->fd : -1; fds[i].events = POLLIN; } @@ -143,7 +143,7 @@ index d1a282c65e9..2a7c3865617 100644 { /* Quick, grab everything. */ for (i = 0; i < count; i++) -@@ -873,6 +927,19 @@ err: +@@ -865,6 +919,19 @@ err: ERR("ppoll failed: %s\n", strerror(errno)); return errno_to_status( errno ); } @@ -164,10 +164,10 @@ index d1a282c65e9..2a7c3865617 100644 /* We need to let the server know when we are doing a message wait, and when we diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h -index c8c959029d0..1d40afcb569 100644 +index b278ab8df84..a3f0368b731 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h -@@ -52,6 +52,7 @@ struct ntdll_thread_data +@@ -93,6 +93,7 @@ struct ntdll_thread_data { void *cpu_data[16]; /* reserved for CPU-specific data */ void *kernel_stack; /* stack for thread startup and kernel syscalls */ @@ -176,10 +176,10 @@ index c8c959029d0..1d40afcb569 100644 int reply_fd; /* fd for receiving server replies */ int wait_fd[2]; /* fd for sleeping server requests */ diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c -index 83b8b892b0f..977bfdd2dd2 100644 +index 2116b677adb..a7d0bb7e8c8 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c -@@ -2888,6 +2888,7 @@ static TEB *init_teb( void *ptr, BOOL is_wow ) +@@ -3646,6 +3646,7 @@ static TEB *init_teb( void *ptr, BOOL is_wow ) teb->StaticUnicodeString.Buffer = teb->StaticUnicodeBuffer; teb->StaticUnicodeString.MaximumLength = sizeof(teb->StaticUnicodeBuffer); thread_data = (struct ntdll_thread_data *)&teb->GdiTebBatch; @@ -188,10 +188,10 @@ index 83b8b892b0f..977bfdd2dd2 100644 thread_data->reply_fd = -1; thread_data->wait_fd[0] = -1; diff --git a/server/esync.c b/server/esync.c -index ad5403bd4e0..3aa3a22df68 100644 +index c5587bef6cf..0c365006f0b 100644 --- a/server/esync.c +++ b/server/esync.c -@@ -348,19 +348,25 @@ int esync_create_fd( int initval, int flags ) +@@ -346,19 +346,25 @@ int esync_create_fd( int initval, int flags ) #endif } @@ -221,7 +221,7 @@ index ad5403bd4e0..3aa3a22df68 100644 } } -@@ -498,3 +504,9 @@ DECL_HANDLER(get_esync_fd) +@@ -496,3 +502,9 @@ DECL_HANDLER(get_esync_fd) release_object( obj ); } @@ -232,10 +232,10 @@ index ad5403bd4e0..3aa3a22df68 100644 + send_client_fd( current->process, current->esync_apc_fd, current->id ); +} diff --git a/server/esync.h b/server/esync.h -index aeb58c5469c..cea025d9308 100644 +index 689d8569b73..e1588d205d9 100644 --- a/server/esync.h +++ b/server/esync.h -@@ -21,6 +21,7 @@ +@@ -23,6 +23,7 @@ extern int do_esync(void); void esync_init(void); int esync_create_fd( int initval, int flags ); @@ -244,22 +244,22 @@ index aeb58c5469c..cea025d9308 100644 void esync_clear( int fd ); diff --git a/server/protocol.def b/server/protocol.def -index 5eadd8795f2..bb6f1d1c589 100644 +index 8c728080d05..3ea700054c6 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -3784,3 +3784,7 @@ enum esync_type - @REQ(esync_msgwait) - int in_msgwait; /* are we in a message wait? */ +@@ -3935,3 +3935,7 @@ enum esync_type + @REPLY + int enable; /* previous state of auto-repeat enable */ @END + +/* Retrieve the fd to wait on for user APCs. */ +@REQ(get_esync_apc_fd) +@END diff --git a/server/thread.c b/server/thread.c -index 10da1e3d4c7..258c3f28815 100644 +index fd6b91b228a..8d7c520ced7 100644 --- a/server/thread.c +++ b/server/thread.c -@@ -228,6 +228,7 @@ static inline void init_thread_structure( struct thread *thread ) +@@ -232,6 +232,7 @@ static inline void init_thread_structure( struct thread *thread ) thread->teb = 0; thread->entry_point = 0; thread->esync_fd = -1; @@ -267,7 +267,7 @@ index 10da1e3d4c7..258c3f28815 100644 thread->system_regs = 0; thread->queue = NULL; thread->wait = NULL; -@@ -375,7 +376,10 @@ struct thread *create_thread( int fd, struct process *process, const struct secu +@@ -380,7 +381,10 @@ struct thread *create_thread( int fd, struct process *process, const struct secu } if (do_esync()) @@ -278,7 +278,7 @@ index 10da1e3d4c7..258c3f28815 100644 set_fd_events( thread->request_fd, POLLIN ); /* start listening to events */ add_process_thread( thread->process, thread ); -@@ -1164,8 +1168,13 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr +@@ -1174,8 +1178,13 @@ static int queue_apc( struct process *process, struct thread *thread, struct thr grab_object( apc ); list_add_tail( queue, &apc->entry ); if (!list_prev( queue, &apc->entry )) /* first one */ @@ -292,7 +292,7 @@ index 10da1e3d4c7..258c3f28815 100644 return 1; } -@@ -1211,6 +1220,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system +@@ -1221,6 +1230,10 @@ static struct thread_apc *thread_dequeue_apc( struct thread *thread, int system apc = LIST_ENTRY( ptr, struct thread_apc, entry ); list_remove( ptr ); } @@ -304,10 +304,10 @@ index 10da1e3d4c7..258c3f28815 100644 } diff --git a/server/thread.h b/server/thread.h -index 8a5a8501d9c..e5145f9eb07 100644 +index 9129e473ba9..10e9e28b432 100644 --- a/server/thread.h +++ b/server/thread.h -@@ -55,6 +55,7 @@ struct thread +@@ -56,6 +56,7 @@ struct thread thread_id_t id; /* thread id */ struct list mutex_list; /* list of currently owned mutexes */ int esync_fd; /* esync file descriptor (signalled on exit) */ @@ -316,5 +316,5 @@ index 8a5a8501d9c..e5145f9eb07 100644 struct msg_queue *queue; /* message queue */ struct thread_wait *wait; /* current wait condition if sleeping */ -- -2.30.2 +2.43.0 diff --git a/patches/user32-rawinput-mouse/0004-server-Add-send_hardware_message-flags-for-rawinput-.patch b/patches/user32-rawinput-mouse/0004-server-Add-send_hardware_message-flags-for-rawinput-.patch index 5873bb4f..e38afaed 100644 --- a/patches/user32-rawinput-mouse/0004-server-Add-send_hardware_message-flags-for-rawinput-.patch +++ b/patches/user32-rawinput-mouse/0004-server-Add-send_hardware_message-flags-for-rawinput-.patch @@ -1,4 +1,4 @@ -From 84025e765979320128422a50d5f892e8f501b2df Mon Sep 17 00:00:00 2001 +From e51d13c759303fd7a903d784ebf8e9a42e2955b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Mon, 26 Aug 2019 14:37:20 +0200 Subject: [PATCH] server: Add send_hardware_message flags for rawinput @@ -7,14 +7,14 @@ Subject: [PATCH] server: Add send_hardware_message flags for rawinput --- include/ntuser.h | 4 ++++ server/protocol.def | 3 +-- - server/queue.c | 16 ++++++++++------ - 3 files changed, 15 insertions(+), 8 deletions(-) + server/queue.c | 20 ++++++++++++-------- + 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/ntuser.h b/include/ntuser.h -index ff45ffa2bc8..bc51f04af6e 100644 +index 507ed2e47ec..33e99f1084e 100644 --- a/include/ntuser.h +++ b/include/ntuser.h -@@ -1440,6 +1440,10 @@ struct hid_packet +@@ -1478,6 +1478,10 @@ struct hid_packet C_ASSERT(sizeof(struct hid_packet) == offsetof(struct hid_packet, data[0])); @@ -26,7 +26,7 @@ index ff45ffa2bc8..bc51f04af6e 100644 { UINT flags; diff --git a/server/protocol.def b/server/protocol.def -index 1fdedd161ff..4d199a6407c 100644 +index c3fab5e65ba..fc686f1254e 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -2164,7 +2164,7 @@ enum message_type @@ -47,18 +47,18 @@ index 1fdedd161ff..4d199a6407c 100644 /* Get a message from the current queue */ diff --git a/server/queue.c b/server/queue.c -index ac863fd439b..c38d91ba28c 100644 +index 7a721877a6f..a220baa1f92 100644 --- a/server/queue.c +++ b/server/queue.c -@@ -2019,7 +2019,7 @@ static void dispatch_rawinput_message( struct desktop *desktop, struct rawinput_ +@@ -2020,7 +2020,7 @@ static void dispatch_rawinput_message( struct desktop *desktop, struct rawinput_ /* queue a hardware message for a mouse event */ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, const hw_input_t *input, - unsigned int origin, struct msg_queue *sender ) + unsigned int origin, struct msg_queue *sender, unsigned int send_flags ) { - const struct rawinput_device *device; struct hardware_msg_data *msg_data; + struct rawinput_message raw_msg; @@ -2075,7 +2075,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons y = desktop->cursor.y; } @@ -68,8 +68,8 @@ index ac863fd439b..c38d91ba28c 100644 { memset( &raw_msg, 0, sizeof(raw_msg) ); raw_msg.foreground = foreground; -@@ -2097,6 +2097,8 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons - return 0; +@@ -2090,6 +2090,8 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons + release_object( foreground ); } + if (send_flags & SEND_HWMSG_NO_MSG) return 0; @@ -77,17 +77,34 @@ index ac863fd439b..c38d91ba28c 100644 for (i = 0; i < ARRAY_SIZE( messages ); i++) { if (!messages[i]) continue; -@@ -2128,7 +2130,7 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons +@@ -2120,14 +2122,14 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons + } + + static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, const hw_input_t *input, +- unsigned int origin, struct msg_queue *sender, int repeat ); ++ unsigned int origin, struct msg_queue *sender, int repeat, unsigned int send_flags); + + static void key_repeat_timeout( void *private ) + { + struct desktop *desktop = private; + + desktop->key_repeat.timeout = NULL; +- queue_keyboard_message( desktop, desktop->key_repeat.win, &desktop->key_repeat.input, IMO_HARDWARE, NULL, 1 ); ++ queue_keyboard_message( desktop, desktop->key_repeat.win, &desktop->key_repeat.input, IMO_HARDWARE, NULL, 1, 0 ); + } + + static void stop_key_repeat( struct desktop *desktop ) +@@ -2140,7 +2142,7 @@ static void stop_key_repeat( struct desktop *desktop ) /* queue a hardware message for a keyboard event */ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, const hw_input_t *input, -- unsigned int origin, struct msg_queue *sender ) -+ unsigned int origin, struct msg_queue *sender, unsigned int send_flags ) +- unsigned int origin, struct msg_queue *sender, int repeat ) ++ unsigned int origin, struct msg_queue *sender, int repeat, unsigned int send_flags ) { struct hw_msg_source source = { IMDT_KEYBOARD, origin }; - const struct rawinput_device *device; -@@ -2232,7 +2234,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c - } + struct hardware_msg_data *msg_data; +@@ -2263,7 +2265,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c + } } - if (!unicode && (foreground = get_foreground_thread( desktop, win ))) @@ -95,8 +112,8 @@ index ac863fd439b..c38d91ba28c 100644 { struct rawinput_message raw_msg = {0}; raw_msg.foreground = foreground; -@@ -2253,6 +2255,8 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c - return 0; +@@ -2278,6 +2280,8 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c + release_object( foreground ); } + if (send_flags & SEND_HWMSG_NO_MSG) return 0; @@ -104,7 +121,7 @@ index ac863fd439b..c38d91ba28c 100644 if (!(msg = alloc_hardware_message( input->kbd.info, source, time, 0 ))) return 0; msg_data = msg->data; -@@ -3004,10 +3008,10 @@ DECL_HANDLER(send_hardware_message) +@@ -3029,10 +3033,10 @@ DECL_HANDLER(send_hardware_message) switch (req->input.type) { case INPUT_MOUSE: @@ -112,8 +129,8 @@ index ac863fd439b..c38d91ba28c 100644 + wait = queue_mouse_message( desktop, req->win, &req->input, origin, sender, req->flags ); break; case INPUT_KEYBOARD: -- wait = queue_keyboard_message( desktop, req->win, &req->input, origin, sender ); -+ wait = queue_keyboard_message( desktop, req->win, &req->input, origin, sender, req->flags ); +- wait = queue_keyboard_message( desktop, req->win, &req->input, origin, sender, 0 ); ++ wait = queue_keyboard_message( desktop, req->win, &req->input, origin, sender, 0, req->flags ); break; case INPUT_HARDWARE: queue_custom_hardware_message( desktop, req->win, origin, &req->input ); diff --git a/staging/upstream-commit b/staging/upstream-commit index d8e394a7..da231ff4 100644 --- a/staging/upstream-commit +++ b/staging/upstream-commit @@ -1 +1 @@ -9f6e44fd9ca7d39258f2772c3f44013142702ca4 +7eb72b7bb3d3ea771efddcb5273e8a69456548ff