[PATCH 15/18] Add rotation support for synaptics driver
Takashi Iwai
tiwai at suse.de
Fri Oct 8 10:22:39 PDT 2010
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
include/synaptics-properties.h | 3 +++
src/properties.c | 8 ++++++++
src/synaptics.c | 35 +++++++++++++++++++++++++++++++++++
src/synapticsstr.h | 1 +
tools/synclient.c | 1 +
5 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/include/synaptics-properties.h b/include/synaptics-properties.h
index 5d440be..f6fbfac 100644
--- a/include/synaptics-properties.h
+++ b/include/synaptics-properties.h
@@ -179,4 +179,7 @@
/* 32bit, read-only */
#define SYNAPTICS_PROP_GESTURE_MODE "Current Gesture Mode"
+/* 32 bit */
+#define SYNAPTICS_PROP_ORIENTATION "Synaptics Orientation"
+
#endif /* _SYNAPTICS_PROPERTIES_H_ */
diff --git a/src/properties.c b/src/properties.c
index 7788a13..7278560 100644
--- a/src/properties.c
+++ b/src/properties.c
@@ -46,6 +46,7 @@ static Atom float_type;
Atom prop_edges = 0;
Atom prop_finger = 0;
+Atom prop_orientation = 0;
Atom prop_tap_time = 0;
Atom prop_tap_move = 0;
Atom prop_tap_durations = 0;
@@ -263,6 +264,8 @@ InitDeviceProperties(InputInfoPtr pInfo)
prop_pressuremotion_factor = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 2, fvalues);
+ prop_orientation = InitAtom(local->dev, SYNAPTICS_PROP_ORIENTATION, 32, 1, ¶->orientation);
+
prop_grab = InitAtom(pInfo->dev, SYNAPTICS_PROP_GRAB, 8, 1, ¶->grab_event_device);
values[0] = para->tap_and_drag_gesture;
@@ -674,6 +677,11 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
para->press_motion_min_z = press[0];
para->press_motion_max_z = press[1];
+ } else if (property == prop_orientation) {
+ if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER)
+ return BadMatch;
+
+ para->orientation = *(INT32*)prop->data;
} else if (property == prop_grab)
{
if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER)
diff --git a/src/synaptics.c b/src/synaptics.c
index 2f264f0..71a5134 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -600,6 +600,7 @@ static void set_default_parameters(InputInfoPtr pInfo)
pars->coasting_friction = xf86SetRealOption(opts, "CoastingFriction", 50);
pars->press_motion_min_factor = xf86SetRealOption(opts, "PressureMotionMinFactor", 1.0);
pars->press_motion_max_factor = xf86SetRealOption(opts, "PressureMotionMaxFactor", 1.0);
+ pars->orientation = xf86SetIntOption(opts, "Orientation", 0);
pars->grab_event_device = xf86SetBoolOption(opts, "GrabEventDevice", TRUE);
pars->tap_and_drag_gesture = xf86SetBoolOption(opts, "TapAndDragGesture", TRUE);
pars->resolution_horiz = xf86SetIntOption(opts, "HorizResolution", horizResolution);
@@ -2818,6 +2819,38 @@ repeat_scrollbuttons(const InputInfoPtr pInfo,
return delay;
}
+static void do_rotation(SynapticsPrivate *priv, int orientation, int *xp, int *yp)
+{
+ int width = priv->maxx - priv->minx;
+ int height = priv->maxy - priv->miny;
+ int x = *xp;
+ int y = *yp;
+
+ switch (orientation) {
+ case 1:
+ *xp = (priv->maxy - y) * width / height + priv->minx;
+ *yp = (x - priv->minx) * height / width + priv->miny;
+ break;
+ case 2:
+ *xp = priv->maxx + priv->minx - x;
+ *yp = priv->maxy + priv->miny - y;
+ break;
+ case 3:
+ *xp = (y - priv->miny) * width / height + priv->minx;
+ *yp = (priv->maxx - x) * height / width + priv->miny;
+ break;
+ }
+}
+
+static void update_orientation(SynapticsPrivate *priv,
+ struct SynapticsHwState *hw)
+{
+ SynapticsParameters *para = &priv->synpara;
+ do_rotation(priv, para->orientation, &hw->x, &hw->y);
+ if (hw->multi_touch > 1)
+ do_rotation(priv, para->orientation, &hw->multi_touch_x, &hw->multi_touch_y);
+}
+
/*
* React on changes in the hardware state. This function is called every time
* the hardware state changes. The return value is used to specify how many
@@ -2843,6 +2876,8 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw)
prev_gesture_mode = priv->gesture_mode;
+ update_orientation(priv, hw);
+
update_multi_touch(priv, hw);
update_shm(pInfo, hw);
diff --git a/src/synapticsstr.h b/src/synapticsstr.h
index 285c8f3..e972a42 100644
--- a/src/synapticsstr.h
+++ b/src/synapticsstr.h
@@ -101,6 +101,7 @@ typedef struct _SynapticsParameters
{
/* Parameter data */
int left_edge, right_edge, top_edge, bottom_edge; /* edge coordinates absolute */
+ int orientation;
int finger_low, finger_high, finger_press; /* finger detection values in Z-values */
int tap_time;
int tap_move; /* max. tapping time and movement in packets and coord. */
diff --git a/tools/synclient.c b/tools/synclient.c
index 68faa13..c08d30c 100644
--- a/tools/synclient.c
+++ b/tools/synclient.c
@@ -78,6 +78,7 @@ static struct Parameter params[] = {
{"RightEdge", PT_INT, 0, 10000, SYNAPTICS_PROP_EDGES, 32, 1},
{"TopEdge", PT_INT, 0, 10000, SYNAPTICS_PROP_EDGES, 32, 2},
{"BottomEdge", PT_INT, 0, 10000, SYNAPTICS_PROP_EDGES, 32, 3},
+ {"Orientation", PT_INT, 0, 3, SYNAPTICS_PROP_ORIENTATION, 32, 0},
{"FingerLow", PT_INT, 0, 255, SYNAPTICS_PROP_FINGER, 32, 0},
{"FingerHigh", PT_INT, 0, 255, SYNAPTICS_PROP_FINGER, 32, 1},
{"FingerPress", PT_INT, 0, 256, SYNAPTICS_PROP_FINGER, 32, 2},
--
1.7.3.1
More information about the xorg-devel
mailing list