All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
@ 2017-08-23 13:51 Gerd Hoffmann
  2017-08-23 14:38 ` Marc-André Lureau
  2017-08-29  7:48 ` Ladi Prosek
  0 siblings, 2 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2017-08-23 13:51 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gerd Hoffmann, Marc-André Lureau, Michael S. Tsirkin

qemu uses wheel-up/down button events for mouse wheel input, however
linux applications typically want REL_WHEEL events.

This fixes wheel with linux guests. Tested with X11/wayland, and
windows virtio-input driver.

Based on a patch from Marc.
Added property to enable/disable wheel axis.
TODO: add compat properties for old machine types.

Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/hw/virtio/virtio-input.h |   1 +
 hw/input/virtio-input-hid.c      | 119 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 115 insertions(+), 5 deletions(-)

diff --git a/include/hw/virtio/virtio-input.h b/include/hw/virtio/virtio-input.h
index 91df57eca4..054c38836f 100644
--- a/include/hw/virtio/virtio-input.h
+++ b/include/hw/virtio/virtio-input.h
@@ -89,6 +89,7 @@ struct VirtIOInputHID {
     QemuInputHandler                  *handler;
     QemuInputHandlerState             *hs;
     int                               ledstate;
+    bool                              wheel_axis;
 };
 
 struct VirtIOInputHost {
diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index 46c038110c..79ab92e89f 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -190,6 +190,7 @@ static void virtio_input_key_config(VirtIOInput *vinput,
 static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
                                       InputEvent *evt)
 {
+    VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev);
     VirtIOInput *vinput = VIRTIO_INPUT(dev);
     virtio_input_event event;
     int qcode;
@@ -215,7 +216,14 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
         break;
     case INPUT_EVENT_KIND_BTN:
         btn = evt->u.btn.data;
-        if (keymap_button[btn->button]) {
+        if (vhid->wheel_axis && (btn->button == INPUT_BUTTON_WHEEL_UP ||
+                                 btn->button == INPUT_BUTTON_WHEEL_DOWN)) {
+            event.type  = cpu_to_le16(EV_REL);
+            event.code  = cpu_to_le16(REL_WHEEL);
+            event.value = cpu_to_le32(btn->button == INPUT_BUTTON_WHEEL_UP
+                                      ? 1 : -1);
+            virtio_input_send(vinput, &event);
+        } else if (keymap_button[btn->button]) {
             event.type  = cpu_to_le16(EV_KEY);
             event.code  = cpu_to_le16(keymap_button[btn->button]);
             event.value = cpu_to_le32(btn->down ? 1 : 0);
@@ -407,7 +415,7 @@ static QemuInputHandler virtio_mouse_handler = {
     .sync  = virtio_input_handle_sync,
 };
 
-static struct virtio_input_config virtio_mouse_config[] = {
+static struct virtio_input_config virtio_mouse_config_v1[] = {
     {
         .select    = VIRTIO_INPUT_CFG_ID_NAME,
         .size      = sizeof(VIRTIO_ID_NAME_MOUSE),
@@ -432,13 +440,53 @@ static struct virtio_input_config virtio_mouse_config[] = {
     { /* end of list */ },
 };
 
+static struct virtio_input_config virtio_mouse_config_v2[] = {
+    {
+        .select    = VIRTIO_INPUT_CFG_ID_NAME,
+        .size      = sizeof(VIRTIO_ID_NAME_MOUSE),
+        .u.string  = VIRTIO_ID_NAME_MOUSE,
+    },{
+        .select    = VIRTIO_INPUT_CFG_ID_DEVIDS,
+        .size      = sizeof(struct virtio_input_devids),
+        .u.ids     = {
+            .bustype = const_le16(BUS_VIRTUAL),
+            .vendor  = const_le16(0x0627), /* same we use for usb hid devices */
+            .product = const_le16(0x0002),
+            .version = const_le16(0x0002),
+        },
+    },{
+        .select    = VIRTIO_INPUT_CFG_EV_BITS,
+        .subsel    = EV_REL,
+        .size      = 2,
+        .u.bitmap  = {
+            (1 << REL_X) | (1 << REL_Y),
+            (1 << (REL_WHEEL - 8))
+        },
+    },
+    { /* end of list */ },
+};
+
+static Property virtio_mouse_properties[] = {
+    DEFINE_PROP_BOOL("wheel-axis", VirtIOInputHID, wheel_axis, true),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void virtio_mouse_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->props  = virtio_mouse_properties;
+}
+
 static void virtio_mouse_init(Object *obj)
 {
     VirtIOInputHID *vhid = VIRTIO_INPUT_HID(obj);
     VirtIOInput *vinput = VIRTIO_INPUT(obj);
 
     vhid->handler = &virtio_mouse_handler;
-    virtio_input_init_config(vinput, virtio_mouse_config);
+    virtio_input_init_config(vinput, vhid->wheel_axis
+                             ? virtio_mouse_config_v2
+                             : virtio_mouse_config_v1);
     virtio_input_key_config(vinput, keymap_button,
                             ARRAY_SIZE(keymap_button));
 }
@@ -448,6 +496,7 @@ static const TypeInfo virtio_mouse_info = {
     .parent        = TYPE_VIRTIO_INPUT_HID,
     .instance_size = sizeof(VirtIOInputHID),
     .instance_init = virtio_mouse_init,
+    .class_init    = virtio_mouse_class_init,
 };
 
 /* ----------------------------------------------------------------- */
@@ -459,7 +508,7 @@ static QemuInputHandler virtio_tablet_handler = {
     .sync  = virtio_input_handle_sync,
 };
 
-static struct virtio_input_config virtio_tablet_config[] = {
+static struct virtio_input_config virtio_tablet_config_v1[] = {
     {
         .select    = VIRTIO_INPUT_CFG_ID_NAME,
         .size      = sizeof(VIRTIO_ID_NAME_TABLET),
@@ -496,13 +545,72 @@ static struct virtio_input_config virtio_tablet_config[] = {
     { /* end of list */ },
 };
 
+static struct virtio_input_config virtio_tablet_config_v2[] = {
+    {
+        .select    = VIRTIO_INPUT_CFG_ID_NAME,
+        .size      = sizeof(VIRTIO_ID_NAME_TABLET),
+        .u.string  = VIRTIO_ID_NAME_TABLET,
+    },{
+        .select    = VIRTIO_INPUT_CFG_ID_DEVIDS,
+        .size      = sizeof(struct virtio_input_devids),
+        .u.ids     = {
+            .bustype = const_le16(BUS_VIRTUAL),
+            .vendor  = const_le16(0x0627), /* same we use for usb hid devices */
+            .product = const_le16(0x0003),
+            .version = const_le16(0x0002),
+        },
+    },{
+        .select    = VIRTIO_INPUT_CFG_EV_BITS,
+        .subsel    = EV_ABS,
+        .size      = 1,
+        .u.bitmap  = {
+            (1 << ABS_X) | (1 << ABS_Y),
+        },
+    },{
+        .select    = VIRTIO_INPUT_CFG_EV_BITS,
+        .subsel    = EV_REL,
+        .size      = 2,
+        .u.bitmap  = {
+            0,
+            (1 << (REL_WHEEL - 8))
+        },
+    },{
+        .select    = VIRTIO_INPUT_CFG_ABS_INFO,
+        .subsel    = ABS_X,
+        .size      = sizeof(virtio_input_absinfo),
+        .u.abs.min = const_le32(INPUT_EVENT_ABS_MIN),
+        .u.abs.max = const_le32(INPUT_EVENT_ABS_MAX),
+    },{
+        .select    = VIRTIO_INPUT_CFG_ABS_INFO,
+        .subsel    = ABS_Y,
+        .size      = sizeof(virtio_input_absinfo),
+        .u.abs.min = const_le32(INPUT_EVENT_ABS_MIN),
+        .u.abs.max = const_le32(INPUT_EVENT_ABS_MAX),
+    },
+    { /* end of list */ },
+};
+
+static Property virtio_tablet_properties[] = {
+    DEFINE_PROP_BOOL("wheel-axis", VirtIOInputHID, wheel_axis, true),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void virtio_tablet_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->props  = virtio_tablet_properties;
+}
+
 static void virtio_tablet_init(Object *obj)
 {
     VirtIOInputHID *vhid = VIRTIO_INPUT_HID(obj);
     VirtIOInput *vinput = VIRTIO_INPUT(obj);
 
     vhid->handler = &virtio_tablet_handler;
-    virtio_input_init_config(vinput, virtio_tablet_config);
+    virtio_input_init_config(vinput, vhid->wheel_axis
+                             ? virtio_tablet_config_v2
+                             : virtio_tablet_config_v1);
     virtio_input_key_config(vinput, keymap_button,
                             ARRAY_SIZE(keymap_button));
 }
@@ -512,6 +620,7 @@ static const TypeInfo virtio_tablet_info = {
     .parent        = TYPE_VIRTIO_INPUT_HID,
     .instance_size = sizeof(VirtIOInputHID),
     .instance_init = virtio_tablet_init,
+    .class_init    = virtio_tablet_class_init,
 };
 
 /* ----------------------------------------------------------------- */
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
  2017-08-23 13:51 [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons Gerd Hoffmann
@ 2017-08-23 14:38 ` Marc-André Lureau
  2017-08-23 14:49   ` Gerd Hoffmann
  2017-08-29  7:48 ` Ladi Prosek
  1 sibling, 1 reply; 9+ messages in thread
From: Marc-André Lureau @ 2017-08-23 14:38 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel; +Cc: Michael S. Tsirkin

Hi

On Wed, Aug 23, 2017 at 3:52 PM Gerd Hoffmann <kraxel@redhat.com> wrote:

> qemu uses wheel-up/down button events for mouse wheel input, however
> linux applications typically want REL_WHEEL events.
>
> This fixes wheel with linux guests. Tested with X11/wayland, and
> windows virtio-input driver.
>
> Based on a patch from Marc.
> Added property to enable/disable wheel axis.
> TODO: add compat properties for old machine types.
>

I guess this patch isn't enough to handle migration? Why not modify
hw/compat.h with this patch?


> Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
>

Otherwise looks good to me

---
>  include/hw/virtio/virtio-input.h |   1 +
>  hw/input/virtio-input-hid.c      | 119
> +++++++++++++++++++++++++++++++++++++--
>  2 files changed, 115 insertions(+), 5 deletions(-)
>
> diff --git a/include/hw/virtio/virtio-input.h
> b/include/hw/virtio/virtio-input.h
> index 91df57eca4..054c38836f 100644
> --- a/include/hw/virtio/virtio-input.h
> +++ b/include/hw/virtio/virtio-input.h
> @@ -89,6 +89,7 @@ struct VirtIOInputHID {
>      QemuInputHandler                  *handler;
>      QemuInputHandlerState             *hs;
>      int                               ledstate;
> +    bool                              wheel_axis;
>  };
>
>  struct VirtIOInputHost {
> diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
> index 46c038110c..79ab92e89f 100644
> --- a/hw/input/virtio-input-hid.c
> +++ b/hw/input/virtio-input-hid.c
> @@ -190,6 +190,7 @@ static void virtio_input_key_config(VirtIOInput
> *vinput,
>  static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
>                                        InputEvent *evt)
>  {
> +    VirtIOInputHID *vhid = VIRTIO_INPUT_HID(dev);
>      VirtIOInput *vinput = VIRTIO_INPUT(dev);
>      virtio_input_event event;
>      int qcode;
> @@ -215,7 +216,14 @@ static void virtio_input_handle_event(DeviceState
> *dev, QemuConsole *src,
>          break;
>      case INPUT_EVENT_KIND_BTN:
>          btn = evt->u.btn.data;
> -        if (keymap_button[btn->button]) {
> +        if (vhid->wheel_axis && (btn->button == INPUT_BUTTON_WHEEL_UP ||
> +                                 btn->button == INPUT_BUTTON_WHEEL_DOWN))
> {
> +            event.type  = cpu_to_le16(EV_REL);
> +            event.code  = cpu_to_le16(REL_WHEEL);
> +            event.value = cpu_to_le32(btn->button == INPUT_BUTTON_WHEEL_UP
> +                                      ? 1 : -1);
> +            virtio_input_send(vinput, &event);
> +        } else if (keymap_button[btn->button]) {
>              event.type  = cpu_to_le16(EV_KEY);
>              event.code  = cpu_to_le16(keymap_button[btn->button]);
>              event.value = cpu_to_le32(btn->down ? 1 : 0);
> @@ -407,7 +415,7 @@ static QemuInputHandler virtio_mouse_handler = {
>      .sync  = virtio_input_handle_sync,
>  };
>
> -static struct virtio_input_config virtio_mouse_config[] = {
> +static struct virtio_input_config virtio_mouse_config_v1[] = {
>      {
>          .select    = VIRTIO_INPUT_CFG_ID_NAME,
>          .size      = sizeof(VIRTIO_ID_NAME_MOUSE),
> @@ -432,13 +440,53 @@ static struct virtio_input_config
> virtio_mouse_config[] = {
>      { /* end of list */ },
>  };
>
> +static struct virtio_input_config virtio_mouse_config_v2[] = {
> +    {
> +        .select    = VIRTIO_INPUT_CFG_ID_NAME,
> +        .size      = sizeof(VIRTIO_ID_NAME_MOUSE),
> +        .u.string  = VIRTIO_ID_NAME_MOUSE,
> +    },{
> +        .select    = VIRTIO_INPUT_CFG_ID_DEVIDS,
> +        .size      = sizeof(struct virtio_input_devids),
> +        .u.ids     = {
> +            .bustype = const_le16(BUS_VIRTUAL),
> +            .vendor  = const_le16(0x0627), /* same we use for usb hid
> devices */
> +            .product = const_le16(0x0002),
> +            .version = const_le16(0x0002),
> +        },
> +    },{
> +        .select    = VIRTIO_INPUT_CFG_EV_BITS,
> +        .subsel    = EV_REL,
> +        .size      = 2,
> +        .u.bitmap  = {
> +            (1 << REL_X) | (1 << REL_Y),
> +            (1 << (REL_WHEEL - 8))
> +        },
> +    },
> +    { /* end of list */ },
> +};
> +
> +static Property virtio_mouse_properties[] = {
> +    DEFINE_PROP_BOOL("wheel-axis", VirtIOInputHID, wheel_axis, true),
> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +
> +static void virtio_mouse_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +
> +    dc->props  = virtio_mouse_properties;
> +}
> +
>  static void virtio_mouse_init(Object *obj)
>  {
>      VirtIOInputHID *vhid = VIRTIO_INPUT_HID(obj);
>      VirtIOInput *vinput = VIRTIO_INPUT(obj);
>
>      vhid->handler = &virtio_mouse_handler;
> -    virtio_input_init_config(vinput, virtio_mouse_config);
> +    virtio_input_init_config(vinput, vhid->wheel_axis
> +                             ? virtio_mouse_config_v2
> +                             : virtio_mouse_config_v1);
>      virtio_input_key_config(vinput, keymap_button,
>                              ARRAY_SIZE(keymap_button));
>  }
> @@ -448,6 +496,7 @@ static const TypeInfo virtio_mouse_info = {
>      .parent        = TYPE_VIRTIO_INPUT_HID,
>      .instance_size = sizeof(VirtIOInputHID),
>      .instance_init = virtio_mouse_init,
> +    .class_init    = virtio_mouse_class_init,
>  };
>
>  /* ----------------------------------------------------------------- */
> @@ -459,7 +508,7 @@ static QemuInputHandler virtio_tablet_handler = {
>      .sync  = virtio_input_handle_sync,
>  };
>
> -static struct virtio_input_config virtio_tablet_config[] = {
> +static struct virtio_input_config virtio_tablet_config_v1[] = {
>      {
>          .select    = VIRTIO_INPUT_CFG_ID_NAME,
>          .size      = sizeof(VIRTIO_ID_NAME_TABLET),
> @@ -496,13 +545,72 @@ static struct virtio_input_config
> virtio_tablet_config[] = {
>      { /* end of list */ },
>  };
>
> +static struct virtio_input_config virtio_tablet_config_v2[] = {
> +    {
> +        .select    = VIRTIO_INPUT_CFG_ID_NAME,
> +        .size      = sizeof(VIRTIO_ID_NAME_TABLET),
> +        .u.string  = VIRTIO_ID_NAME_TABLET,
> +    },{
> +        .select    = VIRTIO_INPUT_CFG_ID_DEVIDS,
> +        .size      = sizeof(struct virtio_input_devids),
> +        .u.ids     = {
> +            .bustype = const_le16(BUS_VIRTUAL),
> +            .vendor  = const_le16(0x0627), /* same we use for usb hid
> devices */
> +            .product = const_le16(0x0003),
> +            .version = const_le16(0x0002),
> +        },
> +    },{
> +        .select    = VIRTIO_INPUT_CFG_EV_BITS,
> +        .subsel    = EV_ABS,
> +        .size      = 1,
> +        .u.bitmap  = {
> +            (1 << ABS_X) | (1 << ABS_Y),
> +        },
> +    },{
> +        .select    = VIRTIO_INPUT_CFG_EV_BITS,
> +        .subsel    = EV_REL,
> +        .size      = 2,
> +        .u.bitmap  = {
> +            0,
> +            (1 << (REL_WHEEL - 8))
> +        },
> +    },{
> +        .select    = VIRTIO_INPUT_CFG_ABS_INFO,
> +        .subsel    = ABS_X,
> +        .size      = sizeof(virtio_input_absinfo),
> +        .u.abs.min = const_le32(INPUT_EVENT_ABS_MIN),
> +        .u.abs.max = const_le32(INPUT_EVENT_ABS_MAX),
> +    },{
> +        .select    = VIRTIO_INPUT_CFG_ABS_INFO,
> +        .subsel    = ABS_Y,
> +        .size      = sizeof(virtio_input_absinfo),
> +        .u.abs.min = const_le32(INPUT_EVENT_ABS_MIN),
> +        .u.abs.max = const_le32(INPUT_EVENT_ABS_MAX),
> +    },
> +    { /* end of list */ },
> +};
> +
> +static Property virtio_tablet_properties[] = {
> +    DEFINE_PROP_BOOL("wheel-axis", VirtIOInputHID, wheel_axis, true),
> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +
> +static void virtio_tablet_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +
> +    dc->props  = virtio_tablet_properties;
> +}
> +
>  static void virtio_tablet_init(Object *obj)
>  {
>      VirtIOInputHID *vhid = VIRTIO_INPUT_HID(obj);
>      VirtIOInput *vinput = VIRTIO_INPUT(obj);
>
>      vhid->handler = &virtio_tablet_handler;
> -    virtio_input_init_config(vinput, virtio_tablet_config);
> +    virtio_input_init_config(vinput, vhid->wheel_axis
> +                             ? virtio_tablet_config_v2
> +                             : virtio_tablet_config_v1);
>      virtio_input_key_config(vinput, keymap_button,
>                              ARRAY_SIZE(keymap_button));
>  }
> @@ -512,6 +620,7 @@ static const TypeInfo virtio_tablet_info = {
>      .parent        = TYPE_VIRTIO_INPUT_HID,
>      .instance_size = sizeof(VirtIOInputHID),
>      .instance_init = virtio_tablet_init,
> +    .class_init    = virtio_tablet_class_init,
>  };
>
>  /* ----------------------------------------------------------------- */
> --
> 2.9.3
>
>
> --
Marc-André Lureau

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
  2017-08-23 14:38 ` Marc-André Lureau
@ 2017-08-23 14:49   ` Gerd Hoffmann
  0 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2017-08-23 14:49 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel; +Cc: Michael S. Tsirkin

On Wed, 2017-08-23 at 14:38 +0000, Marc-André Lureau wrote:
> Hi
> 
> On Wed, Aug 23, 2017 at 3:52 PM Gerd Hoffmann <kraxel@redhat.com>
> wrote:
> > qemu uses wheel-up/down button events for mouse wheel input,
> > however
> > linux applications typically want REL_WHEEL events.
> > 
> > This fixes wheel with linux guests. Tested with X11/wayland, and
> > windows virtio-input driver.
> > 
> > Based on a patch from Marc.
> > Added property to enable/disable wheel axis.
> > TODO: add compat properties for old machine types.
> 
> I guess this patch isn't enough to handle migration? Why not modify
> hw/compat.h with this patch?

Because we are in freeze right now.  Just waiting until 2.11 opens and
the 2.11 machine type patch (seen on the list already) is merged, then
I'll do a v2 with the compat fluff.  Meanwhile this one should be good
enough for testing.

cheers,
  Gerd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
  2017-08-23 13:51 [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons Gerd Hoffmann
  2017-08-23 14:38 ` Marc-André Lureau
@ 2017-08-29  7:48 ` Ladi Prosek
  1 sibling, 0 replies; 9+ messages in thread
From: Ladi Prosek @ 2017-08-29  7:48 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: qemu-devel, Marc-André Lureau, Michael S. Tsirkin

On Wed, Aug 23, 2017 at 3:51 PM, Gerd Hoffmann <kraxel@redhat.com> wrote:
> qemu uses wheel-up/down button events for mouse wheel input, however
> linux applications typically want REL_WHEEL events.
>
> This fixes wheel with linux guests. Tested with X11/wayland, and
> windows virtio-input driver.
>
> Based on a patch from Marc.
> Added property to enable/disable wheel axis.
> TODO: add compat properties for old machine types.
>
> Cc: Marc-André Lureau <marcandre.lureau@redhat.com>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Verified that the Windows driver correctly handles axis-based wheel. Thanks!

Tested-by: Ladi Prosek <lprosek@redhat.com>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
  2017-08-21 13:23 ` Gerd Hoffmann
@ 2017-08-21 13:51   ` Marc-André Lureau
  0 siblings, 0 replies; 9+ messages in thread
From: Marc-André Lureau @ 2017-08-21 13:51 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: qemu-devel, Michael S. Tsirkin

Hi

----- Original Message -----
> On Wed, 2017-08-09 at 00:47 +0200, Marc-André Lureau wrote:
> > qemu uses wheel-up/down button events for mouse wheel input, however
> > linux applications typically want REL_WHEEL events.
> 
> --verbose please.
> 
> Both should work just fine.

I haven't done extensive review of all input code on linux, but from what I remember the event got dropped here:

https://cgit.freedesktop.org/xorg/driver/xf86-input-evdev/tree/src/evdev.c#n2720

It seems BTN_GEAR isn't clearly defined either.

Perhaps libinput does a better job at mapping the event, but we should consider older guests. Spice agent is using rel-wheel events, and we never had issues with it.

thanks

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
  2017-08-09  2:33 ` Michael S. Tsirkin
@ 2017-08-21 13:27   ` Gerd Hoffmann
  0 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2017-08-21 13:27 UTC (permalink / raw)
  To: Michael S. Tsirkin, Marc-André Lureau; +Cc: qemu-devel

  Hi,

> >          .select    = VIRTIO_INPUT_CFG_EV_BITS,
> >          .subsel    = EV_REL,
> > -        .size      = 1,
> > +        .size      = 2,
> >          .u.bitmap  = {
> > -            (1 << REL_X) | (1 << REL_Y),
> > +            (1 << REL_X) | (1 << REL_Y),  (1 << (REL_WHEEL - 8))
> 
> Works only when REL_WHEEL is between 8 and 15.
> Add BUILD_BUG_ON?

Not needed IMO, REL_WHEEL value is kernel/userspace abi and will never
change.

> 
> >          },
> >      },
> >      { /* end of list */ },
> 
> Is it problematic e.g. if you migrate from a host with REL_WHEEL
> to one without? Should we maintain a version without REL_WHEEL
> for old machine types?

Yes, we need a compat property.

Possibly it is easier to fix on the guest side, assuming it is actually
needed (see other reply).

cheers,
  Gerd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
  2017-08-08 22:47 Marc-André Lureau
  2017-08-09  2:33 ` Michael S. Tsirkin
@ 2017-08-21 13:23 ` Gerd Hoffmann
  2017-08-21 13:51   ` Marc-André Lureau
  1 sibling, 1 reply; 9+ messages in thread
From: Gerd Hoffmann @ 2017-08-21 13:23 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel; +Cc: Michael S. Tsirkin

On Wed, 2017-08-09 at 00:47 +0200, Marc-André Lureau wrote:
> qemu uses wheel-up/down button events for mouse wheel input, however
> linux applications typically want REL_WHEEL events.

--verbose please.

Both should work just fine.

cheers,
  Gerd

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
  2017-08-08 22:47 Marc-André Lureau
@ 2017-08-09  2:33 ` Michael S. Tsirkin
  2017-08-21 13:27   ` Gerd Hoffmann
  2017-08-21 13:23 ` Gerd Hoffmann
  1 sibling, 1 reply; 9+ messages in thread
From: Michael S. Tsirkin @ 2017-08-09  2:33 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Gerd Hoffmann

On Wed, Aug 09, 2017 at 12:47:50AM +0200, Marc-André Lureau wrote:
> qemu uses wheel-up/down button events for mouse wheel input, however
> linux applications typically want REL_WHEEL events.
> 
> This fixes wheel with linux guests. Tested with X11/wayland, and
> windows virtio-input driver.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  hw/input/virtio-input-hid.c | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
> index 46c038110c..f46857f0e4 100644
> --- a/hw/input/virtio-input-hid.c
> +++ b/hw/input/virtio-input-hid.c
> @@ -196,6 +196,7 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
>      InputKeyEvent *key;
>      InputMoveEvent *move;
>      InputBtnEvent *btn;
> +    unsigned int map;
>  
>      switch (evt->type) {
>      case INPUT_EVENT_KIND_KEY:
> @@ -215,9 +216,15 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
>          break;
>      case INPUT_EVENT_KIND_BTN:
>          btn = evt->u.btn.data;
> -        if (keymap_button[btn->button]) {
> +        map = keymap_button[btn->button];
> +        if (map == BTN_GEAR_DOWN || map == BTN_GEAR_UP) {
> +            event.type  = cpu_to_le16(EV_REL);
> +            event.code  = cpu_to_le16(REL_WHEEL);
> +            event.value = cpu_to_le32(map == BTN_GEAR_DOWN ? -1 : 1);

I realize now that value is actually a signed integer in 2's complement
format. Unfortunate that it's not documented.

> +            virtio_input_send(vinput, &event);
> +        } else if (map) {
>              event.type  = cpu_to_le16(EV_KEY);
> -            event.code  = cpu_to_le16(keymap_button[btn->button]);
> +            event.code  = cpu_to_le16(map);
>              event.value = cpu_to_le32(btn->down ? 1 : 0);
>              virtio_input_send(vinput, &event);
>          } else {
> @@ -424,9 +431,9 @@ static struct virtio_input_config virtio_mouse_config[] = {
>      },{
>          .select    = VIRTIO_INPUT_CFG_EV_BITS,
>          .subsel    = EV_REL,
> -        .size      = 1,
> +        .size      = 2,
>          .u.bitmap  = {
> -            (1 << REL_X) | (1 << REL_Y),
> +            (1 << REL_X) | (1 << REL_Y),  (1 << (REL_WHEEL - 8))

Works only when REL_WHEEL is between 8 and 15.
Add BUILD_BUG_ON?

>          },
>      },
>      { /* end of list */ },

Is it problematic e.g. if you migrate from a host with REL_WHEEL
to one without? Should we maintain a version without REL_WHEEL
for old machine types?


> -- 
> 2.14.0.1.geff633fa0

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons
@ 2017-08-08 22:47 Marc-André Lureau
  2017-08-09  2:33 ` Michael S. Tsirkin
  2017-08-21 13:23 ` Gerd Hoffmann
  0 siblings, 2 replies; 9+ messages in thread
From: Marc-André Lureau @ 2017-08-08 22:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: Marc-André Lureau, Gerd Hoffmann, Michael S. Tsirkin

qemu uses wheel-up/down button events for mouse wheel input, however
linux applications typically want REL_WHEEL events.

This fixes wheel with linux guests. Tested with X11/wayland, and
windows virtio-input driver.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/input/virtio-input-hid.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index 46c038110c..f46857f0e4 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -196,6 +196,7 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
     InputKeyEvent *key;
     InputMoveEvent *move;
     InputBtnEvent *btn;
+    unsigned int map;
 
     switch (evt->type) {
     case INPUT_EVENT_KIND_KEY:
@@ -215,9 +216,15 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
         break;
     case INPUT_EVENT_KIND_BTN:
         btn = evt->u.btn.data;
-        if (keymap_button[btn->button]) {
+        map = keymap_button[btn->button];
+        if (map == BTN_GEAR_DOWN || map == BTN_GEAR_UP) {
+            event.type  = cpu_to_le16(EV_REL);
+            event.code  = cpu_to_le16(REL_WHEEL);
+            event.value = cpu_to_le32(map == BTN_GEAR_DOWN ? -1 : 1);
+            virtio_input_send(vinput, &event);
+        } else if (map) {
             event.type  = cpu_to_le16(EV_KEY);
-            event.code  = cpu_to_le16(keymap_button[btn->button]);
+            event.code  = cpu_to_le16(map);
             event.value = cpu_to_le32(btn->down ? 1 : 0);
             virtio_input_send(vinput, &event);
         } else {
@@ -424,9 +431,9 @@ static struct virtio_input_config virtio_mouse_config[] = {
     },{
         .select    = VIRTIO_INPUT_CFG_EV_BITS,
         .subsel    = EV_REL,
-        .size      = 1,
+        .size      = 2,
         .u.bitmap  = {
-            (1 << REL_X) | (1 << REL_Y),
+            (1 << REL_X) | (1 << REL_Y),  (1 << (REL_WHEEL - 8))
         },
     },
     { /* end of list */ },
-- 
2.14.0.1.geff633fa0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2017-08-29  7:48 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-23 13:51 [Qemu-devel] [PATCH] virtio-input: send rel-wheel events for wheel buttons Gerd Hoffmann
2017-08-23 14:38 ` Marc-André Lureau
2017-08-23 14:49   ` Gerd Hoffmann
2017-08-29  7:48 ` Ladi Prosek
  -- strict thread matches above, loose matches on Subject: below --
2017-08-08 22:47 Marc-André Lureau
2017-08-09  2:33 ` Michael S. Tsirkin
2017-08-21 13:27   ` Gerd Hoffmann
2017-08-21 13:23 ` Gerd Hoffmann
2017-08-21 13:51   ` Marc-André Lureau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.