<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>