On Wed, Oct 13, 2010 at 08:27:09AM +0200, Takashi Iwai wrote: > At Wed, 13 Oct 2010 14:13:00 +1000, > Peter Hutterer wrote: > > > > wacom calls it rotation, not sure about other drivers (evdev has an > > unfortunate mix of swapaxes and invert). some consistency would be nice. > > also, add man page update please with the allowed values. > > I have no preference, so just call one as you like :) > > > IMO the orientation property should go into the server anyway, so we finally > > have some consistency. > > Is there any plan (a defined API) for it?
as soon as you write the patch, it'll go in ;) we have the coordinate transformation matrix in the server already, so that's an example on how to do it. a rotation matrix on top shouldn't go amiss. given that matrix manipulation was never my forte, the plan is currently to wait for someone to send me a patch. Cheers, Peter > > there's also a demand for orientation other than in > > 90 deg increments, so perhaps parsing the actual degrees would be useful. > > OK. > > > thanks, > > Takashi > > > > > Cheers, > > Peter > > > > On Fri, Oct 08, 2010 at 07:22:39PM +0200, Takashi Iwai wrote: > > > Signed-off-by: Takashi Iwai <[email protected]> > > > --- > > > 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 > > > > > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
