[PATCH v8 3/7] server: Add request for sending native raw-input messages.

Derek Lesho dereklesho52 at gmail.com
Fri Jul 26 14:34:51 CDT 2019


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 at gmail.com> wrote:

> Signed-off-by: Derek Lesho <dereklesho52 at 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 rawinput
> event */
> +        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 rawinput
> event */
> -            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
>
>
> + at REQ(send_rawinput_message)
> +    hw_rawinput_t input;
> + at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20190726/d3d3f416/attachment.html>


More information about the wine-devel mailing list