Hi! I noticed that I have forgotten to add the PressureMotion (bool) parameter in synclient. The lack is repared in this patch.
Best, -- Steph
diff -Naur xfree86-driver-synaptics-0.14.3/manpages/synaptics.5 xfree86-driver-synaptics-0.14.3-patch/manpages/synaptics.5 --- xfree86-driver-synaptics-0.14.3/manpages/synaptics.5 2005-11-03 15:09:32.000000000 -0800 +++ xfree86-driver-synaptics-0.14.3-patch/manpages/synaptics.5 2005-11-06 15:39:02.000000000 -0800 @@ -44,6 +44,8 @@ . Not all models implement this feature.) .IP \(bu 4 +Pressure dependant motion speed. +.IP \(bu 4 Run-time configuration using shared memory. This means you can change parameter settings without restarting the X server. .LP @@ -152,6 +154,21 @@ \fBAccelFactor\fR (Float) Acceleration factor. .TP +\fBPressureMotion (Bool) +Switch on/off pressure dependant motion speed. +.TP +\fBPressureMotionMinZ\fR (Integer) +Finger pressure at which minimum pressure motion factor is applied. +.TP +\fBPressureMotionMaxZ\fR (Integer) +Finger pressure at which maximum pressure motion factor is applied. +.TP +\fBPressureMotionMinFactor\fR (Integer) +Lowest setting for edge motion factor. +.TP +\fBPressureMotionMaxFactor\fR (Integer) +Greatest setting for edge motion factor. +.TP \fBUpDownScrolling\fR (Bool) If on, the up/down buttons generate button 4/5 events. . @@ -388,13 +405,35 @@ The sensitivity can be adjusted using the EdgeMotion parameters. . If the pressure is below EdgeMotionMinZ, EdgeMotionMinSpeed is used, -and if the pressure is greater than EdgeMotionMaxZ, EdgeMotionMaxSpeed -is used. +and if the pressure is greater than EdgeMotionMaxZ, +EdgeMotionMaxSpeed is used. . For a pressure value between EdgeMotionMinZ and EdgeMotionMaxZ, the speed is increased linearly. . .LP +When pressure motion is activated, the cursor motion speed depends +on the pressure exerced on the touchpad (the more pressure exerced on +the touchpad, the faster the pointer). +. +More precisely the speed is first calculated according to MinSpeed, +MaxSpeed and AccelFactor, and then is multiplied by a sensitivity +factor. +. +The sensitivity factor can be adjusted using the PressureMotion +parameters. +. +If the pressure is below PressureMotionMinZ, PressureMotionMinFactor +is used, and if the pressure isgreater than PressureMotionMaxZ, +PressureMotionMaxFactor is used. +. +By default, PressureMotionMinZ and PressureMotionMaxZ are equal to +EdgeMotionMinZ and EdgeMotionMaxZ. +. +For a pressure value between EdgeMotionMinZ and EdgeMotionMaxZ, the +factor is increased linearly. +. +.LP Since most synaptics touchpad models don't have a button that corresponds to the middle button on a mouse, the driver can emulate middle mouse button events. diff -Naur xfree86-driver-synaptics-0.14.3/README xfree86-driver-synaptics-0.14.3-patch/README --- xfree86-driver-synaptics-0.14.3/README 2005-07-09 15:09:40.000000000 -0700 +++ xfree86-driver-synaptics-0.14.3-patch/README 2005-11-06 01:55:06.000000000 -0800 @@ -27,6 +27,7 @@ - Multifinger taps: two finger for middle button and three finger for right button events. (Needs hardware support. Not all models implement this feature.) +- Pressure dependant motion speed. - Run-time configuration using shared memory. This means you can change parameter settings without restarting the X server. diff -Naur xfree86-driver-synaptics-0.14.3/synaptics.c xfree86-driver-synaptics-0.14.3-patch/synaptics.c --- xfree86-driver-synaptics-0.14.3/synaptics.c 2005-07-09 15:09:40.000000000 -0700 +++ xfree86-driver-synaptics-0.14.3-patch/synaptics.c 2005-11-05 20:24:42.000000000 -0800 @@ -385,7 +385,10 @@ pars->palm_detect = xf86SetBoolOption(local->options, "PalmDetect", TRUE); pars->palm_min_width = xf86SetIntOption(local->options, "PalmMinWidth", 10); pars->palm_min_z = xf86SetIntOption(local->options, "PalmMinZ", 200); - + pars->press_motion = xf86SetBoolOption(local->options, "PressureMotion", FALSE); + pars->press_motion_min_z = xf86SetIntOption(local->options, "PressureMotionMinZ", pars->edge_motion_min_z); + pars->press_motion_max_z = xf86SetIntOption(local->options, "PressureMotionMaxZ", pars->edge_motion_max_z); + str_par = xf86FindOptionValue(local->options, "MinSpeed"); if ((!str_par) || (xf86sscanf(str_par, "%lf", &pars->min_speed) != 1)) pars->min_speed=0.09; @@ -401,7 +404,14 @@ str_par = xf86FindOptionValue(local->options, "CoastingSpeed"); if ((!str_par) || (xf86sscanf(str_par, "%lf", &pars->coasting_speed) != 1)) pars->coasting_speed = 0.0; - + str_par = xf86FindOptionValue(local->options, "PressureMotionMinFactor"); + if ((!str_par) || (xf86sscanf(str_par, "%lf", &pars->press_motion_min_factor) != 1)) + pars->press_motion_min_factor=0.5; + str_par = xf86FindOptionValue(local->options, "PressureMotionMaxFactor"); + if ((!str_par) || (xf86sscanf(str_par, "%lf", &pars->press_motion_max_factor) != 1)) + pars->press_motion_max_factor=2.; + + /* Warn about (and fix) incorrectly configured CircScrollTrigger parameters */ if (pars->circular_trigger < 0 || pars->circular_trigger > 8) { xf86Msg(X_WARNING, "Unknown circular scrolling trigger, using 0 (edges)"); pars->circular_trigger = 0; @@ -1243,7 +1253,7 @@ y_edge_speed = (int)(edge_speed * relY); } } - + /* speed depending on distance/packet */ dist = move_distance(dx, dy); speed = dist * para->accl; @@ -1253,6 +1263,22 @@ speed = para->min_speed; } + /* modify speed according to pressure */ + if (para->press_motion) { + int minZ = para->press_motion_min_z; + int maxZ = para->press_motion_max_z; + double minFctr = para->press_motion_min_factor; + double maxFctr = para->press_motion_max_factor; + + if (hw->z <= minZ) { + speed *= minFctr; + } else if (hw->z >= maxZ) { + speed *= maxFctr; + } else { + speed *= minFctr + (hw->z - minZ) * (maxFctr - minFctr) / (maxZ - minZ); + } + } + /* save the fraction, report the integer part */ tmpf = dx * speed + x_edge_speed * dtime + priv->frac_x; priv->frac_x = xf86modf(tmpf, &integral); diff -Naur xfree86-driver-synaptics-0.14.3/synaptics.h xfree86-driver-synaptics-0.14.3-patch/synaptics.h --- xfree86-driver-synaptics-0.14.3/synaptics.h 2005-07-09 15:09:40.000000000 -0700 +++ xfree86-driver-synaptics-0.14.3-patch/synaptics.h 2005-11-05 20:15:23.000000000 -0800 @@ -87,7 +87,12 @@ int palm_min_width; /* Palm detection width */ int palm_min_z; /* Palm detection depth */ double coasting_speed; /* Coasting threshold scrolling speed */ -} SynapticsSHM; + Bool press_motion; /* Activate motion with with pressure control */ + int press_motion_min_z; /* finger pressure at which minimum pressure motion factor is applied */ + int press_motion_max_z; /* finger pressure at which maximum pressure motion factor is applied */ + double press_motion_min_factor; /* factor applied on speed when finger pressure is at minimum */ + double press_motion_max_factor; /* factor applied on speed when finger pressure is at minimum */ + } SynapticsSHM; /* * Minimum and maximum values for scroll_button_repeat diff -Naur xfree86-driver-synaptics-0.14.3/synclient.c xfree86-driver-synaptics-0.14.3-patch/synclient.c --- xfree86-driver-synaptics-0.14.3/synclient.c 2005-07-09 15:09:40.000000000 -0700 +++ xfree86-driver-synaptics-0.14.3-patch/synclient.c 2005-11-06 17:47:53.000000000 -0800 @@ -94,6 +94,11 @@ DEFINE_PAR("PalmMinWidth", palm_min_width, PT_INT, 0, 15), DEFINE_PAR("PalmMinZ", palm_min_z, PT_INT, 0, 255), DEFINE_PAR("CoastingSpeed", coasting_speed, PT_DOUBLE, 0, 20), + DEFINE_PAR("PressureMotion", press_motion, PT_BOOL, 0, 1), + DEFINE_PAR("PressureMotionMinZ", press_motion_min_z, PT_INT, 1, 255), + DEFINE_PAR("PressureMotionMaxZ", press_motion_max_z, PT_INT, 1, 255), + DEFINE_PAR("PressureMotionMinFactor", press_motion_min_factor, PT_DOUBLE, 0, 10.0), + DEFINE_PAR("PressureMotionMaxFactor", press_motion_max_factor, PT_DOUBLE, 0, 10.0), { 0, 0, 0, 0, 0 } };