v8 of this patch incorporates Remi's recommendations to use the hw_rawinput_t union for hardware_msg_data and send the rawinput messages to the relevant thread only.
On Fri, Jul 26, 2019 at 3:30 PM Derek Lesho dereklesho52@gmail.com wrote:
Signed-off-by: Derek Lesho dereklesho52@Gmail.com
server/protocol.def | 52 ++++++++++++++++++++++++++++----------------- server/queue.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ server/trace.c | 21 ++++++++++++++++++ tools/make_requests | 1 + 4 files changed, 107 insertions(+), 19 deletions(-)
diff --git a/server/protocol.def b/server/protocol.def index 8b8a8a1512..b5368c71f6 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -286,31 +286,40 @@ struct hw_msg_source unsigned int origin; /* source origin (IMO_* values) */ };
+typedef union +{
- int type;
- struct
- {
int type; /* RIM_TYPEKEYBOARD */unsigned int message; /* message generated by this rawinputevent */
unsigned short vkey; /* virtual key code */unsigned short scan; /* scan code */- } kbd;
- struct
- {
int type; /* RIM_TYPEMOUSE */int x; /* x coordinate */int y; /* y coordinate */unsigned short button_flags; /* mouse button */unsigned short button_data; /* event details */- } mouse;
- struct
- {
int type; /* RIM_TYPEHID *//* TODO: fill this in if/when necessary */- } hid;
+} hw_rawinput_t; +#define RIM_ENABLE_NATIVE_MOUSE_MOVE 0x0800 +#define RIM_ENABLE_NATIVE_MOUSE_PRESS 0x1000
struct hardware_msg_data { lparam_t info; /* extra info */ unsigned int hw_id; /* unique id */ unsigned int flags; /* hook flags */ struct hw_msg_source source; /* message source */
- union
- {
int type;struct{int type; /* RIM_TYPEKEYBOARD */unsigned int message; /* message generated by this rawinputevent */
unsigned short vkey; /* virtual key code */unsigned short scan; /* scan code */} kbd;struct{int type; /* RIM_TYPEMOUSE */int x; /* x coordinate */int y; /* y coordinate */unsigned short button_flags; /* mouse button */unsigned short button_data; /* event details */} mouse;- } rawinput;
- hw_rawinput_t rawinput;
};
struct callback_msg_data @@ -2294,6 +2303,11 @@ enum message_type #define SEND_HWMSG_INJECTED 0x01
+@REQ(send_rawinput_message)
- hw_rawinput_t input;
+@END
/* Get a message from the current queue */ @REQ(get_message) unsigned int flags; /* PM_* flags */ diff --git a/server/queue.c b/server/queue.c index d12db927b9..03e64341c1 100644 --- a/server/queue.c +++ b/server/queue.c @@ -2421,6 +2421,58 @@ DECL_HANDLER(send_hardware_message) release_object( desktop ); }
+/* send a hardware rawinput message to the queue thread */ +DECL_HANDLER(send_rawinput_message) +{
- const struct rawinput_device *device;
- struct hardware_msg_data *msg_data;
- struct message *msg;
- struct desktop *desktop;
- struct hw_msg_source source = { IMDT_MOUSE, IMO_HARDWARE };
- desktop = get_thread_desktop( current, 0 );
- switch (req->input.type)
- {
- case RIM_TYPEMOUSE:
if ((device = current->process->rawinput_mouse)){struct thread *thread = device->target ? get_window_thread(device->target ) : NULL;
if (device->target ? (thread != current) :(current->queue->input != desktop->foreground_input))
{if ( thread )release_object( thread );release_object( desktop );return;}if (thread)release_object( thread );if (!(msg = alloc_hardware_message( 0, source, 0 ))) return;msg_data = msg->data;msg->win = device->target;msg->msg = WM_INPUT;msg->wparam = RIM_INPUT;msg->lparam = 0;msg_data->flags = 0;msg_data->rawinput.type = RIM_TYPEMOUSE;msg_data->rawinput.mouse.x = req->input.mouse.x;msg_data->rawinput.mouse.y = req->input.mouse.y;msg_data->rawinput.mouse.button_flags =req->input.mouse.button_flags;
msg_data->rawinput.mouse.button_data =req->input.mouse.button_data;
queue_hardware_message( desktop, msg, 0 );}break;- default:
set_error( STATUS_INVALID_PARAMETER );- }
- release_object(desktop);
+}
/* post a quit message to the current queue */ DECL_HANDLER(post_quit_message) { diff --git a/server/trace.c b/server/trace.c index 3562823659..bccab449cf 100644 --- a/server/trace.c +++ b/server/trace.c @@ -390,6 +390,27 @@ static void dump_hw_input( const char *prefix, const hw_input_t *input ) } }
+static void dump_hw_rawinput( const char *prefix, const hw_rawinput_t *rawinput ) +{
- switch (rawinput->type)
- {
- case RIM_TYPEMOUSE:
fprintf( stderr,"%s{type=MOUSE,x=%d,y=%d,button_flags=%04hx,button_data=%04hx}",
prefix, rawinput->mouse.x, rawinput->mouse.y,rawinput->mouse.button_flags,
rawinput->mouse.button_data);break;- case RIM_TYPEKEYBOARD:
fprintf( stderr, "%s{type=KEYBOARD}\n", prefix);break;- case RIM_TYPEHID:
fprintf( stderr, "%s{type=HID}\n", prefix);break;- default:
fprintf( stderr, "%s{type=%04x}", prefix, rawinput->type);break;- }
+}
static void dump_luid( const char *prefix, const luid_t *luid ) { fprintf( stderr, "%s%d.%u", prefix, luid->high_part, luid->low_part ); diff --git a/tools/make_requests b/tools/make_requests index 367f245653..cf631923a7 100755 --- a/tools/make_requests +++ b/tools/make_requests @@ -53,6 +53,7 @@ my %formats = "ioctl_code_t" => [ 4, 4, "&dump_ioctl_code" ], "cpu_type_t" => [ 4, 4, "&dump_cpu_type" ], "hw_input_t" => [ 32, 8, "&dump_hw_input" ],
- "hw_rawinput_t" => [ 16, 8, "&dump_hw_rawinput" ]
);
my @requests = ();
2.22.0