[Spice-devel] Adding support for mouse buttons SIDE and EXTRA (often scroll wheel push left or right)

Frediano Ziglio fziglio at redhat.com
Mon Dec 17 11:38:11 UTC 2018


> 
> I have a Logitech G600 mouse.  The scroll wheel can be pushed left or right.
> 
> On Arch Linux host, evtest shows these as event codes 275 (BTN_SIDE)
> and 276 (BTN_EXTRA.)  On host, they work as expected, by default as
> back and forward in supported programs such as web browsers.
> 
> There are so many mice which generate these events, going all the way
> back to the IntelliMouse Explorer in 1999.
> 
> QEMU supports these buttons.  For default PS/2 mouse emulation
> support, see https://github.com/qemu/qemu/blob/master/hw/input/ps2.c
> :700-701.  For "-device virtio-mouse-pci" support, see
> https://github.com/qemu/qemu/blob/master/hw/input/virtio-input-hid.c :
> 31-32.  On an Arch guest, evtest shows an "ImExPS/2 Generic Explorer
> Mouse" or a "QEMU Virtio Mouse", both of which list the event codes as
> supported.  On Windows 7 guest, Device Manager can be manually set to
> a "Microsoft - Microsoft PS/2 Mouse" instead of the default "Microsoft
> - PS/2 Compatible Mouse" driver, which forces IntelliMouse Explorer
> mode to allow usage of the extra buttons.
> 
> "remote-viewer --spice-debug" shows the events:
> 
> (remote-viewer:14226): GSpice-DEBUG: 17:09:00.043: spice-widget.c:2007
> 0:0 button_event press: button 8, state 0x10
> (remote-viewer:14226): GSpice-DEBUG: 17:09:00.414: spice-widget.c:2007
> 0:0 button_event release: button 8, state 0x10
> (remote-viewer:14226): GSpice-DEBUG: 17:09:01.045: spice-widget.c:2007
> 0:0 button_event press: button 9, state 0x10
> (remote-viewer:14226): GSpice-DEBUG: 17:09:01.473: spice-widget.c:2007
> 0:0 button_event release: button 9, state 0x10
> 

>From https://developer.gnome.org/gdk3/stable/gdk3-Event-Structures.html#GdkEventButton
these buttons should not even exist. Wondering what are button 6 and 7.

Honestly names are terrible, I would prefer SIDE_LEFT and SIDE_RIGHT.

> But, the guest never receives them, because spice doesn't appear to handle
> them.
> 
> It doesn't look like adding support for these should be many lines.  I
> was trying to write a patch, but got a bit lost.
> 
> 
> spice-protocol::spice/enums.h only gives SpiceMouseButton types of
> LEFT, MIDDLE, RIGHT, UP, and DOWN.  _SIDE and _EXTRA need to be added
> here.  If they're merely added, in c, they'd be represented by ints 6
> and 7.  I'm not sure if (2) _INVALID types would need to be left in
> the middle to make their internal representation match the button
> numbers that "remote-viewer --spice-debug" is showing.  (That's mainly
> because I'm not sure where these values are ultimately "decoded" into
> causing QEMU mouse events.)
> 

Don't confuse SPICE constant with Gdk ones, you/we need to change
spice.proto (see mouse_button) in spice-common and generate enums.h 

> spice-gtk::src/spice-widget.c::button_event() calls:
> 
> * button_gdk_to_spice() which also only gives the same 5 button types
> and returns 0 for button 8 or 9, so the event winds up never getting
> passing along.  _SIDE and _EXTRA need to be added here.  I'm not sure
> if they should be sequentially added as ints 6 and 7, or if (2)
> _INVALID types need to be added here for padding as well.
> 

No problem, compiler with sort the holes for you.

> * button_mask_gdk_to_spice() which might also need something added.
> I'm not sure why a mask is being used regarding the button state, let
> alone how to convert it.
> 

Depends if these button finish in the state, from your previous messages
seems not. The idea is that for instance the system can do a different action
if some modifier is enabled, for instance CTRL-Right_click or just Right_click.
Not all buttons end up in the state.

> * spice_inputs_channel_button_{press,release}() which might also need
> state mask handling in its switch().
> 

Not necessarily, as stated above.

> From there, msg->marshallers->msgc_inputs_mouse_{press,release}() are
> called.  Those threw me, and during the build process are generated as
> src/spice-gtk/subprojects/spice-common/common/generated_client_marshellers.c.
> They don't look like they need to be modified.
> 

Right

> I'm not sure where that message is received, or where it generates (I
> presume) a mouse event through QEMU.

They will be handled in inputs_channel_handle_message in server/inputs-channel.c
(spice-server). On the server additional code is required to communicate the
new buttons to Qemu.

Frediano


More information about the Spice-devel mailing list