Send ordinal values. These are unaccelerated values for the
various events that allow the client to choose which values
to use.
BUG=chromium-os:36802
TEST=On device
Change-Id: I7c3c0eba73dac16014bcea0fdd6bc43b5c69f5a5
Reviewed-on: https://gerrit.chromium.org/gerrit/42951
Tested-by: Dave Moore <[email protected]>
Reviewed-by: Daniel Kurtz <[email protected]>
Commit-Queue: Dave Moore <[email protected]>
diff --git a/src/cmt.c b/src/cmt.c
index fee2aac..b9730a2 100644
--- a/src/cmt.c
+++ b/src/cmt.c
@@ -27,6 +27,9 @@
#error Unsupported XInput version. Major version 12 and above required.
#endif
+#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X "Abs Dbl Ordinal X"
+#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y "Abs Dbl Ordinal Y"
+
#define AXIS_LABEL_PROP_ABS_FLING_STATE "Abs Fling State"
#define AXIS_LABEL_PROP_ABS_DBL_FLING_VX "Abs Dbl Fling X Velocity"
#define AXIS_LABEL_PROP_ABS_DBL_FLING_VY "Abs Dbl Fling Y Velocity"
@@ -352,6 +355,8 @@
static const char* axes_names[CMT_NUM_AXES] = {
AXIS_LABEL_PROP_REL_X,
AXIS_LABEL_PROP_REL_Y,
+ AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X,
+ AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y,
AXIS_LABEL_PROP_REL_HWHEEL,
AXIS_LABEL_PROP_REL_WHEEL,
AXIS_LABEL_PROP_ABS_FLING_STATE,
diff --git a/src/cmt.h b/src/cmt.h
index 866f5f4..81e1903 100644
--- a/src/cmt.h
+++ b/src/cmt.h
@@ -39,6 +39,8 @@
enum CMT_AXIS {
CMT_AXIS_X = 0,
CMT_AXIS_Y,
+ CMT_AXIS_ORDINAL_X,
+ CMT_AXIS_ORDINAL_Y,
CMT_AXIS_SCROLL_X,
CMT_AXIS_SCROLL_Y,
CMT_AXIS_FLING_STATE,
diff --git a/src/gesture.c b/src/gesture.c
index 9a0cbac..68e1e3f 100644
--- a/src/gesture.c
+++ b/src/gesture.c
@@ -228,6 +228,25 @@
valuator_mask_set_double(mask, CMT_AXIS_DBL_END_TIME, end_time);
}
+static void SetOrdinalValues(ValuatorMask* mask,
+ DeviceIntPtr dev,
+ float x,
+ float y,
+ BOOL is_absolute) {
+ if (!is_absolute) {
+ /*
+ * We send the movement axes as relative values, which causes the
+ * times to be sent as relative values too. This code computes the
+ * right relative values.
+ */
+ x -= dev->last.valuators[CMT_AXIS_ORDINAL_X];
+ y -= dev->last.valuators[CMT_AXIS_ORDINAL_Y];
+ }
+
+ valuator_mask_set_double(mask, CMT_AXIS_ORDINAL_X, x);
+ valuator_mask_set_double(mask, CMT_AXIS_ORDINAL_Y, y);
+}
+
static void Gesture_Gesture_Ready(void* client_data,
const struct Gesture* gesture)
{
@@ -246,20 +265,32 @@
break;
case kGestureTypeMove: {
const GestureMove* move = &gesture->details.move;
- DBG(info, "Gesture Move: (%f, %f)\n", move->dx, move->dy);
+ DBG(info, "Gesture Move: (%f, %f) [%f, %f]\n",
+ move->dx, move->dy, move->ordinal_dx, move->ordinal_dy);
valuator_mask_set_double(mask, CMT_AXIS_X, move->dx);
valuator_mask_set_double(mask, CMT_AXIS_Y, move->dy);
SetTimeValues(mask, gesture, dev, FALSE);
+ SetOrdinalValues(mask,
+ dev,
+ move->ordinal_dx,
+ move->ordinal_dy,
+ FALSE);
xf86PostMotionEventM(dev, FALSE, mask);
break;
}
case kGestureTypeScroll: {
const GestureScroll* scroll = &gesture->details.scroll;
- DBG(info, "Gesture Scroll: (%f, %f)\n", scroll->dx, scroll->dy);
+ DBG(info, "Gesture Scroll: (%f, %f) [%f, %f]\n",
+ scroll->dx, scroll->dy, scroll->ordinal_dx, scroll->ordinal_dy);
valuator_mask_set_double(mask, CMT_AXIS_SCROLL_X, scroll->dx);
valuator_mask_set_double(mask, CMT_AXIS_SCROLL_Y, scroll->dy);
valuator_mask_set_double(mask, CMT_AXIS_FINGER_COUNT, 2.0);
SetTimeValues(mask, gesture, dev, TRUE);
+ SetOrdinalValues(mask,
+ dev,
+ scroll->ordinal_dx,
+ scroll->ordinal_dy,
+ TRUE);
xf86PostMotionEventM(dev, TRUE, mask);
break;
}
@@ -284,22 +315,34 @@
}
case kGestureTypeFling: {
const GestureFling* fling = &gesture->details.fling;
- DBG(info, "Gesture Fling: vx=%f vy=%f fling_state=%d\n",
- fling->vx, fling->vy, fling->fling_state);
+ DBG(info, "Gesture Fling: (%f, %f) [%f, %f] fling_state=%d\n",
+ fling->vx, fling->vy, fling->ordinal_vx, fling->ordinal_vy,
+ fling->fling_state);
valuator_mask_set_double(mask, CMT_AXIS_DBL_FLING_VX, fling->vx);
valuator_mask_set_double(mask, CMT_AXIS_DBL_FLING_VY, fling->vy);
valuator_mask_set(mask, CMT_AXIS_FLING_STATE, fling->fling_state);
SetTimeValues(mask, gesture, dev, TRUE);
+ SetOrdinalValues(mask,
+ dev,
+ fling->ordinal_vx,
+ fling->ordinal_vy,
+ TRUE);
xf86PostMotionEventM(dev, TRUE, mask);
break;
}
case kGestureTypeSwipe: {
const GestureSwipe* swipe = &gesture->details.swipe;
- DBG(info, "Gesture Swipe: dx=%f dy=%f\n", swipe->dx, swipe->dy);
+ DBG(info, "Gesture Swipe: (%f, %f) [%f, %f]\n",
+ swipe->dx, swipe->dy, swipe->ordinal_dx, swipe->ordinal_dy);
valuator_mask_set_double(mask, CMT_AXIS_SCROLL_X, swipe->dx);
valuator_mask_set_double(mask, CMT_AXIS_SCROLL_Y, swipe->dy);
valuator_mask_set_double(mask, CMT_AXIS_FINGER_COUNT, 3.0);
SetTimeValues(mask, gesture, dev, TRUE);
+ SetOrdinalValues(mask,
+ dev,
+ swipe->ordinal_dx,
+ swipe->ordinal_dy,
+ TRUE);
xf86PostMotionEventM(dev, TRUE, mask);
break;
}
@@ -314,7 +357,8 @@
break;
case kGestureTypePinch: {
const GesturePinch* pinch = &gesture->details.pinch;
- DBG(info, "Gesture Pinch: dz=%f\n", pinch->dz);
+ DBG(info, "Gesture Pinch: dz=%f [%f]\n",
+ pinch->dz, pinch->ordinal_dz);
break;
}
default: