<div dir="ltr">Well, while it is certainly possible to use actual rawinput for sending keyboard events and mouse presses, I don't see much of an incentive to. With mouse motion, the DE is bypassed so mouse acceleration and sensitivity are bypassed (just like on windows), but I don't think DE's modify keyboard events or mouse presses in any meaningful way.<div><br></div><div>Plus, the fewer code paths we have doing the same thing the better I think.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 23, 2019 at 4:08 AM Rémi Bernon <<a href="mailto:rbernon@codeweavers.com">rbernon@codeweavers.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Sat, 2019-06-29 at 22:26 -0400, Derek Lesho wrote:<br>
> Signed-off-by: Derek Lesho <dereklesho52@Gmail.com><br>
> ---<br>
> server/protocol.def | 2 +<br>
> server/queue.c | 99 ++++++++++++++++++++++++++-------------------<br>
> 2 files changed, 59 insertions(+), 42 deletions(-)<br>
> <br>
> diff --git a/server/protocol.def b/server/protocol.def<br>
> index 3a6a202f49..9703b49154 100644<br>
> --- a/server/protocol.def<br>
> +++ b/server/protocol.def<br>
> @@ -358,6 +358,8 @@ typedef union<br>
> } hw;<br>
> } hw_input_t;<br>
> <br>
> +#define RIM_ENABLE_NATIVE_MOUSE_MOVE 0x0800<br>
> +#define RIM_ENABLE_NATIVE_MOUSE_PRESS 0x1000<br>
> typedef union<br>
> {<br>
> int type;<br>
> diff --git a/server/queue.c b/server/queue.c<br>
> index 35cfcecff5..41c26d8fa0 100644<br>
> --- a/server/queue.c<br>
> +++ b/server/queue.c<br>
> @@ -1599,6 +1599,9 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa<br>
> return 1;<br>
> }<br>
> <br>
> +int emulate_raw_mouse_move = 1;<br>
> +int emulate_raw_mouse_press = 1;<br>
> +<br>
> /* queue a hardware message for a mouse event */<br>
> static int queue_mouse_message( struct desktop *desktop, user_handle_t win, const hw_input_t *input,<br>
> unsigned int origin, struct msg_queue *sender )<br>
> @@ -1666,53 +1669,59 @@ static int queue_mouse_message( struct desktop *desktop, user_handle_t win, cons<br>
> <br>
> if ((device = current->process->rawinput_mouse))<br>
> {<br>
> - if (!(msg = alloc_hardware_message( input-><a href="http://mouse.info" rel="noreferrer" target="_blank">mouse.info</a>, source, time ))) return 0;<br>
> - msg_data = msg->data;<br>
> + if ( (emulate_raw_mouse_press && flags & ~MOUSEEVENTF_MOVE) || (emulate_raw_mouse_move && flags & MOUSEEVENTF_MOVE) )<br>
> + {<br>
> + if (!(msg = alloc_hardware_message( input-><a href="http://mouse.info" rel="noreferrer" target="_blank">mouse.info</a>, source, time ))) return 0;<br>
> + msg_data = msg->data;<br>
> <br>
> - msg->win = device->target;<br>
> - msg->msg = WM_INPUT;<br>
> - msg->wparam = RIM_INPUT;<br>
> - msg->lparam = 0;<br>
> + msg->win = device->target;<br>
> + msg->msg = WM_INPUT;<br>
> + msg->wparam = RIM_INPUT;<br>
> + msg->lparam = 0;<br>
> <br>
> - msg_data->flags = 0;<br>
> - msg_data->rawinput.type = RIM_TYPEMOUSE;<br>
> - msg_data->rawinput.mouse.x = x - desktop->cursor.x;<br>
> - msg_data->rawinput.mouse.y = y - desktop->cursor.y;<br>
> - msg_data->rawinput.mouse.button_flags = 0;<br>
> - msg_data->rawinput.mouse.button_data = 0;<br>
> + msg_data->flags = 0;<br>
> + msg_data->rawinput.type = RIM_TYPEMOUSE;<br>
> + msg_data->rawinput.mouse.x = emulate_raw_mouse_move ? x - desktop->cursor.x : 0;<br>
> + msg_data->rawinput.mouse.y = emulate_raw_mouse_move ? y - desktop->cursor.y : 0;<br>
> + msg_data->rawinput.mouse.button_flags = 0;<br>
> + msg_data->rawinput.mouse.button_data = 0;<br>
> <br>
> - for (i = 1; i < ARRAY_SIZE(raw_button_flags); ++i)<br>
> - {<br>
> - if (flags & (1 << i))<br>
> - msg_data->rawinput.mouse.button_flags |= raw_button_flags[i];<br>
> - }<br>
> + if (emulate_raw_mouse_press)<br>
> + {<br>
> + for (i = 1; i < ARRAY_SIZE(raw_button_flags); ++i)<br>
> + {<br>
> + if (flags & (1 << i))<br>
> + msg_data->rawinput.mouse.button_flags |= raw_button_flags[i];<br>
> + }<br>
> <br>
> - if (flags & MOUSEEVENTF_WHEEL)<br>
> - {<br>
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_WHEEL;<br>
> - msg_data->rawinput.mouse.button_data = input->mouse.data;<br>
> - }<br>
> - if (flags & MOUSEEVENTF_HWHEEL)<br>
> - {<br>
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_HORIZONTAL_WHEEL;<br>
> - msg_data->rawinput.mouse.button_data = input->mouse.data;<br>
> - }<br>
> - if (flags & MOUSEEVENTF_XDOWN)<br>
> - {<br>
> - if (input->mouse.data == XBUTTON1)<br>
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_DOWN;<br>
> - else if (input->mouse.data == XBUTTON2)<br>
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_DOWN;<br>
> - }<br>
> - if (flags & MOUSEEVENTF_XUP)<br>
> - {<br>
> - if (input->mouse.data == XBUTTON1)<br>
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_UP;<br>
> - else if (input->mouse.data == XBUTTON2)<br>
> - msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_UP;<br>
> - }<br>
> + if (flags & MOUSEEVENTF_WHEEL)<br>
> + {<br>
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_WHEEL;<br>
> + msg_data->rawinput.mouse.button_data = input->mouse.data;<br>
> + }<br>
> + if (flags & MOUSEEVENTF_HWHEEL)<br>
> + {<br>
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_HORIZONTAL_WHEEL;<br>
> + msg_data->rawinput.mouse.button_data = input->mouse.data;<br>
> + }<br>
> + if (flags & MOUSEEVENTF_XDOWN)<br>
> + {<br>
> + if (input->mouse.data == XBUTTON1)<br>
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_DOWN;<br>
> + else if (input->mouse.data == XBUTTON2)<br>
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_DOWN;<br>
> + }<br>
> + if (flags & MOUSEEVENTF_XUP)<br>
> + {<br>
> + if (input->mouse.data == XBUTTON1)<br>
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_4_UP;<br>
> + else if (input->mouse.data == XBUTTON2)<br>
> + msg_data->rawinput.mouse.button_flags |= RI_MOUSE_BUTTON_5_UP;<br>
> + }<br>
> + }<br>
> <br>
> - queue_hardware_message( desktop, msg, 0 );<br>
> + queue_hardware_message( desktop, msg, 0 );<br>
> + }<br>
> <br>
> if (device->flags & RIDEV_NOLEGACY)<br>
> return FALSE;<br>
> @@ -2455,6 +2464,12 @@ DECL_HANDLER(send_rawinput_message)<br>
> queue_hardware_message( desktop, msg, 0 );<br>
> }<br>
> break;<br>
> + case RIM_ENABLE_NATIVE_MOUSE_MOVE:<br>
> + emulate_raw_mouse_move = 0;<br>
> + break;<br>
> + case RIM_ENABLE_NATIVE_MOUSE_PRESS:<br>
> + emulate_raw_mouse_press = 0;<br>
> + break;<br>
> default:<br>
> set_error( STATUS_INVALID_PARAMETER );<br>
> }<br>
<br>
Don't you think we could simplify that by using only one<br>
emulate_raw_input flag? Are there any platforms where only some of the<br>
raw input events are received?<br>
<br>
Also the flag could probably be cleared on the first direct raw input<br>
request received instead of requiring private flag values, and an empty<br>
raw input event could be sent right after the initialization if we<br>
still want to be informed early on.<br>
-- <br>
Rémi Bernon <<a href="mailto:rbernon@codeweavers.com" target="_blank">rbernon@codeweavers.com</a>><br>
<br>
<br>
<br>
</blockquote></div>