[PATCH] xwayland: Implement smooth scrolling

Peter Hutterer peter.hutterer at who-t.net
Thu Apr 30 00:49:28 PDT 2015


On Wed, Apr 29, 2015 at 10:39:18PM -0700, Dima Ryazanov wrote:
> We don't even need to simulate button clicks; it's done automatically.
> This also fixes scrolling in Qt5 apps.
> 
> Signed-off-by: Dima Ryazanov <dima at gmail.com>

Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>

Cheers,
   Peter
> ---
>  hw/xwayland/xwayland-input.c | 53 +++++++++++++-------------------------------
>  hw/xwayland/xwayland.h       |  4 ----
>  2 files changed, 16 insertions(+), 41 deletions(-)
> 
> diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
> index cc3bc53..9d8c28e 100644
> --- a/hw/xwayland/xwayland-input.c
> +++ b/hw/xwayland/xwayland-input.c
> @@ -43,7 +43,7 @@ static int
>  xwl_pointer_proc(DeviceIntPtr device, int what)
>  {
>  #define NBUTTONS 10
> -#define NAXES 2
> +#define NAXES 4
>      BYTE map[NBUTTONS + 1];
>      int i = 0;
>      Atom btn_labels[NBUTTONS] = { 0 };
> @@ -67,8 +67,10 @@ xwl_pointer_proc(DeviceIntPtr device, int what)
>  
>          axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_X);
>          axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_Y);
> +        axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_HWHEEL);
> +        axes_labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_WHEEL);
>  
> -        if (!InitValuatorClassDeviceStruct(device, 2, btn_labels,
> +        if (!InitValuatorClassDeviceStruct(device, NAXES, btn_labels,
>                                             GetMotionHistorySize(), Absolute))
>              return BadValue;
>  
> @@ -77,6 +79,13 @@ xwl_pointer_proc(DeviceIntPtr device, int what)
>                                 0, 0xFFFF, 10000, 0, 10000, Absolute);
>          InitValuatorAxisStruct(device, 1, axes_labels[1],
>                                 0, 0xFFFF, 10000, 0, 10000, Absolute);
> +        InitValuatorAxisStruct(device, 2, axes_labels[2],
> +                               NO_AXIS_LIMITS, NO_AXIS_LIMITS, 0, 0, 0, Relative);
> +        InitValuatorAxisStruct(device, 3, axes_labels[3],
> +                               NO_AXIS_LIMITS, NO_AXIS_LIMITS, 0, 0, 0, Relative);
> +
> +        SetScrollValuator(device, 2, SCROLL_TYPE_HORIZONTAL, 1.0, SCROLL_FLAG_NONE);
> +        SetScrollValuator(device, 3, SCROLL_TYPE_VERTICAL, 1.0, SCROLL_FLAG_PREFERRED);
>  
>          if (!InitPtrFeedbackClassDeviceStruct(device, xwl_pointer_control))
>              return BadValue;
> @@ -259,54 +268,24 @@ pointer_handle_axis(void *data, struct wl_pointer *pointer,
>                      uint32_t time, uint32_t axis, wl_fixed_t value)
>  {
>      struct xwl_seat *xwl_seat = data;
> -    int index, count;
> -    int i, val;
> +    int index;
>      const int divisor = 10;
>      ValuatorMask mask;
>  
> -    if (time - xwl_seat->scroll_time > 2000) {
> -        xwl_seat->vertical_scroll = 0;
> -        xwl_seat->horizontal_scroll = 0;
> -    }
> -    xwl_seat->scroll_time = time;
> -
> -    /* FIXME: Need to do proper smooth scrolling here! */
>      switch (axis) {
>      case WL_POINTER_AXIS_VERTICAL_SCROLL:
> -        xwl_seat->vertical_scroll += value / divisor;
> -        val = wl_fixed_to_int(xwl_seat->vertical_scroll);
> -        xwl_seat->vertical_scroll -= wl_fixed_from_int(val);
> -
> -        if (val <= -1)
> -            index = 4;
> -        else if (val >= 1)
> -            index = 5;
> -        else
> -            return;
> +        index = 3;
>          break;
>      case WL_POINTER_AXIS_HORIZONTAL_SCROLL:
> -        xwl_seat->horizontal_scroll += value / divisor;
> -        val = wl_fixed_to_int(xwl_seat->horizontal_scroll);
> -        xwl_seat->horizontal_scroll -= wl_fixed_from_int(val);
> -
> -        if (val <= -1)
> -            index = 6;
> -        else if (val >= 1)
> -            index = 7;
> -        else
> -            return;
> +        index = 2;
>          break;
>      default:
>          return;
>      }
>  
>      valuator_mask_zero(&mask);
> -
> -    count = abs(val);
> -    for (i = 0; i < count; i++) {
> -        QueuePointerEvents(xwl_seat->pointer, ButtonPress, index, 0, &mask);
> -        QueuePointerEvents(xwl_seat->pointer, ButtonRelease, index, 0, &mask);
> -    }
> +    valuator_mask_set_double(&mask, index, wl_fixed_to_double(value) / divisor);
> +    QueuePointerEvents(xwl_seat->pointer, MotionNotify, 0, POINTER_RELATIVE, &mask);
>  }
>  
>  static const struct wl_pointer_listener pointer_listener = {
> diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
> index bfffa71..cfb343d 100644
> --- a/hw/xwayland/xwayland.h
> +++ b/hw/xwayland/xwayland.h
> @@ -122,10 +122,6 @@ struct xwl_seat {
>      struct xorg_list link;
>      CursorPtr x_cursor;
>  
> -    wl_fixed_t horizontal_scroll;
> -    wl_fixed_t vertical_scroll;
> -    uint32_t scroll_time;
> -
>      size_t keymap_size;
>      char *keymap;
>      struct wl_surface *keyboard_focus;
> -- 
> 2.1.4
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the wayland-devel mailing list