[Spice-devel] [3/6] [PATCH spice] Add horizontal mouse wheel support
Frediano Ziglio
fziglio at redhat.com
Mon Oct 30 09:28:34 UTC 2017
>
> Signed-off-by: Matthew Francis <mjay.francis at gmail.com>
> ---
> README | 2 +-
> configure.ac | 2 +-
> server/inputs-channel.c | 15 +++++++++++----
> server/spice-input.h | 8 ++++----
> 4 files changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/README b/README
> index 4aaf6a7..1e6e677 100644
> --- a/README
> +++ b/README
> @@ -27,7 +27,7 @@ Or to install into a private user specific location
> The following mandatory dependencies are required in order to
> build SPICE
>
> - Spice protocol >= 0.12.13
> + Spice protocol >= 0.12.14
> Pixman >= 0.17.7
> OpenSSL
> libjpeg
> diff --git a/configure.ac b/configure.ac
> index fb266ad..3401dba 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -156,7 +156,7 @@ AS_IF([test x"$have_smartcard" = "xyes"], [
> AS_VAR_APPEND([SPICE_REQUIRES], [" libcacard >= 0.1.2"])
> ])
>
> -SPICE_PROTOCOL_MIN_VER=0.12.13
> +SPICE_PROTOCOL_MIN_VER=0.12.14
> PKG_CHECK_MODULES([SPICE_PROTOCOL], [spice-protocol >=
> $SPICE_PROTOCOL_MIN_VER])
> AC_SUBST([SPICE_PROTOCOL_MIN_VER])
>
> diff --git a/server/inputs-channel.c b/server/inputs-channel.c
> index f6ad27e..0e295b0 100644
> --- a/server/inputs-channel.c
> +++ b/server/inputs-channel.c
> @@ -287,7 +287,7 @@ static bool
> inputs_channel_handle_message(RedChannelClient *rcc, uint16_t type,
> SpiceMouseInterface *sif;
> sif = SPICE_CONTAINEROF(mouse->base.sif, SpiceMouseInterface,
> base);
> sif->motion(mouse,
> - mouse_motion->dx, mouse_motion->dy, 0,
> + mouse_motion->dx, mouse_motion->dy, 0, 0,
> RED_MOUSE_STATE_TO_LOCAL(mouse_motion->buttons_state));
> }
> break;
> @@ -317,8 +317,13 @@ static bool
> inputs_channel_handle_message(RedChannelClient *rcc, uint16_t type,
> }
> case SPICE_MSGC_INPUTS_MOUSE_PRESS: {
> SpiceMsgcMousePress *mouse_press = message;
> + int dw = 0;
> int dz = 0;
> - if (mouse_press->button == SPICE_MOUSE_BUTTON_UP) {
> + if (mouse_press->button == SPICE_MOUSE_BUTTON_WHEEL_LEFT) {
> + dw = -1;
> + } else if (mouse_press->button == SPICE_MOUSE_BUTTON_WHEEL_RIGHT) {
> + dw = 1;
> + } else if (mouse_press->button == SPICE_MOUSE_BUTTON_UP) {
> dz = -1;
> } else if (mouse_press->button == SPICE_MOUSE_BUTTON_DOWN) {
> dz = 1;
> @@ -327,6 +332,8 @@ static bool
> inputs_channel_handle_message(RedChannelClient *rcc, uint16_t type,
> if (reds_config_get_agent_mouse(reds) && reds_has_vdagent(reds))
> {
> inputs_channel->mouse_state.buttons =
> RED_MOUSE_BUTTON_STATE_TO_AGENT(mouse_press->buttons_state)
> |
> + (dw == -1 ? VD_AGENT_WLBUTTON_MASK : 0) |
> + (dw == 1 ? VD_AGENT_WRBUTTON_MASK : 0) |
> (dz == -1 ? VD_AGENT_UBUTTON_MASK : 0) |
> (dz == 1 ? VD_AGENT_DBUTTON_MASK : 0);
> reds_handle_agent_mouse_event(reds,
> &inputs_channel->mouse_state);
> @@ -334,14 +341,14 @@ static bool
> inputs_channel_handle_message(RedChannelClient *rcc, uint16_t type,
> SpiceTabletInterface *sif;
> sif =
> SPICE_CONTAINEROF(inputs_channel_get_tablet(inputs_channel)->base.sif,
> SpiceTabletInterface, base);
> - sif->wheel(inputs_channel_get_tablet(inputs_channel), dz,
> + sif->wheel(inputs_channel_get_tablet(inputs_channel), dw,
> dz,
> RED_MOUSE_STATE_TO_LOCAL(mouse_press->buttons_state));
> }
> } else if (inputs_channel_get_mouse(inputs_channel)) {
> SpiceMouseInterface *sif;
> sif =
> SPICE_CONTAINEROF(inputs_channel_get_mouse(inputs_channel)->base.sif,
> SpiceMouseInterface, base);
> - sif->motion(inputs_channel_get_mouse(inputs_channel), 0, 0, dz,
> + sif->motion(inputs_channel_get_mouse(inputs_channel), 0, 0, dw,
> dz,
> RED_MOUSE_STATE_TO_LOCAL(mouse_press->buttons_state));
> }
> break;
> diff --git a/server/spice-input.h b/server/spice-input.h
> index dc07c4f..1e2e44f 100644
> --- a/server/spice-input.h
> +++ b/server/spice-input.h
> @@ -48,7 +48,7 @@ struct SpiceKbdInstance {
> int spice_server_kbd_leds(SpiceKbdInstance *sin, int leds);
>
> #define SPICE_INTERFACE_MOUSE "mouse"
> -#define SPICE_INTERFACE_MOUSE_MAJOR 1
> +#define SPICE_INTERFACE_MOUSE_MAJOR 2
> #define SPICE_INTERFACE_MOUSE_MINOR 1
> typedef struct SpiceMouseInterface SpiceMouseInterface;
> typedef struct SpiceMouseInstance SpiceMouseInstance;
> @@ -57,7 +57,7 @@ typedef struct SpiceMouseState SpiceMouseState;
> struct SpiceMouseInterface {
> SpiceBaseInterface base;
>
> - void (*motion)(SpiceMouseInstance *sin, int dx, int dy, int dz,
> + void (*motion)(SpiceMouseInstance *sin, int dx, int dy, int dw, int dz,
> uint32_t buttons_state);
> void (*buttons)(SpiceMouseInstance *sin, uint32_t buttons_state);
> };
> @@ -68,7 +68,7 @@ struct SpiceMouseInstance {
> };
>
> #define SPICE_INTERFACE_TABLET "tablet"
> -#define SPICE_INTERFACE_TABLET_MAJOR 1
> +#define SPICE_INTERFACE_TABLET_MAJOR 2
> #define SPICE_INTERFACE_TABLET_MINOR 1
> typedef struct SpiceTabletInterface SpiceTabletInterface;
> typedef struct SpiceTabletInstance SpiceTabletInstance;
> @@ -79,7 +79,7 @@ struct SpiceTabletInterface {
>
> void (*set_logical_size)(SpiceTabletInstance* tablet, int width, int
> height);
> void (*position)(SpiceTabletInstance* tablet, int x, int y, uint32_t
> buttons_state);
> - void (*wheel)(SpiceTabletInstance* tablet, int wheel_moution, uint32_t
> buttons_state);
> + void (*wheel)(SpiceTabletInstance* tablet, int wheel_hmotion, int
> wheel_vmotion, uint32_t buttons_state);
> void (*buttons)(SpiceTabletInstance* tablet, uint32_t buttons_state);
> };
>
This patch changes ABI so would need a version bump and a Qemu patch.
Did you send a patch to Qemu too?
Maybe some capability and usage of some bits in wheel_motion could do
instead of we could add an additional function in SpiceTabletInstance/SpiceMouseInterface
to have a compatible ABI.
OT: what about support for touch pads?
Frediano
More information about the Spice-devel
mailing list