2020-04-16 15:55:20 -07:00
|
|
|
From 323c45f237fc828f32e27448e4c24649b69b49e0 Mon Sep 17 00:00:00 2001
|
2019-12-23 01:03:44 -08:00
|
|
|
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
|
|
|
|
Date: Tue, 12 Nov 2019 12:41:55 +0100
|
2020-04-16 15:55:20 -07:00
|
|
|
Subject: [PATCH] server: Broadcast rawinput message if request flag is
|
2019-12-23 01:03:44 -08:00
|
|
|
SEND_HWMSG_RAWINPUT.
|
|
|
|
|
|
|
|
If the request flag is equal to SEND_HWMSG_RAWINPUT, we broadcast the
|
|
|
|
message to all listening processes -or at least to the foreground
|
|
|
|
process until RIDEV_INPUTSINK is supported.
|
|
|
|
---
|
2020-04-16 15:55:20 -07:00
|
|
|
dlls/user32/tests/input.c | 2 +-
|
|
|
|
server/queue.c | 101 ++++++++++++++++++++++++++++++--------
|
|
|
|
2 files changed, 81 insertions(+), 22 deletions(-)
|
2019-12-23 01:03:44 -08:00
|
|
|
|
|
|
|
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
|
2020-04-16 15:55:20 -07:00
|
|
|
index d45a6b17ece..87e298ce8ff 100644
|
2019-12-23 01:03:44 -08:00
|
|
|
--- a/dlls/user32/tests/input.c
|
|
|
|
+++ b/dlls/user32/tests/input.c
|
2020-04-16 15:55:20 -07:00
|
|
|
@@ -2050,7 +2050,7 @@ static void test_rawinput_mouse(const char *argv0)
|
2019-12-23 01:03:44 -08:00
|
|
|
{ TRUE, TRUE, RIDEV_INPUTSINK, 2, 2, 0, 0, TRUE },
|
|
|
|
|
|
|
|
/* cross-process foreground tests */
|
|
|
|
- { TRUE, TRUE, 0, 0, 0, 0, 0, TRUE },
|
|
|
|
+ { TRUE, TRUE, 0, 0, 0, 0, 0, FALSE },
|
|
|
|
{ TRUE, TRUE, RIDEV_INPUTSINK, 2, 0, 0, 0, TRUE },
|
|
|
|
};
|
|
|
|
|
|
|
|
diff --git a/server/queue.c b/server/queue.c
|
2020-04-16 15:55:20 -07:00
|
|
|
index 05d7af0206f..e1a01389fcf 100644
|
2019-12-23 01:03:44 -08:00
|
|
|
--- a/server/queue.c
|
|
|
|
+++ b/server/queue.c
|
2020-04-16 15:55:20 -07:00
|
|
|
@@ -1596,12 +1596,70 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa
|
2019-12-23 01:03:44 -08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
+struct rawinput_message
|
|
|
|
+{
|
|
|
|
+ struct desktop *desktop;
|
|
|
|
+ struct hw_msg_source source;
|
|
|
|
+ unsigned int time;
|
|
|
|
+ struct hardware_msg_data data;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int queue_rawinput_message( struct process* process, void* user )
|
|
|
|
+{
|
|
|
|
+ const struct rawinput_message* raw_msg = user;
|
|
|
|
+ const struct rawinput_device *device = NULL;
|
|
|
|
+ struct desktop *desktop = NULL;
|
|
|
|
+ struct thread *thread = NULL, *foreground = NULL;
|
|
|
|
+ struct message *msg;
|
|
|
|
+
|
|
|
|
+ if (raw_msg->data.rawinput.type == RIM_TYPEMOUSE)
|
|
|
|
+ device = process->rawinput_mouse;
|
|
|
|
+ else if (raw_msg->data.rawinput.type == RIM_TYPEKEYBOARD)
|
|
|
|
+ device = process->rawinput_kbd;
|
|
|
|
+
|
|
|
|
+ if (!device)
|
|
|
|
+ goto done;
|
|
|
|
+
|
|
|
|
+ if (!(desktop = get_desktop_obj( process, process->desktop, 0 )) ||
|
|
|
|
+ (raw_msg->desktop && desktop != raw_msg->desktop))
|
|
|
|
+ goto done;
|
|
|
|
+
|
2020-04-16 15:55:20 -07:00
|
|
|
+ if (!device->target && !desktop->foreground_input)
|
|
|
|
+ goto done;
|
|
|
|
+
|
2019-12-23 01:03:44 -08:00
|
|
|
+ if (!(thread = get_window_thread( device->target ? device->target : desktop->foreground_input->active )) ||
|
|
|
|
+ process != thread->process)
|
|
|
|
+ goto done;
|
|
|
|
+
|
|
|
|
+ /* FIXME: Implement RIDEV_INPUTSINK */
|
2020-04-16 15:55:20 -07:00
|
|
|
+ if (!desktop->foreground_input || !(foreground = get_window_thread( desktop->foreground_input->active )) ||
|
2019-12-23 01:03:44 -08:00
|
|
|
+ thread->process != foreground->process)
|
|
|
|
+ goto done;
|
|
|
|
+
|
|
|
|
+ if (!(msg = alloc_hardware_message( raw_msg->data.info, raw_msg->source, raw_msg->time )))
|
|
|
|
+ goto done;
|
|
|
|
+
|
|
|
|
+ msg->win = device->target;
|
|
|
|
+ msg->msg = WM_INPUT;
|
|
|
|
+ msg->wparam = RIM_INPUT;
|
|
|
|
+ msg->lparam = 0;
|
|
|
|
+ memcpy( msg->data, &raw_msg->data, sizeof(raw_msg->data) );
|
|
|
|
+
|
|
|
|
+ queue_hardware_message( desktop, msg, 0 );
|
|
|
|
+
|
|
|
|
+done:
|
|
|
|
+ if (foreground) release_object( foreground );
|
|
|
|
+ if (thread) release_object( thread );
|
|
|
|
+ if (desktop) release_object( desktop );
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
/* 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 req_flags )
|
|
|
|
{
|
|
|
|
- const struct rawinput_device *device;
|
|
|
|
struct hardware_msg_data *msg_data;
|
|
|
|
+ struct rawinput_message raw_msg;
|
|
|
|
struct message *msg;
|
|
|
|
unsigned int i, time, flags;
|
|
|
|
struct hw_msg_source source = { IMDT_MOUSE, origin };
|
2020-04-16 15:55:20 -07:00
|
|
|
@@ -1651,24 +1709,24 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons
|
2019-12-23 01:03:44 -08:00
|
|
|
y = desktop->cursor.y;
|
|
|
|
}
|
|
|
|
|
|
|
|
- if ((device = current->process->rawinput_mouse) &&
|
|
|
|
- (req_flags & SEND_HWMSG_RAWINPUT))
|
|
|
|
+ if (req_flags & SEND_HWMSG_RAWINPUT)
|
|
|
|
{
|
|
|
|
- if (!(msg = alloc_hardware_message( input->mouse.info, source, time ))) return 0;
|
|
|
|
- msg_data = msg->data;
|
|
|
|
-
|
|
|
|
- msg->win = device->target;
|
|
|
|
- msg->msg = WM_INPUT;
|
|
|
|
- msg->wparam = RIM_INPUT;
|
|
|
|
- msg->lparam = 0;
|
|
|
|
+ raw_msg.desktop = desktop;
|
|
|
|
+ raw_msg.source = source;
|
|
|
|
+ raw_msg.time = time;
|
|
|
|
|
|
|
|
+ msg_data = &raw_msg.data;
|
|
|
|
+ msg_data->info = input->mouse.info;
|
|
|
|
msg_data->flags = flags;
|
|
|
|
msg_data->rawinput.type = RIM_TYPEMOUSE;
|
|
|
|
msg_data->rawinput.mouse.x = x - desktop->cursor.x;
|
|
|
|
msg_data->rawinput.mouse.y = y - desktop->cursor.y;
|
|
|
|
msg_data->rawinput.mouse.data = input->mouse.data;
|
|
|
|
|
|
|
|
- queue_hardware_message( desktop, msg, 0 );
|
|
|
|
+ if (req_flags == SEND_HWMSG_RAWINPUT)
|
|
|
|
+ enum_processes( queue_rawinput_message, &raw_msg );
|
|
|
|
+ else
|
|
|
|
+ queue_rawinput_message( current->process, &raw_msg );
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(req_flags & SEND_HWMSG_WINDOW))
|
2020-04-16 15:55:20 -07:00
|
|
|
@@ -1708,8 +1766,8 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
|
2019-12-23 01:03:44 -08:00
|
|
|
unsigned int origin, struct msg_queue *sender, unsigned int req_flags )
|
|
|
|
{
|
|
|
|
struct hw_msg_source source = { IMDT_KEYBOARD, origin };
|
|
|
|
- const struct rawinput_device *device;
|
|
|
|
struct hardware_msg_data *msg_data;
|
|
|
|
+ struct rawinput_message raw_msg;
|
|
|
|
struct message *msg;
|
|
|
|
unsigned char vkey = input->kbd.vkey;
|
|
|
|
unsigned int message_code, time;
|
2020-04-16 15:55:20 -07:00
|
|
|
@@ -1781,23 +1839,24 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c
|
2019-12-23 01:03:44 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
- if ((device = current->process->rawinput_kbd) &&
|
|
|
|
- (req_flags & SEND_HWMSG_RAWINPUT))
|
|
|
|
+ if (req_flags & SEND_HWMSG_RAWINPUT)
|
|
|
|
{
|
|
|
|
- if (!(msg = alloc_hardware_message( input->kbd.info, source, time ))) return 0;
|
|
|
|
- msg_data = msg->data;
|
|
|
|
-
|
|
|
|
- msg->win = device->target;
|
|
|
|
- msg->msg = WM_INPUT;
|
|
|
|
- msg->wparam = RIM_INPUT;
|
|
|
|
+ raw_msg.desktop = desktop;
|
|
|
|
+ raw_msg.source = source;
|
|
|
|
+ raw_msg.time = time;
|
|
|
|
|
|
|
|
+ msg_data = &raw_msg.data;
|
|
|
|
+ msg_data->info = input->kbd.info;
|
|
|
|
msg_data->flags = input->kbd.flags;
|
|
|
|
msg_data->rawinput.type = RIM_TYPEKEYBOARD;
|
|
|
|
msg_data->rawinput.kbd.message = message_code;
|
|
|
|
msg_data->rawinput.kbd.vkey = vkey;
|
|
|
|
msg_data->rawinput.kbd.scan = input->kbd.scan;
|
|
|
|
|
|
|
|
- queue_hardware_message( desktop, msg, 0 );
|
|
|
|
+ if (req_flags == SEND_HWMSG_RAWINPUT)
|
|
|
|
+ enum_processes( queue_rawinput_message, &raw_msg );
|
|
|
|
+ else
|
|
|
|
+ queue_rawinput_message( current->process, &raw_msg );
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(req_flags & SEND_HWMSG_WINDOW))
|
|
|
|
--
|
2020-04-16 15:55:20 -07:00
|
|
|
2.26.0
|
2019-12-23 01:03:44 -08:00
|
|
|
|