summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2011-06-09 20:03:11 +0100
committerPeter Hutterer <peter.hutterer@who-t.net>2011-10-24 16:01:30 +1000
commit4f46057a33b20df62d919e49a394ab6cb7aa6aa1 (patch)
tree4cf77764e89da1948439a56d0c3f556be0003c9c
parent15bef1f7092d37aeaa916ed7642ae3b6e684660c (diff)
Scroll: Initial smooth scrolling support
Post smooth-scrolling events through the new X server API when available, rather than legacy jerky button events. [Amended to use the final smooth scrolling API] Signed-off-by: Daniel Stone <daniel@fooishbar.org> Amendments-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/synaptics.c58
-rw-r--r--src/synapticsstr.h11
2 files changed, 66 insertions, 3 deletions
diff --git a/src/synaptics.c b/src/synaptics.c
index cea52a6..9daa45a 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -72,6 +72,7 @@
#include <exevents.h>
#include <X11/Xatom.h>
+#include <X11/extensions/XI2.h>
#include <xserver-properties.h>
#include <ptrveloc.h>
@@ -802,6 +803,10 @@ static void SynapticsUnInit(InputDriverPtr drv,
free(priv->timer);
if (priv && priv->proto_data)
free(priv->proto_data);
+#ifdef HAVE_SMOOTH_SCROLL
+ if (priv && priv->scroll_events_mask)
+ valuator_mask_free(&priv->scroll_events_mask);
+#endif
free(pInfo->private);
pInfo->private = NULL;
xf86DeleteInput(pInfo, 0);
@@ -931,6 +936,12 @@ static void InitAxesLabels(Atom *labels, int nlabels)
switch(nlabels)
{
default:
+#ifdef HAVE_SMOOTH_SCROLL
+ case 4:
+ labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_VSCROLL);
+ case 3:
+ labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_HSCROLL);
+#endif
case 2:
labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
case 1:
@@ -973,11 +984,16 @@ DeviceInit(DeviceIntPtr dev)
unsigned char map[SYN_MAX_BUTTONS + 1];
int i;
int min, max;
+ int num_axes = 2;
Atom btn_labels[SYN_MAX_BUTTONS] = { 0 };
- Atom axes_labels[2] = { 0 };
+ Atom axes_labels[4] = { 0 };
DeviceVelocityPtr pVel;
- InitAxesLabels(axes_labels, 2);
+#ifdef HAVE_SMOOTH_SCROLL
+ num_axes += 2;
+#endif
+
+ InitAxesLabels(axes_labels, num_axes);
InitButtonLabels(btn_labels, SYN_MAX_BUTTONS);
DBG(3, "Synaptics DeviceInit called\n");
@@ -992,7 +1008,7 @@ DeviceInit(DeviceIntPtr dev)
btn_labels,
SynapticsCtrl,
GetMotionHistorySize(),
- 2,
+ num_axes,
axes_labels);
/*
@@ -1074,6 +1090,21 @@ DeviceInit(DeviceIntPtr dev)
);
xf86InitValuatorDefaults(dev, 1);
+#ifdef HAVE_SMOOTH_SCROLL
+ xf86InitValuatorAxisStruct(dev, 2, axes_labels[2], 0, -1, 0, 0, 0,
+ Relative);
+ priv->scroll_axis_horiz = 2;
+ xf86InitValuatorAxisStruct(dev, 3, axes_labels[3], 0, -1, 0, 0, 0,
+ Relative);
+ priv->scroll_axis_vert = 3;
+ priv->scroll_events_mask = valuator_mask_new(MAX_VALUATORS);
+ if (!priv->scroll_events_mask)
+ return !Success;
+
+ SetScrollValuator(dev, priv->scroll_axis_horiz, SCROLL_TYPE_HORIZONTAL, 1, 0);
+ SetScrollValuator(dev, priv->scroll_axis_vert, SCROLL_TYPE_VERTICAL, 1, 0);
+#endif
+
if (!alloc_shm_data(pInfo))
return !Success;
@@ -2393,6 +2424,26 @@ post_scroll_events(const InputInfoPtr pInfo)
{
SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private);
+#ifdef HAVE_SMOOTH_SCROLL
+ valuator_mask_zero(priv->scroll_events_mask);
+
+ if (priv->scroll.delta_y != 0.0)
+ {
+ valuator_mask_set_double(priv->scroll_events_mask,
+ priv->scroll_axis_vert,
+ priv->scroll.delta_y);
+ priv->scroll.delta_y = 0;
+ }
+ if (priv->scroll.delta_x != 0.0)
+ {
+ valuator_mask_set_double(priv->scroll_events_mask,
+ priv->scroll_axis_horiz,
+ priv->scroll.delta_x);
+ priv->scroll.delta_x = 0;
+ }
+ if (valuator_mask_num_valuators(priv->scroll_events_mask))
+ xf86PostMotionEventM(pInfo->dev, FALSE, priv->scroll_events_mask);
+#else
while (priv->scroll.delta_y <= -1.0)
{
post_button_click(pInfo, 4);
@@ -2416,6 +2467,7 @@ post_scroll_events(const InputInfoPtr pInfo)
post_button_click(pInfo, 7);
priv->scroll.delta_x -= 1.0;
}
+#endif
}
static inline int
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index 1f6dc08..1ec8246 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -23,6 +23,7 @@
#define _SYNAPTICSSTR_H_
#include "synproto.h"
+#include <xserver-properties.h>
#ifdef DBG
# undef DBG
@@ -39,6 +40,10 @@
#define xf86IDrvMsg(pInfo, type, ...) xf86Msg(type, __VA_ARGS__)
#endif
+#ifdef AXIS_LABEL_PROP_REL_VSCROLL
+#define HAVE_SMOOTH_SCROLL
+#endif
+
/******************************************************************************
* Definitions
* structs, typedefs, #defines, enums
@@ -254,6 +259,12 @@ typedef struct _SynapticsPrivateRec
enum TouchpadModel model; /* The detected model */
unsigned short id_vendor; /* vendor id */
unsigned short id_product; /* product id */
+
+#ifdef HAVE_SMOOTH_SCROLL
+ int scroll_axis_horiz; /* Horizontal smooth-scrolling axis */
+ int scroll_axis_vert; /* Vertical smooth-scrolling axis */
+ ValuatorMask *scroll_events_mask; /* ValuatorMask for smooth-scrolling */
+#endif
} SynapticsPrivate;
#endif /* _SYNAPTICSSTR_H_ */