diff -Nru xserver-xorg-input-synaptics-1.6.0/ChangeLog xserver-xorg-input-synaptics-1.6.2/ChangeLog --- xserver-xorg-input-synaptics-1.6.0/ChangeLog 2012-05-02 22:25:21.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/ChangeLog 2012-06-12 03:47:39.000000000 +0000 @@ -1,3 +1,225 @@ +commit d5ff9d8b0b186cf39695df84a10984eac559b746 +Author: Peter Hutterer +Date: Tue Jun 12 13:46:34 2012 +1000 + + synaptics 1.6.2 + + Signed-off-by: Peter Hutterer + +commit c1aae820601a911432c64938f03eab62bafaab2f +Author: Peter Hutterer +Date: Fri May 18 09:38:50 2012 +1000 + + synaptics 1.6.1.901 + + Signed-off-by: Peter Hutterer + +commit 7ccca8e7d8fbf2ccb5a2dbbfbf06ff4dbd6b7149 +Author: Peter Hutterer +Date: Thu May 17 12:10:04 2012 +1000 + + Don't allow for scroll distances of 0 (#49965) + + It'll either hang the server or blow up with divisions by 0, whichever one + comes first. + + X.Org Bug 49965 + + Signed-off-by: Peter Hutterer + Reviewed-by: Chase Douglas + (cherry picked from commit 6d47d334d8a876e7e094306c313246b87016b78a) + +commit f8d970e191e6df05a8f2c26afdeea3e27b941a62 +Author: Peter Hutterer +Date: Thu May 17 11:02:02 2012 +1000 + + Reset hw->x/y to INT_MIN and skip HandleState until we have x/y events + + The driver assumes x/y is always valid but after coming from a resume we may + get a few events with either ABS_X or ABS_Y (not both). Thus we process with + hw->x == 0 and hw->y == somevalue, causing cursor jumps when calculating + deltas whenver the real hw->x comes in. + + Fix this by resetting hw->x/y to INT_MIN and skip state processing until + both axes are available. + + For clickpads, this means handling of data will be delayed until we get + at least one motion on each axis. Button presses won't be recognised either + until that happens. It requires some skill to not trigger motion on both + axes, even more to press a button without doing so. + + For non-clickpads, handling of motion events will be delayed likewise. If a + physical button is pressed immediately after resume we have to assume deltas + of x/y. + - If the next event is a new touch, it will have ABS_X/ABS_Y set anyway + - If the finger was already down, a button event is generated, and the + finger has generated ABS_X or ABS_Y only before the event, the next event + containing the missing data will cause a jump. The fix for this is more + invasive and this is quite a corner-case. + + Signed-off-by: Peter Hutterer + Reviewed-by: Chase Douglas + (cherry picked from commit cd569377cda9b5a4ee00c0137db14f625c76c40f) + +commit 739175d198372a3226ce061b118d8fe5bbc8f6bf +Author: Chase Douglas +Date: Wed May 16 07:49:25 2012 -0700 + + Reset open slots array on device disable + + The open slots array is used for clickpad cumulative delta computation. + If the array is not reset and becomes corrupted during the device + disable/enable cycle, the cumulative deltas may be wrong. This manifests + as jumpy cursor behavior on some clickpads after suspend/resume. + + Signed-off-by: Chase Douglas + Signed-off-by: Peter Hutterer + (cherry picked from commit 0054b144f3daf00e46a35b2f165befb209df94fc) + +commit 67a02d676c96d5b3d4729290cd96af0201eb76bb +Author: Chun Yang +Date: Tue May 15 14:51:42 2012 -0500 + + Fix coasting for negative ScrollDelta + + Fix the coasting direction for when VertScrollDelta or HorizScrollDelta is + negative. + + Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=49966 + + Regression introduced in 0de4445ff8e75aab208faf6383e76045934c6720 + + Signed-off-by: Chun Yang + Signed-off-by: Peter Hutterer + (cherry picked from commit 53557a5cab1e253dc8f4393207954ae0fe76068f) + +commit 23e87b57bb874326c88a7ad7292bec51959fb876 +Author: Chase Douglas +Date: Mon May 14 10:20:01 2012 -0700 + + Ignore pre-existing touches + + If a touch is physically active when the device is enabled, then all + events for that touch must be ignored. In particular, we cannot close + the touch or we will decrement touch count counters below zero. If these + counters go below zero memory corruption can occur. + + Note that a device is disabled and enabled every time the user types on + the keyboard if synclient is used to disable the trackpad while typing. + This is a very common option. + + Signed-off-by: Chase Douglas + Signed-off-by: Peter Hutterer + (cherry picked from commit 55fc42e7c9b4948cadd4f98ef7b6a3b12e268e3e) + +commit 23065a974e5dcdf0d6a436a0547bb7887d306a6f +Author: Peter Hutterer +Date: Fri May 11 12:27:39 2012 +1000 + + Avoid out-of-bounds access by running num_active_touches < 0 (#49439) + + If a touch is active during driver init, the slot will be set to + SLOTSTATE_CLOSE when it finishes. That could decrease num_active_touches to + less than 0, causing out-of-bounds access. + + X.Org Bug 49439 + + Signed-off-by: Peter Hutterer + Reviewed-by: Chase Douglas + (cherry picked from commit 77d766b1d535dff9a27c7db343ede85d9f44850b) + +commit e0f5688994baa85a8c658120681575cdd0ba2a58 +Author: Peter Hutterer +Date: Fri May 11 10:30:21 2012 +1000 + + synaptics 1.6.1 + + Signed-off-by: Peter Hutterer + +commit 7f2d9d88204c62de3cb63b48001b9e2408d3a20d +Author: Peter Hutterer +Date: Fri May 11 10:54:47 2012 +1000 + + tools: coasting speed is not capped at 20, cap it at 255 + + Signed-off-by: Peter Hutterer + (cherry picked from commit 0352c67fa2a7224b5a3bf03a934b3c7af42b4f51) + +commit ace20a02c371478f6a9d224dfd31ea219d91fc46 +Author: Peter Hutterer +Date: Wed May 9 14:26:40 2012 +1000 + + Fix coasting speed trigger + + CoastingSpeed is defined as scrolls/s. The previous code just used + delta/seconds which depended on the device coordinate range and exceeded the + default CoastingSpeed at almost any scroll event. + + Divide the estimated delta by the scroll distance to get the accurate + scrolls/s number. Since that now changes the contents of what's in + coast_speed_y, change the users of that too. + + http://bugzilla.redhat.com/813686 + + Signed-off-by: Peter Hutterer + (cherry picked from commit 0de4445ff8e75aab208faf6383e76045934c6720) + +commit 04d24116db59872d4cd00f38a0d1c87957fe4914 +Author: Peter Hutterer +Date: Wed May 9 12:23:46 2012 +1000 + + Don't check for soft buttons if a button is already down + + Moving into a different soft button's area during drag-n-drop would trigger + a click of that button. + + We only have the current button state and we mess with it, so the conditions + for a possible clickpad soft-button event are: + - hw->left is down now + - none of left|right|middle were down before. since we change hw->left to + hw->right/left we need to check all three + + If hw->left is down but one of the other buttons was already down, copy that + button state and continue. + + http://bugzilla.redhat.com/819348 + + Signed-off-by: Peter Hutterer + Reviewed-by: Chase Douglas + (cherry picked from commit a1d6784d790f081f8a6ea3a10d3cfa578aa10d5b) + +commit 4e8ddb3a6f1ba1f7642f0a23d6f22a8c40d68cf0 +Author: Peter Hutterer +Date: Thu May 3 12:00:50 2012 +1000 + + whitespace fix + + Signed-off-by: Peter Hutterer + Reviewed-by: Chase Douglas + +commit d1eebac72e4a5cc7a67efead13fbd32f9cd1fbd9 +Author: Peter Hutterer +Date: Thu May 3 14:21:24 2012 +1000 + + tools: undo indentation in synclient's parameter list + + more more readable this way + + Signed-off-by: Peter Hutterer + Reviewed-by: Chase Douglas + +commit 0434d7776640861d0c8c19a02c2445d2f61627f8 +Author: Peter Hutterer +Date: Thu May 3 11:49:31 2012 +1000 + + Indent consistently + + x-indent-all.sh from xorg/util/modular as of + c2d630fab65dbe3409af3947f6f442782ddb026f + + Signed-off-by: Peter Hutterer + Reviewed-by: Chase Douglas + commit a1162f80324c379bc7581e53275e8ff6d569f8b0 Author: Peter Hutterer Date: Thu May 3 08:06:32 2012 +1000 diff -Nru xserver-xorg-input-synaptics-1.6.0/configure xserver-xorg-input-synaptics-1.6.2/configure --- xserver-xorg-input-synaptics-1.6.0/configure 2012-05-02 22:06:42.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/configure 2012-06-12 03:46:52.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for xf86-input-synaptics 1.6.0. +# Generated by GNU Autoconf 2.68 for xf86-input-synaptics 1.6.2. # # Report bugs to . # @@ -571,8 +571,8 @@ # Identity of this package. PACKAGE_NAME='xf86-input-synaptics' PACKAGE_TARNAME='xf86-input-synaptics' -PACKAGE_VERSION='1.6.0' -PACKAGE_STRING='xf86-input-synaptics 1.6.0' +PACKAGE_VERSION='1.6.2' +PACKAGE_STRING='xf86-input-synaptics 1.6.2' PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg' PACKAGE_URL='' @@ -1367,7 +1367,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures xf86-input-synaptics 1.6.0 to adapt to many kinds of systems. +\`configure' configures xf86-input-synaptics 1.6.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1438,7 +1438,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of xf86-input-synaptics 1.6.0:";; + short | recursive ) echo "Configuration of xf86-input-synaptics 1.6.2:";; esac cat <<\_ACEOF @@ -1576,7 +1576,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -xf86-input-synaptics configure 1.6.0 +xf86-input-synaptics configure 1.6.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -1900,7 +1900,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by xf86-input-synaptics $as_me 1.6.0, which was +It was created by xf86-input-synaptics $as_me 1.6.2, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2720,7 +2720,7 @@ # Define the identity of the package. PACKAGE='xf86-input-synaptics' - VERSION='1.6.0' + VERSION='1.6.2' cat >>confdefs.h <<_ACEOF @@ -17704,7 +17704,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by xf86-input-synaptics $as_me 1.6.0, which was +This file was extended by xf86-input-synaptics $as_me 1.6.2, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17770,7 +17770,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -xf86-input-synaptics config.status 1.6.0 +xf86-input-synaptics config.status 1.6.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" diff -Nru xserver-xorg-input-synaptics-1.6.0/configure.ac xserver-xorg-input-synaptics-1.6.2/configure.ac --- xserver-xorg-input-synaptics-1.6.0/configure.ac 2012-05-02 22:06:26.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/configure.ac 2012-06-12 03:45:29.000000000 +0000 @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-input-synaptics], - [1.6.0], + [1.6.2], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-input-synaptics]) AC_CONFIG_SRCDIR([Makefile.am]) diff -Nru xserver-xorg-input-synaptics-1.6.0/debian/changelog xserver-xorg-input-synaptics-1.6.2/debian/changelog --- xserver-xorg-input-synaptics-1.6.0/debian/changelog 2012-07-12 15:21:50.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/debian/changelog 2012-07-12 15:21:50.000000000 +0000 @@ -1,8 +1,94 @@ -xserver-xorg-input-synaptics (1.6.0-0ubuntu1~precise1+volanin1) precise; urgency=low +xserver-xorg-input-synaptics (1.6.2-1ubuntu1~precise1+volanin1) precise; urgency=low * Improved pointer stability when multiple fingers are over the touchpad. - -- Wagner Volanin Thu, 24 May 2012 22:58:00 -0300 + -- Wagner Volanin Thu, 12 Jul 2012 12:00:00 -0300 + +xserver-xorg-input-synaptics (1.6.2-1ubuntu1~precise1) precise-proposed; urgency=low + + * Fixes memory corruption by driver (LP: #941953) FDo #49439 + * Fixes 'Coasting Direction is incorrect for negative VertScrollDelta/HorizScrollDelta' + * Fixes jumpy cursor after suspend/resume + * Fixes another resume bug + * Fixes division by 0 or infinite loop with zero scroll distance FDo #49965 + * Merged from Debian unstable + * Removed patches that were cherry picked commits and now in 1.6.2: + - 201-Avoid-out-of-bounds-access-by-running-num_active_tou.patch + - 202-Ignore-pre-existing-touches.patch + - 203-Fix-coasting-for-negative-ScrollDelta.patch + - 204-Reset-open-slots-array-on-device-disable.patch + - 205-Reset-hw-x-y-to-INT_MIN-and-skip-HandleState-until-w.patch + - 206-Don-t-allow-for-scroll-distances-of-0-49965.patch + * Remaining patches: + - 101_resolution_detect_option.patch + - 103_enable_cornertapping.patch + - 104_always_enable_tapping.patch + - 106_always_enable_vert_edge_scroll.patch + - 115_evdev_only.patch + - 118_quell_error_msg.patch + - 124_syndaemon_events.patch + - 125_option_rec_revert.patch + - 126_ubuntu_xi22.patch + - 128_disable_three_click_action.patch + - 129_disable_three_touch_tap.patch + * Reinstate patch for (LP: #972727) due to feature freeze in precise + + -- Maarten Lankhorst Thu, 14 Jun 2012 09:35:21 +0200 + +xserver-xorg-input-synaptics (1.6.2-1) unstable; urgency=low + + * New upstream release, from the 1.6 branch. + + -- Cyril Brulebois Wed, 13 Jun 2012 22:22:42 +0200 + +xserver-xorg-input-synaptics (1.6.1-1ubuntu2) quantal-proposed; urgency=low + + * Enable right button clickpad area by default (LP: #972727) + - Upstream has this enabled. We had it disabled for Precise due to the + feature landing well after feature freeze. This change puts us back in + sync with upstream. + + -- Chase Douglas Thu, 07 Jun 2012 10:07:18 -0700 + +xserver-xorg-input-synaptics (1.6.1-1ubuntu1) quantal; urgency=low + + * Merged from Debian unstable + * Refreshed patches for indentation changes + - 101_resolution_detect_option.patch + - 118_quell_error_msg.patch + - 124_syndaemon_events.patch + - 125_option_rec_revert.patch + * Add temporary patches, for upstream git commits on synaptics-1.6-branch + * Fix memory corruption by driver (LP: #941953) FDo #49439 + - 201-Avoid-out-of-bounds-access-by-running-num_active_tou.patch + - 202-Ignore-pre-existing-touches.patch + * Fix FDo #49966 + - 203-Fix-coasting-for-negative-ScrollDelta.patch + * Fix jumpy cursor after suspend/resume + - 204-Reset-open-slots-array-on-device-disable.patch + * Fix another resume bug + - 205-Reset-hw-x-y-to-INT_MIN-and-skip-HandleState-until-w.patch + * Fix division by 0 or infinite loop with zero scroll distance FDo #49965 + - 206-Don-t-allow-for-scroll-distances-of-0-49965.patch + + -- Maarten Lankhorst Mon, 21 May 2012 14:14:49 +0200 + +xserver-xorg-input-synaptics (1.6.1-1) unstable; urgency=low + + [ Julien Cristau ] + * The mtdev build-dep is linux-only (closes: #672572). Thanks, Pino + Toscano! + + [ Cyril Brulebois ] + * New upstream release, from the 1.6 branch. + + -- Cyril Brulebois Sun, 20 May 2012 16:50:18 +0200 + +xserver-xorg-input-synaptics (1.6.0-1) unstable; urgency=low + + * New upstream release. + + -- Cyril Brulebois Mon, 07 May 2012 01:13:08 +0200 xserver-xorg-input-synaptics (1.6.0-0ubuntu1~precise1) precise-proposed; urgency=low @@ -20,6 +106,25 @@ -- Chase Douglas Mon, 07 May 2012 12:31:21 -0700 +xserver-xorg-input-synaptics (1.5.99.904-2) unstable; urgency=low + + * Add a build-dep on libmtdev-dev now that X server 1.12 is in sid, + for XI 2.2 support. + + -- Cyril Brulebois Tue, 01 May 2012 15:02:43 +0200 + +xserver-xorg-input-synaptics (1.5.99.904-1) unstable; urgency=low + + * New upstream release candidate (1.6 RC4). + + -- Cyril Brulebois Fri, 27 Apr 2012 19:52:44 +0000 + +xserver-xorg-input-synaptics (1.5.99.902-1) unstable; urgency=low + + * New upstream release candidate (1.6 RC2). + + -- Cyril Brulebois Mon, 02 Apr 2012 01:12:26 +0000 + xserver-xorg-input-synaptics (1.5.99.902-0ubuntu5.1) precise-proposed; urgency=low * debian/patches/204_monotonicise_hw_timestamp.patch: @@ -80,6 +185,14 @@ -- Chase Douglas Thu, 29 Mar 2012 15:31:40 -0700 +xserver-xorg-input-synaptics (1.5.99.901-1) unstable; urgency=low + + * New upstream release candidate (1.6 RC1): + - Add support for ClickPads. + * Multitouch isn't enabled yet (it would require a newer server anyway). + + -- Cyril Brulebois Tue, 20 Mar 2012 21:40:10 +0000 + xserver-xorg-input-synaptics (1.5.99.901-0ubuntu2) precise; urgency=low * Disable three touch tap in favor of uTouch gestures (LP: #961725) diff -Nru xserver-xorg-input-synaptics-1.6.0/debian/control xserver-xorg-input-synaptics-1.6.2/debian/control --- xserver-xorg-input-synaptics-1.6.0/debian/control 2012-07-12 15:21:50.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/debian/control 2012-07-12 15:21:50.000000000 +0000 @@ -16,7 +16,7 @@ quilt, xutils-dev (>= 1:7.5+4), x11proto-input-dev (>= 2.1.99.5), - libmtdev-dev, + libmtdev-dev [linux-any], Build-Conflicts: libxtst-dev Standards-Version: 3.9.3 diff -Nru xserver-xorg-input-synaptics-1.6.0/debian/patches/101_resolution_detect_option.patch xserver-xorg-input-synaptics-1.6.2/debian/patches/101_resolution_detect_option.patch --- xserver-xorg-input-synaptics-1.6.0/debian/patches/101_resolution_detect_option.patch 2012-07-12 15:21:50.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/debian/patches/101_resolution_detect_option.patch 2012-07-12 15:21:50.000000000 +0000 @@ -1,8 +1,6 @@ -Index: xserver-xorg-input-synaptics/include/synaptics-properties.h -=================================================================== ---- xserver-xorg-input-synaptics.orig/include/synaptics-properties.h 2011-07-05 11:49:41.241347626 +0300 -+++ xserver-xorg-input-synaptics/include/synaptics-properties.h 2011-07-05 11:54:23.291347670 +0300 -@@ -140,6 +140,9 @@ +--- a/include/synaptics-properties.h ++++ b/include/synaptics-properties.h +@@ -143,6 +143,9 @@ #define SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR "Synaptics Pressure Motion Factor" /* 8 bit (BOOL) */ @@ -12,11 +10,9 @@ #define SYNAPTICS_PROP_GRAB "Synaptics Grab Event Device" /* 8 bit (BOOL), 1 value, tap-and-drag */ -Index: xserver-xorg-input-synaptics/man/synaptics.man -=================================================================== ---- xserver-xorg-input-synaptics.orig/man/synaptics.man 2011-07-05 11:49:41.231347626 +0300 -+++ xserver-xorg-input-synaptics/man/synaptics.man 2011-07-05 11:54:23.291347670 +0300 -@@ -457,6 +457,18 @@ +--- a/man/synaptics.man ++++ b/man/synaptics.man +@@ -461,6 +461,18 @@ TapAndDragGesture option to false. Property: "Synaptics Gestures" . .TP @@ -35,7 +31,7 @@ .BI "Option \*qVertResolution\*q \*q" integer \*q Resolution of X coordinates in units/millimeter. The value is used together with HorizResolution to compensate unequal vertical and -@@ -898,6 +910,10 @@ +@@ -941,6 +953,10 @@ FLOAT, 2 values, min, max. .TP 7 @@ -46,92 +42,85 @@ .BI "Synaptics Grab Event Device" 8 bit (BOOL). -Index: xserver-xorg-input-synaptics/src/properties.c -=================================================================== ---- xserver-xorg-input-synaptics.orig/src/properties.c 2011-07-05 11:49:41.271347626 +0300 -+++ xserver-xorg-input-synaptics/src/properties.c 2011-07-05 11:54:23.291347670 +0300 -@@ -77,6 +77,7 @@ - Atom prop_coastspeed = 0; - Atom prop_pressuremotion = 0; +--- a/src/properties.c ++++ b/src/properties.c +@@ -87,6 +87,7 @@ + Atom prop_coastspeed = 0; + Atom prop_pressuremotion = 0; Atom prop_pressuremotion_factor = 0; -+Atom prop_resolution_detect = 0; - Atom prop_grab = 0; - Atom prop_gestures = 0; - Atom prop_capabilities = 0; -@@ -255,7 +256,7 @@ - fvalues[1] = para->press_motion_max_factor; - - prop_pressuremotion_factor = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 2, fvalues); -- -+ prop_resolution_detect = InitAtom(pInfo->dev, SYNAPTICS_PROP_RESOLUTION_DETECT, 8, 1, ¶->resolution_detect); - prop_grab = InitAtom(pInfo->dev, SYNAPTICS_PROP_GRAB, 8, 1, ¶->grab_event_device); - - values[0] = para->tap_and_drag_gesture; -@@ -628,6 +629,12 @@ - ++Atom prop_resolution_detect = 0; + Atom prop_grab = 0; + Atom prop_gestures = 0; + Atom prop_capabilities = 0; +@@ -343,6 +344,10 @@ + InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 2, + fvalues); + ++ prop_resolution_detect = ++ InitAtom(pInfo->dev, SYNAPTICS_PROP_RESOLUTION_DETECT, 8, 1, ++ ¶->resolution_detect); ++ + prop_grab = + InitAtom(pInfo->dev, SYNAPTICS_PROP_GRAB, 8, 1, + ¶->grab_event_device); +@@ -776,6 +781,12 @@ para->press_motion_min_z = press[0]; para->press_motion_max_z = press[1]; -+ } else if (property == prop_resolution_detect) -+ { + } ++ else if (property == prop_resolution_detect) { + if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) + return BadMatch; + + para->resolution_detect = *(BOOL*)prop->data; - } else if (property == prop_grab) - { ++ } + else if (property == prop_grab) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) -Index: xserver-xorg-input-synaptics/src/synaptics.c -=================================================================== ---- xserver-xorg-input-synaptics.orig/src/synaptics.c 2011-07-05 11:49:41.261347626 +0300 -+++ xserver-xorg-input-synaptics/src/synaptics.c 2011-07-05 11:54:36.601347672 +0300 -@@ -579,6 +579,7 @@ - pars->single_tap_timeout = xf86SetIntOption(opts, "SingleTapTimeout", 180); - pars->press_motion_min_z = xf86SetIntOption(opts, "PressureMotionMinZ", pressureMotionMinZ); - pars->press_motion_max_z = xf86SetIntOption(opts, "PressureMotionMaxZ", pressureMotionMaxZ); -+ pars->resolution_detect = xf86SetBoolOption(opts, "ResolutionDetect", TRUE); + return BadMatch; +--- a/src/synaptics.c ++++ b/src/synaptics.c +@@ -787,6 +787,7 @@ + xf86SetIntOption(opts, "PressureMotionMinZ", pressureMotionMinZ); + pars->press_motion_max_z = + xf86SetIntOption(opts, "PressureMotionMaxZ", pressureMotionMaxZ); ++ pars->resolution_detect = xf86SetBoolOption(opts, "ResolutionDetect", TRUE); pars->min_speed = xf86SetRealOption(opts, "MinSpeed", 0.4); pars->max_speed = xf86SetRealOption(opts, "MaxSpeed", 0.7); -@@ -1039,7 +1040,7 @@ - #endif +@@ -1399,7 +1400,7 @@ + } /* X valuator */ -- if (priv->minx < priv->maxx) -+ if (priv->minx < priv->maxx && priv->synpara.resolution_detect) - { +- if (priv->minx < priv->maxx) { ++ if (priv->minx < priv->maxx && priv->synpara.resolution_detect) { min = priv->minx; max = priv->maxx; -@@ -1061,7 +1062,7 @@ + } +@@ -1417,7 +1418,7 @@ xf86InitValuatorDefaults(dev, 0); /* Y valuator */ -- if (priv->miny < priv->maxy) -+ if (priv->miny < priv->maxy && priv->synpara.resolution_detect) - { +- if (priv->miny < priv->maxy) { ++ if (priv->miny < priv->maxy && priv->synpara.resolution_detect) { min = priv->miny; max = priv->maxy; -Index: xserver-xorg-input-synaptics/src/synapticsstr.h -=================================================================== ---- xserver-xorg-input-synaptics.orig/src/synapticsstr.h 2011-07-05 11:49:41.251347626 +0300 -+++ xserver-xorg-input-synaptics/src/synapticsstr.h 2011-07-05 11:54:33.021347672 +0300 -@@ -155,6 +155,7 @@ - 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 */ -+ Bool resolution_detect; /* report pad size to xserver? */ - Bool grab_event_device; /* grab event device for exclusive use? */ - Bool tap_and_drag_gesture; /* Switches the tap-and-drag gesture on/off */ - unsigned int resolution_horiz; /* horizontal resolution of touchpad in units/mm */ -Index: xserver-xorg-input-synaptics/tools/synclient.c -=================================================================== ---- xserver-xorg-input-synaptics.orig/tools/synclient.c 2011-07-05 11:49:41.281347626 +0300 -+++ xserver-xorg-input-synaptics/tools/synclient.c 2011-07-05 11:54:31.731347670 +0300 -@@ -137,6 +137,8 @@ + } +--- a/src/synapticsstr.h ++++ b/src/synapticsstr.h +@@ -174,6 +174,7 @@ + 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 */ ++ Bool resolution_detect; /* report pad size to xserver? */ + Bool grab_event_device; /* grab event device for exclusive use? */ + Bool tap_and_drag_gesture; /* Switches the tap-and-drag gesture on/off */ + unsigned int resolution_horiz; /* horizontal resolution of touchpad in units/mm */ +--- a/tools/synclient.c ++++ b/tools/synclient.c +@@ -136,6 +136,7 @@ {"PressureMotionMaxZ", PT_INT, 1, 255, SYNAPTICS_PROP_PRESSURE_MOTION, 32, 1}, {"PressureMotionMinFactor", PT_DOUBLE, 0, 10.0,SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 0 /*float*/, 0}, {"PressureMotionMaxFactor", PT_DOUBLE, 0, 10.0,SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 0 /*float*/, 1}, + {"ResolutionDetect", PT_BOOL, 0, 1, SYNAPTICS_PROP_RESOLUTION_DETECT, 8, 0}, -+ {"GrabEventDevice", PT_BOOL, 0, 1, SYNAPTICS_PROP_GRAB, 8, 0}, {"TapAndDragGesture", PT_BOOL, 0, 1, SYNAPTICS_PROP_GESTURES, 8, 0}, {"AreaLeftEdge", PT_INT, 0, 10000, SYNAPTICS_PROP_AREA, 32, 0}, diff -Nru xserver-xorg-input-synaptics-1.6.0/debian/patches/118_quell_error_msg.patch xserver-xorg-input-synaptics-1.6.2/debian/patches/118_quell_error_msg.patch --- xserver-xorg-input-synaptics-1.6.0/debian/patches/118_quell_error_msg.patch 2012-07-12 15:21:50.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/debian/patches/118_quell_error_msg.patch 2012-07-12 15:21:50.000000000 +0000 @@ -1,30 +1,26 @@ -Index: xserver-xorg-input-synaptics/tools/synclient.c -=================================================================== ---- xserver-xorg-input-synaptics.orig/tools/synclient.c 2011-07-05 11:54:31.731347670 +0300 -+++ xserver-xorg-input-synaptics/tools/synclient.c 2011-07-05 11:55:06.211347676 +0300 -@@ -391,9 +391,7 @@ - unwind: +--- a/tools/synclient.c ++++ b/tools/synclient.c +@@ -406,9 +406,7 @@ + unwind: XFree(properties); XFreeDeviceList(info); - if (!dev) - fprintf(stderr, "Unable to find a synaptics device.\n"); -- else if (error && dev) -+ if (error && dev) - { - XCloseDevice(dpy, dev); - dev = NULL; -Index: xserver-xorg-input-synaptics/tools/syndaemon.c -=================================================================== ---- xserver-xorg-input-synaptics.orig/tools/syndaemon.c 2011-07-05 11:54:31.751347670 +0300 -+++ xserver-xorg-input-synaptics/tools/syndaemon.c 2011-07-05 11:55:06.211347676 +0300 -@@ -512,9 +512,7 @@ - unwind: +- else if (error && dev) { ++ if (error && dev) { + XCloseDevice(dpy, dev); + dev = NULL; + } +--- a/tools/syndaemon.c ++++ b/tools/syndaemon.c +@@ -529,9 +529,7 @@ + unwind: XFree(properties); XFreeDeviceList(info); - if (!dev) -- fprintf(stderr, "Unable to find a synaptics device.\n"); -- else if (error && dev) -+ if (error && dev) - { - XCloseDevice(dpy, dev); - dev = NULL; +- fprintf(stderr, "Unable to find a synaptics device.\n"); +- else if (error && dev) { ++ if (error && dev) { + XCloseDevice(dpy, dev); + dev = NULL; + } diff -Nru xserver-xorg-input-synaptics-1.6.0/debian/patches/124_syndaemon_events.patch xserver-xorg-input-synaptics-1.6.2/debian/patches/124_syndaemon_events.patch --- xserver-xorg-input-synaptics-1.6.0/debian/patches/124_syndaemon_events.patch 2012-07-12 15:21:50.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/debian/patches/124_syndaemon_events.patch 2012-07-12 15:21:50.000000000 +0000 @@ -22,22 +22,20 @@ tools/syndaemon.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) -Index: xserver-xorg-input-synaptics/tools/syndaemon.c -=================================================================== ---- xserver-xorg-input-synaptics.orig/tools/syndaemon.c 2011-07-05 11:55:06.211347676 +0300 -+++ xserver-xorg-input-synaptics/tools/syndaemon.c 2011-07-05 11:55:19.281347678 +0300 -@@ -429,6 +429,14 @@ - fprintf(stderr, "bad event received, major opcode %d\n", event.type); - } +--- a/tools/syndaemon.c ++++ b/tools/syndaemon.c +@@ -450,6 +450,14 @@ + event.type); + } -+ /* If there are any events left over, they are in error. Drain them -+ * from the connection queue so we don't get stuck. */ -+ while (XEventsQueued(dpy_data, QueuedAlready) > 0) { -+ XEvent event; -+ XNextEvent(dpy_data, &event); -+ fprintf(stderr, "bad event received, major opcode %d\n", event.type); -+ } ++ /* If there are any events left over, they are in error. Drain them ++ * from the connection queue so we don't get stuck. */ ++ while (XEventsQueued(dpy_data, QueuedAlready) > 0) { ++ XEvent event; ++ XNextEvent(dpy_data, &event); ++ fprintf(stderr, "bad event received, major opcode %d\n", event.type); ++ } + - if (!ignore_modifier_keys && cbres.key_event) { - disable_event = 1; - } + if (!ignore_modifier_keys && cbres.key_event) { + disable_event = 1; + } diff -Nru xserver-xorg-input-synaptics-1.6.0/debian/patches/125_option_rec_revert.patch xserver-xorg-input-synaptics-1.6.2/debian/patches/125_option_rec_revert.patch --- xserver-xorg-input-synaptics-1.6.0/debian/patches/125_option_rec_revert.patch 2012-07-12 15:21:50.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/debian/patches/125_option_rec_revert.patch 2012-07-12 15:21:50.000000000 +0000 @@ -1,15 +1,15 @@ --- a/test/fake-symbols.c +++ b/test/fake-symbols.c -@@ -26,7 +26,7 @@ xf86WaitForInput (int fd, int timeout) +@@ -26,7 +26,7 @@ } _X_EXPORT int --xf86OpenSerial (OPTTYPE options) -+xf86OpenSerial (pointer options) +-xf86OpenSerial(OPTTYPE options) ++xf86OpenSerial(pointer options) { return 0; } -@@ -37,43 +37,43 @@ xf86SetSerialSpeed (int fd, int speed) +@@ -37,44 +37,44 @@ return 0; } @@ -42,6 +42,7 @@ { return NULL; } + -_X_EXPORT CONST char * -xf86FindOptionValue(OPTTYPE options, const char *name) +_X_EXPORT char * @@ -63,7 +64,7 @@ { return NULL; } -@@ -85,7 +85,7 @@ xf86NameCmp(const char *s1, const char * +@@ -86,7 +86,7 @@ } _X_EXPORT char * @@ -72,7 +73,7 @@ { return NULL; } -@@ -196,8 +196,8 @@ xf86DeleteInput(InputInfoPtr pInp, int f +@@ -185,8 +185,8 @@ return; } @@ -83,7 +84,7 @@ { return NULL; } -@@ -225,7 +225,7 @@ xf86PostKeyboardEvent(DeviceIntPtr +@@ -213,7 +213,7 @@ } _X_EXPORT int @@ -92,28 +93,27 @@ { return 0; } -@@ -254,7 +254,7 @@ InitPtrFeedbackClassDeviceStruct(DeviceI +@@ -240,7 +240,7 @@ _X_EXPORT int - XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type, - int format, int mode, unsigned long len, -- OPTTYPE value, Bool sendevent) -+ pointer value, Bool sendevent) + XIChangeDeviceProperty(DeviceIntPtr dev, Atom property, Atom type, + int format, int mode, unsigned long len, +- OPTTYPE value, Bool sendevent) ++ pointer value, Bool sendevent) { return 0; } -@@ -367,15 +367,15 @@ InitValuatorClassDeviceStruct(DeviceIntP +@@ -344,14 +344,14 @@ + return FALSE; } - -_X_EXPORT OPTTYPE --xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char* val) +-xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char *val) +_X_EXPORT pointer -+xf86ReplaceStrOption(pointer optlist, const char *name, const char* val) ++xf86ReplaceStrOption(pointer optlist, const char *name, const char *val) { return NULL; } - -_X_EXPORT OPTTYPE -xf86NextOption(OPTTYPE list) +_X_EXPORT pointer @@ -121,7 +121,7 @@ { return NULL; } -@@ -424,14 +424,14 @@ InitFocusClassDeviceStruct(DeviceIntPtr +@@ -393,13 +393,13 @@ #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12 void @@ -132,15 +132,14 @@ void xf86CollectInputOptions(InputInfoPtr pInfo, - const char **defaultOpts, -- OPTTYPE extraOpts) -+ pointer extraOpts) +- const char **defaultOpts, OPTTYPE extraOpts) ++ const char **defaultOpts, pointer extraOpts) { } --- a/test/fake-symbols.h +++ b/test/fake-symbols.h -@@ -1,37 +1,29 @@ +@@ -1,40 +1,32 @@ #include #include @@ -149,101 +148,105 @@ -#define CONST const -#else -#define OPTTYPE pointer --#define CONST +-#define CONST -#endif - - extern int xf86ReadSerial (int fd, void *buf, int count); - extern int xf86WriteSerial (int fd, const void *buf, int count); - extern int xf86CloseSerial (int fd); - extern int xf86WaitForInput (int fd, int timeout); --extern int xf86OpenSerial (OPTTYPE options); -+extern int xf86OpenSerial (pointer options); - extern int xf86SetSerialSpeed (int fd, int speed); - --extern OPTTYPE xf86ReplaceIntOption(OPTTYPE optlist, const char *name, const int val); --extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, const char *val); --extern char* xf86OptionName(OPTTYPE opt); --extern CONST char* xf86FindOptionValue(OPTTYPE options, const char *name); -+extern pointer xf86ReplaceIntOption(pointer optlist, const char *name, const int val); -+extern pointer xf86AddNewOption(pointer head, const char *name, const char *val); -+extern char* xf86OptionName(pointer opt); -+extern char* xf86FindOptionValue(pointer options, const char *name); + extern int xf86ReadSerial(int fd, void *buf, int count); + extern int xf86WriteSerial(int fd, const void *buf, int count); + extern int xf86CloseSerial(int fd); + extern int xf86WaitForInput(int fd, int timeout); +-extern int xf86OpenSerial(OPTTYPE options); ++extern int xf86OpenSerial(pointer options); + extern int xf86SetSerialSpeed(int fd, int speed); + +-extern OPTTYPE xf86ReplaceIntOption(OPTTYPE optlist, const char *name, ++extern pointer xf86ReplaceIntOption(pointer optlist, const char *name, + const int val); +-extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, ++extern pointer xf86AddNewOption(pointer head, const char *name, + const char *val); +-extern char *xf86OptionName(OPTTYPE opt); +-extern CONST char *xf86FindOptionValue(OPTTYPE options, const char *name); ++extern char *xf86OptionName(pointer opt); ++extern char *xf86FindOptionValue(pointer options, const char *name); extern int xf86NameCmp(const char *s1, const char *s2); --extern char* xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); -+extern char* xf86CheckStrOption(pointer optlist, const char *name, char *deflt); - +-extern char *xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); ++extern char *xf86CheckStrOption(pointer optlist, const char *name, char *deflt); --extern char * xf86SetStrOption(OPTTYPE optlist, const char *name, CONST char *deflt); +-extern char *xf86SetStrOption(OPTTYPE optlist, const char *name, +- CONST char *deflt); -extern int xf86SetBoolOption(OPTTYPE optlist, const char *name, int deflt); --extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, const char *val); --extern CONST char* xf86FindOptionValue(OPTTYPE options, const char *name); --extern char* xf86OptionName(OPTTYPE opt); --extern char *xf86OptionValue(OPTTYPE opt); -+extern char * xf86SetStrOption(pointer optlist, const char *name, char *deflt); +-extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, ++extern char *xf86SetStrOption(pointer optlist, const char *name, ++ char *deflt); +extern int xf86SetBoolOption(pointer optlist, const char *name, int deflt); -+extern pointer xf86AddNewOption(pointer head, const char *name, const char *val); -+extern char* xf86FindOptionValue(pointer options, const char *name); -+extern char* xf86OptionName(pointer opt); ++extern pointer xf86AddNewOption(pointer head, const char *name, + const char *val); +-extern CONST char *xf86FindOptionValue(OPTTYPE options, const char *name); +-extern char *xf86OptionName(OPTTYPE opt); +-extern char *xf86OptionValue(OPTTYPE opt); ++extern char *xf86FindOptionValue(pointer options, const char *name); ++extern char *xf86OptionName(pointer opt); +extern char *xf86OptionValue(pointer opt); extern int xf86NameCmp(const char *s1, const char *s2); --extern char * xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); -+extern char * xf86CheckStrOption(pointer optlist, const char *name, char *deflt); +-extern char *xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); ++extern char *xf86CheckStrOption(pointer optlist, const char *name, char *deflt); extern void xf86AddEnabledDevice(InputInfoPtr pInfo); extern void xf86RemoveEnabledDevice(InputInfoPtr pInfo); extern Atom XIGetKnownProperty(char *name); -@@ -61,7 +52,7 @@ XISetDevicePropertyDeletable(DeviceIntPt +@@ -60,7 +52,7 @@ extern InputInfoPtr xf86FirstLocalDevice(void); extern void xf86DeleteInput(InputInfoPtr pInp, int flags); -extern OPTTYPE xf86OptionListDuplicate(OPTTYPE options); +extern pointer xf86OptionListDuplicate(pointer options); extern Bool - InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels, - CARD8 *map); -@@ -73,7 +64,7 @@ xf86PostKeyboardEvent(DeviceIntPtr - unsigned int key_code, - int is_down); - extern int --xf86SetIntOption(OPTTYPE optlist, const char *name, int deflt); -+xf86SetIntOption(pointer optlist, const char *name, int deflt); + + InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom *labels, +@@ -73,7 +65,7 @@ extern void - xf86PostButtonEventP(DeviceIntPtr device, - int is_absolute, -@@ -91,7 +82,7 @@ InitPtrFeedbackClassDeviceStruct(DeviceI + xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down); extern int - XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type, - int format, int mode, unsigned long len, -- OPTTYPE value, Bool sendevent); -+ pointer value, Bool sendevent); - extern CARD32 GetTimeInMillis (void); +- xf86SetIntOption(OPTTYPE optlist, const char *name, int deflt); ++ xf86SetIntOption(pointer optlist, const char *name, int deflt); + extern void + + xf86PostButtonEventP(DeviceIntPtr device, +@@ -91,7 +83,7 @@ + + XIChangeDeviceProperty(DeviceIntPtr dev, Atom property, Atom type, + int format, int mode, unsigned long len, +- OPTTYPE value, Bool sendevent); ++ pointer value, Bool sendevent); + extern CARD32 GetTimeInMillis(void); extern int -@@ -140,10 +131,10 @@ extern Bool +@@ -143,10 +135,10 @@ InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels, int numMotionEvents, int mode); -extern OPTTYPE --xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char* val); +-xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char *val); +extern pointer -+xf86ReplaceStrOption(pointer optlist, const char *name, const char* val); ++xf86ReplaceStrOption(pointer optlist, const char *name, const char *val); -extern OPTTYPE xf86NextOption(OPTTYPE list); +extern pointer xf86NextOption(pointer list); extern int - XIGetDeviceProperty (DeviceIntPtr dev, Atom property, XIPropertyValuePtr *value); -@@ -167,12 +158,12 @@ extern Bool InitFocusClassDeviceStruct(D + +@@ -169,12 +161,12 @@ #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12 extern void --xf86ProcessCommonOptions(InputInfoPtr pInfo, OPTTYPE list); -+xf86ProcessCommonOptions(InputInfoPtr pInfo, pointer list); +- xf86ProcessCommonOptions(InputInfoPtr pInfo, OPTTYPE list); ++ xf86ProcessCommonOptions(InputInfoPtr pInfo, pointer list); extern void + xf86CollectInputOptions(InputInfoPtr pInfo, - const char **defaultOpts, -- OPTTYPE extraOpts); -+ pointer extraOpts); +- const char **defaultOpts, OPTTYPE extraOpts); ++ const char **defaultOpts, pointer extraOpts); + + extern InputInfoPtr xf86AllocateInput(InputDriverPtr drv, int flags); - extern InputInfoPtr - xf86AllocateInput(InputDriverPtr drv, int flags); diff -Nru xserver-xorg-input-synaptics-1.6.0/include/synaptics.h xserver-xorg-input-synaptics-1.6.2/include/synaptics.h --- xserver-xorg-input-synaptics-1.6.0/include/synaptics.h 2012-04-30 00:33:10.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/include/synaptics.h 2012-06-12 01:23:34.000000000 +0000 @@ -29,36 +29,35 @@ * Used by driver and the shared memory configurator *****************************************************************************/ typedef enum { - RT_TAP = 0, /* Right top corner */ - RB_TAP, /* Right bottom corner */ - LT_TAP, /* Left top corner */ - LB_TAP, /* Left bottom corner */ - F1_TAP, /* Non-corner tap, one finger */ - F2_TAP, /* Non-corner tap, two fingers */ - F3_TAP, /* Non-corner tap, three fingers */ + RT_TAP = 0, /* Right top corner */ + RB_TAP, /* Right bottom corner */ + LT_TAP, /* Left top corner */ + LB_TAP, /* Left bottom corner */ + F1_TAP, /* Non-corner tap, one finger */ + F2_TAP, /* Non-corner tap, two fingers */ + F3_TAP, /* Non-corner tap, three fingers */ MAX_TAP } TapEvent; typedef enum { - F1_CLICK1 = 0, /* Click left, one finger */ - F2_CLICK1, /* Click left, two fingers */ - F3_CLICK1, /* Click left, three fingers */ + F1_CLICK1 = 0, /* Click left, one finger */ + F2_CLICK1, /* Click left, two fingers */ + F3_CLICK1, /* Click left, three fingers */ MAX_CLICK } ClickFingerEvent; -#define SYN_MAX_BUTTONS 12 /* Max number of mouse buttons */ +#define SYN_MAX_BUTTONS 12 /* Max number of mouse buttons */ #define SHM_SYNAPTICS 23947 -typedef struct _SynapticsSHM -{ - int version; /* Driver version */ +typedef struct _SynapticsSHM { + int version; /* Driver version */ /* Current device state */ - int x, y; /* actual x, y coordinates */ - int z; /* pressure value */ - int numFingers; /* number of fingers */ - int fingerWidth; /* finger width value */ - int left, right, up, down; /* left/right/up/down buttons */ + int x, y; /* actual x, y coordinates */ + int z; /* pressure value */ + int numFingers; /* number of fingers */ + int fingerWidth; /* finger width value */ + int left, right, up, down; /* left/right/up/down buttons */ Bool multi[8]; Bool middle; } SynapticsSHM; @@ -69,4 +68,4 @@ #define SBR_MIN 10 #define SBR_MAX 1000 -#endif /* _SYNAPTICS_H_ */ +#endif /* _SYNAPTICS_H_ */ diff -Nru xserver-xorg-input-synaptics-1.6.0/include/synaptics-properties.h xserver-xorg-input-synaptics-1.6.2/include/synaptics-properties.h --- xserver-xorg-input-synaptics-1.6.0/include/synaptics-properties.h 2012-04-30 00:33:10.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/include/synaptics-properties.h 2012-06-12 01:23:34.000000000 +0000 @@ -164,4 +164,4 @@ /* 32 Bit Integer, 2 values, horizontal hysteresis, vertical hysteresis */ #define SYNAPTICS_PROP_NOISE_CANCELLATION "Synaptics Noise Cancellation" -#endif /* _SYNAPTICS_PROPERTIES_H_ */ +#endif /* _SYNAPTICS_PROPERTIES_H_ */ diff -Nru xserver-xorg-input-synaptics-1.6.0/src/alpscomm.c xserver-xorg-input-synaptics-1.6.2/src/alpscomm.c --- xserver-xorg-input-synaptics-1.6.0/src/alpscomm.c 2012-04-30 00:33:10.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/alpscomm.c 2012-06-12 01:23:34.000000000 +0000 @@ -39,14 +39,14 @@ #include "ps2comm.h" #include - /* Wait for the channel to go silent, which means we're in sync */ static void ALPS_sync(int fd) { byte buffer[64]; + while (xf86WaitForInput(fd, 250000) > 0) { - xf86ReadSerial(fd, &buffer, 64); + xf86ReadSerial(fd, &buffer, 64); } } @@ -98,7 +98,7 @@ { /* ALPS absolute mode packets start with 0b11111mrl */ if ((comm->protoBuf[0] & 0xf8) == 0xf8) - return TRUE; + return TRUE; return FALSE; } @@ -108,24 +108,23 @@ int c; while ((c = XisbRead(comm->buffer)) >= 0) { - unsigned char u = (unsigned char)c; + unsigned char u = (unsigned char) c; - comm->protoBuf[comm->protoBufTail++] = u; + comm->protoBuf[comm->protoBufTail++] = u; - if (comm->protoBufTail == 3) { /* PS/2 packet received? */ - if ((comm->protoBuf[0] & 0xc8) == 0x08) { - comm->protoBufTail = 0; - return TRUE; - } - } - - if (comm->protoBufTail >= 6) { /* Full packet received */ - comm->protoBufTail = 0; - if (ALPS_packet_ok(comm)) - return TRUE; - while ((c = XisbRead(comm->buffer)) >= 0) - ; /* If packet is invalid, re-sync */ - } + if (comm->protoBufTail == 3) { /* PS/2 packet received? */ + if ((comm->protoBuf[0] & 0xc8) == 0x08) { + comm->protoBufTail = 0; + return TRUE; + } + } + + if (comm->protoBufTail >= 6) { /* Full packet received */ + comm->protoBufTail = 0; + if (ALPS_packet_ok(comm)) + return TRUE; + while ((c = XisbRead(comm->buffer)) >= 0); /* If packet is invalid, re-sync */ + } } return FALSE; @@ -157,48 +156,50 @@ hw->millis = GetTimeInMillis(); - x = (packet[1] & 0x7f) | ((packet[2] & 0x78) << (7-3)); - y = (packet[4] & 0x7f) | ((packet[3] & 0x70) << (7-4)); + x = (packet[1] & 0x7f) | ((packet[2] & 0x78) << (7 - 3)); + y = (packet[4] & 0x7f) | ((packet[3] & 0x70) << (7 - 4)); z = packet[5]; - if (z == 127) { /* DualPoint stick is relative, not absolute */ - hw->left = packet[3] & 1; - hw->right = (packet[3] >> 1) & 1; - return; + if (z == 127) { /* DualPoint stick is relative, not absolute */ + hw->left = packet[3] & 1; + hw->right = (packet[3] >> 1) & 1; + return; } /* Handle normal packets */ hw->x = hw->y = hw->z = hw->numFingers = hw->fingerWidth = 0; hw->left = hw->right = hw->up = hw->down = hw->middle = FALSE; for (i = 0; i < 8; i++) - hw->multi[i] = FALSE; + hw->multi[i] = FALSE; if (z > 0) { - hw->x = x; - hw->y = y; + hw->x = x; + hw->y = y; } hw->z = z; hw->numFingers = (z > 0) ? 1 : 0; hw->fingerWidth = 5; - left |= (packet[2] ) & 1; - left |= (packet[3] ) & 1; + left |= (packet[2]) & 1; + left |= (packet[3]) & 1; right |= (packet[3] >> 1) & 1; if (packet[0] == 0xff) { - int back = (packet[3] >> 2) & 1; - int forward = (packet[2] >> 2) & 1; - if (back && forward) { - middle = 1; - back = 0; - forward = 0; - } - hw->down = back; - hw->up = forward; - } else { - left |= (packet[0] ) & 1; - right |= (packet[0] >> 1) & 1; - middle |= (packet[0] >> 2) & 1; - middle |= (packet[3] >> 2) & 1; + int back = (packet[3] >> 2) & 1; + int forward = (packet[2] >> 2) & 1; + + if (back && forward) { + middle = 1; + back = 0; + forward = 0; + } + hw->down = back; + hw->up = forward; + } + else { + left |= (packet[0]) & 1; + right |= (packet[0] >> 1) & 1; + middle |= (packet[0] >> 2) & 1; + middle |= (packet[3] >> 2) & 1; } hw->left = left; @@ -208,13 +209,13 @@ static Bool ALPSReadHwState(InputInfoPtr pInfo, - struct CommData *comm, struct SynapticsHwState *hwRet) + struct CommData *comm, struct SynapticsHwState *hwRet) { unsigned char *buf = comm->protoBuf; struct SynapticsHwState *hw = comm->hwState; if (!ALPS_get_packet(comm, pInfo)) - return FALSE; + return FALSE; ALPS_process_packet(buf, hw); diff -Nru xserver-xorg-input-synaptics-1.6.0/src/eventcomm.c xserver-xorg-input-synaptics-1.6.2/src/eventcomm.c --- xserver-xorg-input-synaptics-1.6.0/src/eventcomm.c 2012-05-02 00:42:53.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/eventcomm.c 2012-06-12 01:23:34.000000000 +0000 @@ -63,8 +63,7 @@ /** * Protocol-specific data. */ -struct eventcomm_proto_data -{ +struct eventcomm_proto_data { /** * Do we need to grab the event device? * Note that in the current flow, this variable is always false and @@ -99,9 +98,10 @@ #ifdef HAVE_MULTITOUCH static int -last_mt_vals_slot(const SynapticsPrivate *priv) +last_mt_vals_slot(const SynapticsPrivate * priv) { - struct eventcomm_proto_data *proto_data = (struct eventcomm_proto_data*)priv->proto_data; + struct eventcomm_proto_data *proto_data = + (struct eventcomm_proto_data *) priv->proto_data; int value = proto_data->cur_slot - proto_data->mtdev->caps.slot.minimum; return value < priv->num_slots ? value : -1; @@ -110,14 +110,14 @@ static void UninitializeTouch(InputInfoPtr pInfo) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; - struct eventcomm_proto_data *proto_data = (struct eventcomm_proto_data*)priv->proto_data; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; + struct eventcomm_proto_data *proto_data = + (struct eventcomm_proto_data *) priv->proto_data; if (!priv->has_touch) return; - if (proto_data->last_mt_vals) - { + if (proto_data->last_mt_vals) { int i; for (i = 0; i < priv->num_slots; i++) @@ -134,16 +134,16 @@ static void InitializeTouch(InputInfoPtr pInfo) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; - struct eventcomm_proto_data *proto_data = (struct eventcomm_proto_data*)priv->proto_data; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; + struct eventcomm_proto_data *proto_data = + (struct eventcomm_proto_data *) priv->proto_data; int i; if (!priv->has_touch) return; proto_data->mtdev = mtdev_new_open(pInfo->fd); - if (!proto_data->mtdev) - { + if (!proto_data->mtdev) { xf86IDrvMsg(pInfo, X_WARNING, "failed to create mtdev instance, ignoring touch events\n"); return; @@ -152,23 +152,19 @@ proto_data->cur_slot = proto_data->mtdev->caps.slot.value; proto_data->num_touches = 0; - proto_data->last_mt_vals = calloc(priv->num_slots, - sizeof(ValuatorMask *)); - if (!proto_data->last_mt_vals) - { + proto_data->last_mt_vals = calloc(priv->num_slots, sizeof(ValuatorMask *)); + if (!proto_data->last_mt_vals) { xf86IDrvMsg(pInfo, X_WARNING, "failed to allocate MT last values mask array\n"); UninitializeTouch(pInfo); return; } - for (i = 0; i < priv->num_slots; i++) - { + for (i = 0; i < priv->num_slots; i++) { int j; proto_data->last_mt_vals[i] = valuator_mask_new(4 + priv->num_mt_axes); - if (!proto_data->last_mt_vals[i]) - { + if (!proto_data->last_mt_vals[i]) { xf86IDrvMsg(pInfo, X_WARNING, "failed to allocate MT last values mask\n"); UninitializeTouch(pInfo); @@ -186,20 +182,22 @@ #endif static Bool -EventDeviceOnHook(InputInfoPtr pInfo, SynapticsParameters *para) +EventDeviceOnHook(InputInfoPtr pInfo, SynapticsParameters * para) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; - struct eventcomm_proto_data *proto_data = (struct eventcomm_proto_data*)priv->proto_data; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; + struct eventcomm_proto_data *proto_data = + (struct eventcomm_proto_data *) priv->proto_data; if (para->grab_event_device) { - /* Try to grab the event device so that data don't leak to /dev/input/mice */ - int ret; - SYSCALL(ret = ioctl(pInfo->fd, EVIOCGRAB, (pointer)1)); - if (ret < 0) { - xf86IDrvMsg(pInfo, X_WARNING, "can't grab event device, errno=%d\n", - errno); - return FALSE; - } + /* Try to grab the event device so that data don't leak to /dev/input/mice */ + int ret; + + SYSCALL(ret = ioctl(pInfo->fd, EVIOCGRAB, (pointer) 1)); + if (ret < 0) { + xf86IDrvMsg(pInfo, X_WARNING, "can't grab event device, errno=%d\n", + errno); + return FALSE; + } } proto_data->need_grab = FALSE; @@ -239,13 +237,12 @@ event_query_is_touchpad(int fd, BOOL test_grab) { int ret = FALSE, rc; - unsigned long evbits[NBITS(EV_MAX)] = {0}; - unsigned long absbits[NBITS(ABS_MAX)] = {0}; - unsigned long keybits[NBITS(KEY_MAX)] = {0}; + unsigned long evbits[NBITS(EV_MAX)] = { 0 }; + unsigned long absbits[NBITS(ABS_MAX)] = { 0 }; + unsigned long keybits[NBITS(KEY_MAX)] = { 0 }; - if (test_grab) - { - SYSCALL(rc = ioctl(fd, EVIOCGRAB, (pointer)1)); + if (test_grab) { + SYSCALL(rc = ioctl(fd, EVIOCGRAB, (pointer) 1)); if (rc < 0) return FALSE; } @@ -254,54 +251,53 @@ SYSCALL(rc = ioctl(fd, EVIOCGBIT(0, sizeof(evbits)), evbits)); if (rc < 0) - goto unwind; + goto unwind; if (!TEST_BIT(EV_SYN, evbits) || - !TEST_BIT(EV_ABS, evbits) || - !TEST_BIT(EV_KEY, evbits)) - goto unwind; + !TEST_BIT(EV_ABS, evbits) || !TEST_BIT(EV_KEY, evbits)) + goto unwind; SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits)); if (rc < 0) - goto unwind; - if (!TEST_BIT(ABS_X, absbits) || - !TEST_BIT(ABS_Y, absbits)) - goto unwind; + goto unwind; + if (!TEST_BIT(ABS_X, absbits) || !TEST_BIT(ABS_Y, absbits)) + goto unwind; SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits)); if (rc < 0) - goto unwind; + goto unwind; /* we expect touchpad either report raw pressure or touches */ if (!TEST_BIT(ABS_PRESSURE, absbits) && !TEST_BIT(BTN_TOUCH, keybits)) - goto unwind; + goto unwind; /* all Synaptics-like touchpad report BTN_TOOL_FINGER */ if (!TEST_BIT(BTN_TOOL_FINGER, keybits)) - goto unwind; + goto unwind; if (TEST_BIT(BTN_TOOL_PEN, keybits)) - goto unwind; /* Don't match wacom tablets */ + goto unwind; /* Don't match wacom tablets */ ret = TRUE; -unwind: + unwind: if (test_grab) - SYSCALL(ioctl(fd, EVIOCGRAB, (pointer)0)); + SYSCALL(ioctl(fd, EVIOCGRAB, (pointer) 0)); return (ret == TRUE); } typedef struct { - short vendor; - short product; - enum TouchpadModel model; + short vendor; + short product; + enum TouchpadModel model; } model_lookup_t; + #define PRODUCT_ANY 0x0000 static model_lookup_t model_lookup_table[] = { - {0x0002, 0x0007, MODEL_SYNAPTICS}, - {0x0002, 0x0008, MODEL_ALPS}, - {0x05ac, PRODUCT_ANY, MODEL_APPLETOUCH}, - {0x0002, 0x000e, MODEL_ELANTECH}, - {0x0, 0x0, 0x0} + {0x0002, 0x0007, MODEL_SYNAPTICS}, + {0x0002, 0x0008, MODEL_ALPS}, + {0x05ac, PRODUCT_ANY, MODEL_APPLETOUCH}, + {0x0002, 0x000e, MODEL_ELANTECH}, + {0x0, 0x0, 0x0} }; /** @@ -315,7 +311,8 @@ * @return TRUE on success or FALSE otherwise. */ static Bool -event_query_model(int fd, enum TouchpadModel *model_out, unsigned short *vendor_id, unsigned short *product_id) +event_query_model(int fd, enum TouchpadModel *model_out, + unsigned short *vendor_id, unsigned short *product_id) { struct input_id id; int rc; @@ -325,9 +322,11 @@ if (rc < 0) return FALSE; - for(model_lookup = model_lookup_table; model_lookup->vendor; model_lookup++) { - if(model_lookup->vendor == id.vendor && - (model_lookup->product == id.product|| model_lookup->product == PRODUCT_ANY)) + for (model_lookup = model_lookup_table; model_lookup->vendor; + model_lookup++) { + if (model_lookup->vendor == id.vendor && + (model_lookup->product == id.product || + model_lookup->product == PRODUCT_ANY)) *model_out = model_lookup->model; } @@ -356,71 +355,68 @@ int *min, int *max, int *fuzz, int *res) { int rc; - struct input_absinfo abs = {0}; + struct input_absinfo abs = { 0 }; SYSCALL(rc = ioctl(fd, EVIOCGABS(code), &abs)); if (rc < 0) { - xf86IDrvMsg(pInfo, X_ERROR, "%s EVIOCGABS error on %d (%s)\n", - __func__, code, strerror(errno)); - return errno; + xf86IDrvMsg(pInfo, X_ERROR, "%s EVIOCGABS error on %d (%s)\n", + __func__, code, strerror(errno)); + return errno; } *min = abs.minimum; *max = abs.maximum; /* We dont trust a zero fuzz as it probably is just a lazy value */ if (fuzz && abs.fuzz > 0) - *fuzz = abs.fuzz; + *fuzz = abs.fuzz; #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30) if (res) - *res = abs.resolution; + *res = abs.resolution; #endif return 0; } - /* Query device for axis ranges */ static void event_query_axis_ranges(InputInfoPtr pInfo) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct eventcomm_proto_data *proto_data = priv->proto_data; - unsigned long absbits[NBITS(ABS_MAX)] = {0}; - unsigned long keybits[NBITS(KEY_MAX)] = {0}; - char buf[256] = {0}; + unsigned long absbits[NBITS(ABS_MAX)] = { 0 }; + unsigned long keybits[NBITS(KEY_MAX)] = { 0 }; + char buf[256] = { 0 }; int rc; /* The kernel's fuzziness concept seems a bit weird, but it can more or * less be applied as hysteresis directly, i.e. no factor here. */ event_get_abs(pInfo, pInfo->fd, ABS_X, &priv->minx, &priv->maxx, - &priv->synpara.hyst_x, &priv->resx); + &priv->synpara.hyst_x, &priv->resx); event_get_abs(pInfo, pInfo->fd, ABS_Y, &priv->miny, &priv->maxy, - &priv->synpara.hyst_y, &priv->resy); + &priv->synpara.hyst_y, &priv->resy); priv->has_pressure = FALSE; priv->has_width = FALSE; SYSCALL(rc = ioctl(pInfo->fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits)); - if (rc >= 0) - { - priv->has_pressure = (TEST_BIT(ABS_PRESSURE, absbits) != 0); - priv->has_width = (TEST_BIT(ABS_TOOL_WIDTH, absbits) != 0); + if (rc >= 0) { + priv->has_pressure = (TEST_BIT(ABS_PRESSURE, absbits) != 0); + priv->has_width = (TEST_BIT(ABS_TOOL_WIDTH, absbits) != 0); } else - xf86IDrvMsg(pInfo, X_ERROR, "failed to query ABS bits (%s)\n", strerror(errno)); + xf86IDrvMsg(pInfo, X_ERROR, "failed to query ABS bits (%s)\n", + strerror(errno)); if (priv->has_pressure) - event_get_abs(pInfo, pInfo->fd, ABS_PRESSURE, &priv->minp, &priv->maxp, - NULL, NULL); + event_get_abs(pInfo, pInfo->fd, ABS_PRESSURE, &priv->minp, &priv->maxp, + NULL, NULL); if (priv->has_width) - event_get_abs(pInfo, pInfo->fd, ABS_TOOL_WIDTH, - &priv->minw, &priv->maxw, - NULL, NULL); + event_get_abs(pInfo, pInfo->fd, ABS_TOOL_WIDTH, + &priv->minw, &priv->maxw, NULL, NULL); #if HAVE_MULTITOUCH - if (priv->has_touch) - { + if (priv->has_touch) { int st_minx = priv->minx; int st_maxx = priv->maxx; int st_miny = priv->miny; @@ -441,51 +437,48 @@ #endif SYSCALL(rc = ioctl(pInfo->fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits)); - if (rc >= 0) - { - priv->has_left = (TEST_BIT(BTN_LEFT, keybits) != 0); - priv->has_right = (TEST_BIT(BTN_RIGHT, keybits) != 0); - priv->has_middle = (TEST_BIT(BTN_MIDDLE, keybits) != 0); - priv->has_double = (TEST_BIT(BTN_TOOL_DOUBLETAP, keybits) != 0); - priv->has_triple = (TEST_BIT(BTN_TOOL_TRIPLETAP, keybits) != 0); - - if ((TEST_BIT(BTN_0, keybits) != 0) || - (TEST_BIT(BTN_1, keybits) != 0) || - (TEST_BIT(BTN_2, keybits) != 0) || - (TEST_BIT(BTN_3, keybits) != 0)) - priv->has_scrollbuttons = 1; + if (rc >= 0) { + priv->has_left = (TEST_BIT(BTN_LEFT, keybits) != 0); + priv->has_right = (TEST_BIT(BTN_RIGHT, keybits) != 0); + priv->has_middle = (TEST_BIT(BTN_MIDDLE, keybits) != 0); + priv->has_double = (TEST_BIT(BTN_TOOL_DOUBLETAP, keybits) != 0); + priv->has_triple = (TEST_BIT(BTN_TOOL_TRIPLETAP, keybits) != 0); + + if ((TEST_BIT(BTN_0, keybits) != 0) || + (TEST_BIT(BTN_1, keybits) != 0) || + (TEST_BIT(BTN_2, keybits) != 0) || (TEST_BIT(BTN_3, keybits) != 0)) + priv->has_scrollbuttons = 1; } /* Now print the device information */ xf86IDrvMsg(pInfo, X_PROBED, "x-axis range %d - %d\n", - priv->minx, priv->maxx); + priv->minx, priv->maxx); xf86IDrvMsg(pInfo, X_PROBED, "y-axis range %d - %d\n", - priv->miny, priv->maxy); + priv->miny, priv->maxy); if (priv->has_pressure) - xf86IDrvMsg(pInfo, X_PROBED, "pressure range %d - %d\n", - priv->minp, priv->maxp); + xf86IDrvMsg(pInfo, X_PROBED, "pressure range %d - %d\n", + priv->minp, priv->maxp); else - xf86IDrvMsg(pInfo, X_INFO, - "device does not report pressure, will use touch data.\n"); + xf86IDrvMsg(pInfo, X_INFO, + "device does not report pressure, will use touch data.\n"); if (priv->has_width) - xf86IDrvMsg(pInfo, X_PROBED, "finger width range %d - %d\n", - priv->minw, priv->maxw); + xf86IDrvMsg(pInfo, X_PROBED, "finger width range %d - %d\n", + priv->minw, priv->maxw); else - xf86IDrvMsg(pInfo, X_INFO, - "device does not report finger width.\n"); + xf86IDrvMsg(pInfo, X_INFO, "device does not report finger width.\n"); if (priv->has_left) - strcat(buf, " left"); + strcat(buf, " left"); if (priv->has_right) - strcat(buf, " right"); + strcat(buf, " right"); if (priv->has_middle) - strcat(buf, " middle"); + strcat(buf, " middle"); if (priv->has_double) - strcat(buf, " double"); + strcat(buf, " double"); if (priv->has_triple) - strcat(buf, " triple"); + strcat(buf, " triple"); if (priv->has_scrollbuttons) - strcat(buf, " scroll-buttons"); + strcat(buf, " scroll-buttons"); xf86IDrvMsg(pInfo, X_PROBED, "buttons:%s\n", buf); } @@ -493,11 +486,12 @@ static Bool EventQueryHardware(InputInfoPtr pInfo) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct eventcomm_proto_data *proto_data = priv->proto_data; - if (!event_query_is_touchpad(pInfo->fd, (proto_data) ? proto_data->need_grab : TRUE)) - return FALSE; + if (!event_query_is_touchpad + (pInfo->fd, (proto_data) ? proto_data->need_grab : TRUE)) + return FALSE; xf86IDrvMsg(pInfo, X_PROBED, "touchpad found\n"); @@ -508,7 +502,7 @@ SynapticsReadEvent(InputInfoPtr pInfo, struct input_event *ev) { #ifdef HAVE_MULTITOUCH - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct eventcomm_proto_data *proto_data = priv->proto_data; #endif int rc = TRUE; @@ -517,18 +511,20 @@ #ifdef HAVE_MULTITOUCH if (proto_data->mtdev) len = mtdev_get(proto_data->mtdev, pInfo->fd, ev, 1) * - sizeof(struct input_event); + sizeof(struct input_event); else #endif len = read(pInfo->fd, ev, sizeof(*ev)); - if (len <= 0) - { + if (len <= 0) { /* We use X_NONE here because it doesn't alloc */ if (errno != EAGAIN) - xf86MsgVerb(X_NONE, 0, "%s: Read error %s\n", pInfo->name, strerror(errno)); + xf86MsgVerb(X_NONE, 0, "%s: Read error %s\n", pInfo->name, + strerror(errno)); rc = FALSE; - } else if (len % sizeof(*ev)) { - xf86MsgVerb(X_NONE, 0, "%s: Read error, invalid number of bytes.", pInfo->name); + } + else if (len % sizeof(*ev)) { + xf86MsgVerb(X_NONE, 0, "%s: Read error, invalid number of bytes.", + pInfo->name); rc = FALSE; } return rc; @@ -536,7 +532,7 @@ #ifdef HAVE_MULTITOUCH static Bool -EventTouchSlotPreviouslyOpen(SynapticsPrivate *priv, int slot) +EventTouchSlotPreviouslyOpen(SynapticsPrivate * priv, int slot) { int i; @@ -553,29 +549,25 @@ struct input_event *ev) { #ifdef HAVE_MULTITOUCH - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct eventcomm_proto_data *proto_data = priv->proto_data; if (!priv->has_touch) return; - if (ev->code == ABS_MT_SLOT) - { + if (ev->code == ABS_MT_SLOT) { proto_data->cur_slot = ev->value; - } else - { + } + else { int slot_index = last_mt_vals_slot(priv); if (slot_index < 0) return; - if (hw->slot_state[slot_index] == SLOTSTATE_EMPTY || - hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY) + if (hw->slot_state[slot_index] == SLOTSTATE_OPEN_EMPTY) hw->slot_state[slot_index] = SLOTSTATE_UPDATE; - if (ev->code == ABS_MT_TRACKING_ID) - { - if (ev->value >= 0) - { + if (ev->code == ABS_MT_TRACKING_ID) { + if (ev->value >= 0) { hw->slot_state[slot_index] = SLOTSTATE_OPEN; proto_data->num_touches++; @@ -586,22 +578,21 @@ xf86IDrvMsg(pInfo, X_WARNING, "Attempted to copy values from out-of-range " "slot, touch events may be incorrect.\n"); - } else - { + } + else if (hw->slot_state[slot_index] != SLOTSTATE_EMPTY) { hw->slot_state[slot_index] = SLOTSTATE_CLOSE; proto_data->num_touches--; } - } else - { + } + else { int map = proto_data->axis_map[ev->code - ABS_MT_TOUCH_MAJOR]; + valuator_mask_set(hw->mt_mask[slot_index], map, ev->value); - if (slot_index >= 0) - { + if (slot_index >= 0) { ValuatorMask *mask = proto_data->last_mt_vals[slot_index]; int last_val = valuator_mask_get(mask, map); - if (EventTouchSlotPreviouslyOpen(priv, slot_index)) - { + if (EventTouchSlotPreviouslyOpen(priv, slot_index)) { if (ev->code == ABS_MT_POSITION_X) hw->cumulative_dx += ev->value - last_val; else if (ev->code == ABS_MT_POSITION_Y) @@ -623,18 +614,19 @@ * @param comm Assembled information from previous events. * @return The number of fingers currently set. */ -static int count_fingers(InputInfoPtr pInfo, const struct CommData *comm) +static int +count_fingers(InputInfoPtr pInfo, const struct CommData *comm) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct eventcomm_proto_data *proto_data = priv->proto_data; int fingers = 0; if (comm->oneFinger) - fingers = 1; + fingers = 1; else if (comm->twoFingers) - fingers = 2; + fingers = 2; else if (comm->threeFingers) - fingers = 3; + fingers = 3; #ifdef HAVE_MULTITOUCH if (priv->has_touch && proto_data->num_touches > fingers) @@ -644,135 +636,137 @@ return fingers; } - static inline double apply_st_scaling(struct eventcomm_proto_data *proto_data, int value, int axis) { - return value * proto_data->st_to_mt_scale[axis] + proto_data->st_to_mt_offset[axis]; + return value * proto_data->st_to_mt_scale[axis] + + proto_data->st_to_mt_offset[axis]; } Bool EventReadHwState(InputInfoPtr pInfo, - struct CommData *comm, struct SynapticsHwState *hwRet) + struct CommData *comm, struct SynapticsHwState *hwRet) { struct input_event ev; Bool v; struct SynapticsHwState *hw = comm->hwState; - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; SynapticsParameters *para = &priv->synpara; struct eventcomm_proto_data *proto_data = priv->proto_data; SynapticsResetTouchHwState(hw, FALSE); /* Reset cumulative values if buttons were not previously pressed */ - if (!hw->left && !hw->right && !hw->middle) - { + if (!hw->left && !hw->right && !hw->middle) { hw->cumulative_dx = hw->x; hw->cumulative_dy = hw->y; } while (SynapticsReadEvent(pInfo, &ev)) { - switch (ev.type) { - case EV_SYN: - switch (ev.code) { - case SYN_REPORT: - hw->numFingers = count_fingers(pInfo, comm); - hw->millis = 1000 * ev.time.tv_sec + ev.time.tv_usec / 1000; - SynapticsCopyHwState(hwRet, hw); - return TRUE; - } - break; - case EV_KEY: - v = (ev.value ? TRUE : FALSE); - switch (ev.code) { - case BTN_LEFT: - hw->left = v; - break; - case BTN_RIGHT: - hw->right = v; - break; - case BTN_MIDDLE: - hw->middle = v; - break; - case BTN_FORWARD: - hw->up = v; - break; - case BTN_BACK: - hw->down = v; - break; - case BTN_0: - hw->multi[0] = v; - break; - case BTN_1: - hw->multi[1] = v; - break; - case BTN_2: - hw->multi[2] = v; - break; - case BTN_3: - hw->multi[3] = v; - break; - case BTN_4: - hw->multi[4] = v; - break; - case BTN_5: - hw->multi[5] = v; - break; - case BTN_6: - hw->multi[6] = v; - break; - case BTN_7: - hw->multi[7] = v; - break; - case BTN_TOOL_FINGER: - comm->oneFinger = v; - break; - case BTN_TOOL_DOUBLETAP: - comm->twoFingers = v; - break; - case BTN_TOOL_TRIPLETAP: - comm->threeFingers = v; - break; - case BTN_TOUCH: - if (!priv->has_pressure) - hw->z = v ? para->finger_high + 1 : 0; - break; - } - break; - case EV_ABS: - if (ev.code < ABS_MT_SLOT) { - switch (ev.code) { - case ABS_X: - hw->x = apply_st_scaling(proto_data, ev.value, 0); - break; - case ABS_Y: - hw->y = apply_st_scaling(proto_data, ev.value, 1); - break; - case ABS_PRESSURE: - hw->z = ev.value; - break; - case ABS_TOOL_WIDTH: - hw->fingerWidth = ev.value; - break; - } - } else - EventProcessTouchEvent(pInfo, hw, &ev); - break; - } + switch (ev.type) { + case EV_SYN: + switch (ev.code) { + case SYN_REPORT: + hw->numFingers = count_fingers(pInfo, comm); + hw->millis = 1000 * ev.time.tv_sec + ev.time.tv_usec / 1000; + SynapticsCopyHwState(hwRet, hw); + return TRUE; + } + break; + case EV_KEY: + v = (ev.value ? TRUE : FALSE); + switch (ev.code) { + case BTN_LEFT: + hw->left = v; + break; + case BTN_RIGHT: + hw->right = v; + break; + case BTN_MIDDLE: + hw->middle = v; + break; + case BTN_FORWARD: + hw->up = v; + break; + case BTN_BACK: + hw->down = v; + break; + case BTN_0: + hw->multi[0] = v; + break; + case BTN_1: + hw->multi[1] = v; + break; + case BTN_2: + hw->multi[2] = v; + break; + case BTN_3: + hw->multi[3] = v; + break; + case BTN_4: + hw->multi[4] = v; + break; + case BTN_5: + hw->multi[5] = v; + break; + case BTN_6: + hw->multi[6] = v; + break; + case BTN_7: + hw->multi[7] = v; + break; + case BTN_TOOL_FINGER: + comm->oneFinger = v; + break; + case BTN_TOOL_DOUBLETAP: + comm->twoFingers = v; + break; + case BTN_TOOL_TRIPLETAP: + comm->threeFingers = v; + break; + case BTN_TOUCH: + if (!priv->has_pressure) + hw->z = v ? para->finger_high + 1 : 0; + break; + } + break; + case EV_ABS: + if (ev.code < ABS_MT_SLOT) { + switch (ev.code) { + case ABS_X: + hw->x = apply_st_scaling(proto_data, ev.value, 0); + break; + case ABS_Y: + hw->y = apply_st_scaling(proto_data, ev.value, 1); + break; + case ABS_PRESSURE: + hw->z = ev.value; + break; + case ABS_TOOL_WIDTH: + hw->fingerWidth = ev.value; + break; + } + } + else + EventProcessTouchEvent(pInfo, hw, &ev); + break; + } } return FALSE; } /* filter for the AutoDevProbe scandir on /dev/input */ -static int EventDevOnly(const struct dirent *dir) { - return strncmp(EVENT_DEV_NAME, dir->d_name, 5) == 0; +static int +EventDevOnly(const struct dirent *dir) +{ + return strncmp(EVENT_DEV_NAME, dir->d_name, 5) == 0; } #ifdef HAVE_MULTITOUCH static void event_query_touch(InputInfoPtr pInfo) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; SynapticsParameters *para = &priv->synpara; struct eventcomm_proto_data *proto_data = priv->proto_data; struct mtdev *mtdev; @@ -785,53 +779,46 @@ #ifdef EVIOCGPROP SYSCALL(rc = ioctl(pInfo->fd, EVIOCGPROP(sizeof(prop)), &prop)); - if (rc >= 0 && BitIsOn(&prop, INPUT_PROP_SEMI_MT)) - { + if (rc >= 0 && BitIsOn(&prop, INPUT_PROP_SEMI_MT)) { xf86IDrvMsg(pInfo, X_INFO, "ignoring touch events for semi-multitouch device\n"); priv->has_semi_mt = TRUE; } - if (rc >= 0 && BitIsOn(&prop, INPUT_PROP_BUTTONPAD)) - { + if (rc >= 0 && BitIsOn(&prop, INPUT_PROP_BUTTONPAD)) { xf86IDrvMsg(pInfo, X_INFO, "found clickpad property\n"); para->clickpad = TRUE; } #endif mtdev = mtdev_new_open(pInfo->fd); - if (!mtdev) - { + if (!mtdev) { xf86IDrvMsg(pInfo, X_WARNING, "failed to open mtdev when querying touch capabilities\n"); return; } - for (i = 0; i < MT_ABS_SIZE; i++) - { - if (mtdev->caps.has_abs[i]) - { - switch (i) - { + for (i = 0; i < MT_ABS_SIZE; i++) { + if (mtdev->caps.has_abs[i]) { + switch (i) { /* X and Y axis info is handed by synaptics already */ - case ABS_MT_POSITION_X - ABS_MT_TOUCH_MAJOR: - case ABS_MT_POSITION_Y - ABS_MT_TOUCH_MAJOR: + case ABS_MT_POSITION_X - ABS_MT_TOUCH_MAJOR: + case ABS_MT_POSITION_Y - ABS_MT_TOUCH_MAJOR: /* Skip tracking ID info */ - case ABS_MT_TRACKING_ID - ABS_MT_TOUCH_MAJOR: - break; - default: - priv->num_mt_axes++; - break; + case ABS_MT_TRACKING_ID - ABS_MT_TOUCH_MAJOR: + break; + default: + priv->num_mt_axes++; + break; } priv->has_touch = TRUE; } } - if (priv->has_touch) - { + if (priv->has_touch) { int axnum; - static const char *labels[] = - { + + static const char *labels[] = { AXIS_LABEL_PROP_ABS_MT_TOUCH_MAJOR, AXIS_LABEL_PROP_ABS_MT_TOUCH_MINOR, AXIS_LABEL_PROP_ABS_MT_WIDTH_MAJOR, @@ -847,56 +834,50 @@ if (mtdev->caps.slot.maximum > 0) priv->max_touches = mtdev->caps.slot.maximum - - mtdev->caps.slot.minimum + 1; + mtdev->caps.slot.minimum + 1; priv->touch_axes = malloc(priv->num_mt_axes * sizeof(SynapticsTouchAxisRec)); - if (!priv->touch_axes) - { + if (!priv->touch_axes) { priv->has_touch = FALSE; goto out; } axnum = 0; - for (i = 0; i < MT_ABS_SIZE; i++) - { - if (mtdev->caps.has_abs[i]) - { - switch (i) - { + for (i = 0; i < MT_ABS_SIZE; i++) { + if (mtdev->caps.has_abs[i]) { + switch (i) { /* X and Y axis info is handed by synaptics already, we just * need to map the evdev codes to the valuator numbers */ - case ABS_MT_POSITION_X - ABS_MT_TOUCH_MAJOR: - proto_data->axis_map[i] = 0; - break; - - case ABS_MT_POSITION_Y - ABS_MT_TOUCH_MAJOR: - proto_data->axis_map[i] = 1; - break; + case ABS_MT_POSITION_X - ABS_MT_TOUCH_MAJOR: + proto_data->axis_map[i] = 0; + break; + + case ABS_MT_POSITION_Y - ABS_MT_TOUCH_MAJOR: + proto_data->axis_map[i] = 1; + break; /* Skip tracking ID info */ - case ABS_MT_TRACKING_ID - ABS_MT_TOUCH_MAJOR: - break; + case ABS_MT_TRACKING_ID - ABS_MT_TOUCH_MAJOR: + break; - default: - priv->touch_axes[axnum].label = labels[i]; - priv->touch_axes[axnum].min = - mtdev->caps.abs[i].minimum; - priv->touch_axes[axnum].max = - mtdev->caps.abs[i].maximum; - /* Kernel provides units/mm, X wants units/m */ - priv->touch_axes[axnum].res = - mtdev->caps.abs[i].resolution * 1000; - /* Valuators 0-3 are used for X, Y, and scrolling */ - proto_data->axis_map[i] = 4 + axnum; - axnum++; - break; + default: + priv->touch_axes[axnum].label = labels[i]; + priv->touch_axes[axnum].min = mtdev->caps.abs[i].minimum; + priv->touch_axes[axnum].max = mtdev->caps.abs[i].maximum; + /* Kernel provides units/mm, X wants units/m */ + priv->touch_axes[axnum].res = + mtdev->caps.abs[i].resolution * 1000; + /* Valuators 0-3 are used for X, Y, and scrolling */ + proto_data->axis_map[i] = 4 + axnum; + axnum++; + break; } } } } -out: + out: mtdev_close(mtdev); } #endif @@ -907,8 +888,9 @@ static void EventReadDevDimensions(InputInfoPtr pInfo) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct eventcomm_proto_data *proto_data = priv->proto_data; + #ifdef HAVE_MULTITOUCH int i; #endif @@ -922,14 +904,15 @@ proto_data->cur_slot = -1; #endif - if (event_query_is_touchpad(pInfo->fd, (proto_data) ? proto_data->need_grab : TRUE)) - { + if (event_query_is_touchpad + (pInfo->fd, (proto_data) ? proto_data->need_grab : TRUE)) { #ifdef HAVE_MULTITOUCH event_query_touch(pInfo); #endif event_query_axis_ranges(pInfo); } - event_query_model(pInfo->fd, &priv->model, &priv->id_vendor, &priv->id_product); + event_query_model(pInfo->fd, &priv->model, &priv->id_vendor, + &priv->id_product); xf86IDrvMsg(pInfo, X_PROBED, "Vendor %#hx Product %#hx\n", priv->id_vendor, priv->id_product); @@ -945,59 +928,60 @@ struct dirent **namelist; if (device) { - int fd = -1; - SYSCALL(fd = open(device, O_RDONLY)); - if (fd >= 0) - { - touchpad_found = event_query_is_touchpad(fd, TRUE); + int fd = -1; + + SYSCALL(fd = open(device, O_RDONLY)); + if (fd >= 0) { + touchpad_found = event_query_is_touchpad(fd, TRUE); - SYSCALL(close(fd)); + SYSCALL(close(fd)); /* if a device is set and not a touchpad (or already grabbed), * we must return FALSE. Otherwise, we'll add a device that * wasn't requested for and repeat * f5687a6741a19ef3081e7fd83ac55f6df8bcd5c2. */ - return touchpad_found; - } + return touchpad_found; + } } i = scandir(DEV_INPUT_EVENT, &namelist, EventDevOnly, alphasort); if (i < 0) { - xf86IDrvMsg(pInfo, X_ERROR, "Couldn't open %s\n", DEV_INPUT_EVENT); - return FALSE; + xf86IDrvMsg(pInfo, X_ERROR, "Couldn't open %s\n", DEV_INPUT_EVENT); + return FALSE; } else if (i == 0) { - xf86IDrvMsg(pInfo, X_ERROR, "The /dev/input/event* device nodes seem to be missing\n"); - free(namelist); - return FALSE; + xf86IDrvMsg(pInfo, X_ERROR, + "The /dev/input/event* device nodes seem to be missing\n"); + free(namelist); + return FALSE; } while (i--) { - char fname[64]; - int fd = -1; + char fname[64]; + int fd = -1; - if (!touchpad_found) { - sprintf(fname, "%s/%s", DEV_INPUT_EVENT, namelist[i]->d_name); - SYSCALL(fd = open(fname, O_RDONLY)); - if (fd < 0) - continue; - - if (event_query_is_touchpad(fd, TRUE)) { - touchpad_found = TRUE; - xf86IDrvMsg(pInfo, X_PROBED, "auto-dev sets device to %s\n", - fname); - pInfo->options = - xf86ReplaceStrOption(pInfo->options, "Device", fname); - } - SYSCALL(close(fd)); - } - free(namelist[i]); + if (!touchpad_found) { + sprintf(fname, "%s/%s", DEV_INPUT_EVENT, namelist[i]->d_name); + SYSCALL(fd = open(fname, O_RDONLY)); + if (fd < 0) + continue; + + if (event_query_is_touchpad(fd, TRUE)) { + touchpad_found = TRUE; + xf86IDrvMsg(pInfo, X_PROBED, "auto-dev sets device to %s\n", + fname); + pInfo->options = + xf86ReplaceStrOption(pInfo->options, "Device", fname); + } + SYSCALL(close(fd)); + } + free(namelist[i]); } free(namelist); if (!touchpad_found) { - xf86IDrvMsg(pInfo, X_ERROR, "no synaptics event device found\n"); - return FALSE; + xf86IDrvMsg(pInfo, X_ERROR, "no synaptics event device found\n"); + return FALSE; } return TRUE; diff -Nru xserver-xorg-input-synaptics-1.6.0/src/eventcomm.h xserver-xorg-input-synaptics-1.6.2/src/eventcomm.h --- xserver-xorg-input-synaptics-1.6.0/src/eventcomm.h 2012-04-30 00:33:10.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/eventcomm.h 2012-06-12 01:23:34.000000000 +0000 @@ -38,11 +38,11 @@ struct eventcomm_proto_data; -extern struct eventcomm_proto_data * -EventProtoDataAlloc(void); +extern struct eventcomm_proto_data *EventProtoDataAlloc(void); extern Bool + EventReadHwState(InputInfoPtr pInfo, - struct CommData *comm, struct SynapticsHwState *hwRet); + struct CommData *comm, struct SynapticsHwState *hwRet); -#endif /* _EVENTCOMM_H_ */ +#endif /* _EVENTCOMM_H_ */ diff -Nru xserver-xorg-input-synaptics-1.6.0/src/properties.c xserver-xorg-input-synaptics-1.6.2/src/properties.c --- xserver-xorg-input-synaptics-1.6.0/src/properties.c 2012-04-30 00:33:10.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/properties.c 2012-06-12 01:23:34.000000000 +0000 @@ -53,49 +53,49 @@ static Atom float_type; -Atom prop_edges = 0; -Atom prop_finger = 0; -Atom prop_tap_time = 0; -Atom prop_tap_move = 0; -Atom prop_tap_durations = 0; -Atom prop_clickpad = 0; -Atom prop_tap_fast = 0; -Atom prop_middle_timeout = 0; -Atom prop_twofinger_pressure = 0; -Atom prop_twofinger_width = 0; -Atom prop_scrolldist = 0; -Atom prop_scrolledge = 0; -Atom prop_scrolltwofinger = 0; -Atom prop_speed = 0; -Atom prop_edgemotion_pressure = 0; -Atom prop_edgemotion_speed = 0; -Atom prop_edgemotion_always = 0; -Atom prop_buttonscroll = 0; -Atom prop_buttonscroll_repeat = 0; -Atom prop_buttonscroll_time = 0; -Atom prop_off = 0; -Atom prop_lockdrags = 0; -Atom prop_lockdrags_time = 0; -Atom prop_tapaction = 0; -Atom prop_clickaction = 0; -Atom prop_circscroll = 0; -Atom prop_circscroll_dist = 0; -Atom prop_circscroll_trigger = 0; -Atom prop_circpad = 0; -Atom prop_palm = 0; -Atom prop_palm_dim = 0; -Atom prop_coastspeed = 0; -Atom prop_pressuremotion = 0; +Atom prop_edges = 0; +Atom prop_finger = 0; +Atom prop_tap_time = 0; +Atom prop_tap_move = 0; +Atom prop_tap_durations = 0; +Atom prop_clickpad = 0; +Atom prop_tap_fast = 0; +Atom prop_middle_timeout = 0; +Atom prop_twofinger_pressure = 0; +Atom prop_twofinger_width = 0; +Atom prop_scrolldist = 0; +Atom prop_scrolledge = 0; +Atom prop_scrolltwofinger = 0; +Atom prop_speed = 0; +Atom prop_edgemotion_pressure = 0; +Atom prop_edgemotion_speed = 0; +Atom prop_edgemotion_always = 0; +Atom prop_buttonscroll = 0; +Atom prop_buttonscroll_repeat = 0; +Atom prop_buttonscroll_time = 0; +Atom prop_off = 0; +Atom prop_lockdrags = 0; +Atom prop_lockdrags_time = 0; +Atom prop_tapaction = 0; +Atom prop_clickaction = 0; +Atom prop_circscroll = 0; +Atom prop_circscroll_dist = 0; +Atom prop_circscroll_trigger = 0; +Atom prop_circpad = 0; +Atom prop_palm = 0; +Atom prop_palm_dim = 0; +Atom prop_coastspeed = 0; +Atom prop_pressuremotion = 0; Atom prop_pressuremotion_factor = 0; -Atom prop_grab = 0; -Atom prop_gestures = 0; -Atom prop_capabilities = 0; -Atom prop_resolution = 0; -Atom prop_area = 0; -Atom prop_softbutton_areas = 0; -Atom prop_noise_cancellation = 0; -Atom prop_product_id = 0; -Atom prop_device_node = 0; +Atom prop_grab = 0; +Atom prop_gestures = 0; +Atom prop_capabilities = 0; +Atom prop_resolution = 0; +Atom prop_area = 0; +Atom prop_softbutton_areas = 0; +Atom prop_noise_cancellation = 0; +Atom prop_product_id = 0; +Atom prop_device_node = 0; static Atom InitTypedAtom(DeviceIntPtr dev, char *name, Atom type, int format, int nvalues, @@ -103,27 +103,35 @@ { int i; Atom atom; - uint8_t val_8[9]; /* we never have more than 9 values in an atom */ + uint8_t val_8[9]; /* we never have more than 9 values in an atom */ uint16_t val_16[9]; uint32_t val_32[9]; pointer converted; - - for (i = 0; i < nvalues; i++) - { - switch(format) - { - case 8: val_8[i] = values[i]; break; - case 16: val_16[i] = values[i]; break; - case 32: val_32[i] = values[i]; break; + for (i = 0; i < nvalues; i++) { + switch (format) { + case 8: + val_8[i] = values[i]; + break; + case 16: + val_16[i] = values[i]; + break; + case 32: + val_32[i] = values[i]; + break; } } - switch(format) - { - case 8: converted = val_8; break; - case 16: converted = val_16; break; - case 32: converted = val_32; break; + switch (format) { + case 8: + converted = val_8; + break; + case 16: + converted = val_16; + break; + case 32: + converted = val_32; + break; } atom = MakeAtom(name, strlen(name), TRUE); @@ -166,7 +174,8 @@ values[5] = para->softbutton_areas[1][1]; values[6] = para->softbutton_areas[1][2]; values[7] = para->softbutton_areas[1][3]; - prop_softbutton_areas = InitAtom(pInfo->dev, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 8, values); + prop_softbutton_areas = + InitAtom(pInfo->dev, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 8, values); } void @@ -174,15 +183,13 @@ { SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; SynapticsParameters *para = &priv->synpara; - int values[9]; /* we never have more than 9 values in an atom */ - float fvalues[4]; /* never have more than 4 float values */ + int values[9]; /* we never have more than 9 values in an atom */ + float fvalues[4]; /* never have more than 4 float values */ float_type = XIGetKnownProperty(XATOM_FLOAT); - if (!float_type) - { + if (!float_type) { float_type = MakeAtom(XATOM_FLOAT, strlen(XATOM_FLOAT), TRUE); - if (!float_type) - { + if (!float_type) { xf86IDrvMsg(pInfo, X_ERROR, "Failed to init float atom. " "Disabling property support.\n"); return; @@ -201,35 +208,45 @@ values[2] = para->finger_press; prop_finger = InitAtom(pInfo->dev, SYNAPTICS_PROP_FINGER, 32, 3, values); - prop_tap_time = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_TIME, 32, 1, ¶->tap_time); - prop_tap_move = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_MOVE, 32, 1, ¶->tap_move); + prop_tap_time = + InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_TIME, 32, 1, ¶->tap_time); + prop_tap_move = + InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_MOVE, 32, 1, ¶->tap_move); values[0] = para->single_tap_timeout; values[1] = para->tap_time_2; values[2] = para->click_time; - prop_tap_durations = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_DURATIONS, 32, 3, values); - prop_clickpad = InitAtom(pInfo->dev, SYNAPTICS_PROP_CLICKPAD, 8, 1, - ¶->clickpad); - prop_tap_fast = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_FAST, 8, 1, ¶->fast_taps); - prop_middle_timeout = InitAtom(pInfo->dev, SYNAPTICS_PROP_MIDDLE_TIMEOUT, - 32, 1, ¶->emulate_mid_button_time); - prop_twofinger_pressure = InitAtom(pInfo->dev, SYNAPTICS_PROP_TWOFINGER_PRESSURE, - 32, 1, ¶->emulate_twofinger_z); - prop_twofinger_width = InitAtom(pInfo->dev, SYNAPTICS_PROP_TWOFINGER_WIDTH, - 32, 1, ¶->emulate_twofinger_w); + prop_tap_durations = + InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_DURATIONS, 32, 3, values); + prop_clickpad = + InitAtom(pInfo->dev, SYNAPTICS_PROP_CLICKPAD, 8, 1, ¶->clickpad); + prop_tap_fast = + InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_FAST, 8, 1, ¶->fast_taps); + prop_middle_timeout = + InitAtom(pInfo->dev, SYNAPTICS_PROP_MIDDLE_TIMEOUT, 32, 1, + ¶->emulate_mid_button_time); + prop_twofinger_pressure = + InitAtom(pInfo->dev, SYNAPTICS_PROP_TWOFINGER_PRESSURE, 32, 1, + ¶->emulate_twofinger_z); + prop_twofinger_width = + InitAtom(pInfo->dev, SYNAPTICS_PROP_TWOFINGER_WIDTH, 32, 1, + ¶->emulate_twofinger_w); values[0] = para->scroll_dist_vert; values[1] = para->scroll_dist_horiz; - prop_scrolldist = InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_DISTANCE, 32, 2, values); + prop_scrolldist = + InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_DISTANCE, 32, 2, values); values[0] = para->scroll_edge_vert; values[1] = para->scroll_edge_horiz; values[2] = para->scroll_edge_corner; - prop_scrolledge = InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_EDGE,8, 3, values); + prop_scrolledge = + InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_EDGE, 8, 3, values); values[0] = para->scroll_twofinger_vert; values[1] = para->scroll_twofinger_horiz; - prop_scrolltwofinger = InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_TWOFINGER,8, 2, values); + prop_scrolltwofinger = + InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_TWOFINGER, 8, 2, values); fvalues[0] = para->min_speed; fvalues[1] = para->max_speed; @@ -239,63 +256,96 @@ values[0] = para->edge_motion_min_z; values[1] = para->edge_motion_max_z; - prop_edgemotion_pressure = InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION_PRESSURE, 32, 2, values); + prop_edgemotion_pressure = + InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION_PRESSURE, 32, 2, values); values[0] = para->edge_motion_min_speed; values[1] = para->edge_motion_max_speed; - prop_edgemotion_speed = InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION_SPEED, 32, 2, values); - prop_edgemotion_always = InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION, 8, 1, ¶->edge_motion_use_always); + prop_edgemotion_speed = + InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION_SPEED, 32, 2, values); + prop_edgemotion_always = + InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION, 8, 1, + ¶->edge_motion_use_always); - if (priv->has_scrollbuttons) - { + if (priv->has_scrollbuttons) { values[0] = para->updown_button_scrolling; values[1] = para->leftright_button_scrolling; - prop_buttonscroll = InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING, 8, 2, values); + prop_buttonscroll = + InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING, 8, 2, values); values[0] = para->updown_button_repeat; values[1] = para->leftright_button_repeat; - prop_buttonscroll_repeat = InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING_REPEAT, 8, 2, values); - prop_buttonscroll_time = InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING_TIME, 32, 1, ¶->scroll_button_repeat); + prop_buttonscroll_repeat = + InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING_REPEAT, 8, 2, + values); + prop_buttonscroll_time = + InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING_TIME, 32, 1, + ¶->scroll_button_repeat); } - prop_off = InitAtom(pInfo->dev, SYNAPTICS_PROP_OFF, 8, 1, ¶->touchpad_off); - prop_lockdrags = InitAtom(pInfo->dev, SYNAPTICS_PROP_LOCKED_DRAGS, 8, 1, ¶->locked_drags); - prop_lockdrags_time = InitAtom(pInfo->dev, SYNAPTICS_PROP_LOCKED_DRAGS_TIMEOUT, 32, 1, ¶->locked_drag_time); + prop_off = + InitAtom(pInfo->dev, SYNAPTICS_PROP_OFF, 8, 1, ¶->touchpad_off); + prop_lockdrags = + InitAtom(pInfo->dev, SYNAPTICS_PROP_LOCKED_DRAGS, 8, 1, + ¶->locked_drags); + prop_lockdrags_time = + InitAtom(pInfo->dev, SYNAPTICS_PROP_LOCKED_DRAGS_TIMEOUT, 32, 1, + ¶->locked_drag_time); memcpy(values, para->tap_action, MAX_TAP * sizeof(int)); - prop_tapaction = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_ACTION, 8, MAX_TAP, values); + prop_tapaction = + InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_ACTION, 8, MAX_TAP, values); memcpy(values, para->click_action, MAX_CLICK * sizeof(int)); - prop_clickaction = InitAtom(pInfo->dev, SYNAPTICS_PROP_CLICK_ACTION, 8, MAX_CLICK, values); + prop_clickaction = + InitAtom(pInfo->dev, SYNAPTICS_PROP_CLICK_ACTION, 8, MAX_CLICK, values); - prop_circscroll = InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING, 8, 1, ¶->circular_scrolling); + prop_circscroll = + InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING, 8, 1, + ¶->circular_scrolling); fvalues[0] = para->scroll_dist_circ; - prop_circscroll_dist = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_DIST, 1, fvalues); - - prop_circscroll_trigger = InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_TRIGGER, 8, 1, ¶->circular_trigger); - prop_circpad = InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_PAD, 8, 1, ¶->circular_pad); - prop_palm = InitAtom(pInfo->dev, SYNAPTICS_PROP_PALM_DETECT, 8, 1, ¶->palm_detect); + prop_circscroll_dist = + InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_DIST, 1, + fvalues); + + prop_circscroll_trigger = + InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_TRIGGER, 8, 1, + ¶->circular_trigger); + prop_circpad = + InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_PAD, 8, 1, + ¶->circular_pad); + prop_palm = + InitAtom(pInfo->dev, SYNAPTICS_PROP_PALM_DETECT, 8, 1, + ¶->palm_detect); values[0] = para->palm_min_width; values[1] = para->palm_min_z; - prop_palm_dim = InitAtom(pInfo->dev, SYNAPTICS_PROP_PALM_DIMENSIONS, 32, 2, values); + prop_palm_dim = + InitAtom(pInfo->dev, SYNAPTICS_PROP_PALM_DIMENSIONS, 32, 2, values); fvalues[0] = para->coasting_speed; fvalues[1] = para->coasting_friction; - prop_coastspeed = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_COASTING_SPEED, 2, fvalues); + prop_coastspeed = + InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_COASTING_SPEED, 2, fvalues); values[0] = para->press_motion_min_z; values[1] = para->press_motion_max_z; - prop_pressuremotion = InitTypedAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION, XA_CARDINAL, 32, 2, values); + prop_pressuremotion = + InitTypedAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION, XA_CARDINAL, + 32, 2, values); fvalues[0] = para->press_motion_min_factor; fvalues[1] = para->press_motion_max_factor; - prop_pressuremotion_factor = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 2, fvalues); - - prop_grab = InitAtom(pInfo->dev, SYNAPTICS_PROP_GRAB, 8, 1, ¶->grab_event_device); + prop_pressuremotion_factor = + InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 2, + fvalues); + + prop_grab = + InitAtom(pInfo->dev, SYNAPTICS_PROP_GRAB, 8, 1, + ¶->grab_event_device); values[0] = para->tap_and_drag_gesture; prop_gestures = InitAtom(pInfo->dev, SYNAPTICS_PROP_GESTURES, 8, 1, values); @@ -307,11 +357,13 @@ values[4] = priv->has_triple; values[5] = priv->has_pressure; values[6] = priv->has_width; - prop_capabilities = InitAtom(pInfo->dev, SYNAPTICS_PROP_CAPABILITIES, 8, 7, values); + prop_capabilities = + InitAtom(pInfo->dev, SYNAPTICS_PROP_CAPABILITIES, 8, 7, values); values[0] = para->resolution_vert; values[1] = para->resolution_horiz; - prop_resolution = InitAtom(pInfo->dev, SYNAPTICS_PROP_RESOLUTION, 32, 2, values); + prop_resolution = + InitAtom(pInfo->dev, SYNAPTICS_PROP_RESOLUTION, 32, 2, values); values[0] = para->area_left_edge; values[1] = para->area_right_edge; @@ -325,19 +377,20 @@ values[0] = para->hyst_x; values[1] = para->hyst_y; prop_noise_cancellation = InitAtom(pInfo->dev, - SYNAPTICS_PROP_NOISE_CANCELLATION, 32, 2, values); + SYNAPTICS_PROP_NOISE_CANCELLATION, 32, 2, + values); /* only init product_id property if we actually know them */ - if (priv->id_vendor || priv->id_product) - { + if (priv->id_vendor || priv->id_product) { values[0] = priv->id_vendor; values[1] = priv->id_product; - prop_product_id = InitAtom(pInfo->dev, XI_PROP_PRODUCT_ID, 32, 2, values); + prop_product_id = + InitAtom(pInfo->dev, XI_PROP_PRODUCT_ID, 32, 2, values); } - if (priv->device) - { - prop_device_node = MakeAtom(XI_PROP_DEVICE_NODE, strlen(XI_PROP_DEVICE_NODE), TRUE); + if (priv->device) { + prop_device_node = + MakeAtom(XI_PROP_DEVICE_NODE, strlen(XI_PROP_DEVICE_NODE), TRUE); XIChangeDeviceProperty(pInfo->dev, prop_device_node, XA_STRING, 8, PropModeReplace, strlen(priv->device), (pointer) priv->device, FALSE); @@ -357,200 +410,204 @@ /* If checkonly is set, no parameters may be changed. So just let the code * change temporary variables and forget about it. */ - if (checkonly) - { + if (checkonly) { tmp = *para; para = &tmp; } - if (property == prop_edges) - { + if (property == prop_edges) { INT32 *edges; + if (prop->size != 4 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - edges = (INT32*)prop->data; + edges = (INT32 *) prop->data; if (edges[0] > edges[1] || edges[2] > edges[3]) return BadValue; - para->left_edge = edges[0]; - para->right_edge = edges[1]; - para->top_edge = edges[2]; + para->left_edge = edges[0]; + para->right_edge = edges[1]; + para->top_edge = edges[2]; para->bottom_edge = edges[3]; - } else if (property == prop_finger) - { + } + else if (property == prop_finger) { INT32 *finger; + if (prop->size != 3 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - finger = (INT32*)prop->data; + finger = (INT32 *) prop->data; if (finger[0] > finger[1]) return BadValue; - para->finger_low = finger[0]; - para->finger_high = finger[1]; + para->finger_low = finger[0]; + para->finger_high = finger[1]; para->finger_press = finger[2]; - } else if (property == prop_tap_time) - { + } + else if (property == prop_tap_time) { if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - para->tap_time = *(INT32*)prop->data; + para->tap_time = *(INT32 *) prop->data; - } else if (property == prop_tap_move) - { + } + else if (property == prop_tap_move) { if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - para->tap_move = *(INT32*)prop->data; - } else if (property == prop_tap_durations) - { + para->tap_move = *(INT32 *) prop->data; + } + else if (property == prop_tap_durations) { INT32 *timeouts; if (prop->size != 3 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - timeouts = (INT32*)prop->data; + timeouts = (INT32 *) prop->data; para->single_tap_timeout = timeouts[0]; - para->tap_time_2 = timeouts[1]; - para->click_time = timeouts[2]; - } else if (property == prop_clickpad) { + para->tap_time_2 = timeouts[1]; + para->click_time = timeouts[2]; + } + else if (property == prop_clickpad) { BOOL value; if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - value = *(BOOL*)prop->data; + value = *(BOOL *) prop->data; if (!para->clickpad && value && !prop_softbutton_areas) InitSoftButtonProperty(pInfo); - else if (para->clickpad && !value && prop_softbutton_areas) - { + else if (para->clickpad && !value && prop_softbutton_areas) { XIDeleteDeviceProperty(dev, prop_softbutton_areas, FALSE); prop_softbutton_areas = 0; } - para->clickpad = *(BOOL*)prop->data; - } else if (property == prop_tap_fast) - { + para->clickpad = *(BOOL *) prop->data; + } + else if (property == prop_tap_fast) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - para->fast_taps = *(BOOL*)prop->data; + para->fast_taps = *(BOOL *) prop->data; - } else if (property == prop_middle_timeout) - { + } + else if (property == prop_middle_timeout) { if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - para->emulate_mid_button_time = *(INT32*)prop->data; - } else if (property == prop_twofinger_pressure) - { + para->emulate_mid_button_time = *(INT32 *) prop->data; + } + else if (property == prop_twofinger_pressure) { if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - para->emulate_twofinger_z = *(INT32*)prop->data; - } else if (property == prop_twofinger_width) - { + para->emulate_twofinger_z = *(INT32 *) prop->data; + } + else if (property == prop_twofinger_width) { if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - para->emulate_twofinger_w = *(INT32*)prop->data; - } else if (property == prop_scrolldist) - { + para->emulate_twofinger_w = *(INT32 *) prop->data; + } + else if (property == prop_scrolldist) { INT32 *dist; + if (prop->size != 2 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - dist = (INT32*)prop->data; - if (para->scroll_dist_vert != dist[0]) - { + dist = (INT32 *) prop->data; + if (dist[0] == 0 || dist[1] == 0) + return BadValue; + + if (para->scroll_dist_vert != dist[0]) { para->scroll_dist_vert = dist[0]; #ifdef HAVE_SMOOTH_SCROLL SetScrollValuator(dev, priv->scroll_axis_vert, SCROLL_TYPE_VERTICAL, para->scroll_dist_vert, 0); #endif } - if (para->scroll_dist_horiz != dist[1]) - { + if (para->scroll_dist_horiz != dist[1]) { para->scroll_dist_horiz = dist[1]; #ifdef HAVE_SMOOTH_SCROLL - SetScrollValuator(dev, priv->scroll_axis_horiz, SCROLL_TYPE_HORIZONTAL, - para->scroll_dist_horiz, 0); + SetScrollValuator(dev, priv->scroll_axis_horiz, + SCROLL_TYPE_HORIZONTAL, para->scroll_dist_horiz, + 0); #endif } - } else if (property == prop_scrolledge) - { + } + else if (property == prop_scrolledge) { CARD8 *edge; + if (prop->size != 3 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - edge = (BOOL*)prop->data; - para->scroll_edge_vert = edge[0]; - para->scroll_edge_horiz = edge[1]; + edge = (BOOL *) prop->data; + para->scroll_edge_vert = edge[0]; + para->scroll_edge_horiz = edge[1]; para->scroll_edge_corner = edge[2]; - } else if (property == prop_scrolltwofinger) - { + } + else if (property == prop_scrolltwofinger) { CARD8 *twofinger; if (prop->size != 2 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - twofinger = (BOOL*)prop->data; - para->scroll_twofinger_vert = twofinger[0]; + twofinger = (BOOL *) prop->data; + para->scroll_twofinger_vert = twofinger[0]; para->scroll_twofinger_horiz = twofinger[1]; - } else if (property == prop_speed) - { + } + else if (property == prop_speed) { float *speed; if (prop->size != 4 || prop->format != 32 || prop->type != float_type) return BadMatch; - speed = (float*)prop->data; + speed = (float *) prop->data; para->min_speed = speed[0]; para->max_speed = speed[1]; para->accl = speed[2]; para->trackstick_speed = speed[3]; - } else if (property == prop_edgemotion_pressure) - { + } + else if (property == prop_edgemotion_pressure) { CARD32 *pressure; if (prop->size != 2 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - pressure = (CARD32*)prop->data; + pressure = (CARD32 *) prop->data; if (pressure[0] > pressure[1]) return BadValue; para->edge_motion_min_z = pressure[0]; para->edge_motion_max_z = pressure[1]; - } else if (property == prop_edgemotion_speed) - { + } + else if (property == prop_edgemotion_speed) { CARD32 *speed; if (prop->size != 2 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - speed = (CARD32*)prop->data; + speed = (CARD32 *) prop->data; if (speed[0] > speed[1]) return BadValue; para->edge_motion_min_speed = speed[0]; para->edge_motion_max_speed = speed[1]; - } else if (property == prop_edgemotion_always) - { + } + else if (property == prop_edgemotion_always) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - para->edge_motion_use_always = *(BOOL*)prop->data; + para->edge_motion_use_always = *(BOOL *) prop->data; - } else if (property == prop_buttonscroll) - { + } + else if (property == prop_buttonscroll) { BOOL *scroll; if (!priv->has_scrollbuttons) @@ -559,12 +616,12 @@ if (prop->size != 2 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - scroll = (BOOL*)prop->data; - para->updown_button_scrolling = scroll[0]; + scroll = (BOOL *) prop->data; + para->updown_button_scrolling = scroll[0]; para->leftright_button_scrolling = scroll[1]; - } else if (property == prop_buttonscroll_repeat) - { + } + else if (property == prop_buttonscroll_repeat) { BOOL *repeat; if (!priv->has_scrollbuttons) @@ -573,203 +630,215 @@ if (prop->size != 2 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - repeat = (BOOL*)prop->data; - para->updown_button_repeat = repeat[0]; + repeat = (BOOL *) prop->data; + para->updown_button_repeat = repeat[0]; para->leftright_button_repeat = repeat[1]; - } else if (property == prop_buttonscroll_time) - { + } + else if (property == prop_buttonscroll_time) { if (!priv->has_scrollbuttons) return BadMatch; if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - para->scroll_button_repeat = *(INT32*)prop->data; + para->scroll_button_repeat = *(INT32 *) prop->data; - } else if (property == prop_off) - { + } + else if (property == prop_off) { CARD8 off; + if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - off = *(CARD8*)prop->data; + off = *(CARD8 *) prop->data; if (off > 2) return BadValue; para->touchpad_off = off; - } else if (property == prop_gestures) - { + } + else if (property == prop_gestures) { BOOL *gestures; if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - gestures = (BOOL*)prop->data; + gestures = (BOOL *) prop->data; para->tap_and_drag_gesture = gestures[0]; - } else if (property == prop_lockdrags) - { + } + else if (property == prop_lockdrags) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - para->locked_drags = *(BOOL*)prop->data; - } else if (property == prop_lockdrags_time) - { + para->locked_drags = *(BOOL *) prop->data; + } + else if (property == prop_lockdrags_time) { if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - para->locked_drag_time = *(INT32*)prop->data; - } else if (property == prop_tapaction) - { + para->locked_drag_time = *(INT32 *) prop->data; + } + else if (property == prop_tapaction) { int i; CARD8 *action; - if (prop->size > MAX_TAP || prop->format != 8 || prop->type != XA_INTEGER) + if (prop->size > MAX_TAP || prop->format != 8 || + prop->type != XA_INTEGER) return BadMatch; - action = (CARD8*)prop->data; + action = (CARD8 *) prop->data; for (i = 0; i < MAX_TAP; i++) para->tap_action[i] = action[i]; - } else if (property == prop_clickaction) - { + } + else if (property == prop_clickaction) { int i; CARD8 *action; - if (prop->size > MAX_CLICK || prop->format != 8 || prop->type != XA_INTEGER) + if (prop->size > MAX_CLICK || prop->format != 8 || + prop->type != XA_INTEGER) return BadMatch; - action = (CARD8*)prop->data; + action = (CARD8 *) prop->data; for (i = 0; i < MAX_CLICK; i++) para->click_action[i] = action[i]; - } else if (property == prop_circscroll) - { + } + else if (property == prop_circscroll) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - para->circular_scrolling = *(BOOL*)prop->data; + para->circular_scrolling = *(BOOL *) prop->data; - } else if (property == prop_circscroll_dist) - { + } + else if (property == prop_circscroll_dist) { float circdist; if (prop->size != 1 || prop->format != 32 || prop->type != float_type) return BadMatch; - circdist = *(float*)prop->data; + circdist = *(float *) prop->data; + if (circdist == 0) + return BadValue; + para->scroll_dist_circ = circdist; - } else if (property == prop_circscroll_trigger) - { + } + else if (property == prop_circscroll_trigger) { int trigger; + if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - trigger = *(CARD8*)prop->data; + trigger = *(CARD8 *) prop->data; if (trigger > 8) return BadValue; para->circular_trigger = trigger; - } else if (property == prop_circpad) - { + } + else if (property == prop_circpad) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - para->circular_pad = *(BOOL*)prop->data; - } else if (property == prop_palm) - { + para->circular_pad = *(BOOL *) prop->data; + } + else if (property == prop_palm) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - para->palm_detect = *(BOOL*)prop->data; - } else if (property == prop_palm_dim) - { + para->palm_detect = *(BOOL *) prop->data; + } + else if (property == prop_palm_dim) { INT32 *dim; if (prop->size != 2 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - dim = (INT32*)prop->data; + dim = (INT32 *) prop->data; para->palm_min_width = dim[0]; - para->palm_min_z = dim[1]; - } else if (property == prop_coastspeed) - { + para->palm_min_z = dim[1]; + } + else if (property == prop_coastspeed) { float *coast_speeds; if (prop->size != 2 || prop->format != 32 || prop->type != float_type) return BadMatch; - coast_speeds = (float*)prop->data; + coast_speeds = (float *) prop->data; para->coasting_speed = coast_speeds[0]; para->coasting_friction = coast_speeds[1]; - } else if (property == prop_pressuremotion) - { + } + else if (property == prop_pressuremotion) { CARD32 *press; + if (prop->size != 2 || prop->format != 32 || prop->type != XA_CARDINAL) return BadMatch; - press = (CARD32*)prop->data; + press = (CARD32 *) prop->data; if (press[0] > press[1]) return BadValue; para->press_motion_min_z = press[0]; para->press_motion_max_z = press[1]; - } else if (property == prop_grab) - { + } + else if (property == prop_grab) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) return BadMatch; - para->grab_event_device = *(BOOL*)prop->data; - } else if (property == prop_capabilities) - { + para->grab_event_device = *(BOOL *) prop->data; + } + else if (property == prop_capabilities) { /* read-only */ return BadValue; - } else if (property == prop_resolution) - { + } + else if (property == prop_resolution) { /* read-only */ return BadValue; - } else if (property == prop_area) - { + } + else if (property == prop_area) { INT32 *area; + if (prop->size != 4 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - area = (INT32*)prop->data; - if ((((area[0] != 0) && (area[1] != 0)) && (area[0] > area[1]) ) || (((area[2] != 0) && (area[3] != 0)) && (area[2] > area[3]))) + area = (INT32 *) prop->data; + if ((((area[0] != 0) && (area[1] != 0)) && (area[0] > area[1])) || + (((area[2] != 0) && (area[3] != 0)) && (area[2] > area[3]))) return BadValue; - para->area_left_edge = area[0]; - para->area_right_edge = area[1]; - para->area_top_edge = area[2]; + para->area_left_edge = area[0]; + para->area_right_edge = area[1]; + para->area_top_edge = area[2]; para->area_bottom_edge = area[3]; - } else if (property == prop_softbutton_areas) - { + } + else if (property == prop_softbutton_areas) { int *areas; if (prop->size != 8 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - areas = (int*)prop->data; + areas = (int *) prop->data; if (!SynapticsIsSoftButtonAreasValid(areas)) return BadValue; memcpy(para->softbutton_areas[0], areas, 4 * sizeof(int)); memcpy(para->softbutton_areas[1], areas + 4, 4 * sizeof(int)); - } else if (property == prop_noise_cancellation) { + } + else if (property == prop_noise_cancellation) { INT32 *hyst; + if (prop->size != 2 || prop->format != 32 || prop->type != XA_INTEGER) return BadMatch; - hyst = (INT32*)prop->data; + hyst = (INT32 *) prop->data; if (hyst[0] < 0 || hyst[1] < 0) return BadValue; para->hyst_x = hyst[0]; para->hyst_y = hyst[1]; - } else if (property == prop_product_id || property == prop_device_node) - return BadValue; /* read-only */ + } + else if (property == prop_product_id || property == prop_device_node) + return BadValue; /* read-only */ return Success; } - diff -Nru xserver-xorg-input-synaptics-1.6.0/src/ps2comm.c xserver-xorg-input-synaptics-1.6.2/src/ps2comm.c --- xserver-xorg-input-synaptics-1.6.0/src/ps2comm.c 2012-04-30 00:33:10.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/ps2comm.c 2012-06-12 01:23:34.000000000 +0000 @@ -43,7 +43,7 @@ #include "ps2comm.h" #include -#define MAX_UNSYNC_PACKETS 10 /* i.e. 10 to 60 bytes */ +#define MAX_UNSYNC_PACKETS 10 /* i.e. 10 to 60 bytes */ /* * The x/y limits are taken from the Synaptics TouchPad interfacing Guide, * section 2.3.2, which says that they should be valid regardless of the @@ -91,15 +91,15 @@ * Read a byte from the ps/2 port */ static Bool -ps2_getbyte(int fd, byte *b) +ps2_getbyte(int fd, byte * b) { if (xf86WaitForInput(fd, 50000) > 0) { - if (xf86ReadSerial(fd, b, 1) != 1) { - PS2DBG(ErrorF("ps2_getbyte: No byte read\n")); - return FALSE; - } - PS2DBG(ErrorF("ps2_getbyte: byte %02X read\n", *b)); - return TRUE; + if (xf86ReadSerial(fd, b, 1) != 1) { + PS2DBG(ErrorF("ps2_getbyte: No byte read\n")); + return FALSE; + } + PS2DBG(ErrorF("ps2_getbyte: byte %02X read\n", *b)); + return TRUE; } PS2DBG(ErrorF("ps2_getbyte: timeout xf86WaitForInput\n")); return FALSE; @@ -114,17 +114,17 @@ byte ack; if (xf86WriteSerial(fd, &b, 1) != 1) { - PS2DBG(ErrorF("ps2_putbyte: error xf86WriteSerial\n")); - return FALSE; + PS2DBG(ErrorF("ps2_putbyte: error xf86WriteSerial\n")); + return FALSE; } PS2DBG(ErrorF("ps2_putbyte: byte %02X send\n", b)); /* wait for an ACK */ if (!ps2_getbyte(fd, &ack)) { - return FALSE; + return FALSE; } if (ack != PS2_ACK) { - PS2DBG(ErrorF("ps2_putbyte: wrong acknowledge 0x%02x\n", ack)); - return FALSE; + PS2DBG(ErrorF("ps2_putbyte: wrong acknowledge 0x%02x\n", ack)); + return FALSE; } return TRUE; } @@ -142,14 +142,14 @@ /* initialize with 'inert' command */ if (!ps2_putbyte(fd, PS2_CMD_SET_SCALING_1_1)) - return FALSE; + return FALSE; /* send 4x 2-bits with set resolution command */ for (i = 0; i < 4; i++) { - if (!ps2_putbyte(fd, PS2_CMD_SET_RESOLUTION) || - !ps2_putbyte(fd, (cmd >> 6) & 0x3)) - return FALSE; - cmd <<= 2; + if (!ps2_putbyte(fd, PS2_CMD_SET_RESOLUTION) || + !ps2_putbyte(fd, (cmd >> 6) & 0x3)) + return FALSE; + cmd <<= 2; } return TRUE; } @@ -161,8 +161,7 @@ ps2_send_cmd(int fd, byte c) { PS2DBG(ErrorF("send command: 0x%02X\n", c)); - return (ps2_special_cmd(fd, c) && - ps2_putbyte(fd, PS2_CMD_STATUS_REQUEST)); + return (ps2_special_cmd(fd, c) && ps2_putbyte(fd, PS2_CMD_STATUS_REQUEST)); } /***************************************************************************** @@ -177,8 +176,7 @@ { PS2DBG(ErrorF("set mode byte to: 0x%02X\n", mode)); return (ps2_special_cmd(fd, mode) && - ps2_putbyte(fd, PS2_CMD_SET_SAMPLE_RATE) && - ps2_putbyte(fd, 0x14)); + ps2_putbyte(fd, PS2_CMD_SET_SAMPLE_RATE) && ps2_putbyte(fd, 0x14)); } /* @@ -192,18 +190,20 @@ xf86FlushInput(fd); PS2DBG(ErrorF("Reset the Touchpad...\n")); if (!ps2_putbyte(fd, PS2_CMD_RESET)) { - PS2DBG(ErrorF("...failed\n")); - return FALSE; + PS2DBG(ErrorF("...failed\n")); + return FALSE; } xf86WaitForInput(fd, 4000000); if (ps2_getbyte(fd, &r[0]) && ps2_getbyte(fd, &r[1])) { - if (r[0] == 0xAA && r[1] == 0x00) { - PS2DBG(ErrorF("...done\n")); - return TRUE; - } else { - PS2DBG(ErrorF("...failed. Wrong reset ack 0x%02x, 0x%02x\n", r[0], r[1])); - return FALSE; - } + if (r[0] == 0xAA && r[1] == 0x00) { + PS2DBG(ErrorF("...done\n")); + return TRUE; + } + else { + PS2DBG(ErrorF + ("...failed. Wrong reset ack 0x%02x, 0x%02x\n", r[0], r[1])); + return FALSE; + } } PS2DBG(ErrorF("...failed\n")); return FALSE; @@ -222,13 +222,12 @@ synhw->model_id = 0; if (ps2_send_cmd(fd, SYN_QUE_MODEL) && - ps2_getbyte(fd, &mi[0]) && - ps2_getbyte(fd, &mi[1]) && - ps2_getbyte(fd, &mi[2])) { - synhw->model_id = (mi[0] << 16) | (mi[1] << 8) | mi[2]; - PS2DBG(ErrorF("model-id %06X\n", synhw->model_id)); - PS2DBG(ErrorF("...done.\n")); - return TRUE; + ps2_getbyte(fd, &mi[0]) && + ps2_getbyte(fd, &mi[1]) && ps2_getbyte(fd, &mi[2])) { + synhw->model_id = (mi[0] << 16) | (mi[1] << 8) | mi[2]; + PS2DBG(ErrorF("model-id %06X\n", synhw->model_id)); + PS2DBG(ErrorF("...done.\n")); + return TRUE; } PS2DBG(ErrorF("...failed.\n")); return FALSE; @@ -248,27 +247,27 @@ synhw->capabilities = 0; synhw->ext_cap = 0; if (ps2_send_cmd(fd, SYN_QUE_CAPABILITIES) && - ps2_getbyte(fd, &cap[0]) && - ps2_getbyte(fd, &cap[1]) && - ps2_getbyte(fd, &cap[2])) { - synhw->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2]; - PS2DBG(ErrorF("capabilities %06X\n", synhw->capabilities)); - if (SYN_CAP_VALID(synhw)) { - if (SYN_EXT_CAP_REQUESTS(synhw)) { - if (ps2_send_cmd(fd, SYN_QUE_EXT_CAPAB) && - ps2_getbyte(fd, &cap[0]) && - ps2_getbyte(fd, &cap[1]) && - ps2_getbyte(fd, &cap[2])) { - synhw->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2]; - PS2DBG(ErrorF("ext-capability %06X\n", synhw->ext_cap)); - } else { - PS2DBG(ErrorF("synaptics says, that it has extended-capabilities, " - "but I cannot read them.")); - } - } - PS2DBG(ErrorF("...done.\n")); - return TRUE; - } + ps2_getbyte(fd, &cap[0]) && + ps2_getbyte(fd, &cap[1]) && ps2_getbyte(fd, &cap[2])) { + synhw->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2]; + PS2DBG(ErrorF("capabilities %06X\n", synhw->capabilities)); + if (SYN_CAP_VALID(synhw)) { + if (SYN_EXT_CAP_REQUESTS(synhw)) { + if (ps2_send_cmd(fd, SYN_QUE_EXT_CAPAB) && + ps2_getbyte(fd, &cap[0]) && + ps2_getbyte(fd, &cap[1]) && ps2_getbyte(fd, &cap[2])) { + synhw->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2]; + PS2DBG(ErrorF("ext-capability %06X\n", synhw->ext_cap)); + } + else { + PS2DBG(ErrorF + ("synaptics says, that it has extended-capabilities, " + "but I cannot read them.")); + } + } + PS2DBG(ErrorF("...done.\n")); + return TRUE; + } } PS2DBG(ErrorF("...failed.\n")); return FALSE; @@ -287,15 +286,14 @@ synhw->identity = 0; if (ps2_send_cmd(fd, SYN_QUE_IDENTIFY) && - ps2_getbyte(fd, &id[0]) && - ps2_getbyte(fd, &id[1]) && - ps2_getbyte(fd, &id[2])) { - synhw->identity = (id[0] << 16) | (id[1] << 8) | id[2]; - PS2DBG(ErrorF("ident %06X\n", synhw->identity)); - if (SYN_ID_IS_SYNAPTICS(synhw)) { - PS2DBG(ErrorF("...done.\n")); - return TRUE; - } + ps2_getbyte(fd, &id[0]) && + ps2_getbyte(fd, &id[1]) && ps2_getbyte(fd, &id[2])) { + synhw->identity = (id[0] << 16) | (id[1] << 8) | id[2]; + PS2DBG(ErrorF("ident %06X\n", synhw->identity)); + if (SYN_ID_IS_SYNAPTICS(synhw)) { + PS2DBG(ErrorF("...done.\n")); + return TRUE; + } } PS2DBG(ErrorF("...failed.\n")); return FALSE; @@ -315,57 +313,63 @@ } static Bool -ps2_query_is_synaptics(InputInfoPtr pInfo, int fd, struct PS2SynapticsHwInfo* synhw) +ps2_query_is_synaptics(InputInfoPtr pInfo, int fd, + struct PS2SynapticsHwInfo *synhw) { int i; for (i = 0; i < 3; i++) { - if (ps2_synaptics_disable_device(fd)) - break; + if (ps2_synaptics_disable_device(fd)) + break; } xf86WaitForInput(fd, 20000); xf86FlushInput(fd); if (ps2_synaptics_identify(fd, synhw)) { - return TRUE; - } else { - xf86IDrvMsg(pInfo, X_ERROR, "Query no Synaptics: %06X\n", synhw->identity); - return FALSE; + return TRUE; + } + else { + xf86IDrvMsg(pInfo, X_ERROR, "Query no Synaptics: %06X\n", + synhw->identity); + return FALSE; } } void ps2_print_ident(InputInfoPtr pInfo, const struct PS2SynapticsHwInfo *synhw) { - xf86IDrvMsg(pInfo, X_PROBED, " Synaptics Touchpad, model: %d\n", SYN_ID_MODEL(synhw)); + xf86IDrvMsg(pInfo, X_PROBED, " Synaptics Touchpad, model: %d\n", + SYN_ID_MODEL(synhw)); xf86IDrvMsg(pInfo, X_PROBED, " Firmware: %d.%d\n", SYN_ID_MAJOR(synhw), - SYN_ID_MINOR(synhw)); + SYN_ID_MINOR(synhw)); if (SYN_MODEL_ROT180(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " 180 degree mounted touchpad\n"); + xf86IDrvMsg(pInfo, X_PROBED, " 180 degree mounted touchpad\n"); if (SYN_MODEL_PORTRAIT(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " portrait touchpad\n"); + xf86IDrvMsg(pInfo, X_PROBED, " portrait touchpad\n"); xf86IDrvMsg(pInfo, X_PROBED, " Sensor: %d\n", SYN_MODEL_SENSOR(synhw)); if (SYN_MODEL_NEWABS(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " new absolute packet format\n"); + xf86IDrvMsg(pInfo, X_PROBED, " new absolute packet format\n"); if (SYN_MODEL_PEN(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " pen detection\n"); + xf86IDrvMsg(pInfo, X_PROBED, " pen detection\n"); if (SYN_CAP_EXTENDED(synhw)) { - xf86IDrvMsg(pInfo, X_PROBED, " Touchpad has extended capability bits\n"); - if (SYN_CAP_MULTI_BUTTON_NO(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " -> %d multi buttons, i.e. besides standard buttons\n", - (int)(SYN_CAP_MULTI_BUTTON_NO(synhw))); - if (SYN_CAP_MIDDLE_BUTTON(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " -> middle button\n"); - if (SYN_CAP_FOUR_BUTTON(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " -> four buttons\n"); - if (SYN_CAP_MULTIFINGER(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " -> multifinger detection\n"); - if (SYN_CAP_PALMDETECT(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " -> palm detection\n"); - if (SYN_CAP_PASSTHROUGH(synhw)) - xf86IDrvMsg(pInfo, X_PROBED, " -> pass-through port\n"); + xf86IDrvMsg(pInfo, X_PROBED, + " Touchpad has extended capability bits\n"); + if (SYN_CAP_MULTI_BUTTON_NO(synhw)) + xf86IDrvMsg(pInfo, X_PROBED, + " -> %d multi buttons, i.e. besides standard buttons\n", + (int) (SYN_CAP_MULTI_BUTTON_NO(synhw))); + if (SYN_CAP_MIDDLE_BUTTON(synhw)) + xf86IDrvMsg(pInfo, X_PROBED, " -> middle button\n"); + if (SYN_CAP_FOUR_BUTTON(synhw)) + xf86IDrvMsg(pInfo, X_PROBED, " -> four buttons\n"); + if (SYN_CAP_MULTIFINGER(synhw)) + xf86IDrvMsg(pInfo, X_PROBED, " -> multifinger detection\n"); + if (SYN_CAP_PALMDETECT(synhw)) + xf86IDrvMsg(pInfo, X_PROBED, " -> palm detection\n"); + if (SYN_CAP_PASSTHROUGH(synhw)) + xf86IDrvMsg(pInfo, X_PROBED, " -> pass-through port\n"); } } @@ -382,38 +386,38 @@ PS2QueryHardware(InputInfoPtr pInfo) { int mode; - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct PS2SynapticsHwInfo *synhw; if (!priv->proto_data) priv->proto_data = calloc(1, sizeof(struct PS2SynapticsHwInfo)); - synhw = (struct PS2SynapticsHwInfo*)priv->proto_data; + synhw = (struct PS2SynapticsHwInfo *) priv->proto_data; /* is the synaptics touchpad active? */ if (!ps2_query_is_synaptics(pInfo, pInfo->fd, synhw)) - return FALSE; + return FALSE; xf86IDrvMsg(pInfo, X_PROBED, "synaptics touchpad found\n"); if (!ps2_synaptics_reset(pInfo->fd)) - xf86IDrvMsg(pInfo, X_ERROR, "reset failed\n"); + xf86IDrvMsg(pInfo, X_ERROR, "reset failed\n"); if (!ps2_synaptics_identify(pInfo->fd, synhw)) - return FALSE; + return FALSE; if (!ps2_synaptics_model_id(pInfo->fd, synhw)) - return FALSE; + return FALSE; if (!ps2_synaptics_capability(pInfo->fd, synhw)) - return FALSE; + return FALSE; mode = SYN_BIT_ABSOLUTE_MODE | SYN_BIT_HIGH_RATE; if (SYN_ID_MAJOR(synhw) >= 4) - mode |= SYN_BIT_DISABLE_GESTURE; + mode |= SYN_BIT_DISABLE_GESTURE; if (SYN_CAP_EXTENDED(synhw)) - mode |= SYN_BIT_W_MODE; + mode |= SYN_BIT_W_MODE; if (!ps2_synaptics_set_mode(pInfo->fd, mode)) - return FALSE; + return FALSE; ps2_synaptics_enable_device(pInfo->fd); @@ -432,23 +436,23 @@ int newabs = SYN_MODEL_NEWABS(synhw); if (newabs ? ((buf[0] & 0xC0) != 0x80) : ((buf[0] & 0xC0) != 0xC0)) { - DBG(4, "Synaptics driver lost sync at 1st byte\n"); - return FALSE; + DBG(4, "Synaptics driver lost sync at 1st byte\n"); + return FALSE; } if (!newabs && ((buf[1] & 0x60) != 0x00)) { - DBG(4, "Synaptics driver lost sync at 2nd byte\n"); - return FALSE; + DBG(4, "Synaptics driver lost sync at 2nd byte\n"); + return FALSE; } if ((newabs ? ((buf[3] & 0xC0) != 0xC0) : ((buf[3] & 0xC0) != 0x80))) { - DBG(4, "Synaptics driver lost sync at 4th byte\n"); - return FALSE; + DBG(4, "Synaptics driver lost sync at 4th byte\n"); + return FALSE; } if (!newabs && ((buf[4] & 0x60) != 0x00)) { - DBG(4, "Synaptics driver lost sync at 5th byte\n"); - return FALSE; + DBG(4, "Synaptics driver lost sync at 5th byte\n"); + return FALSE; } return TRUE; @@ -456,60 +460,64 @@ static Bool ps2_synaptics_get_packet(InputInfoPtr pInfo, struct PS2SynapticsHwInfo *synhw, - struct SynapticsProtocolOperations *proto_ops, - struct CommData *comm) + struct SynapticsProtocolOperations *proto_ops, + struct CommData *comm) { int count = 0; int c; unsigned char u; while ((c = XisbRead(comm->buffer)) >= 0) { - u = (unsigned char)c; + u = (unsigned char) c; - /* test if there is a reset sequence received */ - if ((c == 0x00) && (comm->lastByte == 0xAA)) { - if (xf86WaitForInput(pInfo->fd, 50000) == 0) { - DBG(7, "Reset received\n"); - proto_ops->QueryHardware(pInfo); - } else - DBG(3, "faked reset received\n"); - } - comm->lastByte = u; - - /* to avoid endless loops */ - if (count++ > 30) { - xf86IDrvMsg(pInfo, X_ERROR, "Synaptics driver lost sync... got gigantic packet!\n"); - return FALSE; - } - - comm->protoBuf[comm->protoBufTail++] = u; - - /* Check that we have a valid packet. If not, we are out of sync, - so we throw away the first byte in the packet.*/ - if (comm->protoBufTail >= 6) { - if (!ps2_packet_ok(synhw, comm)) { - int i; - for (i = 0; i < comm->protoBufTail - 1; i++) - comm->protoBuf[i] = comm->protoBuf[i + 1]; - comm->protoBufTail--; - comm->outOfSync++; - if (comm->outOfSync > MAX_UNSYNC_PACKETS) { - comm->outOfSync = 0; - DBG(3, "Synaptics synchronization lost too long -> reset touchpad.\n"); - proto_ops->QueryHardware(pInfo); /* including a reset */ - continue; - } - } - } - - if (comm->protoBufTail >= 6) { /* Full packet received */ - if (comm->outOfSync > 0) { - comm->outOfSync = 0; - DBG(4, "Synaptics driver resynced.\n"); - } - comm->protoBufTail = 0; - return TRUE; - } + /* test if there is a reset sequence received */ + if ((c == 0x00) && (comm->lastByte == 0xAA)) { + if (xf86WaitForInput(pInfo->fd, 50000) == 0) { + DBG(7, "Reset received\n"); + proto_ops->QueryHardware(pInfo); + } + else + DBG(3, "faked reset received\n"); + } + comm->lastByte = u; + + /* to avoid endless loops */ + if (count++ > 30) { + xf86IDrvMsg(pInfo, X_ERROR, + "Synaptics driver lost sync... got gigantic packet!\n"); + return FALSE; + } + + comm->protoBuf[comm->protoBufTail++] = u; + + /* Check that we have a valid packet. If not, we are out of sync, + so we throw away the first byte in the packet. */ + if (comm->protoBufTail >= 6) { + if (!ps2_packet_ok(synhw, comm)) { + int i; + + for (i = 0; i < comm->protoBufTail - 1; i++) + comm->protoBuf[i] = comm->protoBuf[i + 1]; + comm->protoBufTail--; + comm->outOfSync++; + if (comm->outOfSync > MAX_UNSYNC_PACKETS) { + comm->outOfSync = 0; + DBG(3, + "Synaptics synchronization lost too long -> reset touchpad.\n"); + proto_ops->QueryHardware(pInfo); /* including a reset */ + continue; + } + } + } + + if (comm->protoBufTail >= 6) { /* Full packet received */ + if (comm->outOfSync > 0) { + comm->outOfSync = 0; + DBG(4, "Synaptics driver resynced.\n"); + } + comm->protoBufTail = 0; + return TRUE; + } } return FALSE; @@ -517,20 +525,19 @@ Bool PS2ReadHwStateProto(InputInfoPtr pInfo, - struct SynapticsProtocolOperations *proto_ops, - struct CommData *comm, struct SynapticsHwState *hwRet) + struct SynapticsProtocolOperations *proto_ops, + struct CommData *comm, struct SynapticsHwState *hwRet) { unsigned char *buf = comm->protoBuf; struct SynapticsHwState *hw = comm->hwState; - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; SynapticsParameters *para = &priv->synpara; struct PS2SynapticsHwInfo *synhw; int newabs; int w, i; - synhw = (struct PS2SynapticsHwInfo*)priv->proto_data; - if (!synhw) - { + synhw = (struct PS2SynapticsHwInfo *) priv->proto_data; + if (!synhw) { xf86IDrvMsg(pInfo, X_ERROR, "PS2ReadHwState, synhw is NULL. This is a bug.\n"); return FALSE; @@ -539,115 +546,110 @@ newabs = SYN_MODEL_NEWABS(synhw); if (!ps2_synaptics_get_packet(pInfo, synhw, proto_ops, comm)) - return FALSE; + return FALSE; /* Handle normal packets */ hw->x = hw->y = hw->z = hw->numFingers = hw->fingerWidth = 0; hw->left = hw->right = hw->up = hw->down = hw->middle = FALSE; for (i = 0; i < 8; i++) - hw->multi[i] = FALSE; + hw->multi[i] = FALSE; - if (newabs) { /* newer protos...*/ - DBG(7, "using new protocols\n"); - hw->x = (((buf[3] & 0x10) << 8) | - ((buf[1] & 0x0f) << 8) | - buf[4]); - hw->y = (((buf[3] & 0x20) << 7) | - ((buf[1] & 0xf0) << 4) | - buf[5]); - - hw->z = buf[2]; - w = (((buf[0] & 0x30) >> 2) | - ((buf[0] & 0x04) >> 1) | - ((buf[3] & 0x04) >> 2)); - - hw->left = (buf[0] & 0x01) ? 1 : 0; - hw->right = (buf[0] & 0x02) ? 1 : 0; - - if (SYN_CAP_EXTENDED(synhw)) { - if (SYN_CAP_MIDDLE_BUTTON(synhw)) { - hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; - } - if (SYN_CAP_FOUR_BUTTON(synhw)) { - hw->up = ((buf[3] & 0x01)) ? 1 : 0; - if (hw->left) - hw->up = !hw->up; - hw->down = ((buf[3] & 0x02)) ? 1 : 0; - if (hw->right) - hw->down = !hw->down; - } - if (SYN_CAP_MULTI_BUTTON_NO(synhw)) { - if ((buf[3] & 2) ? !hw->right : hw->right) { - switch (SYN_CAP_MULTI_BUTTON_NO(synhw) & ~0x01) { - default: - break; - case 8: - hw->multi[7] = ((buf[5] & 0x08)) ? 1 : 0; - hw->multi[6] = ((buf[4] & 0x08)) ? 1 : 0; - case 6: - hw->multi[5] = ((buf[5] & 0x04)) ? 1 : 0; - hw->multi[4] = ((buf[4] & 0x04)) ? 1 : 0; - case 4: - hw->multi[3] = ((buf[5] & 0x02)) ? 1 : 0; - hw->multi[2] = ((buf[4] & 0x02)) ? 1 : 0; - case 2: - hw->multi[1] = ((buf[5] & 0x01)) ? 1 : 0; - hw->multi[0] = ((buf[4] & 0x01)) ? 1 : 0; - } - } - } - } - } else { /* old proto...*/ - DBG(7, "using old protocol\n"); - hw->x = (((buf[1] & 0x1F) << 8) | - buf[2]); - hw->y = (((buf[4] & 0x1F) << 8) | - buf[5]); - - hw->z = (((buf[0] & 0x30) << 2) | - (buf[3] & 0x3F)); - w = (((buf[1] & 0x80) >> 4) | - ((buf[0] & 0x04) >> 1)); + if (newabs) { /* newer protos... */ + DBG(7, "using new protocols\n"); + hw->x = (((buf[3] & 0x10) << 8) | ((buf[1] & 0x0f) << 8) | buf[4]); + hw->y = (((buf[3] & 0x20) << 7) | ((buf[1] & 0xf0) << 4) | buf[5]); + + hw->z = buf[2]; + w = (((buf[0] & 0x30) >> 2) | + ((buf[0] & 0x04) >> 1) | ((buf[3] & 0x04) >> 2)); + + hw->left = (buf[0] & 0x01) ? 1 : 0; + hw->right = (buf[0] & 0x02) ? 1 : 0; + + if (SYN_CAP_EXTENDED(synhw)) { + if (SYN_CAP_MIDDLE_BUTTON(synhw)) { + hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; + } + if (SYN_CAP_FOUR_BUTTON(synhw)) { + hw->up = ((buf[3] & 0x01)) ? 1 : 0; + if (hw->left) + hw->up = !hw->up; + hw->down = ((buf[3] & 0x02)) ? 1 : 0; + if (hw->right) + hw->down = !hw->down; + } + if (SYN_CAP_MULTI_BUTTON_NO(synhw)) { + if ((buf[3] & 2) ? !hw->right : hw->right) { + switch (SYN_CAP_MULTI_BUTTON_NO(synhw) & ~0x01) { + default: + break; + case 8: + hw->multi[7] = ((buf[5] & 0x08)) ? 1 : 0; + hw->multi[6] = ((buf[4] & 0x08)) ? 1 : 0; + case 6: + hw->multi[5] = ((buf[5] & 0x04)) ? 1 : 0; + hw->multi[4] = ((buf[4] & 0x04)) ? 1 : 0; + case 4: + hw->multi[3] = ((buf[5] & 0x02)) ? 1 : 0; + hw->multi[2] = ((buf[4] & 0x02)) ? 1 : 0; + case 2: + hw->multi[1] = ((buf[5] & 0x01)) ? 1 : 0; + hw->multi[0] = ((buf[4] & 0x01)) ? 1 : 0; + } + } + } + } + } + else { /* old proto... */ + DBG(7, "using old protocol\n"); + hw->x = (((buf[1] & 0x1F) << 8) | buf[2]); + hw->y = (((buf[4] & 0x1F) << 8) | buf[5]); - hw->left = (buf[0] & 0x01) ? 1 : 0; - hw->right = (buf[0] & 0x02) ? 1 : 0; + hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F)); + w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1)); + + hw->left = (buf[0] & 0x01) ? 1 : 0; + hw->right = (buf[0] & 0x02) ? 1 : 0; } hw->y = YMAX_NOMINAL + YMIN_NOMINAL - hw->y; if (hw->z >= para->finger_high) { - int w_ok = 0; - /* - * Use capability bits to decide if the w value is valid. - * If not, set it to 5, which corresponds to a finger of - * normal width. - */ - if (SYN_CAP_EXTENDED(synhw)) { - if ((w >= 0) && (w <= 1)) { - w_ok = SYN_CAP_MULTIFINGER(synhw); - } else if (w == 2) { - w_ok = SYN_MODEL_PEN(synhw); - } else if ((w >= 4) && (w <= 15)) { - w_ok = SYN_CAP_PALMDETECT(synhw); - } - } - if (!w_ok) - w = 5; - - switch (w) { - case 0: - hw->numFingers = 2; - hw->fingerWidth = 5; - break; - case 1: - hw->numFingers = 3; - hw->fingerWidth = 5; - break; - default: - hw->numFingers = 1; - hw->fingerWidth = w; - break; - } + int w_ok = 0; + + /* + * Use capability bits to decide if the w value is valid. + * If not, set it to 5, which corresponds to a finger of + * normal width. + */ + if (SYN_CAP_EXTENDED(synhw)) { + if ((w >= 0) && (w <= 1)) { + w_ok = SYN_CAP_MULTIFINGER(synhw); + } + else if (w == 2) { + w_ok = SYN_MODEL_PEN(synhw); + } + else if ((w >= 4) && (w <= 15)) { + w_ok = SYN_CAP_PALMDETECT(synhw); + } + } + if (!w_ok) + w = 5; + + switch (w) { + case 0: + hw->numFingers = 2; + hw->fingerWidth = 5; + break; + case 1: + hw->numFingers = 3; + hw->fingerWidth = 5; + break; + default: + hw->numFingers = 1; + hw->fingerWidth = w; + break; + } } hw->millis = GetTimeInMillis(); SynapticsCopyHwState(hwRet, hw); diff -Nru xserver-xorg-input-synaptics-1.6.0/src/ps2comm.h xserver-xorg-input-synaptics-1.6.2/src/ps2comm.h --- xserver-xorg-input-synaptics-1.6.0/src/ps2comm.h 2012-04-30 00:33:10.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/ps2comm.h 2012-05-31 04:57:58.000000000 +0000 @@ -27,7 +27,7 @@ #include "xf86_OSproc.h" /* acknowledge for commands and parameter */ -#define PS2_ACK 0xFA +#define PS2_ACK 0xFA #define PS2_ERROR 0xFC /* standard PS/2 commands */ @@ -56,7 +56,7 @@ #define SYN_BIT_W_MODE (1 << 0) /* synaptics model ID bits */ -#define SYN_MODEL_ROT180(synhw) ((synhw)->model_id & (1 << 23)) +#define SYN_MODEL_ROT180(synhw) ((synhw)->model_id & (1 << 23)) #define SYN_MODEL_PORTRAIT(synhw) ((synhw)->model_id & (1 << 22)) #define SYN_MODEL_SENSOR(synhw) (((synhw)->model_id >> 16) & 0x3f) #define SYN_MODEL_HARDWARE(synhw) (((synhw)->model_id >> 9) & 0x7f) @@ -95,16 +95,17 @@ typedef unsigned char byte; struct PS2SynapticsHwInfo { - unsigned int model_id; /* Model-ID */ - unsigned int capabilities; /* Capabilities */ - unsigned int ext_cap; /* Extended Capabilities */ - unsigned int identity; /* Identification */ + unsigned int model_id; /* Model-ID */ + unsigned int capabilities; /* Capabilities */ + unsigned int ext_cap; /* Extended Capabilities */ + unsigned int identity; /* Identification */ }; Bool ps2_putbyte(int fd, byte b); -void ps2_print_ident(InputInfoPtr pInfo, const struct PS2SynapticsHwInfo *synhw); +void ps2_print_ident(InputInfoPtr pInfo, + const struct PS2SynapticsHwInfo *synhw); Bool PS2ReadHwStateProto(InputInfoPtr pInfo, - struct SynapticsProtocolOperations *proto_ops, - struct CommData *comm, struct SynapticsHwState *hwRet); + struct SynapticsProtocolOperations *proto_ops, + struct CommData *comm, struct SynapticsHwState *hwRet); -#endif /* _PS2COMM_H_ */ +#endif /* _PS2COMM_H_ */ diff -Nru xserver-xorg-input-synaptics-1.6.0/src/psmcomm.c xserver-xorg-input-synaptics-1.6.2/src/psmcomm.c --- xserver-xorg-input-synaptics-1.6.0/src/psmcomm.c 2012-04-30 00:33:11.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/psmcomm.c 2012-06-12 01:23:34.000000000 +0000 @@ -47,7 +47,7 @@ #include "synproto.h" #include "synaptics.h" #include "synapticsstr.h" -#include "ps2comm.h" /* ps2_print_ident() */ +#include "ps2comm.h" /* ps2_print_ident() */ #include #define SYSCALL(call) while (((call) == -1) && (errno == EINTR)) @@ -57,15 +57,15 @@ * See also the SYN_ID_* macros */ static Bool -psm_synaptics_identify(int fd, synapticshw_t *ident) +psm_synaptics_identify(int fd, synapticshw_t * ident) { int ret; SYSCALL(ret = ioctl(fd, MOUSE_SYN_GETHWINFO, ident)); if (ret == 0) - return TRUE; + return TRUE; else - return FALSE; + return FALSE; } /* This define is used in a ioctl but not in mouse.h :/ */ @@ -84,46 +84,49 @@ */ SYSCALL(ret = ioctl(pInfo->fd, MOUSE_SETLEVEL, &level)); if (ret != 0) { - xf86IDrvMsg(pInfo, X_ERROR, "%s Can't set native mode\n", pInfo->name); - return FALSE; + xf86IDrvMsg(pInfo, X_ERROR, "%s Can't set native mode\n", pInfo->name); + return FALSE; } SYSCALL(ret = ioctl(pInfo->fd, MOUSE_GETHWINFO, &mhw)); if (ret != 0) { - xf86IDrvMsg(pInfo, X_ERROR, "%s Can't get hardware info\n", pInfo->name); - return FALSE; + xf86IDrvMsg(pInfo, X_ERROR, "%s Can't get hardware info\n", + pInfo->name); + return FALSE; } if (mhw.model == MOUSE_MODEL_SYNAPTICS) { - return TRUE; - } else { - xf86IDrvMsg(pInfo, X_ERROR, "%s Found no Synaptics, found Mouse model %d instead\n", - pInfo->name, mhw.model); - return FALSE; + return TRUE; + } + else { + xf86IDrvMsg(pInfo, X_ERROR, + "%s Found no Synaptics, found Mouse model %d instead\n", + pInfo->name, mhw.model); + return FALSE; } } static void -convert_hw_info(const synapticshw_t *psm_ident, struct PS2SynapticsHwInfo *synhw) +convert_hw_info(const synapticshw_t * psm_ident, + struct PS2SynapticsHwInfo *synhw) { memset(synhw, 0, sizeof(*synhw)); synhw->model_id = ((psm_ident->infoRot180 << 23) | - (psm_ident->infoPortrait << 22) | - (psm_ident->infoSensor << 16) | - (psm_ident->infoHardware << 9) | - (psm_ident->infoNewAbs << 7) | - (psm_ident->capPen << 6) | - (psm_ident->infoSimplC << 5) | - (psm_ident->infoGeometry)); + (psm_ident->infoPortrait << 22) | + (psm_ident->infoSensor << 16) | + (psm_ident->infoHardware << 9) | + (psm_ident->infoNewAbs << 7) | + (psm_ident->capPen << 6) | + (psm_ident->infoSimplC << 5) | + (psm_ident->infoGeometry)); synhw->capabilities = ((psm_ident->capExtended << 23) | - (psm_ident->capPassthrough << 7) | - (psm_ident->capSleep << 4) | - (psm_ident->capFourButtons << 3) | - (psm_ident->capMultiFinger << 1) | - (psm_ident->capPalmDetect)); + (psm_ident->capPassthrough << 7) | + (psm_ident->capSleep << 4) | + (psm_ident->capFourButtons << 3) | + (psm_ident->capMultiFinger << 1) | + (psm_ident->capPalmDetect)); synhw->ext_cap = 0; synhw->identity = ((psm_ident->infoMajor) | - (0x47 << 8) | - (psm_ident->infoMinor << 16)); + (0x47 << 8) | (psm_ident->infoMinor << 16)); } static Bool @@ -133,20 +136,20 @@ struct PS2SynapticsHwInfo *synhw; SynapticsPrivate *priv; - priv = (SynapticsPrivate *)pInfo->private; + priv = (SynapticsPrivate *) pInfo->private; - if(!priv->proto_data) + if (!priv->proto_data) priv->proto_data = calloc(1, sizeof(struct PS2SynapticsHwInfo)); - synhw = (struct PS2SynapticsHwInfo*)priv->proto_data; + synhw = (struct PS2SynapticsHwInfo *) priv->proto_data; /* is the synaptics touchpad active? */ if (!PSMQueryIsSynaptics(pInfo)) - return FALSE; + return FALSE; xf86IDrvMsg(pInfo, X_PROBED, "synaptics touchpad found\n"); if (!psm_synaptics_identify(pInfo->fd, &psm_ident)) - return FALSE; + return FALSE; convert_hw_info(&psm_ident, synhw); @@ -157,7 +160,7 @@ static Bool PSMReadHwState(InputInfoPtr pInfo, - struct CommData *comm, struct SynapticsHwState *hwRet) + struct CommData *comm, struct SynapticsHwState *hwRet) { return PS2ReadHwStateProto(pInfo, &psm_proto_operations, comm, hwRet); } diff -Nru xserver-xorg-input-synaptics-1.6.0/src/synaptics.c xserver-xorg-input-synaptics-1.6.2/src/synaptics.c --- xserver-xorg-input-synaptics-1.6.0/src/synaptics.c 2012-07-12 15:21:50.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/synaptics.c 2012-07-12 15:21:50.000000000 +0000 @@ -55,7 +55,6 @@ * Trademarks are the property of their respective owners. */ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -118,7 +117,7 @@ #endif #ifndef M_SQRT1_2 -#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ +#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ #endif #define INPUT_BUFFER_SIZE 200 @@ -129,14 +128,15 @@ #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 static int SynapticsPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags); #else -static InputInfoPtr SynapticsPreInit(InputDriverPtr drv, IDevPtr dev, int flags); +static InputInfoPtr SynapticsPreInit(InputDriverPtr drv, IDevPtr dev, + int flags); #endif static void SynapticsUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags); static Bool DeviceControl(DeviceIntPtr, int); static void ReadInput(InputInfoPtr); -static int HandleState(InputInfoPtr, struct SynapticsHwState*, CARD32 now, +static int HandleState(InputInfoPtr, struct SynapticsHwState *, CARD32 now, Bool from_timer); -static int ControlProc(InputInfoPtr, xDeviceCtl*); +static int ControlProc(InputInfoPtr, xDeviceCtl *); static int SwitchMode(ClientPtr, DeviceIntPtr, int); static Bool DeviceInit(DeviceIntPtr); static Bool DeviceOn(DeviceIntPtr); @@ -144,8 +144,9 @@ static Bool DeviceClose(DeviceIntPtr); static Bool QueryHardware(InputInfoPtr); static void ReadDevDimensions(InputInfoPtr); -static void ScaleCoordinates(SynapticsPrivate *priv, struct SynapticsHwState *hw); -static void CalculateScalingCoeffs(SynapticsPrivate *priv); +static void ScaleCoordinates(SynapticsPrivate * priv, + struct SynapticsHwState *hw); +static void CalculateScalingCoeffs(SynapticsPrivate * priv); static void SanitizeDimensions(InputInfoPtr pInfo); void InitDeviceProperties(InputInfoPtr pInfo); @@ -157,16 +158,20 @@ struct SynapticsProtocolOperations *proto_ops; } protocols[] = { #ifdef BUILD_EVENTCOMM - {"event", &event_proto_operations}, + { + "event", &event_proto_operations}, #endif #ifdef BUILD_PSMCOMM - {"psm", &psm_proto_operations}, + { + "psm", &psm_proto_operations}, #endif #ifdef BUILD_PS2COMM - {"psaux", &psaux_proto_operations}, - {"alps", &alps_proto_operations}, + { + "psaux", &psaux_proto_operations}, { + "alps", &alps_proto_operations}, #endif - {NULL, NULL} + { + NULL, NULL} }; InputDriverRec SYNAPTICS = { @@ -204,7 +209,6 @@ NULL }; - /***************************************************************************** * Function Definitions ****************************************************************************/ @@ -220,48 +224,44 @@ static void SanitizeDimensions(InputInfoPtr pInfo) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; - if (priv->minx >= priv->maxx) - { - priv->minx = 1615; - priv->maxx = 5685; - priv->resx = 0; + if (priv->minx >= priv->maxx) { + priv->minx = 1615; + priv->maxx = 5685; + priv->resx = 0; - xf86IDrvMsg(pInfo, X_PROBED, - "invalid x-axis range. defaulting to %d - %d\n", - priv->minx, priv->maxx); + xf86IDrvMsg(pInfo, X_PROBED, + "invalid x-axis range. defaulting to %d - %d\n", + priv->minx, priv->maxx); } - if (priv->miny >= priv->maxy) - { - priv->miny = 1729; - priv->maxy = 4171; - priv->resy = 0; + if (priv->miny >= priv->maxy) { + priv->miny = 1729; + priv->maxy = 4171; + priv->resy = 0; - xf86IDrvMsg(pInfo, X_PROBED, - "invalid y-axis range. defaulting to %d - %d\n", - priv->miny, priv->maxy); + xf86IDrvMsg(pInfo, X_PROBED, + "invalid y-axis range. defaulting to %d - %d\n", + priv->miny, priv->maxy); } - if (priv->minp >= priv->maxp) - { - priv->minp = 0; - priv->maxp = 255; + if (priv->minp >= priv->maxp) { + priv->minp = 0; + priv->maxp = 255; - xf86IDrvMsg(pInfo, X_PROBED, - "invalid pressure range. defaulting to %d - %d\n", - priv->minp, priv->maxp); + xf86IDrvMsg(pInfo, X_PROBED, + "invalid pressure range. defaulting to %d - %d\n", + priv->minp, priv->maxp); } - if (priv->minw >= priv->maxw) - { - priv->minw = 0; - priv->maxw = 15; + if (priv->minw >= priv->maxw) { + priv->minw = 0; + priv->maxw = 15; - xf86IDrvMsg(pInfo, X_PROBED, - "invalid finger width range. defaulting to %d - %d\n", - priv->minw, priv->maxw); + xf86IDrvMsg(pInfo, X_PROBED, + "invalid finger width range. defaulting to %d - %d\n", + priv->minw, priv->maxw); } } @@ -309,24 +309,25 @@ SynapticsPrivate *priv = pInfo->private; if (priv->synshm) - return TRUE; /* Already allocated */ + return TRUE; /* Already allocated */ if (priv->shm_config) { - if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) != -1) - shmctl(shmid, IPC_RMID, NULL); - if ((shmid = shmget(SHM_SYNAPTICS, sizeof(SynapticsSHM), - 0774 | IPC_CREAT)) == -1) { - xf86IDrvMsg(pInfo, X_ERROR, "error shmget\n"); - return FALSE; - } - if ((priv->synshm = (SynapticsSHM*)shmat(shmid, NULL, 0)) == NULL) { - xf86IDrvMsg(pInfo, X_ERROR, "error shmat\n"); - return FALSE; - } - } else { - priv->synshm = calloc(1, sizeof(SynapticsSHM)); - if (!priv->synshm) - return FALSE; + if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) != -1) + shmctl(shmid, IPC_RMID, NULL); + if ((shmid = shmget(SHM_SYNAPTICS, sizeof(SynapticsSHM), + 0774 | IPC_CREAT)) == -1) { + xf86IDrvMsg(pInfo, X_ERROR, "error shmget\n"); + return FALSE; + } + if ((priv->synshm = (SynapticsSHM *) shmat(shmid, NULL, 0)) == NULL) { + xf86IDrvMsg(pInfo, X_ERROR, "error shmat\n"); + return FALSE; + } + } + else { + priv->synshm = calloc(1, sizeof(SynapticsSHM)); + if (!priv->synshm) + return FALSE; } return TRUE; @@ -336,46 +337,46 @@ * Free SynapticsParameters data previously allocated by alloc_shm_data(). */ static void -free_shm_data(SynapticsPrivate *priv) +free_shm_data(SynapticsPrivate * priv) { int shmid; if (!priv->synshm) - return; + return; if (priv->shm_config) { - if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) != -1) - shmctl(shmid, IPC_RMID, NULL); - } else { - free(priv->synshm); + if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) != -1) + shmctl(shmid, IPC_RMID, NULL); + } + else { + free(priv->synshm); } priv->synshm = NULL; } static void -calculate_edge_widths(SynapticsPrivate *priv, int *l, int *r, int *t, int *b) +calculate_edge_widths(SynapticsPrivate * priv, int *l, int *r, int *t, int *b) { int width, height; - int ewidth, eheight; /* edge width/height */ + int ewidth, eheight; /* edge width/height */ width = abs(priv->maxx - priv->minx); height = abs(priv->maxy - priv->miny); - if (priv->model == MODEL_SYNAPTICS) - { + if (priv->model == MODEL_SYNAPTICS) { ewidth = width * .07; eheight = height * .07; - } else if (priv->model == MODEL_ALPS) - { + } + else if (priv->model == MODEL_ALPS) { ewidth = width * .15; eheight = height * .15; - } else if (priv->model == MODEL_APPLETOUCH) - { + } + else if (priv->model == MODEL_APPLETOUCH) { ewidth = width * .085; eheight = height * .085; - } else - { + } + else { ewidth = width * .04; eheight = height * .054; } @@ -387,7 +388,7 @@ } static void -calculate_tap_hysteresis(SynapticsPrivate *priv, int range, +calculate_tap_hysteresis(SynapticsPrivate * priv, int range, int *fingerLow, int *fingerHigh, int *fingerPress) { if (priv->model == MODEL_ELANTECH) { @@ -395,11 +396,12 @@ * number of fingers correctly. See Documentation/elantech.txt * in the kernel. */ - *fingerLow = priv->minp + 1; + *fingerLow = priv->minp + 1; *fingerHigh = priv->minp + 1; - } else { - *fingerLow = priv->minp + range * (25.0/256); - *fingerHigh = priv->minp + range * (30.0/256); + } + else { + *fingerLow = priv->minp + range * (25.0 / 256); + *fingerHigh = priv->minp + range * (30.0 / 256); } *fingerPress = priv->minp + range * 1.000; @@ -411,25 +413,28 @@ * int. So - check first for percent, then call xf86Set* again to get * the log message. */ -static int set_percent_option(pointer options, const char* optname, - const int range, const int offset, - const int default_value) +static int +set_percent_option(pointer options, const char *optname, + const int range, const int offset, const int default_value) { int result; + #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11 double percent = xf86CheckPercentOption(options, optname, -1); if (percent >= 0.0) { percent = xf86SetPercentOption(options, optname, -1); - result = percent/100.0 * range + offset; - } else + result = percent / 100.0 * range + offset; + } + else #endif result = xf86SetIntOption(options, optname, default_value); return result; } -Bool SynapticsIsSoftButtonAreasValid(int *values) +Bool +SynapticsIsSoftButtonAreasValid(int *values) { Bool right_disabled = FALSE; Bool middle_disabled = FALSE; @@ -451,8 +456,8 @@ middle_disabled = TRUE; if (!right_disabled && - ((values[0] && values[0] == values[1]) || - (values[2] && values[2] == values[3]))) + ((values[0] && values[0] == values[1]) || + (values[2] && values[2] == values[3]))) return FALSE; if (!middle_disabled && @@ -461,8 +466,7 @@ return FALSE; /* Check for overlapping button areas */ - if (!right_disabled && !middle_disabled) - { + if (!right_disabled && !middle_disabled) { int right_left = values[0] ? values[0] : INT_MIN; int right_right = values[1] ? values[1] : INT_MAX; int right_top = values[2] ? values[2] : INT_MIN; @@ -474,8 +478,7 @@ /* If areas overlap in the Y axis */ if ((right_bottom <= middle_bottom && right_bottom >= middle_top) || - (right_top <= middle_bottom && right_top >= middle_top)) - { + (right_top <= middle_bottom && right_top >= middle_top)) { /* Check for overlapping left edges */ if ((right_left < middle_left && right_right >= middle_left) || (middle_left < right_left && middle_right >= right_left)) @@ -489,8 +492,7 @@ /* If areas overlap in the X axis */ if ((right_left >= middle_left && right_left <= middle_right) || - (right_right >= middle_left && right_right <= middle_right)) - { + (right_right >= middle_left && right_right <= middle_right)) { /* Check for overlapping top edges */ if ((right_top < middle_top && right_bottom >= middle_top) || (middle_top < right_top && middle_bottom >= right_top)) @@ -506,12 +508,13 @@ return TRUE; } -static void set_softbutton_areas_option(InputInfoPtr pInfo) +static void +set_softbutton_areas_option(InputInfoPtr pInfo) { SynapticsPrivate *priv = pInfo->private; SynapticsParameters *pars = &priv->synpara; int values[8]; - int in_percent = 0; /* bitmask for which ones are in % */ + int in_percent = 0; /* bitmask for which ones are in % */ char *option_string; char *next_num; char *end_str; @@ -527,23 +530,22 @@ next_num = option_string; - for (i = 0; i < 8 && *next_num != '\0'; i++) - { + for (i = 0; i < 8 && *next_num != '\0'; i++) { long int value = strtol(next_num, &end_str, 0); + if (value > INT_MAX || value < -INT_MAX) goto fail; values[i] = value; - if (next_num != end_str) - { - if (end_str && *end_str == '%') - { + if (next_num != end_str) { + if (end_str && *end_str == '%') { in_percent |= 1 << i; end_str++; } next_num = end_str; - } else + } + else goto fail; } @@ -553,8 +555,7 @@ width = priv->maxx - priv->minx; height = priv->maxy - priv->miny; - for (i = 0; in_percent && i < 8; i++) - { + for (i = 0; in_percent && i < 8; i++) { int base, size; if ((in_percent & (1 << i)) == 0 || values[i] == 0) @@ -562,7 +563,7 @@ size = ((i % 4) < 2) ? width : height; base = ((i % 4) < 2) ? priv->minx : priv->miny; - values[i] = base + size * values[i]/100.0; + values[i] = base + size * values[i] / 100.0; } if (!SynapticsIsSoftButtonAreasValid(values)) @@ -573,28 +574,30 @@ return; -fail: - xf86IDrvMsg(pInfo, X_ERROR, "invalid SoftButtonAreas value '%s', keeping defaults\n", + fail: + xf86IDrvMsg(pInfo, X_ERROR, + "invalid SoftButtonAreas value '%s', keeping defaults\n", option_string); } -static void set_default_parameters(InputInfoPtr pInfo) +static void +set_default_parameters(InputInfoPtr pInfo) { - SynapticsPrivate *priv = pInfo->private; /* read-only */ - pointer opts = pInfo->options; /* read-only */ + SynapticsPrivate *priv = pInfo->private; /* read-only */ + pointer opts = pInfo->options; /* read-only */ SynapticsParameters *pars = &priv->synpara; /* modified */ - int horizScrollDelta, vertScrollDelta; /* pixels */ - int tapMove; /* pixels */ - int l, r, t, b; /* left, right, top, bottom */ - int edgeMotionMinSpeed, edgeMotionMaxSpeed; /* pixels/second */ - double accelFactor; /* 1/pixels */ - int fingerLow, fingerHigh, fingerPress; /* pressure */ - int emulateTwoFingerMinZ; /* pressure */ - int emulateTwoFingerMinW; /* width */ - int edgeMotionMinZ, edgeMotionMaxZ; /* pressure */ - int pressureMotionMinZ, pressureMotionMaxZ; /* pressure */ - int palmMinWidth, palmMinZ; /* pressure */ + int horizScrollDelta, vertScrollDelta; /* pixels */ + int tapMove; /* pixels */ + int l, r, t, b; /* left, right, top, bottom */ + int edgeMotionMinSpeed, edgeMotionMaxSpeed; /* pixels/second */ + double accelFactor; /* 1/pixels */ + int fingerLow, fingerHigh, fingerPress; /* pressure */ + int emulateTwoFingerMinZ; /* pressure */ + int emulateTwoFingerMinW; /* width */ + int edgeMotionMinZ, edgeMotionMaxZ; /* pressure */ + int pressureMotionMinZ, pressureMotionMaxZ; /* pressure */ + int palmMinWidth, palmMinZ; /* pressure */ int tapButton1, tapButton2, tapButton3; int clickFinger1, clickFinger2, clickFinger3; Bool vertEdgeScroll, horizEdgeScroll; @@ -607,7 +610,9 @@ /* read the parameters */ if (priv->synshm) - priv->synshm->version = (PACKAGE_VERSION_MAJOR*10000+PACKAGE_VERSION_MINOR*100+PACKAGE_VERSION_PATCHLEVEL); + priv->synshm->version = + (PACKAGE_VERSION_MAJOR * 10000 + PACKAGE_VERSION_MINOR * 100 + + PACKAGE_VERSION_PATCHLEVEL); /* The synaptics specs specify typical edge widths of 4% on x, and 5.4% on * y (page 7) [Synaptics TouchPad Interfacing Guide, 510-000080 - A @@ -640,21 +645,22 @@ range = priv->maxp - priv->minp + 1; - calculate_tap_hysteresis(priv, range, &fingerLow, &fingerHigh, &fingerPress); + calculate_tap_hysteresis(priv, range, &fingerLow, &fingerHigh, + &fingerPress); /* scaling based on defaults and a pressure of 256 */ - emulateTwoFingerMinZ = priv->minp + range * (282.0/256); - edgeMotionMinZ = priv->minp + range * (30.0/256); - edgeMotionMaxZ = priv->minp + range * (160.0/256); - pressureMotionMinZ = priv->minp + range * (30.0/256); - pressureMotionMaxZ = priv->minp + range * (160.0/256); - palmMinZ = priv->minp + range * (200.0/256); + emulateTwoFingerMinZ = priv->minp + range * (282.0 / 256); + edgeMotionMinZ = priv->minp + range * (30.0 / 256); + edgeMotionMaxZ = priv->minp + range * (160.0 / 256); + pressureMotionMinZ = priv->minp + range * (30.0 / 256); + pressureMotionMaxZ = priv->minp + range * (160.0 / 256); + palmMinZ = priv->minp + range * (200.0 / 256); range = priv->maxw - priv->minw + 1; /* scaling based on defaults below and a tool width of 16 */ - palmMinWidth = priv->minw + range * (10.0/16); - emulateTwoFingerMinW = priv->minw + range * (7.0/16); + palmMinWidth = priv->minw + range * (10.0 / 16); + emulateTwoFingerMinW = priv->minw + range * (7.0 / 16); /* Enable tap if we don't have a phys left button */ tapButton1 = priv->has_left ? 0 : 1; @@ -687,13 +693,19 @@ pars->top_edge = xf86SetIntOption(opts, "TopEdge", t); pars->bottom_edge = xf86SetIntOption(opts, "BottomEdge", b); - pars->area_top_edge = set_percent_option(opts, "AreaTopEdge", height, priv->miny, 0); - pars->area_bottom_edge = set_percent_option(opts, "AreaBottomEdge", height, priv->miny, 0); - pars->area_left_edge = set_percent_option(opts, "AreaLeftEdge", width, priv->minx, 0); - pars->area_right_edge = set_percent_option(opts, "AreaRightEdge", width, priv->minx, 0); - - pars->hyst_x = set_percent_option(opts, "HorizHysteresis", width, 0, horizHyst); - pars->hyst_y = set_percent_option(opts, "VertHysteresis", height, 0, vertHyst); + pars->area_top_edge = + set_percent_option(opts, "AreaTopEdge", height, priv->miny, 0); + pars->area_bottom_edge = + set_percent_option(opts, "AreaBottomEdge", height, priv->miny, 0); + pars->area_left_edge = + set_percent_option(opts, "AreaLeftEdge", width, priv->minx, 0); + pars->area_right_edge = + set_percent_option(opts, "AreaRightEdge", width, priv->minx, 0); + + pars->hyst_x = + set_percent_option(opts, "HorizHysteresis", width, 0, horizHyst); + pars->hyst_y = + set_percent_option(opts, "VertHysteresis", height, 0, vertHyst); pars->finger_low = xf86SetIntOption(opts, "FingerLow", fingerLow); pars->finger_high = xf86SetIntOption(opts, "FingerHigh", fingerHigh); @@ -702,32 +714,51 @@ pars->tap_move = xf86SetIntOption(opts, "MaxTapMove", tapMove); pars->tap_time_2 = xf86SetIntOption(opts, "MaxDoubleTapTime", 180); pars->click_time = xf86SetIntOption(opts, "ClickTime", 100); - pars->clickpad = xf86SetBoolOption(opts, "ClickPad", pars->clickpad); /* Probed */ + pars->clickpad = xf86SetBoolOption(opts, "ClickPad", pars->clickpad); /* Probed */ pars->fast_taps = xf86SetBoolOption(opts, "FastTaps", FALSE); /* middle mouse button emulation on a clickpad? nah, you're joking */ middle_button_timeout = pars->clickpad ? 0 : 75; - pars->emulate_mid_button_time = xf86SetIntOption(opts, "EmulateMidButtonTime", middle_button_timeout); - pars->emulate_twofinger_z = xf86SetIntOption(opts, "EmulateTwoFingerMinZ", emulateTwoFingerMinZ); - pars->emulate_twofinger_w = xf86SetIntOption(opts, "EmulateTwoFingerMinW", emulateTwoFingerMinW); - pars->scroll_dist_vert = xf86SetIntOption(opts, "VertScrollDelta", vertScrollDelta); - pars->scroll_dist_horiz = xf86SetIntOption(opts, "HorizScrollDelta", horizScrollDelta); - pars->scroll_edge_vert = xf86SetBoolOption(opts, "VertEdgeScroll", vertEdgeScroll); - pars->scroll_edge_horiz = xf86SetBoolOption(opts, "HorizEdgeScroll", horizEdgeScroll); + pars->emulate_mid_button_time = + xf86SetIntOption(opts, "EmulateMidButtonTime", middle_button_timeout); + pars->emulate_twofinger_z = + xf86SetIntOption(opts, "EmulateTwoFingerMinZ", emulateTwoFingerMinZ); + pars->emulate_twofinger_w = + xf86SetIntOption(opts, "EmulateTwoFingerMinW", emulateTwoFingerMinW); + pars->scroll_dist_vert = + xf86SetIntOption(opts, "VertScrollDelta", vertScrollDelta); + pars->scroll_dist_horiz = + xf86SetIntOption(opts, "HorizScrollDelta", horizScrollDelta); + pars->scroll_edge_vert = + xf86SetBoolOption(opts, "VertEdgeScroll", vertEdgeScroll); + pars->scroll_edge_horiz = + xf86SetBoolOption(opts, "HorizEdgeScroll", horizEdgeScroll); pars->scroll_edge_corner = xf86SetBoolOption(opts, "CornerCoasting", FALSE); - pars->scroll_twofinger_vert = xf86SetBoolOption(opts, "VertTwoFingerScroll", vertTwoFingerScroll); - pars->scroll_twofinger_horiz = xf86SetBoolOption(opts, "HorizTwoFingerScroll", horizTwoFingerScroll); - pars->edge_motion_min_z = xf86SetIntOption(opts, "EdgeMotionMinZ", edgeMotionMinZ); - pars->edge_motion_max_z = xf86SetIntOption(opts, "EdgeMotionMaxZ", edgeMotionMaxZ); - pars->edge_motion_min_speed = xf86SetIntOption(opts, "EdgeMotionMinSpeed", edgeMotionMinSpeed); - pars->edge_motion_max_speed = xf86SetIntOption(opts, "EdgeMotionMaxSpeed", edgeMotionMaxSpeed); - pars->edge_motion_use_always = xf86SetBoolOption(opts, "EdgeMotionUseAlways", FALSE); + pars->scroll_twofinger_vert = + xf86SetBoolOption(opts, "VertTwoFingerScroll", vertTwoFingerScroll); + pars->scroll_twofinger_horiz = + xf86SetBoolOption(opts, "HorizTwoFingerScroll", horizTwoFingerScroll); + pars->edge_motion_min_z = + xf86SetIntOption(opts, "EdgeMotionMinZ", edgeMotionMinZ); + pars->edge_motion_max_z = + xf86SetIntOption(opts, "EdgeMotionMaxZ", edgeMotionMaxZ); + pars->edge_motion_min_speed = + xf86SetIntOption(opts, "EdgeMotionMinSpeed", edgeMotionMinSpeed); + pars->edge_motion_max_speed = + xf86SetIntOption(opts, "EdgeMotionMaxSpeed", edgeMotionMaxSpeed); + pars->edge_motion_use_always = + xf86SetBoolOption(opts, "EdgeMotionUseAlways", FALSE); if (priv->has_scrollbuttons) { - pars->updown_button_scrolling = xf86SetBoolOption(opts, "UpDownScrolling", TRUE); - pars->leftright_button_scrolling = xf86SetBoolOption(opts, "LeftRightScrolling", TRUE); - pars->updown_button_repeat = xf86SetBoolOption(opts, "UpDownScrollRepeat", TRUE); - pars->leftright_button_repeat = xf86SetBoolOption(opts, "LeftRightScrollRepeat", TRUE); + pars->updown_button_scrolling = + xf86SetBoolOption(opts, "UpDownScrolling", TRUE); + pars->leftright_button_scrolling = + xf86SetBoolOption(opts, "LeftRightScrolling", TRUE); + pars->updown_button_repeat = + xf86SetBoolOption(opts, "UpDownScrollRepeat", TRUE); + pars->leftright_button_repeat = + xf86SetBoolOption(opts, "LeftRightScrollRepeat", TRUE); } - pars->scroll_button_repeat = xf86SetIntOption(opts,"ScrollButtonRepeat", 100); + pars->scroll_button_repeat = + xf86SetIntOption(opts, "ScrollButtonRepeat", 100); pars->touchpad_off = xf86SetIntOption(opts, "TouchpadOff", 0); pars->locked_drags = xf86SetBoolOption(opts, "LockedDrags", FALSE); pars->locked_drag_time = xf86SetIntOption(opts, "LockedDragTimeout", 5000); @@ -735,21 +766,27 @@ pars->tap_action[RB_TAP] = xf86SetIntOption(opts, "RBCornerButton", 0); pars->tap_action[LT_TAP] = xf86SetIntOption(opts, "LTCornerButton", 0); pars->tap_action[LB_TAP] = xf86SetIntOption(opts, "LBCornerButton", 0); - pars->tap_action[F1_TAP] = xf86SetIntOption(opts, "TapButton1", tapButton1); - pars->tap_action[F2_TAP] = xf86SetIntOption(opts, "TapButton2", tapButton2); - pars->tap_action[F3_TAP] = xf86SetIntOption(opts, "TapButton3", tapButton3); - pars->click_action[F1_CLICK1] = xf86SetIntOption(opts, "ClickFinger1", clickFinger1); - pars->click_action[F2_CLICK1] = xf86SetIntOption(opts, "ClickFinger2", clickFinger2); - pars->click_action[F3_CLICK1] = xf86SetIntOption(opts, "ClickFinger3", clickFinger3); - pars->circular_scrolling = xf86SetBoolOption(opts, "CircularScrolling", FALSE); - pars->circular_trigger = xf86SetIntOption(opts, "CircScrollTrigger", 0); - pars->circular_pad = xf86SetBoolOption(opts, "CircularPad", FALSE); - pars->palm_detect = xf86SetBoolOption(opts, "PalmDetect", FALSE); - pars->palm_min_width = xf86SetIntOption(opts, "PalmMinWidth", palmMinWidth); - pars->palm_min_z = xf86SetIntOption(opts, "PalmMinZ", palmMinZ); + pars->tap_action[F1_TAP] = xf86SetIntOption(opts, "TapButton1", tapButton1); + pars->tap_action[F2_TAP] = xf86SetIntOption(opts, "TapButton2", tapButton2); + pars->tap_action[F3_TAP] = xf86SetIntOption(opts, "TapButton3", tapButton3); + pars->click_action[F1_CLICK1] = + xf86SetIntOption(opts, "ClickFinger1", clickFinger1); + pars->click_action[F2_CLICK1] = + xf86SetIntOption(opts, "ClickFinger2", clickFinger2); + pars->click_action[F3_CLICK1] = + xf86SetIntOption(opts, "ClickFinger3", clickFinger3); + pars->circular_scrolling = + xf86SetBoolOption(opts, "CircularScrolling", FALSE); + pars->circular_trigger = xf86SetIntOption(opts, "CircScrollTrigger", 0); + pars->circular_pad = xf86SetBoolOption(opts, "CircularPad", FALSE); + pars->palm_detect = xf86SetBoolOption(opts, "PalmDetect", FALSE); + pars->palm_min_width = xf86SetIntOption(opts, "PalmMinWidth", palmMinWidth); + pars->palm_min_z = xf86SetIntOption(opts, "PalmMinZ", palmMinZ); pars->single_tap_timeout = xf86SetIntOption(opts, "SingleTapTimeout", 180); - pars->press_motion_min_z = xf86SetIntOption(opts, "PressureMotionMinZ", pressureMotionMinZ); - pars->press_motion_max_z = xf86SetIntOption(opts, "PressureMotionMaxZ", pressureMotionMaxZ); + pars->press_motion_min_z = + xf86SetIntOption(opts, "PressureMotionMinZ", pressureMotionMinZ); + pars->press_motion_max_z = + xf86SetIntOption(opts, "PressureMotionMaxZ", pressureMotionMaxZ); pars->min_speed = xf86SetRealOption(opts, "MinSpeed", 0.4); pars->max_speed = xf86SetRealOption(opts, "MaxSpeed", 0.7); @@ -758,42 +795,49 @@ pars->scroll_dist_circ = xf86SetRealOption(opts, "CircScrollDelta", 0.1); pars->coasting_speed = xf86SetRealOption(opts, "CoastingSpeed", 20.0); 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->press_motion_min_factor = + xf86SetRealOption(opts, "PressureMotionMinFactor", 1.0); + pars->press_motion_max_factor = + xf86SetRealOption(opts, "PressureMotionMaxFactor", 1.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); - pars->resolution_vert = xf86SetIntOption(opts, "VertResolution", vertResolution); + pars->tap_and_drag_gesture = + xf86SetBoolOption(opts, "TapAndDragGesture", TRUE); + pars->resolution_horiz = + xf86SetIntOption(opts, "HorizResolution", horizResolution); + pars->resolution_vert = + xf86SetIntOption(opts, "VertResolution", vertResolution); /* Warn about (and fix) incorrectly configured TopEdge/BottomEdge parameters */ if (pars->top_edge > pars->bottom_edge) { - int tmp = pars->top_edge; - pars->top_edge = pars->bottom_edge; - pars->bottom_edge = tmp; - xf86IDrvMsg(pInfo, X_WARNING, "TopEdge is bigger than BottomEdge. Fixing.\n"); + int tmp = pars->top_edge; + + pars->top_edge = pars->bottom_edge; + pars->bottom_edge = tmp; + xf86IDrvMsg(pInfo, X_WARNING, + "TopEdge is bigger than BottomEdge. Fixing.\n"); } set_softbutton_areas_option(pInfo); } #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 14 -static double SynapticsAccelerationProfile(DeviceIntPtr dev, - DeviceVelocityPtr vel, - double velocity, - double thr, - double acc) { +static double +SynapticsAccelerationProfile(DeviceIntPtr dev, + DeviceVelocityPtr vel, + double velocity, double thr, double acc) +{ #else -static float SynapticsAccelerationProfile(DeviceIntPtr dev, - DeviceVelocityPtr vel, - float velocity_f, - float thr_f, - float acc_f) { +static float +SynapticsAccelerationProfile(DeviceIntPtr dev, + DeviceVelocityPtr vel, + float velocity_f, float thr_f, float acc_f) +{ double velocity = velocity_f; double acc = acc_f; #endif InputInfoPtr pInfo = dev->public.devicePrivate; SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private); - SynapticsParameters* para = &priv->synpara; + SynapticsParameters *para = &priv->synpara; double accelfct; @@ -808,23 +852,28 @@ /* clip acceleration factor */ if (accelfct > para->max_speed * acc) - accelfct = para->max_speed * acc; + accelfct = para->max_speed * acc; else if (accelfct < para->min_speed) - accelfct = para->min_speed; + accelfct = para->min_speed; /* modify speed according to pressure */ if (priv->moving_state == MS_TOUCHPAD_RELATIVE) { - 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 (priv->hwState->z <= minZ) { - accelfct *= minFctr; - } else if (priv->hwState->z >= maxZ) { - accelfct *= maxFctr; - } else { - accelfct *= minFctr + (priv->hwState->z - minZ) * (maxFctr - minFctr) / (maxZ - minZ); - } + 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 (priv->hwState->z <= minZ) { + accelfct *= minFctr; + } + else if (priv->hwState->z >= maxZ) { + accelfct *= maxFctr; + } + else { + accelfct *= + minFctr + (priv->hwState->z - minZ) * (maxFctr - + minFctr) / (maxZ - minZ); + } } return accelfct; @@ -832,7 +881,8 @@ #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12 static int -NewSynapticsPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags); + NewSynapticsPreInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags); + /* * called by the module loader for initialization */ @@ -844,17 +894,17 @@ /* Allocate a new InputInfoRec and add it to the head xf86InputDevs. */ pInfo = xf86AllocateInput(drv, 0); if (!pInfo) { - return NULL; + return NULL; } /* initialize the InputInfoRec */ - pInfo->name = dev->identifier; + pInfo->name = dev->identifier; pInfo->reverse_conversion_proc = NULL; - pInfo->dev = NULL; - pInfo->private_flags = 0; - pInfo->flags = XI86_SEND_DRAG_EVENTS; - pInfo->conf_idev = dev; - pInfo->always_core_feedback = 0; + pInfo->dev = NULL; + pInfo->private_flags = 0; + pInfo->flags = XI86_SEND_DRAG_EVENTS; + pInfo->conf_idev = dev; + pInfo->always_core_feedback = 0; xf86CollectInputOptions(pInfo, NULL, NULL); @@ -878,25 +928,26 @@ /* allocate memory for SynapticsPrivateRec */ priv = calloc(1, sizeof(SynapticsPrivate)); if (!priv) - return BadAlloc; + return BadAlloc; - pInfo->type_name = XI_TOUCHPAD; - pInfo->device_control = DeviceControl; - pInfo->read_input = ReadInput; - pInfo->control_proc = ControlProc; - pInfo->switch_mode = SwitchMode; - pInfo->private = priv; + pInfo->type_name = XI_TOUCHPAD; + pInfo->device_control = DeviceControl; + pInfo->read_input = ReadInput; + pInfo->control_proc = ControlProc; + pInfo->switch_mode = SwitchMode; + pInfo->private = priv; /* allocate now so we don't allocate in the signal handler */ priv->timer = TimerSet(NULL, 0, 0, NULL, NULL); if (!priv->timer) { - free(priv); - return BadAlloc; + free(priv); + return BadAlloc; } /* may change pInfo->options */ if (!SetDeviceAndProtocol(pInfo)) { - xf86IDrvMsg(pInfo, X_ERROR, "Synaptics driver unable to detect protocol\n"); + xf86IDrvMsg(pInfo, X_ERROR, + "Synaptics driver unable to detect protocol\n"); goto SetupProc_fail; } @@ -905,8 +956,8 @@ /* open the touchpad device */ pInfo->fd = xf86OpenSerial(pInfo->options); if (pInfo->fd == -1) { - xf86IDrvMsg(pInfo, X_ERROR, "Synaptics driver unable to open device\n"); - goto SetupProc_fail; + xf86IDrvMsg(pInfo, X_ERROR, "Synaptics driver unable to open device\n"); + goto SetupProc_fail; } xf86ErrorFVerb(6, "port opened successfully\n"); @@ -932,23 +983,24 @@ CalculateScalingCoeffs(priv); if (!alloc_shm_data(pInfo)) - goto SetupProc_fail; + goto SetupProc_fail; priv->comm.buffer = XisbNew(pInfo->fd, INPUT_BUFFER_SIZE); if (!QueryHardware(pInfo)) { - xf86IDrvMsg(pInfo, X_ERROR, "Unable to query/initialize Synaptics hardware.\n"); - goto SetupProc_fail; + xf86IDrvMsg(pInfo, X_ERROR, + "Unable to query/initialize Synaptics hardware.\n"); + goto SetupProc_fail; } xf86ProcessCommonOptions(pInfo, pInfo->options); if (pInfo->fd != -1) { - if (priv->comm.buffer) { - XisbFree(priv->comm.buffer); - priv->comm.buffer = NULL; - } - xf86CloseSerial(pInfo->fd); + if (priv->comm.buffer) { + XisbFree(priv->comm.buffer); + priv->comm.buffer = NULL; + } + xf86CloseSerial(pInfo->fd); } pInfo->fd = -1; @@ -956,12 +1008,12 @@ SetupProc_fail: if (pInfo->fd >= 0) { - xf86CloseSerial(pInfo->fd); - pInfo->fd = -1; + xf86CloseSerial(pInfo->fd); + pInfo->fd = -1; } if (priv->comm.buffer) - XisbFree(priv->comm.buffer); + XisbFree(priv->comm.buffer); free_shm_data(priv); free(priv->proto_data); free(priv->timer); @@ -970,15 +1022,14 @@ return BadAlloc; } - /* * Uninitialize the device. */ -static void SynapticsUnInit(InputDriverPtr drv, - InputInfoPtr pInfo, - int flags) +static void +SynapticsUnInit(InputDriverPtr drv, InputInfoPtr pInfo, int flags) { - SynapticsPrivate *priv = ((SynapticsPrivate *)pInfo->private); + SynapticsPrivate *priv = ((SynapticsPrivate *) pInfo->private); + if (priv && priv->timer) free(priv->timer); if (priv && priv->proto_data) @@ -996,13 +1047,12 @@ xf86DeleteInput(pInfo, 0); } - /* * Alter the control parameters for the mouse. Note that all special * protocol values are handled by dix. */ static void -SynapticsCtrl(DeviceIntPtr device, PtrCtrl *ctrl) +SynapticsCtrl(DeviceIntPtr device, PtrCtrl * ctrl) { } @@ -1013,19 +1063,19 @@ switch (mode) { case DEVICE_INIT: - RetValue = DeviceInit(dev); - break; + RetValue = DeviceInit(dev); + break; case DEVICE_ON: - RetValue = DeviceOn(dev); - break; + RetValue = DeviceOn(dev); + break; case DEVICE_OFF: - RetValue = DeviceOff(dev); - break; + RetValue = DeviceOff(dev); + break; case DEVICE_CLOSE: - RetValue = DeviceClose(dev); - break; + RetValue = DeviceClose(dev); + break; default: - RetValue = BadValue; + RetValue = BadValue; } return RetValue; @@ -1041,8 +1091,8 @@ pInfo->fd = xf86OpenSerial(pInfo->options); if (pInfo->fd == -1) { - xf86IDrvMsg(pInfo, X_WARNING, "cannot open input device\n"); - return !Success; + xf86IDrvMsg(pInfo, X_WARNING, "cannot open input device\n"); + return !Success; } if (priv->proto_ops->DeviceOnHook && @@ -1051,16 +1101,15 @@ priv->comm.buffer = XisbNew(pInfo->fd, INPUT_BUFFER_SIZE); if (!priv->comm.buffer) { - xf86CloseSerial(pInfo->fd); - pInfo->fd = -1; - return !Success; + xf86CloseSerial(pInfo->fd); + pInfo->fd = -1; + return !Success; } xf86FlushInput(pInfo->fd); /* reinit the pad */ - if (!QueryHardware(pInfo)) - { + if (!QueryHardware(pInfo)) { XisbFree(priv->comm.buffer); priv->comm.buffer = NULL; xf86CloseSerial(pInfo->fd); @@ -1075,7 +1124,7 @@ } static void -SynapticsReset(SynapticsPrivate *priv) +SynapticsReset(SynapticsPrivate * priv) { SynapticsResetHwState(priv->hwState); SynapticsResetHwState(priv->local_hw_state); @@ -1104,9 +1153,11 @@ priv->lastButtons = 0; priv->prev_z = 0; priv->prevFingers = 0; +#ifdef HAVE_MULTITOUCH + memset(priv->open_slots, 0, priv->num_slots * sizeof(int)); +#endif } - static Bool DeviceOff(DeviceIntPtr dev) { @@ -1117,19 +1168,19 @@ DBG(3, "Synaptics DeviceOff called\n"); if (pInfo->fd != -1) { - TimerCancel(priv->timer); - xf86RemoveEnabledDevice(pInfo); - SynapticsReset(priv); + TimerCancel(priv->timer); + xf86RemoveEnabledDevice(pInfo); + SynapticsReset(priv); if (priv->proto_ops->DeviceOffHook && !priv->proto_ops->DeviceOffHook(pInfo)) rc = !Success; - if (priv->comm.buffer) { - XisbFree(priv->comm.buffer); - priv->comm.buffer = NULL; - } - xf86CloseSerial(pInfo->fd); - pInfo->fd = -1; + if (priv->comm.buffer) { + XisbFree(priv->comm.buffer); + priv->comm.buffer = NULL; + } + xf86CloseSerial(pInfo->fd); + pInfo->fd = -1; } dev->public.on = FALSE; return rc; @@ -1153,61 +1204,60 @@ return RetValue; } -static void InitAxesLabels(Atom *labels, int nlabels, - const SynapticsPrivate *priv) +static void +InitAxesLabels(Atom *labels, int nlabels, const SynapticsPrivate * priv) { #ifdef HAVE_MULTITOUCH int i; #endif memset(labels, 0, nlabels * sizeof(Atom)); - switch(nlabels) - { - default: + 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: - labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X); - break; + 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: + labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X); + break; } #ifdef HAVE_MULTITOUCH - for (i = 0; i < priv->num_mt_axes; i++) - { + for (i = 0; i < priv->num_mt_axes; i++) { SynapticsTouchAxisRec *axis = &priv->touch_axes[i]; int axnum = nlabels - priv->num_mt_axes + i; + labels[axnum] = XIGetKnownProperty(axis->label); } #endif } -static void InitButtonLabels(Atom *labels, int nlabels) +static void +InitButtonLabels(Atom *labels, int nlabels) { memset(labels, 0, nlabels * sizeof(Atom)); - switch(nlabels) - { - default: - case 7: - labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT); - case 6: - labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT); - case 5: - labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN); - case 4: - labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP); - case 3: - labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT); - case 2: - labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE); - case 1: - labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT); - break; + switch (nlabels) { + default: + case 7: + labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT); + case 6: + labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT); + case 5: + labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN); + case 4: + labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP); + case 3: + labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT); + case 2: + labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE); + case 1: + labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT); + break; } } @@ -1219,13 +1269,12 @@ SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private); int i; - if (priv->has_touch) - { - priv->num_slots = priv->max_touches ? priv->max_touches : SYNAPTICS_MAX_TOUCHES; + if (priv->has_touch) { + priv->num_slots = + priv->max_touches ? priv->max_touches : SYNAPTICS_MAX_TOUCHES; priv->open_slots = malloc(priv->num_slots * sizeof(int)); - if (!priv->open_slots) - { + if (!priv->open_slots) { xf86IDrvMsg(pInfo, X_ERROR, "failed to allocate open touch slots array\n"); priv->has_touch = 0; @@ -1235,8 +1284,8 @@ /* x/y + whatever other MT axes we found */ if (!InitTouchClassDeviceStruct(dev, priv->max_touches, - XIDependentTouch, 2 + priv->num_mt_axes)) - { + XIDependentTouch, + 2 + priv->num_mt_axes)) { xf86IDrvMsg(pInfo, X_ERROR, "failed to initialize touch class device\n"); priv->has_touch = 0; @@ -1246,15 +1295,13 @@ return; } - for (i = 0; i < priv->num_mt_axes; i++) - { + for (i = 0; i < priv->num_mt_axes; i++) { SynapticsTouchAxisRec *axis = &priv->touch_axes[i]; - int axnum = 4 + i; /* Skip x, y, and scroll axes */ + int axnum = 4 + i; /* Skip x, y, and scroll axes */ if (!xf86InitValuatorAxisStruct(dev, axnum, axes_labels[axnum], axis->min, axis->max, axis->res, 0, - axis->res, Absolute)) - { + axis->res, Absolute)) { xf86IDrvMsg(pInfo, X_WARNING, "failed to initialize axis %s, skipping\n", axis->label); @@ -1291,8 +1338,7 @@ #endif axes_labels = calloc(num_axes, sizeof(Atom)); - if (!axes_labels) - { + if (!axes_labels) { xf86IDrvMsg(pInfo, X_ERROR, "failed to allocate axis labels\n"); return !Success; } @@ -1303,17 +1349,15 @@ DBG(3, "Synaptics DeviceInit called\n"); for (i = 0; i <= SYN_MAX_BUTTONS; i++) - map[i] = i; + map[i] = i; dev->public.on = FALSE; - InitPointerDeviceStruct((DevicePtr)dev, map, - SYN_MAX_BUTTONS, + InitPointerDeviceStruct((DevicePtr) dev, map, + SYN_MAX_BUTTONS, btn_labels, - SynapticsCtrl, - GetMotionHistorySize(), - num_axes, - axes_labels); + SynapticsCtrl, + GetMotionHistorySize(), num_axes, axes_labels); /* * setup dix acceleration to match legacy synaptics settings, and @@ -1321,77 +1365,76 @@ * acceleration. */ if (NULL != (pVel = GetDevicePredictableAccelData(dev))) { - SetDeviceSpecificAccelerationProfile(pVel, - SynapticsAccelerationProfile); + SetDeviceSpecificAccelerationProfile(pVel, + SynapticsAccelerationProfile); - /* float property type */ - float_type = XIGetKnownProperty(XATOM_FLOAT); + /* float property type */ + float_type = XIGetKnownProperty(XATOM_FLOAT); - /* translate MinAcc to constant deceleration. - * May be overridden in xf86InitValuatorDefaults */ - tmpf = 1.0 / priv->synpara.min_speed; - - xf86IDrvMsg(pInfo, X_CONFIG, "(accel) MinSpeed is now constant deceleration " - "%.1f\n", tmpf); - prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION); - XIChangeDeviceProperty(dev, prop, float_type, 32, - PropModeReplace, 1, &tmpf, FALSE); - - /* adjust accordingly */ - priv->synpara.max_speed /= priv->synpara.min_speed; - priv->synpara.min_speed = 1.0; - - /* synaptics seems to report 80 packet/s, but dix scales for - * 100 packet/s by default. */ - pVel->corr_mul = 12.5f; /*1000[ms]/80[/s] = 12.5 */ - - xf86IDrvMsg(pInfo, X_CONFIG, "MaxSpeed is now %.2f\n", - priv->synpara.max_speed); - xf86IDrvMsg(pInfo, X_CONFIG, "AccelFactor is now %.3f\n", - priv->synpara.accl); - - prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER); - i = AccelProfileDeviceSpecific; - XIChangeDeviceProperty(dev, prop, XA_INTEGER, 32, - PropModeReplace, 1, &i, FALSE); + /* translate MinAcc to constant deceleration. + * May be overridden in xf86InitValuatorDefaults */ + tmpf = 1.0 / priv->synpara.min_speed; + + xf86IDrvMsg(pInfo, X_CONFIG, + "(accel) MinSpeed is now constant deceleration " "%.1f\n", + tmpf); + prop = XIGetKnownProperty(ACCEL_PROP_CONSTANT_DECELERATION); + XIChangeDeviceProperty(dev, prop, float_type, 32, + PropModeReplace, 1, &tmpf, FALSE); + + /* adjust accordingly */ + priv->synpara.max_speed /= priv->synpara.min_speed; + priv->synpara.min_speed = 1.0; + + /* synaptics seems to report 80 packet/s, but dix scales for + * 100 packet/s by default. */ + pVel->corr_mul = 12.5f; /*1000[ms]/80[/s] = 12.5 */ + + xf86IDrvMsg(pInfo, X_CONFIG, "MaxSpeed is now %.2f\n", + priv->synpara.max_speed); + xf86IDrvMsg(pInfo, X_CONFIG, "AccelFactor is now %.3f\n", + priv->synpara.accl); + + prop = XIGetKnownProperty(ACCEL_PROP_PROFILE_NUMBER); + i = AccelProfileDeviceSpecific; + XIChangeDeviceProperty(dev, prop, XA_INTEGER, 32, + PropModeReplace, 1, &i, FALSE); } /* X valuator */ - if (priv->minx < priv->maxx) - { + if (priv->minx < priv->maxx) { min = priv->minx; max = priv->maxx; - } else - { + } + else { min = 0; max = -1; } xf86InitValuatorAxisStruct(dev, 0, axes_labels[0], - min, max, priv->resx * 1000, 0, priv->resx * 1000 + min, max, priv->resx * 1000, 0, priv->resx * 1000 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 - , Relative + , Relative #endif - ); + ); xf86InitValuatorDefaults(dev, 0); /* Y valuator */ - if (priv->miny < priv->maxy) - { + if (priv->miny < priv->maxy) { min = priv->miny; max = priv->maxy; - } else - { + } + else { min = 0; max = -1; } xf86InitValuatorAxisStruct(dev, 1, axes_labels[1], - min, max, priv->resy * 1000, 0, priv->resy * 1000 + min, max, priv->resy * 1000, 0, priv->resy * 1000 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 - , Relative + , Relative #endif - ); + ); xf86InitValuatorDefaults(dev, 1); #ifdef HAVE_SMOOTH_SCROLL @@ -1402,8 +1445,7 @@ Relative); priv->scroll_axis_vert = 3; priv->scroll_events_mask = valuator_mask_new(MAX_VALUATORS); - if (!priv->scroll_events_mask) - { + if (!priv->scroll_events_mask) { free(axes_labels); return !Success; } @@ -1428,7 +1470,7 @@ priv->local_hw_state = SynapticsHwStateAlloc(priv); if (!priv->local_hw_state) - goto fail; + goto fail; priv->comm.hwState = SynapticsHwStateAlloc(priv); @@ -1440,7 +1482,7 @@ return Success; -fail: + fail: free_shm_data(priv); free(priv->local_hw_state); free(priv->hwState); @@ -1450,15 +1492,14 @@ return !Success; } - /* * Convert from absolute X/Y coordinates to a coordinate system where * -1 corresponds to the left/upper edge and +1 corresponds to the * right/lower edge. */ static void -relative_coords(SynapticsPrivate *priv, int x, int y, - double *relX, double *relY) +relative_coords(SynapticsPrivate * priv, int x, int y, + double *relX, double *relY) { int minX = priv->synpara.left_edge; int maxX = priv->synpara.right_edge; @@ -1468,17 +1509,18 @@ double yCenter = (minY + maxY) / 2.0; if ((maxX - xCenter > 0) && (maxY - yCenter > 0)) { - *relX = (x - xCenter) / (maxX - xCenter); - *relY = (y - yCenter) / (maxY - yCenter); - } else { - *relX = 0; - *relY = 0; + *relX = (x - xCenter) / (maxX - xCenter); + *relY = (y - yCenter) / (maxY - yCenter); + } + else { + *relX = 0; + *relY = 0; } } /* return angle of point relative to center */ static double -angle(SynapticsPrivate *priv, int x, int y) +angle(SynapticsPrivate * priv, int x, int y) { double xCenter = (priv->synpara.left_edge + priv->synpara.right_edge) / 2.0; double yCenter = (priv->synpara.top_edge + priv->synpara.bottom_edge) / 2.0; @@ -1491,15 +1533,16 @@ diffa(double a1, double a2) { double da = fmod(a2 - a1, 2 * M_PI); + if (da < 0) - da += 2 * M_PI; + da += 2 * M_PI; if (da > M_PI) - da -= 2 * M_PI; + da -= 2 * M_PI; return da; } static edge_type -circular_edge_detection(SynapticsPrivate *priv, int x, int y) +circular_edge_detection(SynapticsPrivate * priv, int x, int y) { edge_type edge = 0; double relX, relY, relR; @@ -1508,38 +1551,38 @@ relR = SQR(relX) + SQR(relY); if (relR > 1) { - /* we are outside the ellipse enclosed by the edge parameters */ - if (relX > M_SQRT1_2) - edge |= RIGHT_EDGE; - else if (relX < -M_SQRT1_2) - edge |= LEFT_EDGE; - - if (relY < -M_SQRT1_2) - edge |= TOP_EDGE; - else if (relY > M_SQRT1_2) - edge |= BOTTOM_EDGE; + /* we are outside the ellipse enclosed by the edge parameters */ + if (relX > M_SQRT1_2) + edge |= RIGHT_EDGE; + else if (relX < -M_SQRT1_2) + edge |= LEFT_EDGE; + + if (relY < -M_SQRT1_2) + edge |= TOP_EDGE; + else if (relY > M_SQRT1_2) + edge |= BOTTOM_EDGE; } return edge; } static edge_type -edge_detection(SynapticsPrivate *priv, int x, int y) +edge_detection(SynapticsPrivate * priv, int x, int y) { edge_type edge = NO_EDGE; if (priv->synpara.circular_pad) - return circular_edge_detection(priv, x, y); + return circular_edge_detection(priv, x, y); if (x > priv->synpara.right_edge) - edge |= RIGHT_EDGE; + edge |= RIGHT_EDGE; else if (x < priv->synpara.left_edge) - edge |= LEFT_EDGE; + edge |= LEFT_EDGE; if (y < priv->synpara.top_edge) - edge |= TOP_EDGE; + edge |= TOP_EDGE; else if (y > priv->synpara.bottom_edge) - edge |= BOTTOM_EDGE; + edge |= BOTTOM_EDGE; return edge; } @@ -1550,25 +1593,28 @@ * all set to zero), the function returns TRUE. */ static Bool -is_inside_active_area(SynapticsPrivate *priv, int x, int y) +is_inside_active_area(SynapticsPrivate * priv, int x, int y) { Bool inside_area = TRUE; - if ((priv->synpara.area_left_edge != 0) && (x < priv->synpara.area_left_edge)) - inside_area = FALSE; - else if ((priv->synpara.area_right_edge != 0) && (x > priv->synpara.area_right_edge)) - inside_area = FALSE; + if ((priv->synpara.area_left_edge != 0) && + (x < priv->synpara.area_left_edge)) + inside_area = FALSE; + else if ((priv->synpara.area_right_edge != 0) && + (x > priv->synpara.area_right_edge)) + inside_area = FALSE; if ((priv->synpara.area_top_edge != 0) && (y < priv->synpara.area_top_edge)) - inside_area = FALSE; - else if ((priv->synpara.area_bottom_edge != 0) && (y > priv->synpara.area_bottom_edge)) - inside_area = FALSE; + inside_area = FALSE; + else if ((priv->synpara.area_bottom_edge != 0) && + (y > priv->synpara.area_bottom_edge)) + inside_area = FALSE; return inside_area; } static Bool -is_inside_button_area(SynapticsParameters *para, int which, int x, int y) +is_inside_button_area(SynapticsParameters * para, int which, int x, int y) { Bool inside_area = TRUE; @@ -1580,28 +1626,28 @@ if (para->softbutton_areas[which][0] && x < para->softbutton_areas[which][0]) - inside_area = FALSE; + inside_area = FALSE; else if (para->softbutton_areas[which][1] && x > para->softbutton_areas[which][1]) - inside_area = FALSE; + inside_area = FALSE; else if (para->softbutton_areas[which][2] && y < para->softbutton_areas[which][2]) - inside_area = FALSE; + inside_area = FALSE; else if (para->softbutton_areas[which][3] && y > para->softbutton_areas[which][3]) - inside_area = FALSE; + inside_area = FALSE; return inside_area; } static Bool -is_inside_rightbutton_area(SynapticsParameters *para, int x, int y) +is_inside_rightbutton_area(SynapticsParameters * para, int x, int y) { return is_inside_button_area(para, 0, x, y); } static Bool -is_inside_middlebutton_area(SynapticsParameters *para, int x, int y) +is_inside_middlebutton_area(SynapticsParameters * para, int x, int y) { return is_inside_button_area(para, 1, x, y); } @@ -1634,16 +1680,16 @@ clamp(int val, int min, int max) { if (val < min) - return min; + return min; else if (val < max) - return val; + return val; else - return max; + return max; } static Bool -SynapticsGetHwState(InputInfoPtr pInfo, SynapticsPrivate *priv, - struct SynapticsHwState *hw) +SynapticsGetHwState(InputInfoPtr pInfo, SynapticsPrivate * priv, + struct SynapticsHwState *hw) { return priv->proto_ops->ReadHwState(pInfo, &priv->comm, hw); } @@ -1662,31 +1708,32 @@ SynapticsResetTouchHwState(hw, FALSE); while (SynapticsGetHwState(pInfo, priv, hw)) { - /* Semi-mt device touch slots do not track touches. When there is a - * change in the number of touches, we must disregard the temporary - * motion changes. */ - if (priv->has_semi_mt && hw->numFingers != priv->hwState->numFingers) { - hw->cumulative_dx = priv->hwState->cumulative_dx; - hw->cumulative_dy = priv->hwState->cumulative_dy; - } - - /* timer may cause actual events to lag behind (#48777) */ - if (priv->hwState->millis > hw->millis) - hw->millis = priv->hwState->millis; - - SynapticsCopyHwState(priv->hwState, hw); - delay = HandleState(pInfo, hw, hw->millis, FALSE); - newDelay = TRUE; + /* Semi-mt device touch slots do not track touches. When there is a + * change in the number of touches, we must disregard the temporary + * motion changes. */ + if (priv->has_semi_mt && hw->numFingers != priv->hwState->numFingers) { + hw->cumulative_dx = priv->hwState->cumulative_dx; + hw->cumulative_dy = priv->hwState->cumulative_dy; + } + + /* timer may cause actual events to lag behind (#48777) */ + if (priv->hwState->millis > hw->millis) + hw->millis = priv->hwState->millis; + + SynapticsCopyHwState(priv->hwState, hw); + delay = HandleState(pInfo, hw, hw->millis, FALSE); + newDelay = TRUE; } if (newDelay) { - priv->timer_time = GetTimeInMillis(); - priv->timer = TimerSet(priv->timer, 0, delay, timerFunc, pInfo); + priv->timer_time = GetTimeInMillis(); + priv->timer = TimerSet(priv->timer, 0, delay, timerFunc, pInfo); } } static int -HandleMidButtonEmulation(SynapticsPrivate *priv, struct SynapticsHwState *hw, CARD32 now, int *delay) +HandleMidButtonEmulation(SynapticsPrivate * priv, struct SynapticsHwState *hw, + CARD32 now, int *delay) { SynapticsParameters *para = &priv->synpara; Bool done = FALSE; @@ -1697,83 +1744,95 @@ return mid; while (!done) { - switch (priv->mid_emu_state) { - case MBE_LEFT_CLICK: - case MBE_RIGHT_CLICK: - case MBE_OFF: - priv->button_delay_millis = now; - if (hw->left) { - priv->mid_emu_state = MBE_LEFT; - } else if (hw->right) { - priv->mid_emu_state = MBE_RIGHT; - } else { - done = TRUE; - } - break; - case MBE_LEFT: - timeleft = TIME_DIFF(priv->button_delay_millis + para->emulate_mid_button_time, - now); - if (timeleft > 0) - *delay = MIN(*delay, timeleft); + switch (priv->mid_emu_state) { + case MBE_LEFT_CLICK: + case MBE_RIGHT_CLICK: + case MBE_OFF: + priv->button_delay_millis = now; + if (hw->left) { + priv->mid_emu_state = MBE_LEFT; + } + else if (hw->right) { + priv->mid_emu_state = MBE_RIGHT; + } + else { + done = TRUE; + } + break; + case MBE_LEFT: + timeleft = + TIME_DIFF(priv->button_delay_millis + + para->emulate_mid_button_time, now); + if (timeleft > 0) + *delay = MIN(*delay, timeleft); /* timeout, but within the same ReadInput cycle! */ if ((timeleft <= 0) && !hw->left) { - priv->mid_emu_state = MBE_LEFT_CLICK; - done = TRUE; - } else if ((!hw->left) || (timeleft <= 0)) { - hw->left = TRUE; - priv->mid_emu_state = MBE_TIMEOUT; - done = TRUE; - } else if (hw->right) { - priv->mid_emu_state = MBE_MID; - } else { - hw->left = FALSE; - done = TRUE; - } - break; - case MBE_RIGHT: - timeleft = TIME_DIFF(priv->button_delay_millis + para->emulate_mid_button_time, - now); - if (timeleft > 0) - *delay = MIN(*delay, timeleft); + priv->mid_emu_state = MBE_LEFT_CLICK; + done = TRUE; + } + else if ((!hw->left) || (timeleft <= 0)) { + hw->left = TRUE; + priv->mid_emu_state = MBE_TIMEOUT; + done = TRUE; + } + else if (hw->right) { + priv->mid_emu_state = MBE_MID; + } + else { + hw->left = FALSE; + done = TRUE; + } + break; + case MBE_RIGHT: + timeleft = + TIME_DIFF(priv->button_delay_millis + + para->emulate_mid_button_time, now); + if (timeleft > 0) + *delay = MIN(*delay, timeleft); - /* timeout, but within the same ReadInput cycle! */ + /* timeout, but within the same ReadInput cycle! */ if ((timeleft <= 0) && !hw->right) { - priv->mid_emu_state = MBE_RIGHT_CLICK; - done = TRUE; - } else if (!hw->right || (timeleft <= 0)) { - hw->right = TRUE; - priv->mid_emu_state = MBE_TIMEOUT; - done = TRUE; - } else if (hw->left) { - priv->mid_emu_state = MBE_MID; - } else { - hw->right = FALSE; - done = TRUE; - } - break; - case MBE_MID: - if (!hw->left && !hw->right) { - priv->mid_emu_state = MBE_OFF; - } else { - mid = TRUE; - hw->left = hw->right = FALSE; - done = TRUE; - } - break; - case MBE_TIMEOUT: - if (!hw->left && !hw->right) { - priv->mid_emu_state = MBE_OFF; - } else { - done = TRUE; - } - } + priv->mid_emu_state = MBE_RIGHT_CLICK; + done = TRUE; + } + else if (!hw->right || (timeleft <= 0)) { + hw->right = TRUE; + priv->mid_emu_state = MBE_TIMEOUT; + done = TRUE; + } + else if (hw->left) { + priv->mid_emu_state = MBE_MID; + } + else { + hw->right = FALSE; + done = TRUE; + } + break; + case MBE_MID: + if (!hw->left && !hw->right) { + priv->mid_emu_state = MBE_OFF; + } + else { + mid = TRUE; + hw->left = hw->right = FALSE; + done = TRUE; + } + break; + case MBE_TIMEOUT: + if (!hw->left && !hw->right) { + priv->mid_emu_state = MBE_OFF; + } + else { + done = TRUE; + } + } } return mid; } static enum FingerState -SynapticsDetectFinger(SynapticsPrivate *priv, struct SynapticsHwState *hw) +SynapticsDetectFinger(SynapticsPrivate * priv, struct SynapticsHwState *hw) { SynapticsParameters *para = &priv->synpara; enum FingerState finger; @@ -1790,10 +1849,10 @@ else if (hw->z > para->finger_high && priv->finger_state == FS_UNTOUCHED) finger = FS_TOUCHED; else - finger = priv->finger_state; + finger = priv->finger_state; if (!para->palm_detect) - return finger; + return finger; /* palm detection */ @@ -1801,24 +1860,24 @@ return FS_BLOCKED; if (hw->x == 0 || priv->finger_state == FS_UNTOUCHED) - priv->avg_width = 0; + priv->avg_width = 0; else - priv->avg_width += (hw->fingerWidth - priv->avg_width + 1) / 2; + priv->avg_width += (hw->fingerWidth - priv->avg_width + 1) / 2; if (finger != FS_UNTOUCHED && priv->finger_state == FS_UNTOUCHED) { - int safe_width = MAX(hw->fingerWidth, priv->avg_width); + int safe_width = MAX(hw->fingerWidth, priv->avg_width); - if (hw->numFingers > 1 || /* more than one finger -> not a palm */ - ((safe_width < 6) && (priv->prev_z < para->finger_high)) || /* thin finger, distinct touch -> not a palm */ - ((safe_width < 7) && (priv->prev_z < para->finger_high / 2)))/* thin finger, distinct touch -> not a palm */ - { - /* leave finger value as is */ - } else if (hw->z > priv->prev_z + 1) /* z not stable, may be a palm */ - finger = FS_UNTOUCHED; - else if (hw->z < priv->prev_z - 5) /* z not stable, may be a palm */ - finger = FS_UNTOUCHED; - else if (hw->fingerWidth > para->palm_min_width) /* finger width too large -> probably palm */ - finger = FS_UNTOUCHED; + if (hw->numFingers > 1 || /* more than one finger -> not a palm */ + ((safe_width < 6) && (priv->prev_z < para->finger_high)) || /* thin finger, distinct touch -> not a palm */ + ((safe_width < 7) && (priv->prev_z < para->finger_high / 2))) { /* thin finger, distinct touch -> not a palm */ + /* leave finger value as is */ + } + else if (hw->z > priv->prev_z + 1) /* z not stable, may be a palm */ + finger = FS_UNTOUCHED; + else if (hw->z < priv->prev_z - 5) /* z not stable, may be a palm */ + finger = FS_UNTOUCHED; + else if (hw->fingerWidth > para->palm_min_width) /* finger width too large -> probably palm */ + finger = FS_UNTOUCHED; } priv->prev_z = hw->z; @@ -1826,48 +1885,48 @@ } static void -SelectTapButton(SynapticsPrivate *priv, edge_type edge) +SelectTapButton(SynapticsPrivate * priv, edge_type edge) { TapEvent tap; if (priv->synpara.touchpad_off == 2) { - priv->tap_button = 0; - return; + priv->tap_button = 0; + return; } switch (priv->tap_max_fingers) { case 1: - switch (edge) { - case RIGHT_TOP_EDGE: - DBG(7, "right top edge\n"); - tap = RT_TAP; - break; - case RIGHT_BOTTOM_EDGE: - DBG(7, "right bottom edge\n"); - tap = RB_TAP; - break; - case LEFT_TOP_EDGE: - DBG(7, "left top edge\n"); - tap = LT_TAP; - break; - case LEFT_BOTTOM_EDGE: - DBG(7, "left bottom edge\n"); - tap = LB_TAP; - break; - default: - DBG(7, "no edge\n"); - tap = F1_TAP; - break; - } - break; + switch (edge) { + case RIGHT_TOP_EDGE: + DBG(7, "right top edge\n"); + tap = RT_TAP; + break; + case RIGHT_BOTTOM_EDGE: + DBG(7, "right bottom edge\n"); + tap = RB_TAP; + break; + case LEFT_TOP_EDGE: + DBG(7, "left top edge\n"); + tap = LT_TAP; + break; + case LEFT_BOTTOM_EDGE: + DBG(7, "left bottom edge\n"); + tap = LB_TAP; + break; + default: + DBG(7, "no edge\n"); + tap = F1_TAP; + break; + } + break; case 2: - DBG(7, "two finger tap\n"); - tap = F2_TAP; - break; + DBG(7, "two finger tap\n"); + tap = F2_TAP; + break; case 3: - DBG(7, "three finger tap\n"); - tap = F3_TAP; - break; + DBG(7, "three finger tap\n"); + tap = F3_TAP; + break; default: priv->tap_button = 0; return; @@ -1878,58 +1937,62 @@ } static void -SetTapState(SynapticsPrivate *priv, enum TapState tap_state, CARD32 millis) +SetTapState(SynapticsPrivate * priv, enum TapState tap_state, CARD32 millis) { SynapticsParameters *para = &priv->synpara; - DBG(3, "SetTapState - %d -> %d (millis:%u)\n", priv->tap_state, tap_state, millis); + + DBG(3, "SetTapState - %d -> %d (millis:%u)\n", priv->tap_state, tap_state, + millis); switch (tap_state) { case TS_START: - priv->tap_button_state = TBS_BUTTON_UP; - priv->tap_max_fingers = 0; - break; + priv->tap_button_state = TBS_BUTTON_UP; + priv->tap_max_fingers = 0; + break; case TS_1: - priv->tap_button_state = TBS_BUTTON_UP; - break; + priv->tap_button_state = TBS_BUTTON_UP; + break; case TS_2A: - if (para->fast_taps) - priv->tap_button_state = TBS_BUTTON_DOWN; - else - priv->tap_button_state = TBS_BUTTON_UP; - break; + if (para->fast_taps) + priv->tap_button_state = TBS_BUTTON_DOWN; + else + priv->tap_button_state = TBS_BUTTON_UP; + break; case TS_2B: - priv->tap_button_state = TBS_BUTTON_UP; - break; + priv->tap_button_state = TBS_BUTTON_UP; + break; case TS_3: - priv->tap_button_state = TBS_BUTTON_DOWN; - break; + priv->tap_button_state = TBS_BUTTON_DOWN; + break; case TS_SINGLETAP: - if (para->fast_taps) - priv->tap_button_state = TBS_BUTTON_UP; - else - priv->tap_button_state = TBS_BUTTON_DOWN; - priv->touch_on.millis = millis; - break; + if (para->fast_taps) + priv->tap_button_state = TBS_BUTTON_UP; + else + priv->tap_button_state = TBS_BUTTON_DOWN; + priv->touch_on.millis = millis; + break; default: - break; + break; } priv->tap_state = tap_state; } static void -SetMovingState(SynapticsPrivate *priv, enum MovingState moving_state, CARD32 millis) +SetMovingState(SynapticsPrivate * priv, enum MovingState moving_state, + CARD32 millis) { - DBG(7, "SetMovingState - %d -> %d center at %d/%d (millis:%u)\n", priv->moving_state, - moving_state,priv->hwState->x, priv->hwState->y, millis); + DBG(7, "SetMovingState - %d -> %d center at %d/%d (millis:%u)\n", + priv->moving_state, moving_state, priv->hwState->x, priv->hwState->y, + millis); if (moving_state == MS_TRACKSTICK) { - priv->trackstick_neutral_x = priv->hwState->x; - priv->trackstick_neutral_y = priv->hwState->y; + priv->trackstick_neutral_x = priv->hwState->x; + priv->trackstick_neutral_y = priv->hwState->y; } priv->moving_state = moving_state; } static int -GetTimeOut(SynapticsPrivate *priv) +GetTimeOut(SynapticsPrivate * priv) { SynapticsParameters *para = &priv->synpara; @@ -1937,24 +2000,24 @@ case TS_1: case TS_3: case TS_5: - return para->tap_time; + return para->tap_time; case TS_SINGLETAP: - return para->click_time; + return para->click_time; case TS_2A: - return para->single_tap_timeout; + return para->single_tap_timeout; case TS_2B: - return para->tap_time_2; + return para->tap_time_2; case TS_4: - return para->locked_drag_time; + return para->locked_drag_time; default: - return -1; /* No timeout */ + return -1; /* No timeout */ } } static int -HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw, - CARD32 now, enum FingerState finger, - Bool inside_active_area) +HandleTapProcessing(SynapticsPrivate * priv, struct SynapticsHwState *hw, + CARD32 now, enum FingerState finger, + Bool inside_active_area) { SynapticsParameters *para = &priv->synpara; Bool touch, release, is_timeout, move, press; @@ -1963,26 +2026,29 @@ int delay = 1000000000; if (priv->finger_state == FS_BLOCKED) - return delay; + return delay; touch = finger >= FS_TOUCHED && priv->finger_state == FS_UNTOUCHED; release = finger == FS_UNTOUCHED && priv->finger_state >= FS_TOUCHED; move = (finger >= FS_TOUCHED && - (priv->tap_max_fingers <= ((priv->horiz_scroll_twofinger_on || priv->vert_scroll_twofinger_on)? 2 : 1)) && - ((abs(hw->x - priv->touch_on.x) >= para->tap_move) || - (abs(hw->y - priv->touch_on.y) >= para->tap_move))); + (priv->tap_max_fingers <= + ((priv->horiz_scroll_twofinger_on || + priv->vert_scroll_twofinger_on) ? 2 : 1)) && + ((abs(hw->x - priv->touch_on.x) >= para->tap_move) || + (abs(hw->y - priv->touch_on.y) >= para->tap_move))); press = (hw->left || hw->right || hw->middle); if (touch) { - priv->touch_on.x = hw->x; - priv->touch_on.y = hw->y; - priv->touch_on.millis = now; - } else if (release) { - priv->touch_on.millis = now; + priv->touch_on.x = hw->x; + priv->touch_on.y = hw->y; + priv->touch_on.millis = now; + } + else if (release) { + priv->touch_on.millis = now; } if (hw->z > para->finger_high) - if (priv->tap_max_fingers < hw->numFingers) - priv->tap_max_fingers = hw->numFingers; + if (priv->tap_max_fingers < hw->numFingers) + priv->tap_max_fingers = hw->numFingers; timeout = GetTimeOut(priv); timeleft = TIME_DIFF(priv->touch_on.millis + timeout, now); is_timeout = timeleft <= 0; @@ -1990,150 +2056,161 @@ restart: switch (priv->tap_state) { case TS_START: - if (touch) - SetTapState(priv, TS_1, now); - break; + if (touch) + SetTapState(priv, TS_1, now); + break; case TS_1: - if (para->clickpad && press) { - SetTapState(priv, TS_CLICKPAD_MOVE, now); - goto restart; - } - if (move) { - SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); - SetTapState(priv, TS_MOVE, now); - goto restart; - } else if (is_timeout) { - if (finger == FS_TOUCHED) { - SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); - } else if (finger == FS_PRESSED) { - SetMovingState(priv, MS_TRACKSTICK, now); - } - SetTapState(priv, TS_MOVE, now); - goto restart; - } else if (release) { - edge = edge_detection(priv, priv->touch_on.x, priv->touch_on.y); - SelectTapButton(priv, edge); - /* Disable taps outside of the active area */ - if (!inside_active_area) { - priv->tap_button = 0; - } - SetTapState(priv, TS_2A, now); - } - break; + if (para->clickpad && press) { + SetTapState(priv, TS_CLICKPAD_MOVE, now); + goto restart; + } + if (move) { + SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); + SetTapState(priv, TS_MOVE, now); + goto restart; + } + else if (is_timeout) { + if (finger == FS_TOUCHED) { + SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); + } + else if (finger == FS_PRESSED) { + SetMovingState(priv, MS_TRACKSTICK, now); + } + SetTapState(priv, TS_MOVE, now); + goto restart; + } + else if (release) { + edge = edge_detection(priv, priv->touch_on.x, priv->touch_on.y); + SelectTapButton(priv, edge); + /* Disable taps outside of the active area */ + if (!inside_active_area) { + priv->tap_button = 0; + } + SetTapState(priv, TS_2A, now); + } + break; case TS_MOVE: - if (para->clickpad && press) { - SetTapState(priv, TS_CLICKPAD_MOVE, now); - goto restart; - } - if (move && priv->moving_state == MS_TRACKSTICK) { - SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); - } - if (release) { - SetMovingState(priv, MS_FALSE, now); - SetTapState(priv, TS_START, now); - } - break; + if (para->clickpad && press) { + SetTapState(priv, TS_CLICKPAD_MOVE, now); + goto restart; + } + if (move && priv->moving_state == MS_TRACKSTICK) { + SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); + } + if (release) { + SetMovingState(priv, MS_FALSE, now); + SetTapState(priv, TS_START, now); + } + break; case TS_2A: - if (touch) - SetTapState(priv, TS_3, now); - else if (is_timeout) - SetTapState(priv, TS_SINGLETAP, now); - break; + if (touch) + SetTapState(priv, TS_3, now); + else if (is_timeout) + SetTapState(priv, TS_SINGLETAP, now); + break; case TS_2B: - if (touch) { - SetTapState(priv, TS_3, now); - } else if (is_timeout) { - SetTapState(priv, TS_START, now); - priv->tap_button_state = TBS_BUTTON_DOWN_UP; - } - break; + if (touch) { + SetTapState(priv, TS_3, now); + } + else if (is_timeout) { + SetTapState(priv, TS_START, now); + priv->tap_button_state = TBS_BUTTON_DOWN_UP; + } + break; case TS_SINGLETAP: - if (touch) - SetTapState(priv, TS_1, now); - else if (is_timeout) - SetTapState(priv, TS_START, now); - break; + if (touch) + SetTapState(priv, TS_1, now); + else if (is_timeout) + SetTapState(priv, TS_START, now); + break; case TS_3: - if (move) { - if (para->tap_and_drag_gesture) { - SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); - SetTapState(priv, TS_DRAG, now); - } else { - SetTapState(priv, TS_1, now); - } - goto restart; - } else if (is_timeout) { - if (para->tap_and_drag_gesture) { - if (finger == FS_TOUCHED) { - SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); - } else if (finger == FS_PRESSED) { - SetMovingState(priv, MS_TRACKSTICK, now); - } - SetTapState(priv, TS_DRAG, now); - } else { - SetTapState(priv, TS_1, now); - } - goto restart; - } else if (release) { - SetTapState(priv, TS_2B, now); - } - break; + if (move) { + if (para->tap_and_drag_gesture) { + SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); + SetTapState(priv, TS_DRAG, now); + } + else { + SetTapState(priv, TS_1, now); + } + goto restart; + } + else if (is_timeout) { + if (para->tap_and_drag_gesture) { + if (finger == FS_TOUCHED) { + SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); + } + else if (finger == FS_PRESSED) { + SetMovingState(priv, MS_TRACKSTICK, now); + } + SetTapState(priv, TS_DRAG, now); + } + else { + SetTapState(priv, TS_1, now); + } + goto restart; + } + else if (release) { + SetTapState(priv, TS_2B, now); + } + break; case TS_DRAG: - if (para->clickpad && press) { - SetTapState(priv, TS_CLICKPAD_MOVE, now); - goto restart; - } - if (move) - SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); - if (release) { - SetMovingState(priv, MS_FALSE, now); - if (para->locked_drags) { - SetTapState(priv, TS_4, now); - } else { - SetTapState(priv, TS_START, now); - } - } - break; + if (para->clickpad && press) { + SetTapState(priv, TS_CLICKPAD_MOVE, now); + goto restart; + } + if (move) + SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); + if (release) { + SetMovingState(priv, MS_FALSE, now); + if (para->locked_drags) { + SetTapState(priv, TS_4, now); + } + else { + SetTapState(priv, TS_START, now); + } + } + break; case TS_4: - if (is_timeout) { - SetTapState(priv, TS_START, now); - goto restart; - } - if (touch) - SetTapState(priv, TS_5, now); - break; + if (is_timeout) { + SetTapState(priv, TS_START, now); + goto restart; + } + if (touch) + SetTapState(priv, TS_5, now); + break; case TS_5: - if (is_timeout || move) { - SetTapState(priv, TS_DRAG, now); - goto restart; - } else if (release) { - SetMovingState(priv, MS_FALSE, now); - SetTapState(priv, TS_START, now); - } - break; + if (is_timeout || move) { + SetTapState(priv, TS_DRAG, now); + goto restart; + } + else if (release) { + SetMovingState(priv, MS_FALSE, now); + SetTapState(priv, TS_START, now); + } + break; case TS_CLICKPAD_MOVE: - /* Disable scrolling once a button is pressed on a clickpad */ - priv->vert_scroll_edge_on = FALSE; - priv->horiz_scroll_edge_on = FALSE; - priv->vert_scroll_twofinger_on = FALSE; - priv->horiz_scroll_twofinger_on = FALSE; + /* Disable scrolling once a button is pressed on a clickpad */ + priv->vert_scroll_edge_on = FALSE; + priv->horiz_scroll_edge_on = FALSE; + priv->vert_scroll_twofinger_on = FALSE; + priv->horiz_scroll_twofinger_on = FALSE; /* Assume one touch is only for holding the clickpad button down */ - if (hw->numFingers > 1) - hw->numFingers--; - SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); - if (!press) { - SetMovingState(priv, MS_FALSE, now); - SetTapState(priv, TS_MOVE, now); - priv->count_packet_finger = 0; - } - break; + if (hw->numFingers > 1) + hw->numFingers--; + SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); + if (!press) { + SetMovingState(priv, MS_FALSE, now); + SetTapState(priv, TS_MOVE, now); + priv->count_packet_finger = 0; + } + break; } timeout = GetTimeOut(priv); if (timeout >= 0) { - timeleft = TIME_DIFF(priv->touch_on.millis + timeout, now); - delay = clamp(timeleft, 1, delay); + timeleft = TIME_DIFF(priv->touch_on.millis + timeout, now); + delay = clamp(timeleft, 1, delay); } return delay; } @@ -2142,9 +2219,10 @@ #define HIST_DELTA(a, b, e) ((HIST((a)).e) - (HIST((b)).e)) static void -store_history(SynapticsPrivate *priv, int x, int y, CARD32 millis) +store_history(SynapticsPrivate * priv, int x, int y, CARD32 millis) { int idx = (priv->hist_index + 1) % SYNAPTICS_MOVE_HISTORY; + priv->move_hist[idx].x = x; priv->move_hist[idx].y = y; priv->move_hist[idx].millis = millis; @@ -2172,21 +2250,27 @@ * @param margin the margin to center in which no change is applied * @return the new center (which might coincide with the previous) */ -static int hysteresis(int in, int center, int margin) { +static int +hysteresis(int in, int center, int margin) +{ int diff = in - center; + if (abs(diff) <= margin) { - diff = 0; - } else if (diff > margin) { - diff -= margin; - } else if (diff < -margin) { - diff += margin; + diff = 0; + } + else if (diff > margin) { + diff -= margin; + } + else if (diff < -margin) { + diff += margin; } return center + diff; } static void -get_delta_for_trackstick(SynapticsPrivate *priv, const struct SynapticsHwState *hw, - double *dx, double *dy) +get_delta_for_trackstick(SynapticsPrivate * priv, + const struct SynapticsHwState *hw, double *dx, + double *dy) { SynapticsParameters *para = &priv->synpara; double dtime = (hw->millis - HIST(0).millis) / 1000.0; @@ -2199,7 +2283,7 @@ } static void -get_edge_speed(SynapticsPrivate *priv, const struct SynapticsHwState *hw, +get_edge_speed(SynapticsPrivate * priv, const struct SynapticsHwState *hw, edge_type edge, int *x_edge_speed, int *y_edge_speed) { SynapticsParameters *para = &priv->synpara; @@ -2212,35 +2296,41 @@ if (hw->z <= minZ) { edge_speed = minSpd; - } else if (hw->z >= maxZ) { + } + else if (hw->z >= maxZ) { edge_speed = maxSpd; - } else { - edge_speed = minSpd + (hw->z - minZ) * (maxSpd - minSpd) / (maxZ - minZ); + } + else { + edge_speed = + minSpd + (hw->z - minZ) * (maxSpd - minSpd) / (maxZ - minZ); } if (!priv->synpara.circular_pad) { /* on rectangular pad */ if (edge & RIGHT_EDGE) { *x_edge_speed = edge_speed; - } else if (edge & LEFT_EDGE) { + } + else if (edge & LEFT_EDGE) { *x_edge_speed = -edge_speed; } if (edge & TOP_EDGE) { *y_edge_speed = -edge_speed; - } else if (edge & BOTTOM_EDGE) { + } + else if (edge & BOTTOM_EDGE) { *y_edge_speed = edge_speed; } - } else if (edge) { + } + else if (edge) { /* at edge of circular pad */ double relX, relY; relative_coords(priv, hw->x, hw->y, &relX, &relY); - *x_edge_speed = (int)(edge_speed * relX); - *y_edge_speed = (int)(edge_speed * relY); + *x_edge_speed = (int) (edge_speed * relX); + *y_edge_speed = (int) (edge_speed * relY); } } static void -get_delta(SynapticsPrivate *priv, const struct SynapticsHwState *hw, +get_delta(SynapticsPrivate * priv, const struct SynapticsHwState *hw, edge_type edge, double *dx, double *dy) { SynapticsParameters *para = &priv->synpara; @@ -2278,8 +2368,8 @@ * Compute relative motion ('deltas') including edge motion xor trackstick. */ static int -ComputeDeltas(SynapticsPrivate *priv, const struct SynapticsHwState *hw, - edge_type edge, int *dxP, int *dyP, Bool inside_area) +ComputeDeltas(SynapticsPrivate * priv, const struct SynapticsHwState *hw, + edge_type edge, int *dxP, int *dyP, Bool inside_area) { static int movelock_count = 0; enum MovingState moving_state; @@ -2290,19 +2380,19 @@ moving_state = priv->moving_state; if (moving_state == MS_FALSE) { - switch (priv->tap_state) { - case TS_MOVE: - case TS_DRAG: - moving_state = MS_TOUCHPAD_RELATIVE; - break; - case TS_1: - case TS_3: - case TS_5: - moving_state = MS_TOUCHPAD_RELATIVE; - break; - default: - break; - } + switch (priv->tap_state) { + case TS_MOVE: + case TS_DRAG: + moving_state = MS_TOUCHPAD_RELATIVE; + break; + case TS_1: + case TS_3: + case TS_5: + moving_state = MS_TOUCHPAD_RELATIVE; + break; + default: + break; + } } if (hw->numFingers > 1) { @@ -2315,11 +2405,10 @@ } if (!inside_area || !moving_state || priv->finger_state == FS_BLOCKED || - priv->vert_scroll_edge_on || priv->horiz_scroll_edge_on || - priv->vert_scroll_twofinger_on || priv->horiz_scroll_twofinger_on || - priv->circ_scroll_on || priv->prevFingers != hw->numFingers || - (moving_state == MS_TOUCHPAD_RELATIVE && hw->numFingers != 1)) - { + priv->vert_scroll_edge_on || priv->horiz_scroll_edge_on || + priv->vert_scroll_twofinger_on || priv->horiz_scroll_twofinger_on || + priv->circ_scroll_on || priv->prevFingers != hw->numFingers || + (moving_state == MS_TOUCHPAD_RELATIVE && hw->numFingers != 1)) { /* reset packet counter. */ priv->count_packet_finger = 0; goto out; @@ -2331,14 +2420,14 @@ delay = MIN(delay, POLL_MS); if (priv->count_packet_finger <= 1) - goto out; /* skip the lot */ + goto out; /* skip the lot */ if (priv->moving_state == MS_TRACKSTICK) get_delta_for_trackstick(priv, hw, &dx, &dy); else if (moving_state == MS_TOUCHPAD_RELATIVE) get_delta(priv, hw, edge, &dx, &dy); -out: + out: priv->prevFingers = hw->numFingers; *dxP = dx; @@ -2348,24 +2437,25 @@ } static double -estimate_delta_circ(SynapticsPrivate *priv) +estimate_delta_circ(SynapticsPrivate * priv) { - double a1 = angle(priv, HIST(3).x, HIST(3).y); - double a2 = angle(priv, HIST(2).x, HIST(2).y); - double a3 = angle(priv, HIST(1).x, HIST(1).y); - double a4 = angle(priv, HIST(0).x, HIST(0).y); - double d1 = diffa(a2, a1); - double d2 = d1 + diffa(a3, a2); - double d3 = d2 + diffa(a4, a3); - return estimate_delta(d3, d2, d1, 0); + double a1 = angle(priv, HIST(3).x, HIST(3).y); + double a2 = angle(priv, HIST(2).x, HIST(2).y); + double a3 = angle(priv, HIST(1).x, HIST(1).y); + double a4 = angle(priv, HIST(0).x, HIST(0).y); + double d1 = diffa(a2, a1); + double d2 = d1 + diffa(a3, a2); + double d3 = d2 + diffa(a4, a3); + + return estimate_delta(d3, d2, d1, 0); } /* vert and horiz are to know which direction to start coasting * circ is true if the user had been circular scrolling. */ static void -start_coasting(SynapticsPrivate *priv, struct SynapticsHwState *hw, - Bool vert, Bool horiz, Bool circ) +start_coasting(SynapticsPrivate * priv, struct SynapticsHwState *hw, + Bool vert, Bool horiz, Bool circ) { SynapticsParameters *para = &priv->synpara; @@ -2373,49 +2463,60 @@ priv->scroll.coast_delta_x = 0.0; if ((priv->scroll.packets_this_scroll > 3) && (para->coasting_speed > 0.0)) { - double pkt_time = HIST_DELTA(0, 3, millis) / 1000.0; - if (vert && !circ) { - double dy = estimate_delta(HIST(0).y, HIST(1).y, HIST(2).y, HIST(3).y); - if (pkt_time > 0) { - double scrolls_per_sec = dy / pkt_time; - if (fabs(scrolls_per_sec) >= para->coasting_speed) { - priv->scroll.coast_speed_y = scrolls_per_sec; - priv->scroll.coast_delta_y = (hw->y - priv->scroll.last_y); - } - } - } - if (horiz && !circ){ - double dx = estimate_delta(HIST(0).x, HIST(1).x, HIST(2).x, HIST(3).x); - if (pkt_time > 0) { - double scrolls_per_sec = dx / pkt_time; - if (fabs(scrolls_per_sec) >= para->coasting_speed) { - priv->scroll.coast_speed_x = scrolls_per_sec; - priv->scroll.coast_delta_x = (hw->x - priv->scroll.last_x); - } - } - } - if (circ) { - double da = estimate_delta_circ(priv); - if (pkt_time > 0) { - double scrolls_per_sec = da / pkt_time; - if (fabs(scrolls_per_sec) >= para->coasting_speed) { - if (vert) { - priv->scroll.coast_speed_y = scrolls_per_sec; - priv->scroll.coast_delta_y = diffa(priv->scroll.last_a, angle(priv, hw->x, hw->y)); - } - else if (horiz) { - priv->scroll.coast_speed_x = scrolls_per_sec; - priv->scroll.coast_delta_x = diffa(priv->scroll.last_a, angle(priv, hw->x, hw->y)); - } - } - } - } + double pkt_time = HIST_DELTA(0, 3, millis) / 1000.0; + + if (vert && !circ) { + double dy = + estimate_delta(HIST(0).y, HIST(1).y, HIST(2).y, HIST(3).y); + if (pkt_time > 0) { + double scrolls_per_sec = (dy / abs(para->scroll_dist_vert)) / pkt_time; + + if (fabs(scrolls_per_sec) >= para->coasting_speed) { + priv->scroll.coast_speed_y = scrolls_per_sec; + priv->scroll.coast_delta_y = (hw->y - priv->scroll.last_y); + } + } + } + if (horiz && !circ) { + double dx = + estimate_delta(HIST(0).x, HIST(1).x, HIST(2).x, HIST(3).x); + if (pkt_time > 0) { + double scrolls_per_sec = (dx / abs(para->scroll_dist_vert)) / pkt_time; + + if (fabs(scrolls_per_sec) >= para->coasting_speed) { + priv->scroll.coast_speed_x = scrolls_per_sec; + priv->scroll.coast_delta_x = (hw->x - priv->scroll.last_x); + } + } + } + if (circ) { + double da = estimate_delta_circ(priv); + + if (pkt_time > 0) { + double scrolls_per_sec = (da / para->scroll_dist_circ) / pkt_time; + + if (fabs(scrolls_per_sec) >= para->coasting_speed) { + if (vert) { + priv->scroll.coast_speed_y = scrolls_per_sec; + priv->scroll.coast_delta_y = + diffa(priv->scroll.last_a, + angle(priv, hw->x, hw->y)); + } + else if (horiz) { + priv->scroll.coast_speed_x = scrolls_per_sec; + priv->scroll.coast_delta_x = + diffa(priv->scroll.last_a, + angle(priv, hw->x, hw->y)); + } + } + } + } } priv->scroll.packets_this_scroll = 0; } static void -stop_coasting(SynapticsPrivate *priv) +stop_coasting(SynapticsPrivate * priv) { priv->scroll.coast_speed_x = 0; priv->scroll.coast_speed_y = 0; @@ -2423,241 +2524,260 @@ } static int -HandleScrolling(SynapticsPrivate *priv, struct SynapticsHwState *hw, - edge_type edge, Bool finger) +HandleScrolling(SynapticsPrivate * priv, struct SynapticsHwState *hw, + edge_type edge, Bool finger) { SynapticsParameters *para = &priv->synpara; int delay = 1000000000; if ((priv->synpara.touchpad_off == 2) || (priv->finger_state == FS_BLOCKED)) { - stop_coasting(priv); - priv->circ_scroll_on = FALSE; - priv->vert_scroll_edge_on = FALSE; - priv->horiz_scroll_edge_on = FALSE; - priv->vert_scroll_twofinger_on = FALSE; - priv->horiz_scroll_twofinger_on = FALSE; - return delay; + stop_coasting(priv); + priv->circ_scroll_on = FALSE; + priv->vert_scroll_edge_on = FALSE; + priv->horiz_scroll_edge_on = FALSE; + priv->vert_scroll_twofinger_on = FALSE; + priv->horiz_scroll_twofinger_on = FALSE; + return delay; } /* scroll detection */ if (finger && priv->finger_state == FS_UNTOUCHED) { - stop_coasting(priv); + stop_coasting(priv); priv->scroll.delta_y = 0; priv->scroll.delta_x = 0; - if (para->circular_scrolling) { - if ((para->circular_trigger == 0 && edge) || - (para->circular_trigger == 1 && edge & TOP_EDGE) || - (para->circular_trigger == 2 && edge & TOP_EDGE && edge & RIGHT_EDGE) || - (para->circular_trigger == 3 && edge & RIGHT_EDGE) || - (para->circular_trigger == 4 && edge & RIGHT_EDGE && edge & BOTTOM_EDGE) || - (para->circular_trigger == 5 && edge & BOTTOM_EDGE) || - (para->circular_trigger == 6 && edge & BOTTOM_EDGE && edge & LEFT_EDGE) || - (para->circular_trigger == 7 && edge & LEFT_EDGE) || - (para->circular_trigger == 8 && edge & LEFT_EDGE && edge & TOP_EDGE)) { - priv->circ_scroll_on = TRUE; - priv->circ_scroll_vert = TRUE; - priv->scroll.last_a = angle(priv, hw->x, hw->y); - DBG(7, "circular scroll detected on edge\n"); - } - } + if (para->circular_scrolling) { + if ((para->circular_trigger == 0 && edge) || + (para->circular_trigger == 1 && edge & TOP_EDGE) || + (para->circular_trigger == 2 && edge & TOP_EDGE && + edge & RIGHT_EDGE) || (para->circular_trigger == 3 && + edge & RIGHT_EDGE) || + (para->circular_trigger == 4 && edge & RIGHT_EDGE && + edge & BOTTOM_EDGE) || (para->circular_trigger == 5 && + edge & BOTTOM_EDGE) || + (para->circular_trigger == 6 && edge & BOTTOM_EDGE && + edge & LEFT_EDGE) || (para->circular_trigger == 7 && + edge & LEFT_EDGE) || + (para->circular_trigger == 8 && edge & LEFT_EDGE && + edge & TOP_EDGE)) { + priv->circ_scroll_on = TRUE; + priv->circ_scroll_vert = TRUE; + priv->scroll.last_a = angle(priv, hw->x, hw->y); + DBG(7, "circular scroll detected on edge\n"); + } + } } if (!priv->circ_scroll_on) { - if (finger) { - if (hw->numFingers == 2) { - if (!priv->vert_scroll_twofinger_on && - (para->scroll_twofinger_vert) && (para->scroll_dist_vert != 0)) { - stop_coasting(priv); - priv->vert_scroll_twofinger_on = TRUE; - priv->vert_scroll_edge_on = FALSE; - priv->scroll.last_y = hw->y; - DBG(7, "vert two-finger scroll detected\n"); - } - if (!priv->horiz_scroll_twofinger_on && - (para->scroll_twofinger_horiz) && (para->scroll_dist_horiz != 0)) { - stop_coasting(priv); - priv->horiz_scroll_twofinger_on = TRUE; - priv->horiz_scroll_edge_on = FALSE; - priv->scroll.last_x = hw->x; - DBG(7, "horiz two-finger scroll detected\n"); - } - } - } - if (finger && priv->finger_state == FS_UNTOUCHED) { - if (!priv->vert_scroll_twofinger_on && !priv->horiz_scroll_twofinger_on) { - if ((para->scroll_edge_vert) && (para->scroll_dist_vert != 0) && - (edge & RIGHT_EDGE)) { - priv->vert_scroll_edge_on = TRUE; - priv->scroll.last_y = hw->y; - DBG(7, "vert edge scroll detected on right edge\n"); - } - if ((para->scroll_edge_horiz) && (para->scroll_dist_horiz != 0) && - (edge & BOTTOM_EDGE)) { - priv->horiz_scroll_edge_on = TRUE; - priv->scroll.last_x = hw->x; - DBG(7, "horiz edge scroll detected on bottom edge\n"); - } - } - } + if (finger) { + if (hw->numFingers == 2) { + if (!priv->vert_scroll_twofinger_on && + (para->scroll_twofinger_vert) && + (para->scroll_dist_vert != 0)) { + stop_coasting(priv); + priv->vert_scroll_twofinger_on = TRUE; + priv->vert_scroll_edge_on = FALSE; + priv->scroll.last_y = hw->y; + DBG(7, "vert two-finger scroll detected\n"); + } + if (!priv->horiz_scroll_twofinger_on && + (para->scroll_twofinger_horiz) && + (para->scroll_dist_horiz != 0)) { + stop_coasting(priv); + priv->horiz_scroll_twofinger_on = TRUE; + priv->horiz_scroll_edge_on = FALSE; + priv->scroll.last_x = hw->x; + DBG(7, "horiz two-finger scroll detected\n"); + } + } + } + if (finger && priv->finger_state == FS_UNTOUCHED) { + if (!priv->vert_scroll_twofinger_on && + !priv->horiz_scroll_twofinger_on) { + if ((para->scroll_edge_vert) && (para->scroll_dist_vert != 0) && + (edge & RIGHT_EDGE)) { + priv->vert_scroll_edge_on = TRUE; + priv->scroll.last_y = hw->y; + DBG(7, "vert edge scroll detected on right edge\n"); + } + if ((para->scroll_edge_horiz) && (para->scroll_dist_horiz != 0) + && (edge & BOTTOM_EDGE)) { + priv->horiz_scroll_edge_on = TRUE; + priv->scroll.last_x = hw->x; + DBG(7, "horiz edge scroll detected on bottom edge\n"); + } + } + } } { - Bool oldv = priv->vert_scroll_twofinger_on || priv->vert_scroll_edge_on || - (priv->circ_scroll_on && priv->circ_scroll_vert); + Bool oldv = priv->vert_scroll_twofinger_on || priv->vert_scroll_edge_on + || (priv->circ_scroll_on && priv->circ_scroll_vert); + + Bool oldh = priv->horiz_scroll_twofinger_on || + priv->horiz_scroll_edge_on || (priv->circ_scroll_on && + !priv->circ_scroll_vert); + + Bool oldc = priv->circ_scroll_on; + + if (priv->circ_scroll_on && !finger) { + /* circular scroll locks in until finger is raised */ + DBG(7, "cicular scroll off\n"); + priv->circ_scroll_on = FALSE; + } + + if (!finger || hw->numFingers != 2) { + if (priv->vert_scroll_twofinger_on) { + DBG(7, "vert two-finger scroll off\n"); + priv->vert_scroll_twofinger_on = FALSE; + } + if (priv->horiz_scroll_twofinger_on) { + DBG(7, "horiz two-finger scroll off\n"); + priv->horiz_scroll_twofinger_on = FALSE; + } + } - Bool oldh = priv->horiz_scroll_twofinger_on || priv->horiz_scroll_edge_on || - (priv->circ_scroll_on && !priv->circ_scroll_vert); + if (priv->vert_scroll_edge_on && (!(edge & RIGHT_EDGE) || !finger)) { + DBG(7, "vert edge scroll off\n"); + priv->vert_scroll_edge_on = FALSE; + } + if (priv->horiz_scroll_edge_on && (!(edge & BOTTOM_EDGE) || !finger)) { + DBG(7, "horiz edge scroll off\n"); + priv->horiz_scroll_edge_on = FALSE; + } + /* If we were corner edge scrolling (coasting), + * but no longer in corner or raised a finger, then stop coasting. */ + if (para->scroll_edge_corner && + (priv->scroll.coast_speed_x || priv->scroll.coast_speed_y)) { + Bool is_in_corner = ((edge & RIGHT_EDGE) && + (edge & (TOP_EDGE | BOTTOM_EDGE))) || + ((edge & BOTTOM_EDGE) && (edge & (LEFT_EDGE | RIGHT_EDGE))); + if (!is_in_corner || !finger) { + DBG(7, "corner edge scroll off\n"); + stop_coasting(priv); + } + } + /* if we were scrolling, but couldn't corner edge scroll, + * and are no longer scrolling, then start coasting */ + oldv = oldv && !(priv->vert_scroll_twofinger_on || + priv->vert_scroll_edge_on || (priv->circ_scroll_on && + priv->circ_scroll_vert)); + + oldh = oldh && !(priv->horiz_scroll_twofinger_on || + priv->horiz_scroll_edge_on || (priv->circ_scroll_on && + !priv-> + circ_scroll_vert)); - Bool oldc = priv->circ_scroll_on; + oldc = oldc && !priv->circ_scroll_on; - if (priv->circ_scroll_on && !finger) { - /* circular scroll locks in until finger is raised */ - DBG(7, "cicular scroll off\n"); - priv->circ_scroll_on = FALSE; - } - - if (!finger || hw->numFingers != 2) { - if (priv->vert_scroll_twofinger_on) { - DBG(7, "vert two-finger scroll off\n"); - priv->vert_scroll_twofinger_on = FALSE; - } - if (priv->horiz_scroll_twofinger_on) { - DBG(7, "horiz two-finger scroll off\n"); - priv->horiz_scroll_twofinger_on = FALSE; - } - } - - if (priv->vert_scroll_edge_on && (!(edge & RIGHT_EDGE) || !finger)) { - DBG(7, "vert edge scroll off\n"); - priv->vert_scroll_edge_on = FALSE; - } - if (priv->horiz_scroll_edge_on && (!(edge & BOTTOM_EDGE) || !finger)) { - DBG(7, "horiz edge scroll off\n"); - priv->horiz_scroll_edge_on = FALSE; - } - /* If we were corner edge scrolling (coasting), - * but no longer in corner or raised a finger, then stop coasting. */ - if (para->scroll_edge_corner && (priv->scroll.coast_speed_x || priv->scroll.coast_speed_y)) { - Bool is_in_corner = - ((edge & RIGHT_EDGE) && (edge & (TOP_EDGE | BOTTOM_EDGE))) || - ((edge & BOTTOM_EDGE) && (edge & (LEFT_EDGE | RIGHT_EDGE))) ; - if (!is_in_corner || !finger) { - DBG(7, "corner edge scroll off\n"); - stop_coasting(priv); - } - } - /* if we were scrolling, but couldn't corner edge scroll, - * and are no longer scrolling, then start coasting */ - oldv = oldv && !(priv->vert_scroll_twofinger_on || priv->vert_scroll_edge_on || - (priv->circ_scroll_on && priv->circ_scroll_vert)); - - oldh = oldh && !(priv->horiz_scroll_twofinger_on || priv->horiz_scroll_edge_on || - (priv->circ_scroll_on && !priv->circ_scroll_vert)); - - oldc = oldc && !priv->circ_scroll_on; - - if ((oldv || oldh) && !para->scroll_edge_corner) { - start_coasting(priv, hw, oldv, oldh, oldc); - } + if ((oldv || oldh) && !para->scroll_edge_corner) { + start_coasting(priv, hw, oldv, oldh, oldc); + } } /* if hitting a corner (top right or bottom right) while vertical * scrolling is active, consider starting corner edge scrolling or * switching over to circular scrolling smoothly */ if (priv->vert_scroll_edge_on && !priv->horiz_scroll_edge_on && - (edge & RIGHT_EDGE) && (edge & (TOP_EDGE | BOTTOM_EDGE))) { - if (para->scroll_edge_corner) { - if (priv->scroll.coast_speed_y == 0) { - /* FYI: We can generate multiple start_coasting requests if - * we're in the corner, but we were moving so slowly when we - * got here that we didn't actually start coasting. */ - DBG(7, "corner edge scroll on\n"); - start_coasting(priv, hw, TRUE, FALSE, FALSE); - } - } else if (para->circular_scrolling) { - priv->vert_scroll_edge_on = FALSE; - priv->circ_scroll_on = TRUE; - priv->circ_scroll_vert = TRUE; - priv->scroll.last_a = angle(priv, hw->x, hw->y); - DBG(7, "switching to circular scrolling\n"); - } + (edge & RIGHT_EDGE) && (edge & (TOP_EDGE | BOTTOM_EDGE))) { + if (para->scroll_edge_corner) { + if (priv->scroll.coast_speed_y == 0) { + /* FYI: We can generate multiple start_coasting requests if + * we're in the corner, but we were moving so slowly when we + * got here that we didn't actually start coasting. */ + DBG(7, "corner edge scroll on\n"); + start_coasting(priv, hw, TRUE, FALSE, FALSE); + } + } + else if (para->circular_scrolling) { + priv->vert_scroll_edge_on = FALSE; + priv->circ_scroll_on = TRUE; + priv->circ_scroll_vert = TRUE; + priv->scroll.last_a = angle(priv, hw->x, hw->y); + DBG(7, "switching to circular scrolling\n"); + } } /* Same treatment for horizontal scrolling */ if (priv->horiz_scroll_edge_on && !priv->vert_scroll_edge_on && - (edge & BOTTOM_EDGE) && (edge & (LEFT_EDGE | RIGHT_EDGE))) { - if (para->scroll_edge_corner) { - if (priv->scroll.coast_speed_x == 0) { - /* FYI: We can generate multiple start_coasting requests if - * we're in the corner, but we were moving so slowly when we - * got here that we didn't actually start coasting. */ - DBG(7, "corner edge scroll on\n"); - start_coasting(priv, hw, FALSE, TRUE, FALSE); - } - } else if (para->circular_scrolling) { - priv->horiz_scroll_edge_on = FALSE; - priv->circ_scroll_on = TRUE; - priv->circ_scroll_vert = FALSE; - priv->scroll.last_a = angle(priv, hw->x, hw->y); - DBG(7, "switching to circular scrolling\n"); - } + (edge & BOTTOM_EDGE) && (edge & (LEFT_EDGE | RIGHT_EDGE))) { + if (para->scroll_edge_corner) { + if (priv->scroll.coast_speed_x == 0) { + /* FYI: We can generate multiple start_coasting requests if + * we're in the corner, but we were moving so slowly when we + * got here that we didn't actually start coasting. */ + DBG(7, "corner edge scroll on\n"); + start_coasting(priv, hw, FALSE, TRUE, FALSE); + } + } + else if (para->circular_scrolling) { + priv->horiz_scroll_edge_on = FALSE; + priv->circ_scroll_on = TRUE; + priv->circ_scroll_vert = FALSE; + priv->scroll.last_a = angle(priv, hw->x, hw->y); + DBG(7, "switching to circular scrolling\n"); + } } if (priv->vert_scroll_edge_on || priv->horiz_scroll_edge_on || - priv->vert_scroll_twofinger_on || priv->horiz_scroll_twofinger_on || - priv->circ_scroll_on) { - priv->scroll.packets_this_scroll++; + priv->vert_scroll_twofinger_on || priv->horiz_scroll_twofinger_on || + priv->circ_scroll_on) { + priv->scroll.packets_this_scroll++; } if (priv->vert_scroll_edge_on || priv->vert_scroll_twofinger_on) { - /* + = down, - = up */ - if (para->scroll_dist_vert != 0 && hw->y != priv->scroll.last_y) { - priv->scroll.delta_y += (hw->y - priv->scroll.last_y); - priv->scroll.last_y = hw->y; - } + /* + = down, - = up */ + if (para->scroll_dist_vert != 0 && hw->y != priv->scroll.last_y) { + priv->scroll.delta_y += (hw->y - priv->scroll.last_y); + priv->scroll.last_y = hw->y; + } } if (priv->horiz_scroll_edge_on || priv->horiz_scroll_twofinger_on) { - /* + = right, - = left */ - if (para->scroll_dist_horiz != 0 && hw->x != priv->scroll.last_x) { - priv->scroll.delta_x += (hw->x - priv->scroll.last_x); - priv->scroll.last_x = hw->x; - } + /* + = right, - = left */ + if (para->scroll_dist_horiz != 0 && hw->x != priv->scroll.last_x) { + priv->scroll.delta_x += (hw->x - priv->scroll.last_x); + priv->scroll.last_x = hw->x; + } } if (priv->circ_scroll_on) { - /* + = counter clockwise, - = clockwise */ - double delta = para->scroll_dist_circ; - double diff = diffa(priv->scroll.last_a, angle(priv, hw->x, hw->y)); - if (delta >= 0.005 && diff != 0.0) { - if (priv->circ_scroll_vert) - priv->scroll.delta_y -= diff / delta * para->scroll_dist_vert; - else - priv->scroll.delta_x -= diff / delta * para->scroll_dist_horiz; - priv->scroll.last_a = angle(priv, hw->x, hw->y); + /* + = counter clockwise, - = clockwise */ + double delta = para->scroll_dist_circ; + double diff = diffa(priv->scroll.last_a, angle(priv, hw->x, hw->y)); + + if (delta >= 0.005 && diff != 0.0) { + if (priv->circ_scroll_vert) + priv->scroll.delta_y -= diff / delta * para->scroll_dist_vert; + else + priv->scroll.delta_x -= diff / delta * para->scroll_dist_horiz; + priv->scroll.last_a = angle(priv, hw->x, hw->y); } } if (priv->scroll.coast_speed_y) { - double dtime = (hw->millis - priv->scroll.last_millis) / 1000.0; - double ddy = para->coasting_friction * dtime * abs(para->scroll_dist_vert); + double dtime = (hw->millis - priv->scroll.last_millis) / 1000.0; + double ddy = para->coasting_friction * dtime; - priv->scroll.delta_y += priv->scroll.coast_speed_y * dtime; - delay = MIN(delay, POLL_MS); - if (abs(priv->scroll.coast_speed_y) < ddy) { - priv->scroll.coast_speed_y = 0; - priv->scroll.packets_this_scroll = 0; - } else { - priv->scroll.coast_speed_y += (priv->scroll.coast_speed_y < 0 ? ddy : -ddy); - } + priv->scroll.delta_y += priv->scroll.coast_speed_y * dtime * abs(para->scroll_dist_vert); + delay = MIN(delay, POLL_MS); + if (abs(priv->scroll.coast_speed_y) < ddy) { + priv->scroll.coast_speed_y = 0; + priv->scroll.packets_this_scroll = 0; + } + else { + priv->scroll.coast_speed_y += + (priv->scroll.coast_speed_y < 0 ? ddy : -ddy); + } } if (priv->scroll.coast_speed_x) { - double dtime = (hw->millis - priv->scroll.last_millis) / 1000.0; - double ddx = para->coasting_friction * dtime * abs(para->scroll_dist_horiz); - priv->scroll.delta_x += priv->scroll.coast_speed_x * dtime; - delay = MIN(delay, POLL_MS); - if (abs(priv->scroll.coast_speed_x) < ddx) { - priv->scroll.coast_speed_x = 0; - priv->scroll.packets_this_scroll = 0; - } else { - priv->scroll.coast_speed_x += (priv->scroll.coast_speed_x < 0 ? ddx : -ddx); - } + double dtime = (hw->millis - priv->scroll.last_millis) / 1000.0; + double ddx = para->coasting_friction * dtime; + priv->scroll.delta_x += priv->scroll.coast_speed_x * dtime * abs(para->scroll_dist_horiz); + delay = MIN(delay, POLL_MS); + if (abs(priv->scroll.coast_speed_x) < ddx) { + priv->scroll.coast_speed_x = 0; + priv->scroll.packets_this_scroll = 0; + } + else { + priv->scroll.coast_speed_x += + (priv->scroll.coast_speed_x < 0 ? ddx : -ddx); + } } return delay; @@ -2668,12 +2788,14 @@ * ClickFinger action. */ static int -clickpad_guess_clickfingers(SynapticsPrivate *priv, struct SynapticsHwState *hw) +clickpad_guess_clickfingers(SynapticsPrivate * priv, + struct SynapticsHwState *hw) { int nfingers = 0; + #if HAVE_MULTITOUCH - char close_point[SYNAPTICS_MAX_TOUCHES] = {0}; /* 1 for each point close - to another one */ + char close_point[SYNAPTICS_MAX_TOUCHES] = { 0 }; /* 1 for each point close + to another one */ int i, j; for (i = 0; i < hw->num_mt_mask - 1; i++) { @@ -2720,9 +2842,8 @@ return nfingers; } - static void -handle_clickfinger(SynapticsPrivate *priv, struct SynapticsHwState *hw) +handle_clickfinger(SynapticsPrivate * priv, struct SynapticsHwState *hw) { SynapticsParameters *para = &priv->synpara; int action = 0; @@ -2737,33 +2858,32 @@ if (para->clickpad) nfingers = clickpad_guess_clickfingers(priv, hw); - switch(nfingers) { - case 1: - action = para->click_action[F1_CLICK1]; - break; - case 2: - action = para->click_action[F2_CLICK1]; - break; - case 3: - action = para->click_action[F3_CLICK1]; - break; + switch (nfingers) { + case 1: + action = para->click_action[F1_CLICK1]; + break; + case 2: + action = para->click_action[F2_CLICK1]; + break; + case 3: + action = para->click_action[F3_CLICK1]; + break; } - switch(action){ - case 1: - hw->left = 1 | BTN_EMULATED_FLAG; - break; - case 2: - hw->left = 0; - hw->middle = 1 | BTN_EMULATED_FLAG; - break; - case 3: - hw->left = 0; - hw->right = 1 | BTN_EMULATED_FLAG; - break; + switch (action) { + case 1: + hw->left = 1 | BTN_EMULATED_FLAG; + break; + case 2: + hw->left = 0; + hw->middle = 1 | BTN_EMULATED_FLAG; + break; + case 3: + hw->left = 0; + hw->right = 1 | BTN_EMULATED_FLAG; + break; } } - /* Update the hardware state in shared memory. This is read-only these days, * nothing in the driver reads back from SHM. SHM configuration is a thing of the past. */ @@ -2775,7 +2895,7 @@ SynapticsSHM *shm = priv->synshm; if (!shm) - return; + return; shm->x = hw->x; shm->y = hw->y; @@ -2787,7 +2907,7 @@ shm->up = hw->up; shm->down = hw->down; for (i = 0; i < 8; i++) - shm->multi[i] = hw->multi[i]; + shm->multi[i] = hw->multi[i]; shm->middle = hw->middle; } @@ -2797,34 +2917,35 @@ * function (or scrolling into). */ static Bool -adjust_state_from_scrollbuttons(const InputInfoPtr pInfo, struct SynapticsHwState *hw) +adjust_state_from_scrollbuttons(const InputInfoPtr pInfo, + struct SynapticsHwState *hw) { SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private); SynapticsParameters *para = &priv->synpara; Bool double_click = FALSE; if (!para->updown_button_scrolling) { - if (hw->down) { /* map down button to middle button */ - hw->middle = TRUE; - } - - if (hw->up) { /* up button generates double click */ - if (!priv->prev_up) - double_click = TRUE; - } - priv->prev_up = hw->up; + if (hw->down) { /* map down button to middle button */ + hw->middle = TRUE; + } + + if (hw->up) { /* up button generates double click */ + if (!priv->prev_up) + double_click = TRUE; + } + priv->prev_up = hw->up; - /* reset up/down button events */ - hw->up = hw->down = FALSE; + /* reset up/down button events */ + hw->up = hw->down = FALSE; } /* Left/right button scrolling, or middle clicks */ if (!para->leftright_button_scrolling) { - if (hw->multi[2] || hw->multi[3]) - hw->middle = TRUE; + if (hw->multi[2] || hw->multi[3]) + hw->middle = TRUE; - /* reset left/right button events */ - hw->multi[2] = hw->multi[3] = FALSE; + /* reset left/right button events */ + hw->multi[2] = hw->multi[3] = FALSE; } return double_click; @@ -2846,32 +2967,38 @@ /* If this is a clickpad and the user clicks in a soft button area, press * the soft button instead. */ - if (para->clickpad && hw->left && !hw->right && !hw->middle) - { - if (is_inside_rightbutton_area(para, hw->x, hw->y)) - { - hw->left = 0; - hw->right = 1; - } - else if (is_inside_middlebutton_area(para, hw->x, hw->y)) - { - hw->left = 0; - hw->middle = 1; + if (para->clickpad) { + /* hw->left is down, but no other buttons were already down */ + if (!old->left && !old->right && !old->middle && + hw->left && !hw->right && !hw->middle) { + if (is_inside_rightbutton_area(para, hw->x, hw->y)) { + hw->left = 0; + hw->right = 1; + } + else if (is_inside_middlebutton_area(para, hw->x, hw->y)) { + hw->left = 0; + hw->middle = 1; + } + } + else if (hw->left) { + hw->left = old->left; + hw->right = old->right; + hw->middle = old->middle; } } /* Fingers emulate other buttons. ClickFinger can only be triggered on transition, when left is pressed */ - if(hw->left && !old->left && !old->middle && !old->right && - hw->numFingers >= 1) { + if (hw->left && !old->left && !old->middle && !old->right && + hw->numFingers >= 1) { handle_clickfinger(priv, hw); } /* Two finger emulation */ if (hw->numFingers == 1 && hw->z >= para->emulate_twofinger_z && hw->fingerWidth >= para->emulate_twofinger_w) { - hw->numFingers = 2; + hw->numFingers = 2; } } @@ -2882,7 +3009,6 @@ xf86PostButtonEvent(pInfo->dev, FALSE, button, FALSE, 0, 0); } - static void post_scroll_events(const InputInfoPtr pInfo) { @@ -2891,18 +3017,14 @@ #ifdef HAVE_SMOOTH_SCROLL valuator_mask_zero(priv->scroll_events_mask); - if (priv->scroll.delta_y != 0.0) - { + 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_axis_vert, priv->scroll.delta_y); priv->scroll.delta_y = 0; } - if (priv->scroll.delta_x != 0.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_axis_horiz, priv->scroll.delta_x); priv->scroll.delta_x = 0; } if (valuator_mask_num_valuators(priv->scroll_events_mask)) @@ -2912,26 +3034,22 @@ /* smooth scrolling uses the dist as increment */ - while (priv->scroll.delta_y <= -para->scroll_dist_vert) - { + while (priv->scroll.delta_y <= -para->scroll_dist_vert) { post_button_click(pInfo, 4); priv->scroll.delta_y += para->scroll_dist_vert; } - while (priv->scroll.delta_y >= para->scroll_dist_vert) - { + while (priv->scroll.delta_y >= para->scroll_dist_vert) { post_button_click(pInfo, 5); priv->scroll.delta_y -= para->scroll_dist_vert; } - while (priv->scroll.delta_x <= -para->scroll_dist_horiz) - { + while (priv->scroll.delta_x <= -para->scroll_dist_horiz) { post_button_click(pInfo, 6); priv->scroll.delta_x += para->scroll_dist_horiz; } - while (priv->scroll.delta_x >= para->scroll_dist_horiz) - { + while (priv->scroll.delta_x >= para->scroll_dist_horiz) { post_button_click(pInfo, 7); priv->scroll.delta_x -= para->scroll_dist_horiz; } @@ -2941,7 +3059,7 @@ static inline int repeat_scrollbuttons(const InputInfoPtr pInfo, const struct SynapticsHwState *hw, - int buttons, CARD32 now, int delay) + int buttons, CARD32 now, int delay) { SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private); SynapticsParameters *para = &priv->synpara; @@ -2956,41 +3074,43 @@ /* Handle auto repeat buttons */ repeat_delay = clamp(para->scroll_button_repeat, SBR_MIN, SBR_MAX); if (((hw->up || hw->down) && para->updown_button_repeat && - para->updown_button_scrolling) || - ((hw->multi[2] || hw->multi[3]) && para->leftright_button_repeat && - para->leftright_button_scrolling)) { - priv->repeatButtons = buttons & rep_buttons; - if (!priv->nextRepeat) { - priv->nextRepeat = now + repeat_delay * 2; - } - } else { - priv->repeatButtons = 0; - priv->nextRepeat = 0; + para->updown_button_scrolling) || + ((hw->multi[2] || hw->multi[3]) && para->leftright_button_repeat && + para->leftright_button_scrolling)) { + priv->repeatButtons = buttons & rep_buttons; + if (!priv->nextRepeat) { + priv->nextRepeat = now + repeat_delay * 2; + } + } + else { + priv->repeatButtons = 0; + priv->nextRepeat = 0; } if (priv->repeatButtons) { - timeleft = TIME_DIFF(priv->nextRepeat, now); - if (timeleft > 0) - delay = MIN(delay, timeleft); - if (timeleft <= 0) { - int change, id; - change = priv->repeatButtons; - while (change) { - id = ffs(change); - change &= ~(1 << (id - 1)); - if (id == 4) - priv->scroll.delta_y -= para->scroll_dist_vert; - else if (id == 5) - priv->scroll.delta_y += para->scroll_dist_vert; - else if (id == 6) - priv->scroll.delta_x -= para->scroll_dist_horiz; - else if (id == 7) - priv->scroll.delta_x += para->scroll_dist_horiz; - } - - priv->nextRepeat = now + repeat_delay; - delay = MIN(delay, repeat_delay); - } + timeleft = TIME_DIFF(priv->nextRepeat, now); + if (timeleft > 0) + delay = MIN(delay, timeleft); + if (timeleft <= 0) { + int change, id; + + change = priv->repeatButtons; + while (change) { + id = ffs(change); + change &= ~(1 << (id - 1)); + if (id == 4) + priv->scroll.delta_y -= para->scroll_dist_vert; + else if (id == 5) + priv->scroll.delta_y += para->scroll_dist_vert; + else if (id == 6) + priv->scroll.delta_x -= para->scroll_dist_horiz; + else if (id == 7) + priv->scroll.delta_x += para->scroll_dist_horiz; + } + + priv->nextRepeat = now + repeat_delay; + delay = MIN(delay, repeat_delay); + } } return delay; @@ -3001,22 +3121,19 @@ UpdateTouchState(InputInfoPtr pInfo, struct SynapticsHwState *hw) { #ifdef HAVE_MULTITOUCH - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; int i; - for (i = 0; i < hw->num_mt_mask; i++) - { - if (hw->slot_state[i] == SLOTSTATE_OPEN) - { + for (i = 0; i < hw->num_mt_mask; i++) { + if (hw->slot_state[i] == SLOTSTATE_OPEN) { priv->open_slots[priv->num_active_touches] = i; priv->num_active_touches++; - } else if (hw->slot_state[i] == SLOTSTATE_CLOSE) - { + } + else if (hw->slot_state[i] == SLOTSTATE_CLOSE) { Bool found = FALSE; int j; - for (j = 0; j < priv->num_active_touches - 1; j++) - { + for (j = 0; j < priv->num_active_touches - 1; j++) { if (priv->open_slots[j] == i) found = TRUE; @@ -3024,7 +3141,9 @@ priv->open_slots[j] = priv->open_slots[j + 1]; } - priv->num_active_touches--; + BUG_WARN(priv->num_active_touches == 0); + if (priv->num_active_touches > 0) + priv->num_active_touches--; } } @@ -3036,7 +3155,7 @@ HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw) { #ifdef HAVE_MULTITOUCH - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; SynapticsParameters *para = &priv->synpara; int new_active_touches = priv->num_active_touches; int min_touches = 2; @@ -3050,8 +3169,7 @@ min_touches = 3; /* Count new number of active touches */ - for (i = 0; i < hw->num_mt_mask; i++) - { + for (i = 0; i < hw->num_mt_mask; i++) { if (hw->slot_state[i] == SLOTSTATE_OPEN) new_active_touches++; else if (hw->slot_state[i] == SLOTSTATE_CLOSE) @@ -3062,32 +3180,30 @@ goto out; if (priv->num_active_touches < min_touches && - new_active_touches < min_touches) - { + new_active_touches < min_touches) { /* We stayed below number of touches needed to send events */ goto out; - } else if (priv->num_active_touches >= min_touches && - new_active_touches < min_touches) - { + } + else if (priv->num_active_touches >= min_touches && + new_active_touches < min_touches) { /* We are transitioning to less than the number of touches needed to * send events. End all currently open touches. */ - for (i = 0; i < priv->num_active_touches; i++) - { + for (i = 0; i < priv->num_active_touches; i++) { int slot = priv->open_slots[i]; + xf86PostTouchEvent(pInfo->dev, slot, XI_TouchEnd, 0, hw->mt_mask[slot]); } /* Don't send any more events */ goto out; - } else if (priv->num_active_touches < min_touches && - new_active_touches >= min_touches) - { + } + else if (priv->num_active_touches < min_touches && + new_active_touches >= min_touches) { /* We are transitioning to more than the number of touches needed to * send events. Begin all already open touches. */ restart_touches = TRUE; - for (i = 0; i < priv->num_active_touches; i++) - { + for (i = 0; i < priv->num_active_touches; i++) { int slot = priv->open_slots[i]; xf86PostTouchEvent(pInfo->dev, slot, XI_TouchBegin, 0, @@ -3098,12 +3214,10 @@ /* Send touch begin events for all new touches */ for (i = 0; i < hw->num_mt_mask; i++) if (hw->slot_state[i] == SLOTSTATE_OPEN) - xf86PostTouchEvent(pInfo->dev, i, XI_TouchBegin, 0, - hw->mt_mask[i]); + xf86PostTouchEvent(pInfo->dev, i, XI_TouchBegin, 0, hw->mt_mask[i]); /* Send touch update/end events for all the rest */ - for (i = 0; i < priv->num_active_touches; i++) - { + for (i = 0; i < priv->num_active_touches; i++) { int slot = priv->open_slots[i]; /* Don't send update event if we just reopened the touch above */ @@ -3115,13 +3229,13 @@ hw->mt_mask[slot]); } -out: + out: UpdateTouchState(pInfo, hw); #endif } static void -filter_jitter(SynapticsPrivate *priv, int *x, int *y) +filter_jitter(SynapticsPrivate * priv, int *x, int *y) { SynapticsParameters *para = &priv->synpara; @@ -3169,16 +3283,27 @@ update_shm(pInfo, hw); /* If touchpad is switched off, we skip the whole thing and return delay */ - if (para->touchpad_off == 1) - { - UpdateTouchState(pInfo, hw); - return delay; + if (para->touchpad_off == 1) { + UpdateTouchState(pInfo, hw); + return delay; + } + + /* We need both and x/y, the driver can't handle just one of the two + * yet. But since it's possible to hit a phys button on non-clickpads + * without ever getting motion data first, we must continue with 0/0 for + * that case. */ + if (hw->x == INT_MIN || hw->y == INT_MAX) { + if (para->clickpad) + return delay; + else if (hw->left || hw->right || hw->middle) { + hw->x = (hw->x == INT_MIN) ? 0 : hw->x; + hw->y = (hw->y == INT_MIN) ? 0 : hw->y; + } } /* If a physical button is pressed on a clickpad, use cumulative relative * touch movements for motion */ - if (para->clickpad && (hw->left || hw->right || hw->middle)) - { + if (para->clickpad && (hw->left || hw->right || hw->middle)) { hw->x = hw->cumulative_dx; hw->y = hw->cumulative_dy; } @@ -3193,120 +3318,119 @@ /* now we know that these _coordinates_ aren't in the area. invalid are: x, y, z, numFingers, fingerWidth valid are: millis, left/right/middle/up/down/etc. - */ - if (!inside_active_area) - { - reset_hw_state(hw); + */ + if (!inside_active_area) { + reset_hw_state(hw); - /* FIXME: if finger accidentally moves into the area and doesn't - * really release, the finger should remain down. */ + /* FIXME: if finger accidentally moves into the area and doesn't + * really release, the finger should remain down. */ } /* these two just update hw->left, right, etc. */ update_hw_button_state(pInfo, hw, priv->old_hw_state, now, &delay); if (priv->has_scrollbuttons) - double_click = adjust_state_from_scrollbuttons(pInfo, hw); + double_click = adjust_state_from_scrollbuttons(pInfo, hw); /* no edge or finger detection outside of area */ if (inside_active_area) { - edge = edge_detection(priv, hw->x, hw->y); - if (!from_timer) - finger = SynapticsDetectFinger(priv, hw); - else - finger = priv->finger_state; + edge = edge_detection(priv, hw->x, hw->y); + if (!from_timer) + finger = SynapticsDetectFinger(priv, hw); + else + finger = priv->finger_state; } /* tap and drag detection. Needs to be performed even if the finger is in * the dead area to reset the state. */ timeleft = HandleTapProcessing(priv, hw, now, finger, inside_active_area); if (timeleft > 0) - delay = MIN(delay, timeleft); + delay = MIN(delay, timeleft); - if (inside_active_area) - { - /* Don't bother about scrolling in the dead area of the touchpad. */ - timeleft = HandleScrolling(priv, hw, edge, (finger >= FS_TOUCHED)); - if (timeleft > 0) - delay = MIN(delay, timeleft); - - /* - * Compensate for unequal x/y resolution. This needs to be done after - * calculations that require unadjusted coordinates, for example edge - * detection. - */ - ScaleCoordinates(priv, hw); + if (inside_active_area) { + /* Don't bother about scrolling in the dead area of the touchpad. */ + timeleft = HandleScrolling(priv, hw, edge, (finger >= FS_TOUCHED)); + if (timeleft > 0) + delay = MIN(delay, timeleft); + + /* + * Compensate for unequal x/y resolution. This needs to be done after + * calculations that require unadjusted coordinates, for example edge + * detection. + */ + ScaleCoordinates(priv, hw); } dx = dy = 0; if (!priv->absolute_events) { - timeleft = ComputeDeltas(priv, hw, edge, &dx, &dy, inside_active_area); - delay = MIN(delay, timeleft); + timeleft = ComputeDeltas(priv, hw, edge, &dx, &dy, inside_active_area); + delay = MIN(delay, timeleft); } - - buttons = ((hw->left ? 0x01 : 0) | - (hw->middle ? 0x02 : 0) | - (hw->right ? 0x04 : 0) | - (hw->up ? 0x08 : 0) | - (hw->down ? 0x10 : 0) | - (hw->multi[2] ? 0x20 : 0) | - (hw->multi[3] ? 0x40 : 0)); + buttons = ((hw->left ? 0x01 : 0) | + (hw->middle ? 0x02 : 0) | + (hw->right ? 0x04 : 0) | + (hw->up ? 0x08 : 0) | + (hw->down ? 0x10 : 0) | + (hw->multi[2] ? 0x20 : 0) | (hw->multi[3] ? 0x40 : 0)); if (priv->tap_button > 0) { - int tap_mask = 1 << (priv->tap_button - 1); - if (priv->tap_button_state == TBS_BUTTON_DOWN_UP) { - if (tap_mask != (priv->lastButtons & tap_mask)) { - xf86PostButtonEvent(pInfo->dev, FALSE, priv->tap_button, TRUE, 0, 0); - priv->lastButtons |= tap_mask; - } - priv->tap_button_state = TBS_BUTTON_UP; - } - if (priv->tap_button_state == TBS_BUTTON_DOWN) - buttons |= tap_mask; + int tap_mask = 1 << (priv->tap_button - 1); + + if (priv->tap_button_state == TBS_BUTTON_DOWN_UP) { + if (tap_mask != (priv->lastButtons & tap_mask)) { + xf86PostButtonEvent(pInfo->dev, FALSE, priv->tap_button, TRUE, + 0, 0); + priv->lastButtons |= tap_mask; + } + priv->tap_button_state = TBS_BUTTON_UP; + } + if (priv->tap_button_state == TBS_BUTTON_DOWN) + buttons |= tap_mask; } /* Post events */ if (finger >= FS_TOUCHED) { if (priv->absolute_events && inside_active_area) { xf86PostMotionEvent(pInfo->dev, 1, 0, 2, hw->x, hw->y); - } else if (dx || dy) { + } + else if (dx || dy) { xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy); } } - if (priv->mid_emu_state == MBE_LEFT_CLICK) - { - post_button_click(pInfo, 1); - priv->mid_emu_state = MBE_OFF; - } else if (priv->mid_emu_state == MBE_RIGHT_CLICK) - { - post_button_click(pInfo, 3); - priv->mid_emu_state = MBE_OFF; + if (priv->mid_emu_state == MBE_LEFT_CLICK) { + post_button_click(pInfo, 1); + priv->mid_emu_state = MBE_OFF; + } + else if (priv->mid_emu_state == MBE_RIGHT_CLICK) { + post_button_click(pInfo, 3); + priv->mid_emu_state = MBE_OFF; } change = buttons ^ priv->lastButtons; while (change) { - id = ffs(change); /* number of first set bit 1..32 is returned */ - change &= ~(1 << (id - 1)); - xf86PostButtonEvent(pInfo->dev, FALSE, id, (buttons & (1 << (id - 1))), 0, 0); + id = ffs(change); /* number of first set bit 1..32 is returned */ + change &= ~(1 << (id - 1)); + xf86PostButtonEvent(pInfo->dev, FALSE, id, (buttons & (1 << (id - 1))), + 0, 0); } if (priv->has_scrollbuttons) - delay = repeat_scrollbuttons(pInfo, hw, buttons, now, delay); + delay = repeat_scrollbuttons(pInfo, hw, buttons, now, delay); /* Process scroll events only if coordinates are * in the Synaptics Area */ if (inside_active_area && (priv->scroll.delta_x != 0.0 || priv->scroll.delta_y != 0.0)) { - post_scroll_events(pInfo); - priv->scroll.last_millis = hw->millis; + post_scroll_events(pInfo); + priv->scroll.last_millis = hw->millis; } if (double_click) { - post_button_click(pInfo, 1); - post_button_click(pInfo, 1); + post_button_click(pInfo, 1); + post_button_click(pInfo, 1); } HandleTouches(pInfo, hw); @@ -3317,7 +3441,7 @@ /* generate a history of the absolute positions */ if (inside_active_area) - store_history(priv, hw->x, hw->y, hw->millis); + store_history(priv, hw->x, hw->y, hw->millis); /* Save logical state for transition comparisons */ SynapticsCopyHwState(priv->old_hw_state, hw); @@ -3332,7 +3456,6 @@ return Success; } - static int SwitchMode(ClientPtr client, DeviceIntPtr dev, int mode) { @@ -3363,7 +3486,7 @@ SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; if (priv->proto_ops->ReadDevDimensions) - priv->proto_ops->ReadDevDimensions(pInfo); + priv->proto_ops->ReadDevDimensions(pInfo); SanitizeDimensions(pInfo); } @@ -3376,8 +3499,8 @@ priv->comm.protoBufTail = 0; if (!priv->proto_ops->QueryHardware(pInfo)) { - xf86IDrvMsg(pInfo, X_PROBED, "no supported touchpad found\n"); - if (priv->proto_ops->DeviceOffHook) + xf86IDrvMsg(pInfo, X_PROBED, "no supported touchpad found\n"); + if (priv->proto_ops->DeviceOffHook) priv->proto_ops->DeviceOffHook(pInfo); return FALSE; } @@ -3386,7 +3509,7 @@ } static void -ScaleCoordinates(SynapticsPrivate *priv, struct SynapticsHwState *hw) +ScaleCoordinates(SynapticsPrivate * priv, struct SynapticsHwState *hw) { int xCenter = (priv->synpara.left_edge + priv->synpara.right_edge) / 2; int yCenter = (priv->synpara.top_edge + priv->synpara.bottom_edge) / 2; @@ -3396,18 +3519,20 @@ } void -CalculateScalingCoeffs(SynapticsPrivate *priv) +CalculateScalingCoeffs(SynapticsPrivate * priv) { int vertRes = priv->synpara.resolution_vert; int horizRes = priv->synpara.resolution_horiz; if ((horizRes > vertRes) && (horizRes > 0)) { - priv->horiz_coeff = vertRes / (double)horizRes; + priv->horiz_coeff = vertRes / (double) horizRes; priv->vert_coeff = 1; - } else if ((horizRes < vertRes) && (vertRes > 0)) { + } + else if ((horizRes < vertRes) && (vertRes > 0)) { priv->horiz_coeff = 1; - priv->vert_coeff = horizRes / (double)vertRes; - } else { + priv->vert_coeff = horizRes / (double) vertRes; + } + else { priv->horiz_coeff = 1; priv->vert_coeff = 1; } diff -Nru xserver-xorg-input-synaptics-1.6.0/src/synapticsstr.h xserver-xorg-input-synaptics-1.6.2/src/synapticsstr.h --- xserver-xorg-input-synaptics-1.6.0/src/synapticsstr.h 2012-04-30 00:33:11.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/synapticsstr.h 2012-06-12 01:23:34.000000000 +0000 @@ -26,14 +26,14 @@ #include #ifdef DBG -# undef DBG +#undef DBG #endif #ifdef DEBUG #define DBG(verb, ...) \ xf86MsgVerb(X_INFO, verb, __VA_ARGS__) #else -#define DBG(verb, msg, ...) /* */ +#define DBG(verb, msg, ...) /* */ #endif #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12 @@ -51,14 +51,12 @@ #define SYNAPTICS_MOVE_HISTORY 5 #define SYNAPTICS_MAX_TOUCHES 10 -typedef struct _SynapticsMoveHist -{ +typedef struct _SynapticsMoveHist { int x, y; CARD32 millis; } SynapticsMoveHistRec; -typedef struct _SynapticsTouchAxis -{ +typedef struct _SynapticsTouchAxis { const char *label; int min; int max; @@ -67,7 +65,7 @@ enum FingerState { /* Note! The order matters. Compared with < operator. */ FS_BLOCKED = -1, - FS_UNTOUCHED = 0, /* this is 0 so it's the initialized value. */ + FS_UNTOUCHED = 0, /* this is 0 so it's the initialized value. */ FS_TOUCHED = 1, FS_PRESSED = 2, }; @@ -75,39 +73,39 @@ enum MovingState { MS_FALSE, MS_TOUCHPAD_RELATIVE, - MS_TRACKSTICK /* trackstick is always relative */ + MS_TRACKSTICK /* trackstick is always relative */ }; enum MidButtonEmulation { - MBE_OFF, /* No button pressed */ - MBE_LEFT, /* Left button pressed, waiting for right button or timeout */ - MBE_RIGHT, /* Right button pressed, waiting for left button or timeout */ - MBE_MID, /* Left and right buttons pressed, waiting for both buttons - to be released */ - MBE_TIMEOUT, /* Waiting for both buttons to be released. */ - MBE_LEFT_CLICK, /* Emulate left button click. */ - MBE_RIGHT_CLICK, /* Emulate right button click. */ + MBE_OFF, /* No button pressed */ + MBE_LEFT, /* Left button pressed, waiting for right button or timeout */ + MBE_RIGHT, /* Right button pressed, waiting for left button or timeout */ + MBE_MID, /* Left and right buttons pressed, waiting for both buttons + to be released */ + MBE_TIMEOUT, /* Waiting for both buttons to be released. */ + MBE_LEFT_CLICK, /* Emulate left button click. */ + MBE_RIGHT_CLICK, /* Emulate right button click. */ }; /* See docs/tapndrag.dia for a state machine diagram */ enum TapState { - TS_START, /* No tap/drag in progress */ - TS_1, /* After first touch */ - TS_MOVE, /* Pointer movement enabled */ - TS_2A, /* After first release */ - TS_2B, /* After second/third/... release */ - TS_SINGLETAP, /* After timeout after first release */ - TS_3, /* After second touch */ - TS_DRAG, /* Pointer drag enabled */ - TS_4, /* After release when "locked drags" enabled */ - TS_5, /* After touch when "locked drags" enabled */ - TS_CLICKPAD_MOVE, /* After left button press on a clickpad */ + TS_START, /* No tap/drag in progress */ + TS_1, /* After first touch */ + TS_MOVE, /* Pointer movement enabled */ + TS_2A, /* After first release */ + TS_2B, /* After second/third/... release */ + TS_SINGLETAP, /* After timeout after first release */ + TS_3, /* After second touch */ + TS_DRAG, /* Pointer drag enabled */ + TS_4, /* After release when "locked drags" enabled */ + TS_5, /* After touch when "locked drags" enabled */ + TS_CLICKPAD_MOVE, /* After left button press on a clickpad */ }; enum TapButtonState { - TBS_BUTTON_UP, /* "Virtual tap button" is up */ - TBS_BUTTON_DOWN, /* "Virtual tap button" is down */ - TBS_BUTTON_DOWN_UP /* Send button down event + set up state */ + TBS_BUTTON_UP, /* "Virtual tap button" is up */ + TBS_BUTTON_DOWN, /* "Virtual tap button" is down */ + TBS_BUTTON_DOWN_UP /* Send button down event + set up state */ }; enum TouchpadModel { @@ -118,180 +116,177 @@ MODEL_ELANTECH }; -typedef struct _SynapticsParameters -{ +typedef struct _SynapticsParameters { /* Parameter data */ - int left_edge, right_edge, top_edge, bottom_edge; /* edge coordinates absolute */ - int finger_low, finger_high, finger_press; /* finger detection values in Z-values */ + int left_edge, right_edge, top_edge, bottom_edge; /* edge coordinates absolute */ + 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. */ - int single_tap_timeout; /* timeout to recognize a single tap */ - int tap_time_2; /* max. tapping time for double taps */ - int click_time; /* The duration of a single click */ - Bool clickpad; /* Device is a has integrated buttons */ - Bool fast_taps; /* Faster reaction to single taps */ - int emulate_mid_button_time; /* Max time between left and right button presses to - emulate a middle button press. */ - int emulate_twofinger_z; /* pressure threshold to emulate two finger touch (for Alps) */ - int emulate_twofinger_w; /* Finger width threshold to emulate two finger touch */ - int scroll_dist_vert; /* Scrolling distance in absolute coordinates */ - int scroll_dist_horiz; /* Scrolling distance in absolute coordinates */ - Bool scroll_edge_vert; /* Enable/disable vertical scrolling on right edge */ - Bool scroll_edge_horiz; /* Enable/disable horizontal scrolling on left edge */ - Bool scroll_edge_corner; /* Enable/disable continuous edge scrolling when in the corner */ - Bool scroll_twofinger_vert; /* Enable/disable vertical two-finger scrolling */ - Bool scroll_twofinger_horiz; /* Enable/disable horizontal two-finger scrolling */ - double min_speed, max_speed, accl; /* movement parameters */ - double trackstick_speed; /* trackstick mode speed */ - int edge_motion_min_z; /* finger pressure at which minimum edge motion speed is set */ - int edge_motion_max_z; /* finger pressure at which maximum edge motion speed is set */ - int edge_motion_min_speed; /* slowest setting for edge motion speed */ - int edge_motion_max_speed; /* fastest setting for edge motion speed */ - Bool edge_motion_use_always; /* If false, edge motion is used only when dragging */ - - Bool updown_button_scrolling; /* Up/Down-Button scrolling or middle/double-click */ - Bool leftright_button_scrolling; /* Left/right-button scrolling, or two lots of middle button */ - Bool updown_button_repeat; /* If up/down button being used to scroll, auto-repeat?*/ - Bool leftright_button_repeat; /* If left/right button being used to scroll, auto-repeat? */ - int scroll_button_repeat; /* time, in milliseconds, between scroll events being - * sent when holding down scroll buttons */ - int touchpad_off; /* Switches the touchpad off - * 0 : Not off - * 1 : Off - * 2 : Only tapping and scrolling off - */ - Bool locked_drags; /* Enable locked drags */ - int locked_drag_time; /* timeout for locked drags */ - int tap_action[MAX_TAP]; /* Button to report on tap events */ - int click_action[MAX_CLICK]; /* Button to report on click with fingers */ - Bool circular_scrolling; /* Enable circular scrolling */ - double scroll_dist_circ; /* Scrolling angle radians */ - int circular_trigger; /* Trigger area for circular scrolling */ - Bool circular_pad; /* Edge has an oval or circular shape */ - Bool palm_detect; /* Enable Palm Detection */ - int palm_min_width; /* Palm detection width */ - int palm_min_z; /* Palm detection depth */ - double coasting_speed; /* Coasting threshold scrolling speed */ - double coasting_friction; /* Number of scrolls per second per second to change coasting speed */ - 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 */ - Bool grab_event_device; /* grab event device for exclusive use? */ - Bool tap_and_drag_gesture; /* Switches the tap-and-drag gesture on/off */ - unsigned int resolution_horiz; /* horizontal resolution of touchpad in units/mm */ - unsigned int resolution_vert; /* vertical resolution of touchpad in units/mm */ - int area_left_edge, area_right_edge, area_top_edge, area_bottom_edge; /* area coordinates absolute */ - int softbutton_areas[2][4]; /* soft button area coordinates, 0 => right, 1 => middle button */ - int hyst_x, hyst_y; /* x and y width of hysteresis box */ + int tap_move; /* max. tapping time and movement in packets and coord. */ + int single_tap_timeout; /* timeout to recognize a single tap */ + int tap_time_2; /* max. tapping time for double taps */ + int click_time; /* The duration of a single click */ + Bool clickpad; /* Device is a has integrated buttons */ + Bool fast_taps; /* Faster reaction to single taps */ + int emulate_mid_button_time; /* Max time between left and right button presses to + emulate a middle button press. */ + int emulate_twofinger_z; /* pressure threshold to emulate two finger touch (for Alps) */ + int emulate_twofinger_w; /* Finger width threshold to emulate two finger touch */ + int scroll_dist_vert; /* Scrolling distance in absolute coordinates */ + int scroll_dist_horiz; /* Scrolling distance in absolute coordinates */ + Bool scroll_edge_vert; /* Enable/disable vertical scrolling on right edge */ + Bool scroll_edge_horiz; /* Enable/disable horizontal scrolling on left edge */ + Bool scroll_edge_corner; /* Enable/disable continuous edge scrolling when in the corner */ + Bool scroll_twofinger_vert; /* Enable/disable vertical two-finger scrolling */ + Bool scroll_twofinger_horiz; /* Enable/disable horizontal two-finger scrolling */ + double min_speed, max_speed, accl; /* movement parameters */ + double trackstick_speed; /* trackstick mode speed */ + int edge_motion_min_z; /* finger pressure at which minimum edge motion speed is set */ + int edge_motion_max_z; /* finger pressure at which maximum edge motion speed is set */ + int edge_motion_min_speed; /* slowest setting for edge motion speed */ + int edge_motion_max_speed; /* fastest setting for edge motion speed */ + Bool edge_motion_use_always; /* If false, edge motion is used only when dragging */ + + Bool updown_button_scrolling; /* Up/Down-Button scrolling or middle/double-click */ + Bool leftright_button_scrolling; /* Left/right-button scrolling, or two lots of middle button */ + Bool updown_button_repeat; /* If up/down button being used to scroll, auto-repeat? */ + Bool leftright_button_repeat; /* If left/right button being used to scroll, auto-repeat? */ + int scroll_button_repeat; /* time, in milliseconds, between scroll events being + * sent when holding down scroll buttons */ + int touchpad_off; /* Switches the touchpad off + * 0 : Not off + * 1 : Off + * 2 : Only tapping and scrolling off + */ + Bool locked_drags; /* Enable locked drags */ + int locked_drag_time; /* timeout for locked drags */ + int tap_action[MAX_TAP]; /* Button to report on tap events */ + int click_action[MAX_CLICK]; /* Button to report on click with fingers */ + Bool circular_scrolling; /* Enable circular scrolling */ + double scroll_dist_circ; /* Scrolling angle radians */ + int circular_trigger; /* Trigger area for circular scrolling */ + Bool circular_pad; /* Edge has an oval or circular shape */ + Bool palm_detect; /* Enable Palm Detection */ + int palm_min_width; /* Palm detection width */ + int palm_min_z; /* Palm detection depth */ + double coasting_speed; /* Coasting threshold scrolling speed in scrolls/s */ + double coasting_friction; /* Number of scrolls per second per second to change coasting speed */ + 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 */ + Bool grab_event_device; /* grab event device for exclusive use? */ + Bool tap_and_drag_gesture; /* Switches the tap-and-drag gesture on/off */ + unsigned int resolution_horiz; /* horizontal resolution of touchpad in units/mm */ + unsigned int resolution_vert; /* vertical resolution of touchpad in units/mm */ + int area_left_edge, area_right_edge, area_top_edge, area_bottom_edge; /* area coordinates absolute */ + int softbutton_areas[2][4]; /* soft button area coordinates, 0 => right, 1 => middle button */ + int hyst_x, hyst_y; /* x and y width of hysteresis box */ } SynapticsParameters; - -struct _SynapticsPrivateRec -{ - SynapticsParameters synpara; /* Default parameter settings, read from - the X config file */ - SynapticsSHM *synshm; /* Current parameter settings. Will point to - shared memory if shm_config is true */ - struct SynapticsProtocolOperations* proto_ops; - void *proto_data; /* protocol-specific data */ +struct _SynapticsPrivateRec { + SynapticsParameters synpara; /* Default parameter settings, read from + the X config file */ + SynapticsSHM *synshm; /* Current parameter settings. Will point to + shared memory if shm_config is true */ + struct SynapticsProtocolOperations *proto_ops; + void *proto_data; /* protocol-specific data */ struct SynapticsHwState *hwState; - struct SynapticsHwState *old_hw_state; /* previous logical hw state */ + struct SynapticsHwState *old_hw_state; /* previous logical hw state */ - const char *device; /* device node */ - Bool shm_config; /* True when shared memory area allocated */ + const char *device; /* device node */ + Bool shm_config; /* True when shared memory area allocated */ - CARD32 timer_time; /* when timer last fired */ - OsTimerPtr timer; /* for up/down-button repeat, tap processing, etc */ + CARD32 timer_time; /* when timer last fired */ + OsTimerPtr timer; /* for up/down-button repeat, tap processing, etc */ struct CommData comm; - struct SynapticsHwState *local_hw_state; /* used in place of local hw state variables */ + struct SynapticsHwState *local_hw_state; /* used in place of local hw state variables */ - Bool absolute_events; /* post absolute motion events instead of relative */ - SynapticsMoveHistRec move_hist[SYNAPTICS_MOVE_HISTORY]; /* movement history */ - int hist_index; /* Last added entry in move_hist[] */ - int hyst_center_x; /* center x of hysteresis*/ - int hyst_center_y; /* center y of hysteresis*/ + Bool absolute_events; /* post absolute motion events instead of relative */ + SynapticsMoveHistRec move_hist[SYNAPTICS_MOVE_HISTORY]; /* movement history */ + int hist_index; /* Last added entry in move_hist[] */ + int hyst_center_x; /* center x of hysteresis */ + int hyst_center_y; /* center y of hysteresis */ struct { - int last_x; /* last x-scroll position */ - int last_y; /* last y-scroll position */ - double delta_x; /* accumulated horiz scroll delta */ - double delta_y; /* accumulated vert scroll delta */ - double last_a; /* last angle-scroll position */ - CARD32 last_millis; /* time last scroll event posted */ - double coast_speed_x; /* Horizontal coasting speed */ - double coast_speed_y; /* Vertical coasting speed */ - double coast_delta_x; /* Accumulated horizontal coast delta */ - double coast_delta_y; /* Accumulated vertical coast delta */ - int packets_this_scroll; /* Events received for this scroll */ + int last_x; /* last x-scroll position */ + int last_y; /* last y-scroll position */ + double delta_x; /* accumulated horiz scroll delta */ + double delta_y; /* accumulated vert scroll delta */ + double last_a; /* last angle-scroll position */ + CARD32 last_millis; /* time last scroll event posted */ + double coast_speed_x; /* Horizontal coasting speed in scrolls/s */ + double coast_speed_y; /* Vertical coasting speed in scrolls/s */ + double coast_delta_x; /* Accumulated horizontal coast delta */ + double coast_delta_y; /* Accumulated vertical coast delta */ + int packets_this_scroll; /* Events received for this scroll */ } scroll; - int count_packet_finger; /* packet counter with finger on the touchpad */ - int button_delay_millis; /* button delay for 3rd button emulation */ - Bool prev_up; /* Previous up button value, for double click emulation */ - enum FingerState finger_state; /* previous finger state */ - CARD32 last_motion_millis; /* time of the last motion */ - - enum TapState tap_state; /* State of tap processing */ - int tap_max_fingers; /* Max number of fingers seen since entering start state */ - int tap_button; /* Which button started the tap processing */ - enum TapButtonState tap_button_state; /* Current tap action */ - SynapticsMoveHistRec touch_on; /* data when the touchpad is touched/released */ - - enum MovingState moving_state; /* previous moving state */ - Bool vert_scroll_edge_on; /* Keeps track of currently active scroll modes */ - Bool horiz_scroll_edge_on; /* Keeps track of currently active scroll modes */ - Bool vert_scroll_twofinger_on; /* Keeps track of currently active scroll modes */ - Bool horiz_scroll_twofinger_on; /* Keeps track of currently active scroll modes */ - Bool circ_scroll_on; /* Keeps track of currently active scroll modes */ - Bool circ_scroll_vert; /* True: Generate vertical scroll events - False: Generate horizontal events */ - int trackstick_neutral_x; /* neutral x position for trackstick mode */ - int trackstick_neutral_y; /* neutral y position for trackstick mode */ - double frac_x, frac_y; /* absolute -> relative fraction */ - enum MidButtonEmulation mid_emu_state; /* emulated 3rd button */ - int repeatButtons; /* buttons for repeat */ - int nextRepeat; /* Time when to trigger next auto repeat event */ - int lastButtons; /* last state of the buttons */ - int prev_z; /* previous z value, for palm detection */ - int prevFingers; /* previous numFingers, for transition detection */ - int avg_width; /* weighted average of previous fingerWidth values */ - double horiz_coeff; /* normalization factor for x coordintes */ - double vert_coeff; /* normalization factor for y coordintes */ - - int minx, maxx, miny, maxy; /* min/max dimensions as detected */ - int minp, maxp, minw, maxw; /* min/max pressure and finger width as detected */ - int resx, resy; /* resolution of coordinates as detected in units/mm */ - Bool has_left; /* left button detected for this device */ - Bool has_right; /* right button detected for this device */ - Bool has_middle; /* middle button detected for this device */ - Bool has_double; /* double click detected for this device */ - Bool has_triple; /* triple click detected for this device */ - Bool has_pressure; /* device reports pressure */ - Bool has_width; /* device reports finger width */ - Bool has_scrollbuttons; /* device has physical scrollbuttons */ - Bool has_semi_mt; /* device is only semi-multitouch capable */ - - enum TouchpadModel model; /* The detected model */ - unsigned short id_vendor; /* vendor id */ - unsigned short id_product; /* product id */ + int count_packet_finger; /* packet counter with finger on the touchpad */ + int button_delay_millis; /* button delay for 3rd button emulation */ + Bool prev_up; /* Previous up button value, for double click emulation */ + enum FingerState finger_state; /* previous finger state */ + CARD32 last_motion_millis; /* time of the last motion */ + + enum TapState tap_state; /* State of tap processing */ + int tap_max_fingers; /* Max number of fingers seen since entering start state */ + int tap_button; /* Which button started the tap processing */ + enum TapButtonState tap_button_state; /* Current tap action */ + SynapticsMoveHistRec touch_on; /* data when the touchpad is touched/released */ + + enum MovingState moving_state; /* previous moving state */ + Bool vert_scroll_edge_on; /* Keeps track of currently active scroll modes */ + Bool horiz_scroll_edge_on; /* Keeps track of currently active scroll modes */ + Bool vert_scroll_twofinger_on; /* Keeps track of currently active scroll modes */ + Bool horiz_scroll_twofinger_on; /* Keeps track of currently active scroll modes */ + Bool circ_scroll_on; /* Keeps track of currently active scroll modes */ + Bool circ_scroll_vert; /* True: Generate vertical scroll events + False: Generate horizontal events */ + int trackstick_neutral_x; /* neutral x position for trackstick mode */ + int trackstick_neutral_y; /* neutral y position for trackstick mode */ + double frac_x, frac_y; /* absolute -> relative fraction */ + enum MidButtonEmulation mid_emu_state; /* emulated 3rd button */ + int repeatButtons; /* buttons for repeat */ + int nextRepeat; /* Time when to trigger next auto repeat event */ + int lastButtons; /* last state of the buttons */ + int prev_z; /* previous z value, for palm detection */ + int prevFingers; /* previous numFingers, for transition detection */ + int avg_width; /* weighted average of previous fingerWidth values */ + double horiz_coeff; /* normalization factor for x coordintes */ + double vert_coeff; /* normalization factor for y coordintes */ + + int minx, maxx, miny, maxy; /* min/max dimensions as detected */ + int minp, maxp, minw, maxw; /* min/max pressure and finger width as detected */ + int resx, resy; /* resolution of coordinates as detected in units/mm */ + Bool has_left; /* left button detected for this device */ + Bool has_right; /* right button detected for this device */ + Bool has_middle; /* middle button detected for this device */ + Bool has_double; /* double click detected for this device */ + Bool has_triple; /* triple click detected for this device */ + Bool has_pressure; /* device reports pressure */ + Bool has_width; /* device reports finger width */ + Bool has_scrollbuttons; /* device has physical scrollbuttons */ + Bool has_semi_mt; /* device is only semi-multitouch capable */ + + 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 */ + 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 #ifdef HAVE_MULTITOUCH - Bool has_touch; /* Device has multitouch capabilities */ - int max_touches; /* Number of touches supported */ - int num_mt_axes; /* Number of multitouch axes other than X, Y */ + Bool has_touch; /* Device has multitouch capabilities */ + int max_touches; /* Number of touches supported */ + int num_mt_axes; /* Number of multitouch axes other than X, Y */ SynapticsTouchAxisRec *touch_axes; /* Touch axis information other than X, Y */ - int num_slots; /* Number of touch slots allocated */ - int *open_slots; /* Array of currently open touch slots */ - int num_active_touches; /* Number of active touches on device */ + int num_slots; /* Number of touch slots allocated */ + int *open_slots; /* Array of currently open touch slots */ + int num_active_touches; /* Number of active touches on device */ #endif }; -#endif /* _SYNAPTICSSTR_H_ */ +#endif /* _SYNAPTICSSTR_H_ */ diff -Nru xserver-xorg-input-synaptics-1.6.0/src/synproto.c xserver-xorg-input-synaptics-1.6.2/src/synproto.c --- xserver-xorg-input-synaptics-1.6.0/src/synproto.c 2012-05-02 00:44:45.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/synproto.c 2012-06-12 01:23:34.000000000 +0000 @@ -21,14 +21,13 @@ * DEALINGS IN THE SOFTWARE. */ - #include "synproto.h" #include "synaptics.h" #include "synapticsstr.h" #ifdef HAVE_MULTITOUCH static int -HwStateAllocTouch(struct SynapticsHwState *hw, SynapticsPrivate *priv) +HwStateAllocTouch(struct SynapticsHwState *hw, SynapticsPrivate * priv) { int num_vals; int i = 0; @@ -38,12 +37,11 @@ if (!hw->mt_mask) goto fail; - num_vals = 2; /* x and y */ - num_vals += 2; /* scroll axes */ + num_vals = 2; /* x and y */ + num_vals += 2; /* scroll axes */ num_vals += priv->num_mt_axes; - for (; i < hw->num_mt_mask; i++) - { + for (; i < hw->num_mt_mask; i++) { hw->mt_mask[i] = valuator_mask_new(num_vals); if (!hw->mt_mask[i]) goto fail; @@ -55,7 +53,7 @@ return Success; -fail: + fail: for (i--; i >= 0; i--) valuator_mask_free(&hw->mt_mask[i]); free(hw->mt_mask); @@ -65,7 +63,7 @@ #endif struct SynapticsHwState * -SynapticsHwStateAlloc(SynapticsPrivate *priv) +SynapticsHwStateAlloc(SynapticsPrivate * priv) { struct SynapticsHwState *hw; @@ -74,8 +72,7 @@ return NULL; #ifdef HAVE_MULTITOUCH - if (HwStateAllocTouch(hw, priv) != Success) - { + if (HwStateAllocTouch(hw, priv) != Success) { free(hw); return NULL; } @@ -137,8 +134,8 @@ SynapticsResetHwState(struct SynapticsHwState *hw) { hw->millis = 0; - hw->x = 0; - hw->y = 0; + hw->x = INT_MIN; + hw->y = INT_MIN; hw->z = 0; hw->cumulative_dx = 0; hw->cumulative_dy = 0; @@ -162,25 +159,24 @@ #ifdef HAVE_MULTITOUCH int i; - for (i = 0; i < hw->num_mt_mask; i++) - { + for (i = 0; i < hw->num_mt_mask; i++) { int j; /* Leave x and y valuators in case we need to restart touch */ for (j = 2; j < valuator_mask_num_valuators(hw->mt_mask[i]); j++) valuator_mask_unset(hw->mt_mask[i], j); - switch (hw->slot_state[i]) - { - case SLOTSTATE_OPEN: - case SLOTSTATE_OPEN_EMPTY: - case SLOTSTATE_UPDATE: - hw->slot_state[i] = set_slot_empty ? SLOTSTATE_EMPTY : SLOTSTATE_OPEN_EMPTY; - break; - - default: - hw->slot_state[i] = SLOTSTATE_EMPTY; - break; + switch (hw->slot_state[i]) { + case SLOTSTATE_OPEN: + case SLOTSTATE_OPEN_EMPTY: + case SLOTSTATE_UPDATE: + hw->slot_state[i] = + set_slot_empty ? SLOTSTATE_EMPTY : SLOTSTATE_OPEN_EMPTY; + break; + + default: + hw->slot_state[i] = SLOTSTATE_EMPTY; + break; } } #endif diff -Nru xserver-xorg-input-synaptics-1.6.0/src/synproto.h xserver-xorg-input-synaptics-1.6.2/src/synproto.h --- xserver-xorg-input-synaptics-1.6.0/src/synproto.h 2012-05-02 00:42:53.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/src/synproto.h 2012-06-12 01:23:34.000000000 +0000 @@ -37,8 +37,7 @@ struct _SynapticsPrivateRec; typedef struct _SynapticsPrivateRec SynapticsPrivate; -enum SynapticsSlotState -{ +enum SynapticsSlotState { SLOTSTATE_EMPTY = 0, SLOTSTATE_OPEN, SLOTSTATE_CLOSE, @@ -53,12 +52,12 @@ * A structure to describe the state of the touchpad hardware (buttons and pad) */ struct SynapticsHwState { - CARD32 millis; /* Timestamp in milliseconds */ - int x; /* X position of finger */ - int y; /* Y position of finger */ - int z; /* Finger pressure */ - int cumulative_dx; /* Cumulative delta X for clickpad dragging */ - int cumulative_dy; /* Cumulative delta Y for clickpad dragging */ + CARD32 millis; /* Timestamp in milliseconds */ + int x; /* X position of finger */ + int y; /* Y position of finger */ + int z; /* Finger pressure */ + int cumulative_dx; /* Cumulative delta X for clickpad dragging */ + int cumulative_dy; /* Cumulative delta Y for clickpad dragging */ int numFingers; int fingerWidth; @@ -68,7 +67,7 @@ Bool down; Bool multi[8]; - Bool middle; /* Some ALPS touchpads have a middle button */ + Bool middle; /* Some ALPS touchpads have a middle button */ #ifdef HAVE_MULTITOUCH int num_mt_mask; @@ -79,10 +78,10 @@ struct CommData { XISBuffer *buffer; - unsigned char protoBuf[6]; /* Buffer for Packet */ - unsigned char lastByte; /* Last read byte. Use for reset sequence detection. */ - int outOfSync; /* How many consecutive incorrect packets we - have received */ + unsigned char protoBuf[6]; /* Buffer for Packet */ + unsigned char lastByte; /* Last read byte. Use for reset sequence detection. */ + int outOfSync; /* How many consecutive incorrect packets we + have received */ int protoBufTail; /* Used for keeping track of partial HwState updates. */ @@ -95,33 +94,36 @@ struct _SynapticsParameters; struct SynapticsProtocolOperations { - Bool (*DeviceOnHook)(InputInfoPtr pInfo, struct _SynapticsParameters *para); - Bool (*DeviceOffHook)(InputInfoPtr pInfo); - Bool (*QueryHardware)(InputInfoPtr pInfo); - Bool (*ReadHwState)(InputInfoPtr pInfo, - struct CommData *comm, struct SynapticsHwState *hwRet); - Bool (*AutoDevProbe)(InputInfoPtr pInfo, const char *device); - void (*ReadDevDimensions)(InputInfoPtr pInfo); + Bool (*DeviceOnHook) (InputInfoPtr pInfo, + struct _SynapticsParameters * para); + Bool (*DeviceOffHook) (InputInfoPtr pInfo); + Bool (*QueryHardware) (InputInfoPtr pInfo); + Bool (*ReadHwState) (InputInfoPtr pInfo, + struct CommData * comm, + struct SynapticsHwState * hwRet); + Bool (*AutoDevProbe) (InputInfoPtr pInfo, const char *device); + void (*ReadDevDimensions) (InputInfoPtr pInfo); }; #ifdef BUILD_PS2COMM extern struct SynapticsProtocolOperations psaux_proto_operations; extern struct SynapticsProtocolOperations alps_proto_operations; -#endif /* BUILD_PS2COMM */ +#endif /* BUILD_PS2COMM */ #ifdef BUILD_EVENTCOMM extern struct SynapticsProtocolOperations event_proto_operations; -#endif /* BUILD_EVENTCOMM */ +#endif /* BUILD_EVENTCOMM */ #ifdef BUILD_PSMCOMM extern struct SynapticsProtocolOperations psm_proto_operations; -#endif /* BUILD_PSMCOMM */ +#endif /* BUILD_PSMCOMM */ -extern struct SynapticsHwState *SynapticsHwStateAlloc(SynapticsPrivate *priv); +extern struct SynapticsHwState *SynapticsHwStateAlloc(SynapticsPrivate * priv); extern void SynapticsHwStateFree(struct SynapticsHwState **hw); extern void SynapticsCopyHwState(struct SynapticsHwState *dst, const struct SynapticsHwState *src); extern void SynapticsResetHwState(struct SynapticsHwState *hw); -extern void SynapticsResetTouchHwState(struct SynapticsHwState *hw, Bool force_empty); +extern void SynapticsResetTouchHwState(struct SynapticsHwState *hw, + Bool force_empty); extern Bool SynapticsIsSoftButtonAreasValid(int *values); -#endif /* _SYNPROTO_H_ */ +#endif /* _SYNPROTO_H_ */ diff -Nru xserver-xorg-input-synaptics-1.6.0/test/eventcomm-test.c xserver-xorg-input-synaptics-1.6.2/test/eventcomm-test.c --- xserver-xorg-input-synaptics-1.6.0/test/eventcomm-test.c 2012-04-30 00:33:11.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/test/eventcomm-test.c 2012-06-12 01:23:34.000000000 +0000 @@ -55,7 +55,7 @@ static void reset_data(struct SynapticsHwState **hw, struct CommData *comm, - SynapticsPrivate *priv) + SynapticsPrivate * priv) { SynapticsHwStateFree(&comm->hwState); memset(comm, 0, sizeof(struct CommData)); @@ -74,15 +74,12 @@ write(fd, &syn, sizeof(syn)); } - static void -test_buttons(int fd, - InputInfoPtr pInfo, - struct CommData *comm) +test_buttons(int fd, InputInfoPtr pInfo, struct CommData *comm) { - SynapticsPrivate *priv = (SynapticsPrivate *)pInfo->private; + SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private; struct SynapticsHwState *hw = NULL; - struct input_event ev = {{0, 0}, EV_KEY, 0, 0}; + struct input_event ev = { {0, 0}, EV_KEY, 0, 0 }; reset_data(&hw, comm, priv); @@ -97,19 +94,19 @@ EventReadHwState(pInfo, comm, hw); \ assert(hw->field == 0); - _test_press_release(BTN_LEFT, left); - _test_press_release(BTN_RIGHT, right); - _test_press_release(BTN_MIDDLE, middle); - _test_press_release(BTN_FORWARD, up); - _test_press_release(BTN_BACK, down); - _test_press_release(BTN_0, multi[0]); - _test_press_release(BTN_1, multi[1]); - _test_press_release(BTN_2, multi[2]); - _test_press_release(BTN_3, multi[3]); - _test_press_release(BTN_4, multi[4]); - _test_press_release(BTN_5, multi[5]); - _test_press_release(BTN_6, multi[6]); - _test_press_release(BTN_7, multi[7]); + _test_press_release(BTN_LEFT, left); + _test_press_release(BTN_RIGHT, right); + _test_press_release(BTN_MIDDLE, middle); + _test_press_release(BTN_FORWARD, up); + _test_press_release(BTN_BACK, down); + _test_press_release(BTN_0, multi[0]); + _test_press_release(BTN_1, multi[1]); + _test_press_release(BTN_2, multi[2]); + _test_press_release(BTN_3, multi[3]); + _test_press_release(BTN_4, multi[4]); + _test_press_release(BTN_5, multi[5]); + _test_press_release(BTN_6, multi[6]); + _test_press_release(BTN_7, multi[7]); SynapticsHwStateFree(&hw); } @@ -122,19 +119,19 @@ static void test_read_hw_state(void) { - InputInfoRec info = {0}; - SynapticsPrivate private; - struct SynapticsHwState *hw = NULL; - struct CommData comm = {0}; + InputInfoRec info = { 0 }; + SynapticsPrivate private; + struct SynapticsHwState *hw = NULL; + struct CommData comm = { 0 }; struct input_event ev[] = { - { {0, 0}, EV_KEY, BTN_TOOL_FINGER, 1 }, - { {0, 0}, EV_KEY, BTN_TOOL_DOUBLETAP, 1 }, - { {0, 0}, EV_KEY, BTN_TOOL_TRIPLETAP, 1 }, - { {0, 0}, EV_ABS, ABS_X, 42 }, - { {0, 0}, EV_ABS, ABS_Y, 21 }, - { {0, 0}, EV_ABS, ABS_PRESSURE, 56 }, - { {0, 0}, EV_ABS, ABS_TOOL_WIDTH, 204 }, + {{0, 0}, EV_KEY, BTN_TOOL_FINGER, 1}, + {{0, 0}, EV_KEY, BTN_TOOL_DOUBLETAP, 1}, + {{0, 0}, EV_KEY, BTN_TOOL_TRIPLETAP, 1}, + {{0, 0}, EV_ABS, ABS_X, 42}, + {{0, 0}, EV_ABS, ABS_Y, 21}, + {{0, 0}, EV_ABS, ABS_PRESSURE, 56}, + {{0, 0}, EV_ABS, ABS_TOOL_WIDTH, 204}, }; memset(&private, 0, sizeof(private)); @@ -199,7 +196,7 @@ compare_hw_state(const struct SynapticsHwState *a, const struct SynapticsHwState *b) { - #define COMPARE(x) \ +#define COMPARE(x) \ if (a->x != b->x) return a->x - b->x COMPARE(millis); @@ -216,7 +213,7 @@ return memcmp(a->multi, b->multi, sizeof(a->multi)); COMPARE(middle); - #undef COMPARE +#undef COMPARE return 0; } @@ -229,11 +226,11 @@ test_ignore_hw_state(void) { int i; - InputInfoRec info = {0}; - SynapticsPrivate private; - struct SynapticsHwState *hw = NULL; - struct SynapticsHwState *hw_zero = NULL; - struct CommData comm = {0}; + InputInfoRec info = { 0 }; + SynapticsPrivate private; + struct SynapticsHwState *hw = NULL; + struct SynapticsHwState *hw_zero = NULL; + struct CommData comm = { 0 }; int known_abs[] = { ABS_X, @@ -262,7 +259,7 @@ BTN_TOUCH }; - struct input_event ev = {{0, 0}, 0, 0, 1}; + struct input_event ev = { {0, 0}, 0, 0, 1 }; memset(&private, 0, sizeof(private)); info.private = &private; @@ -281,9 +278,7 @@ EventReadHwState(&info, &comm, hw); \ assert(compare_hw_state(hw, hw_zero) == 0); - - for (i = ABS_X; i < ABS_MAX; i++) - { + for (i = ABS_X; i < ABS_MAX; i++) { int j, skip = 0; for (j = 0; j < ArrayLength(known_abs); j++) { @@ -299,9 +294,9 @@ _assert_no_change(EV_ABS, i); } - for (i = KEY_RESERVED; i < KEY_MAX; i++) - { + for (i = KEY_RESERVED; i < KEY_MAX; i++) { int j, skip = 0; + for (j = 0; j < ArrayLength(known_keys); j++) { if (i == known_keys[j]) { skip = 1; @@ -321,7 +316,8 @@ SynapticsHwStateFree(&comm.hwState); } -int main (int argc, char **argv) +int +main(int argc, char **argv) { create_pipe_fd(); diff -Nru xserver-xorg-input-synaptics-1.6.0/test/fake-symbols.c xserver-xorg-input-synaptics-1.6.2/test/fake-symbols.c --- xserver-xorg-input-synaptics-1.6.0/test/fake-symbols.c 2012-04-30 00:33:11.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/test/fake-symbols.c 2012-06-12 01:23:34.000000000 +0000 @@ -1,38 +1,38 @@ #include "fake-symbols.h" _X_EXPORT -int xf86ReadSerial (int fd, void *buf, int count) + int +xf86ReadSerial(int fd, void *buf, int count) { return 0; } - _X_EXPORT int -xf86WriteSerial (int fd, const void *buf, int count) +xf86WriteSerial(int fd, const void *buf, int count) { return 0; } _X_EXPORT int -xf86CloseSerial (int fd) +xf86CloseSerial(int fd) { return 0; } _X_EXPORT int -xf86WaitForInput (int fd, int timeout) +xf86WaitForInput(int fd, int timeout) { return 0; } _X_EXPORT int -xf86OpenSerial (OPTTYPE options) +xf86OpenSerial(OPTTYPE options) { return 0; } _X_EXPORT int -xf86SetSerialSpeed (int fd, int speed) +xf86SetSerialSpeed(int fd, int speed) { return 0; } @@ -60,6 +60,7 @@ { return NULL; } + _X_EXPORT CONST char * xf86FindOptionValue(OPTTYPE options, const char *name) { @@ -115,81 +116,69 @@ } _X_EXPORT int -xf86ScaleAxis(int Cx, - int to_max, - int to_min, - int from_max, - int from_min ) +xf86ScaleAxis(int Cx, int to_max, int to_min, int from_max, int from_min) { int X; int64_t to_width = to_max - to_min; int64_t from_width = from_max - from_min; if (from_width) { - X = (int)(((to_width * (Cx - from_min)) / from_width) + to_min); + X = (int) (((to_width * (Cx - from_min)) / from_width) + to_min); } else { - X = 0; - /*ErrorF ("Divide by Zero in xf86ScaleAxis\n");*/ + X = 0; + /*ErrorF ("Divide by Zero in xf86ScaleAxis\n"); */ } if (X > to_max) - X = to_max; + X = to_max; if (X < to_min) - X = to_min; + X = to_min; return X; } - _X_EXPORT void DeleteInputDeviceRequest(DeviceIntPtr pDev) { return; } - #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11 _X_EXPORT void -FreeInputAttributes(InputAttributes *attrs) +FreeInputAttributes(InputAttributes * attrs) { return; } #endif _X_EXPORT void -xf86PostButtonEvent(DeviceIntPtr device, - int is_absolute, - int button, - int is_down, - int first_valuator, - int num_valuators, - ...) +xf86PostButtonEvent(DeviceIntPtr device, + int is_absolute, + int button, + int is_down, int first_valuator, int num_valuators, ...) { return; } _X_EXPORT int -Xasprintf(char ** ret, const char * format, ...) +Xasprintf(char **ret, const char *format, ...) { return 0; } - _X_EXPORT int XISetDevicePropertyDeletable(DeviceIntPtr dev, Atom property, Bool deletable) { return 0; } - _X_EXPORT InputInfoPtr xf86FirstLocalDevice(void) { return NULL; } - _X_EXPORT void xf86DeleteInput(InputInfoPtr pInp, int flags) { @@ -203,23 +192,22 @@ } _X_EXPORT Bool -InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels, +InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom *labels, CARD8 *map) { return FALSE; } _X_EXPORT void -InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval, - int resolution, int min_res, int max_res, int mode) +InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, + int maxval, int resolution, int min_res, int max_res, + int mode) { return; } _X_EXPORT void -xf86PostKeyboardEvent(DeviceIntPtr device, - unsigned int key_code, - int is_down) +xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down) { return; } @@ -231,16 +219,14 @@ } _X_EXPORT void -xf86PostButtonEventP(DeviceIntPtr device, - int is_absolute, - int button, - int is_down, - int first_valuator, - int num_valuators, +xf86PostButtonEventP(DeviceIntPtr device, + int is_absolute, + int button, + int is_down, int first_valuator, int num_valuators, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 const #endif - int *valuators) + int *valuators) { return; } @@ -252,41 +238,38 @@ } _X_EXPORT int -XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type, - int format, int mode, unsigned long len, - OPTTYPE value, Bool sendevent) +XIChangeDeviceProperty(DeviceIntPtr dev, Atom property, Atom type, + int format, int mode, unsigned long len, + OPTTYPE value, Bool sendevent) { return 0; } _X_EXPORT CARD32 -GetTimeInMillis (void) +GetTimeInMillis(void) { return 0; } - _X_EXPORT int -NewInputDeviceRequest (InputOption *options, +NewInputDeviceRequest(InputOption *options, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11 - InputAttributes *attrs, + InputAttributes * attrs, #endif - DeviceIntPtr *pdev) + DeviceIntPtr *pdev) { return 0; } - _X_EXPORT Bool -InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc) +InitLedFeedbackClassDeviceStruct(DeviceIntPtr dev, LedCtrlProcPtr controlProc) { return FALSE; } - #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11 -_X_EXPORT InputAttributes* -DuplicateInputAttributes(InputAttributes *attrs) +_X_EXPORT InputAttributes * +DuplicateInputAttributes(InputAttributes * attrs) { return NULL; } @@ -299,14 +282,14 @@ } _X_EXPORT Bool -InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, +InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func) { return FALSE; } _X_EXPORT long -XIRegisterPropertyHandler(DeviceIntPtr dev, +XIRegisterPropertyHandler(DeviceIntPtr dev, int (*SetProperty) (DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop, @@ -325,7 +308,6 @@ return 0; } - _X_EXPORT void xf86Msg(MessageType type, const char *format, ...) { @@ -344,21 +326,17 @@ return; } - _X_EXPORT void -xf86PostMotionEventP(DeviceIntPtr device, - int is_absolute, - int first_valuator, - int num_valuators, +xf86PostMotionEventP(DeviceIntPtr device, + int is_absolute, int first_valuator, int num_valuators, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 - const + const #endif - int *valuators) + int *valuators) { return; } - _X_EXPORT Bool InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels, int numMotionEvents, int mode) @@ -366,56 +344,47 @@ return FALSE; } - _X_EXPORT OPTTYPE -xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char* val) +xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char *val) { return NULL; } - _X_EXPORT OPTTYPE xf86NextOption(OPTTYPE list) { return NULL; } - _X_EXPORT int -XIGetDeviceProperty (DeviceIntPtr dev, Atom property, XIPropertyValuePtr *value) +XIGetDeviceProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr *value) { return 0; } - _X_EXPORT Atom MakeAtom(const char *string, unsigned len, Bool makeit) { return None; } - _X_EXPORT int GetMotionHistorySize(void) { return 0; } - _X_EXPORT void -xf86PostProximityEventP(DeviceIntPtr device, - int is_in, - int first_valuator, - int num_valuators, +xf86PostProximityEventP(DeviceIntPtr device, + int is_in, int first_valuator, int num_valuators, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 const #endif - int *valuators) + int *valuators) { return; } - _X_EXPORT Bool InitFocusClassDeviceStruct(DeviceIntPtr dev) { @@ -430,12 +399,12 @@ void xf86CollectInputOptions(InputInfoPtr pInfo, - const char **defaultOpts, - OPTTYPE extraOpts) + const char **defaultOpts, OPTTYPE extraOpts) { } -InputInfoPtr xf86AllocateInput(InputDriverPtr drv, int flags) +InputInfoPtr +xf86AllocateInput(InputDriverPtr drv, int flags) { return NULL; } @@ -444,54 +413,63 @@ ClientPtr serverClient; -Bool QueueWorkProc ( - Bool (*function)(ClientPtr /* pClient */, pointer /* closure */), - ClientPtr client, pointer closure) +Bool +QueueWorkProc(Bool (*function) + (ClientPtr /* pClient */ , pointer /* closure */ ), + ClientPtr client, pointer closure) { return FALSE; } #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 -_X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators) +_X_EXPORT ValuatorMask * +valuator_mask_new(int num_valuators) { return NULL; } -_X_EXPORT void valuator_mask_free(ValuatorMask **mask) +_X_EXPORT void +valuator_mask_free(ValuatorMask **mask) { } -_X_EXPORT int valuator_mask_get(const ValuatorMask *mask, int valuator) +_X_EXPORT int +valuator_mask_get(const ValuatorMask *mask, int valuator) { return 0; } -_X_EXPORT void valuator_mask_set(ValuatorMask *mask, int valuator, int data) +_X_EXPORT void +valuator_mask_set(ValuatorMask *mask, int valuator, int data) { } -extern _X_EXPORT void valuator_mask_unset(ValuatorMask *mask, int bit) +extern _X_EXPORT void +valuator_mask_unset(ValuatorMask *mask, int bit) { } -_X_EXPORT int valuator_mask_num_valuators(const ValuatorMask *mask) +_X_EXPORT int +valuator_mask_num_valuators(const ValuatorMask *mask) { return 0; } -_X_EXPORT void valuator_mask_zero(ValuatorMask *mask) +_X_EXPORT void +valuator_mask_zero(ValuatorMask *mask) { } -_X_EXPORT void valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src) +_X_EXPORT void +valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src) { } #endif #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 16 -_X_EXPORT void xf86PostTouchEvent(DeviceIntPtr dev, uint32_t touchid, - uint16_t type, uint32_t flags, - const ValuatorMask *mask) +_X_EXPORT void +xf86PostTouchEvent(DeviceIntPtr dev, uint32_t touchid, + uint16_t type, uint32_t flags, const ValuatorMask *mask) { } #endif diff -Nru xserver-xorg-input-synaptics-1.6.0/test/fake-symbols.h xserver-xorg-input-synaptics-1.6.2/test/fake-symbols.h --- xserver-xorg-input-synaptics-1.6.0/test/fake-symbols.h 2012-04-30 00:33:11.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/test/fake-symbols.h 2012-06-12 01:23:34.000000000 +0000 @@ -6,113 +6,115 @@ #define CONST const #else #define OPTTYPE pointer -#define CONST +#define CONST #endif -extern int xf86ReadSerial (int fd, void *buf, int count); -extern int xf86WriteSerial (int fd, const void *buf, int count); -extern int xf86CloseSerial (int fd); -extern int xf86WaitForInput (int fd, int timeout); -extern int xf86OpenSerial (OPTTYPE options); -extern int xf86SetSerialSpeed (int fd, int speed); - -extern OPTTYPE xf86ReplaceIntOption(OPTTYPE optlist, const char *name, const int val); -extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, const char *val); -extern char* xf86OptionName(OPTTYPE opt); -extern CONST char* xf86FindOptionValue(OPTTYPE options, const char *name); +extern int xf86ReadSerial(int fd, void *buf, int count); +extern int xf86WriteSerial(int fd, const void *buf, int count); +extern int xf86CloseSerial(int fd); +extern int xf86WaitForInput(int fd, int timeout); +extern int xf86OpenSerial(OPTTYPE options); +extern int xf86SetSerialSpeed(int fd, int speed); + +extern OPTTYPE xf86ReplaceIntOption(OPTTYPE optlist, const char *name, + const int val); +extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, + const char *val); +extern char *xf86OptionName(OPTTYPE opt); +extern CONST char *xf86FindOptionValue(OPTTYPE options, const char *name); extern int xf86NameCmp(const char *s1, const char *s2); -extern char* xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); +extern char *xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); - -extern char * xf86SetStrOption(OPTTYPE optlist, const char *name, CONST char *deflt); +extern char *xf86SetStrOption(OPTTYPE optlist, const char *name, + CONST char *deflt); extern int xf86SetBoolOption(OPTTYPE optlist, const char *name, int deflt); -extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, const char *val); -extern CONST char* xf86FindOptionValue(OPTTYPE options, const char *name); -extern char* xf86OptionName(OPTTYPE opt); +extern OPTTYPE xf86AddNewOption(OPTTYPE head, const char *name, + const char *val); +extern CONST char *xf86FindOptionValue(OPTTYPE options, const char *name); +extern char *xf86OptionName(OPTTYPE opt); extern char *xf86OptionValue(OPTTYPE opt); extern int xf86NameCmp(const char *s1, const char *s2); -extern char * xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); +extern char *xf86CheckStrOption(OPTTYPE optlist, const char *name, char *deflt); extern void xf86AddEnabledDevice(InputInfoPtr pInfo); extern void xf86RemoveEnabledDevice(InputInfoPtr pInfo); extern Atom XIGetKnownProperty(char *name); -extern void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags); +extern void xf86AddInputDriver(InputDriverPtr driver, pointer module, + int flags); extern int -xf86ScaleAxis(int Cx, - int to_max, - int to_min, - int from_max, - int from_min ); + xf86ScaleAxis(int Cx, int to_max, int to_min, int from_max, int from_min); extern void DeleteInputDeviceRequest(DeviceIntPtr pDev); + #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11 -extern void FreeInputAttributes(InputAttributes *attrs); +extern void FreeInputAttributes(InputAttributes * attrs); #endif extern void -xf86PostButtonEvent(DeviceIntPtr device, - int is_absolute, - int button, - int is_down, - int first_valuator, - int num_valuators, - ...); -extern int Xasprintf(char ** ret, const char *format, ...); + +xf86PostButtonEvent(DeviceIntPtr device, + int is_absolute, + int button, + int is_down, int first_valuator, int num_valuators, ...); +extern int Xasprintf(char **ret, const char *format, ...); extern int -XISetDevicePropertyDeletable(DeviceIntPtr dev, Atom property, Bool deletable); + XISetDevicePropertyDeletable(DeviceIntPtr dev, Atom property, Bool deletable); extern InputInfoPtr xf86FirstLocalDevice(void); extern void xf86DeleteInput(InputInfoPtr pInp, int flags); extern OPTTYPE xf86OptionListDuplicate(OPTTYPE options); extern Bool -InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels, + +InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom *labels, CARD8 *map); extern void -InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, int maxval, - int resolution, int min_res, int max_res, int mode); + +InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, Atom label, int minval, + int maxval, int resolution, int min_res, int max_res, + int mode); +extern void + xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down); +extern int + xf86SetIntOption(OPTTYPE optlist, const char *name, int deflt); extern void -xf86PostKeyboardEvent(DeviceIntPtr device, - unsigned int key_code, - int is_down); -extern int -xf86SetIntOption(OPTTYPE optlist, const char *name, int deflt); -extern void -xf86PostButtonEventP(DeviceIntPtr device, - int is_absolute, - int button, - int is_down, - int first_valuator, - int num_valuators, + +xf86PostButtonEventP(DeviceIntPtr device, + int is_absolute, + int button, + int is_down, int first_valuator, int num_valuators, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 const #endif - int *valuators); + int *valuators); extern Bool -InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc); + InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc); extern int -XIChangeDeviceProperty (DeviceIntPtr dev, Atom property, Atom type, - int format, int mode, unsigned long len, - OPTTYPE value, Bool sendevent); -extern CARD32 GetTimeInMillis (void); + +XIChangeDeviceProperty(DeviceIntPtr dev, Atom property, Atom type, + int format, int mode, unsigned long len, + OPTTYPE value, Bool sendevent); +extern CARD32 GetTimeInMillis(void); extern int -NewInputDeviceRequest (InputOption *options, + NewInputDeviceRequest(InputOption *options, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11 - InputAttributes *attrs, + InputAttributes * attrs, #endif DeviceIntPtr *pdev); extern Bool -InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc); + InitLedFeedbackClassDeviceStruct(DeviceIntPtr dev, LedCtrlProcPtr controlProc); #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 11 -extern InputAttributes* DuplicateInputAttributes(InputAttributes *attrs); +extern InputAttributes *DuplicateInputAttributes(InputAttributes * attrs); #endif extern int ValidAtom(Atom atom); extern Bool -InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo, + +InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet * rmlvo, BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func); extern long -XIRegisterPropertyHandler(DeviceIntPtr dev, + +XIRegisterPropertyHandler(DeviceIntPtr dev, int (*SetProperty) (DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop, @@ -124,63 +126,62 @@ extern int InitProximityClassDeviceStruct(DeviceIntPtr dev); extern void xf86Msg(MessageType type, const char *format, ...); extern void xf86MsgVerb(MessageType type, int verb, const char *format, ...); -extern void xf86IDrvMsg(InputInfoPtr dev, MessageType type, const char *format, ...); +extern void xf86IDrvMsg(InputInfoPtr dev, MessageType type, const char *format, + ...); extern void -xf86PostMotionEventP(DeviceIntPtr device, - int is_absolute, - int first_valuator, - int num_valuators, + +xf86PostMotionEventP(DeviceIntPtr device, + int is_absolute, int first_valuator, int num_valuators, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 - const + const #endif - int *valuators); + int *valuators); extern Bool + InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels, int numMotionEvents, int mode); extern OPTTYPE -xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char* val); +xf86ReplaceStrOption(OPTTYPE optlist, const char *name, const char *val); extern OPTTYPE xf86NextOption(OPTTYPE list); extern int -XIGetDeviceProperty (DeviceIntPtr dev, Atom property, XIPropertyValuePtr *value); + +XIGetDeviceProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr *value); extern Atom MakeAtom(const char *string, unsigned len, Bool makeit); extern int GetMotionHistorySize(void); extern void -xf86PostProximityEventP(DeviceIntPtr device, - int is_in, - int first_valuator, - int num_valuators, + +xf86PostProximityEventP(DeviceIntPtr device, + int is_in, int first_valuator, int num_valuators, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12 const #endif - int *valuators); + int *valuators); extern Bool InitFocusClassDeviceStruct(DeviceIntPtr dev); - #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12 extern void -xf86ProcessCommonOptions(InputInfoPtr pInfo, OPTTYPE list); + xf86ProcessCommonOptions(InputInfoPtr pInfo, OPTTYPE list); extern void -xf86CollectInputOptions(InputInfoPtr pInfo, - const char **defaultOpts, - OPTTYPE extraOpts); -extern InputInfoPtr -xf86AllocateInput(InputDriverPtr drv, int flags); +xf86CollectInputOptions(InputInfoPtr pInfo, + const char **defaultOpts, OPTTYPE extraOpts); +extern InputInfoPtr xf86AllocateInput(InputDriverPtr drv, int flags); extern ClientPtr serverClient; -extern Bool QueueWorkProc ( - Bool (*function)(ClientPtr /* pClient */, pointer /* closure */), - ClientPtr client, pointer closure); +extern Bool +QueueWorkProc(Bool (*function) + (ClientPtr /* pClient */ , pointer /* closure */ ), + ClientPtr client, pointer closure); #endif diff -Nru xserver-xorg-input-synaptics-1.6.0/tools/synclient.c xserver-xorg-input-synaptics-1.6.2/tools/synclient.c --- xserver-xorg-input-synaptics-1.6.0/tools/synclient.c 2012-04-30 00:33:11.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/tools/synclient.c 2012-06-12 01:23:34.000000000 +0000 @@ -51,12 +51,11 @@ #define XATOM_FLOAT "FLOAT" #endif -union flong { /* Xlibs 64-bit property handling madness */ +union flong { /* Xlibs 64-bit property handling madness */ long l; float f; }; - enum ParaType { PT_INT, PT_BOOL, @@ -64,13 +63,13 @@ }; struct Parameter { - char *name; /* Name of parameter */ - enum ParaType type; /* Type of parameter */ - double min_val; /* Minimum allowed value */ - double max_val; /* Maximum allowed value */ - char *prop_name; /* Property name */ - int prop_format; /* Property format (0 for floats) */ - int prop_offset; /* Offset inside property */ + char *name; /* Name of parameter */ + enum ParaType type; /* Type of parameter */ + double min_val; /* Minimum allowed value */ + double max_val; /* Maximum allowed value */ + char *prop_name; /* Property name */ + int prop_format; /* Property format (0 for floats) */ + int prop_offset; /* Offset inside property */ }; static struct Parameter params[] = { @@ -131,7 +130,7 @@ {"PalmDetect", PT_BOOL, 0, 1, SYNAPTICS_PROP_PALM_DETECT, 8, 0}, {"PalmMinWidth", PT_INT, 0, 15, SYNAPTICS_PROP_PALM_DIMENSIONS, 32, 0}, {"PalmMinZ", PT_INT, 0, 255, SYNAPTICS_PROP_PALM_DIMENSIONS, 32, 1}, - {"CoastingSpeed", PT_DOUBLE, 0, 20, SYNAPTICS_PROP_COASTING_SPEED, 0 /* float*/, 0}, + {"CoastingSpeed", PT_DOUBLE, 0, 255, SYNAPTICS_PROP_COASTING_SPEED, 0 /* float*/, 0}, {"CoastingFriction", PT_DOUBLE, 0, 255, SYNAPTICS_PROP_COASTING_SPEED, 0 /* float*/, 1}, {"PressureMotionMinZ", PT_INT, 1, 255, SYNAPTICS_PROP_PRESSURE_MOTION, 32, 0}, {"PressureMotionMaxZ", PT_INT, 1, 255, SYNAPTICS_PROP_PRESSURE_MOTION, 32, 1}, @@ -158,61 +157,65 @@ }; static double -parse_cmd(char* cmd, struct Parameter** par) +parse_cmd(char *cmd, struct Parameter **par) { char *eqp = strchr(cmd, '='); + *par = NULL; if (eqp) { - int j; - int found = 0; - *eqp = 0; - for (j = 0; params[j].name; j++) { - if (strcasecmp(cmd, params[j].name) == 0) { - found = 1; - break; - } - } - if (found) { - double val = atof(&eqp[1]); - *par = ¶ms[j]; - - if (val < (*par)->min_val) - val = (*par)->min_val; - if (val > (*par)->max_val) - val = (*par)->max_val; - - return val; - } else { - printf("Unknown parameter %s\n", cmd); - } - } else { - printf("Invalid command: %s\n", cmd); + int j; + int found = 0; + + *eqp = 0; + for (j = 0; params[j].name; j++) { + if (strcasecmp(cmd, params[j].name) == 0) { + found = 1; + break; + } + } + if (found) { + double val = atof(&eqp[1]); + + *par = ¶ms[j]; + + if (val < (*par)->min_val) + val = (*par)->min_val; + if (val > (*par)->max_val) + val = (*par)->max_val; + + return val; + } + else { + printf("Unknown parameter %s\n", cmd); + } + } + else { + printf("Invalid command: %s\n", cmd); } return 0; } static int -is_equal(SynapticsSHM *s1, SynapticsSHM *s2) +is_equal(SynapticsSHM * s1, SynapticsSHM * s2) { int i; - if ((s1->x != s2->x) || - (s1->y != s2->y) || - (s1->z != s2->z) || - (s1->numFingers != s2->numFingers) || - (s1->fingerWidth != s2->fingerWidth) || - (s1->left != s2->left) || - (s1->right != s2->right) || - (s1->up != s2->up) || - (s1->down != s2->down) || - (s1->middle != s2->middle)) - return 0; + if ((s1->x != s2->x) || + (s1->y != s2->y) || + (s1->z != s2->z) || + (s1->numFingers != s2->numFingers) || + (s1->fingerWidth != s2->fingerWidth) || + (s1->left != s2->left) || + (s1->right != s2->right) || + (s1->up != s2->up) || + (s1->down != s2->down) || (s1->middle != s2->middle)) + return 0; for (i = 0; i < 8; i++) - if (s1->multi[i] != s2->multi[i]) - return 0; + if (s1->multi[i] != s2->multi[i]) + return 0; return 1; } @@ -221,58 +224,64 @@ get_time(void) { struct timeval tv; + gettimeofday(&tv, NULL); return tv.tv_sec + tv.tv_usec / 1000000.0; } static void -shm_monitor(SynapticsSHM *synshm, int delay) +shm_monitor(SynapticsSHM * synshm, int delay) { int header = 0; SynapticsSHM old; double t0 = get_time(); memset(&old, 0, sizeof(SynapticsSHM)); - old.x = -1; /* Force first equality test to fail */ + old.x = -1; /* Force first equality test to fail */ while (1) { - SynapticsSHM cur = *synshm; - if (!is_equal(&old, &cur)) { - if (!header) { - printf("%8s %4s %4s %3s %s %2s %2s %s %s %s %s %8s " - "%2s %2s %2s %3s %3s\n", - "time", "x", "y", "z", "f", "w", "l", "r", "u", "d", "m", - "multi", "gl", "gm", "gr", "gdx", "gdy"); - header = 20; - } - header--; - printf("%8.3f %4d %4d %3d %d %2d %2d %d %d %d %d %d%d%d%d%d%d%d%d\n", - get_time() - t0, - cur.x, cur.y, cur.z, cur.numFingers, cur.fingerWidth, - cur.left, cur.right, cur.up, cur.down, cur.middle, - cur.multi[0], cur.multi[1], cur.multi[2], cur.multi[3], - cur.multi[4], cur.multi[5], cur.multi[6], cur.multi[7]); - fflush(stdout); - old = cur; - } - usleep(delay * 1000); + SynapticsSHM cur = *synshm; + + if (!is_equal(&old, &cur)) { + if (!header) { + printf("%8s %4s %4s %3s %s %2s %2s %s %s %s %s %8s " + "%2s %2s %2s %3s %3s\n", + "time", "x", "y", "z", "f", "w", "l", "r", "u", "d", "m", + "multi", "gl", "gm", "gr", "gdx", "gdy"); + header = 20; + } + header--; + printf + ("%8.3f %4d %4d %3d %d %2d %2d %d %d %d %d %d%d%d%d%d%d%d%d\n", + get_time() - t0, cur.x, cur.y, cur.z, cur.numFingers, + cur.fingerWidth, cur.left, cur.right, cur.up, cur.down, + cur.middle, cur.multi[0], cur.multi[1], cur.multi[2], + cur.multi[3], cur.multi[4], cur.multi[5], cur.multi[6], + cur.multi[7]); + fflush(stdout); + old = cur; + } + usleep(delay * 1000); } } /** Init and return SHM area or NULL on error */ -static SynapticsSHM* +static SynapticsSHM * shm_init() { SynapticsSHM *synshm = NULL; int shmid = 0; if ((shmid = shmget(SHM_SYNAPTICS, sizeof(SynapticsSHM), 0)) == -1) { - if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) == -1) - fprintf(stderr, "Can't access shared memory area. SHMConfig disabled?\n"); - else - fprintf(stderr, "Incorrect size of shared memory area. Incompatible driver version?\n"); - } else if ((synshm = (SynapticsSHM*) shmat(shmid, NULL, SHM_RDONLY)) == NULL) - perror("shmat"); + if ((shmid = shmget(SHM_SYNAPTICS, 0, 0)) == -1) + fprintf(stderr, + "Can't access shared memory area. SHMConfig disabled?\n"); + else + fprintf(stderr, + "Incorrect size of shared memory area. Incompatible driver version?\n"); + } + else if ((synshm = (SynapticsSHM *) shmat(shmid, NULL, SHM_RDONLY)) == NULL) + perror("shmat"); return synshm; } @@ -291,134 +300,130 @@ } /** Init display connection or NULL on error */ -static Display* +static Display * dp_init() { - Display *dpy = NULL; - XExtensionVersion *v = NULL; - Atom touchpad_type = 0; - Atom synaptics_property = 0; - int error = 0; + Display *dpy = NULL; + XExtensionVersion *v = NULL; + Atom touchpad_type = 0; + Atom synaptics_property = 0; + int error = 0; dpy = XOpenDisplay(NULL); if (!dpy) { - fprintf(stderr, "Failed to connect to X Server.\n"); - error = 1; - goto unwind; + fprintf(stderr, "Failed to connect to X Server.\n"); + error = 1; + goto unwind; } v = XGetExtensionVersion(dpy, INAME); if (!v->present || - (v->major_version * 1000 + v->minor_version) < (XI_Add_DeviceProperties_Major * 1000 - + XI_Add_DeviceProperties_Minor)) { - fprintf(stderr, "X server supports X Input %d.%d. I need %d.%d.\n", - v->major_version, v->minor_version, - XI_Add_DeviceProperties_Major, - XI_Add_DeviceProperties_Minor); - error = 1; - goto unwind; + (v->major_version * 1000 + v->minor_version) < + (XI_Add_DeviceProperties_Major * 1000 + + XI_Add_DeviceProperties_Minor)) { + fprintf(stderr, "X server supports X Input %d.%d. I need %d.%d.\n", + v->major_version, v->minor_version, + XI_Add_DeviceProperties_Major, XI_Add_DeviceProperties_Minor); + error = 1; + goto unwind; } /* We know synaptics sets XI_TOUCHPAD for all the devices. */ touchpad_type = XInternAtom(dpy, XI_TOUCHPAD, True); if (!touchpad_type) { - fprintf(stderr, "XI_TOUCHPAD not initialised.\n"); - error = 1; - goto unwind; + fprintf(stderr, "XI_TOUCHPAD not initialised.\n"); + error = 1; + goto unwind; } synaptics_property = XInternAtom(dpy, SYNAPTICS_PROP_EDGES, True); if (!synaptics_property) { - fprintf(stderr, "Couldn't find synaptics properties. No synaptics " - "driver loaded?\n"); - error = 1; - goto unwind; + fprintf(stderr, "Couldn't find synaptics properties. No synaptics " + "driver loaded?\n"); + error = 1; + goto unwind; } -unwind: + unwind: XFree(v); - if (error && dpy) - { - XCloseDisplay(dpy); - dpy = NULL; + if (error && dpy) { + XCloseDisplay(dpy); + dpy = NULL; } return dpy; } static XDevice * -dp_get_device(Display *dpy) +dp_get_device(Display * dpy) { - XDevice* dev = NULL; - XDeviceInfo *info = NULL; - int ndevices = 0; - Atom touchpad_type = 0; - Atom synaptics_property = 0; - Atom *properties = NULL; - int nprops = 0; - int error = 0; + XDevice *dev = NULL; + XDeviceInfo *info = NULL; + int ndevices = 0; + Atom touchpad_type = 0; + Atom synaptics_property = 0; + Atom *properties = NULL; + int nprops = 0; + int error = 0; touchpad_type = XInternAtom(dpy, XI_TOUCHPAD, True); synaptics_property = XInternAtom(dpy, SYNAPTICS_PROP_EDGES, True); info = XListInputDevices(dpy, &ndevices); - while(ndevices--) { - if (info[ndevices].type == touchpad_type) { - dev = XOpenDevice(dpy, info[ndevices].id); - if (!dev) { - fprintf(stderr, "Failed to open device '%s'.\n", - info[ndevices].name); - error = 1; - goto unwind; - } - - properties = XListDeviceProperties(dpy, dev, &nprops); - if (!properties || !nprops) - { - fprintf(stderr, "No properties on device '%s'.\n", - info[ndevices].name); - error = 1; - goto unwind; - } - - while(nprops--) - { - if (properties[nprops] == synaptics_property) - break; - } - if (!nprops) - { - fprintf(stderr, "No synaptics properties on device '%s'.\n", - info[ndevices].name); - error = 1; - goto unwind; - } + while (ndevices--) { + if (info[ndevices].type == touchpad_type) { + dev = XOpenDevice(dpy, info[ndevices].id); + if (!dev) { + fprintf(stderr, "Failed to open device '%s'.\n", + info[ndevices].name); + error = 1; + goto unwind; + } + + properties = XListDeviceProperties(dpy, dev, &nprops); + if (!properties || !nprops) { + fprintf(stderr, "No properties on device '%s'.\n", + info[ndevices].name); + error = 1; + goto unwind; + } + + while (nprops--) { + if (properties[nprops] == synaptics_property) + break; + } + if (!nprops) { + fprintf(stderr, "No synaptics properties on device '%s'.\n", + info[ndevices].name); + error = 1; + goto unwind; + } - break; /* Yay, device is suitable */ - } + break; /* Yay, device is suitable */ + } } -unwind: + unwind: XFree(properties); XFreeDeviceList(info); if (!dev) fprintf(stderr, "Unable to find a synaptics device.\n"); - else if (error && dev) - { - XCloseDevice(dpy, dev); - dev = NULL; + else if (error && dev) { + XCloseDevice(dpy, dev); + dev = NULL; } return dev; } static void -dp_set_variables(Display *dpy, XDevice* dev, int argc, char *argv[], int first_cmd) +dp_set_variables(Display * dpy, XDevice * dev, int argc, char *argv[], + int first_cmd) { int i; double val; struct Parameter *par; Atom prop, type, float_type; int format; - unsigned char* data; + unsigned char *data; unsigned long nitems, bytes_after; union flong *f; @@ -427,81 +432,78 @@ float_type = XInternAtom(dpy, XATOM_FLOAT, True); if (!float_type) - fprintf(stderr, "Float properties not available.\n"); + fprintf(stderr, "Float properties not available.\n"); for (i = first_cmd; i < argc; i++) { - val = parse_cmd(argv[i], &par); - if (!par) - continue; - - prop = XInternAtom(dpy, par->prop_name, True); - if (!prop) - { - fprintf(stderr, "Property for '%s' not available. Skipping.\n", - par->name); - continue; - - } - - XGetDeviceProperty(dpy, dev, prop, 0, 1000, False, AnyPropertyType, - &type, &format, &nitems, &bytes_after, &data); - - if (type == None) - { - fprintf(stderr, "Property for '%s' not available. Skipping.\n", - par->name); - continue; - } - - switch(par->prop_format) - { - case 8: - if (format != par->prop_format || type != XA_INTEGER) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - par->name, format); - break; - } - b = (char*)data; - b[par->prop_offset] = rint(val); - break; - case 32: - if (format != par->prop_format || - (type != XA_INTEGER && type != XA_CARDINAL)) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - par->name, format); - break; - } - n = (long*)data; - n[par->prop_offset] = rint(val); - break; - case 0: /* float */ - if (!float_type) - continue; - if (format != 32 || type != float_type) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - par->name, format); - break; - } - f = (union flong*)data; - f[par->prop_offset].f = val; - break; - } - - XChangeDeviceProperty(dpy, dev, prop, type, format, - PropModeReplace, data, nitems); - XFlush(dpy); + val = parse_cmd(argv[i], &par); + if (!par) + continue; + + prop = XInternAtom(dpy, par->prop_name, True); + if (!prop) { + fprintf(stderr, "Property for '%s' not available. Skipping.\n", + par->name); + continue; + + } + + XGetDeviceProperty(dpy, dev, prop, 0, 1000, False, AnyPropertyType, + &type, &format, &nitems, &bytes_after, &data); + + if (type == None) { + fprintf(stderr, "Property for '%s' not available. Skipping.\n", + par->name); + continue; + } + + switch (par->prop_format) { + case 8: + if (format != par->prop_format || type != XA_INTEGER) { + fprintf(stderr, " %-23s = format mismatch (%d)\n", + par->name, format); + break; + } + b = (char *) data; + b[par->prop_offset] = rint(val); + break; + case 32: + if (format != par->prop_format || + (type != XA_INTEGER && type != XA_CARDINAL)) { + fprintf(stderr, " %-23s = format mismatch (%d)\n", + par->name, format); + break; + } + n = (long *) data; + n[par->prop_offset] = rint(val); + break; + case 0: /* float */ + if (!float_type) + continue; + if (format != 32 || type != float_type) { + fprintf(stderr, " %-23s = format mismatch (%d)\n", + par->name, format); + break; + } + f = (union flong *) data; + f[par->prop_offset].f = val; + break; + } + + XChangeDeviceProperty(dpy, dev, prop, type, format, + PropModeReplace, data, nitems); + XFlush(dpy); } } /* FIXME: horribly inefficient. */ static void -dp_show_settings(Display *dpy, XDevice *dev) +dp_show_settings(Display * dpy, XDevice * dev) { int j; Atom a, type, float_type; int format; unsigned long nitems, bytes_after; - unsigned char* data; + unsigned char *data; int len; union flong *f; @@ -510,69 +512,75 @@ float_type = XInternAtom(dpy, XATOM_FLOAT, True); if (!float_type) - fprintf(stderr, "Float properties not available.\n"); + fprintf(stderr, "Float properties not available.\n"); printf("Parameter settings:\n"); for (j = 0; params[j].name; j++) { - struct Parameter *par = ¶ms[j]; - a = XInternAtom(dpy, par->prop_name, True); - if (!a) - continue; - - len = 1 + ((par->prop_offset * (par->prop_format ? par->prop_format : 32)/8))/4; - - XGetDeviceProperty(dpy, dev, a, 0, len, False, - AnyPropertyType, &type, &format, - &nitems, &bytes_after, &data); - if (type == None) - continue; - - switch(par->prop_format) { - case 8: - if (format != par->prop_format || type != XA_INTEGER) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - par->name, format); - break; - } - - b = (char*)data; - printf(" %-23s = %d\n", par->name, b[par->prop_offset]); - break; - case 32: - if (format != par->prop_format || - (type != XA_INTEGER && type != XA_CARDINAL)) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - par->name, format); - break; - } - - i = (long*)data; - printf(" %-23s = %ld\n", par->name, i[par->prop_offset]); - break; - case 0: /* Float */ - if (!float_type) - continue; - if (format != 32 || type != float_type) { - fprintf(stderr, " %-23s = format mismatch (%d)\n", - par->name, format); - break; - } - - f = (union flong*)data; - printf(" %-23s = %g\n", par->name, f[par->prop_offset].f); - break; - } + struct Parameter *par = ¶ms[j]; + + a = XInternAtom(dpy, par->prop_name, True); + if (!a) + continue; + + len = + 1 + + ((par->prop_offset * (par->prop_format ? par->prop_format : 32) / + 8)) / 4; + + XGetDeviceProperty(dpy, dev, a, 0, len, False, + AnyPropertyType, &type, &format, + &nitems, &bytes_after, &data); + if (type == None) + continue; + + switch (par->prop_format) { + case 8: + if (format != par->prop_format || type != XA_INTEGER) { + fprintf(stderr, " %-23s = format mismatch (%d)\n", + par->name, format); + break; + } + + b = (char *) data; + printf(" %-23s = %d\n", par->name, b[par->prop_offset]); + break; + case 32: + if (format != par->prop_format || + (type != XA_INTEGER && type != XA_CARDINAL)) { + fprintf(stderr, " %-23s = format mismatch (%d)\n", + par->name, format); + break; + } + + i = (long *) data; + printf(" %-23s = %ld\n", par->name, i[par->prop_offset]); + break; + case 0: /* Float */ + if (!float_type) + continue; + if (format != 32 || type != float_type) { + fprintf(stderr, " %-23s = format mismatch (%d)\n", + par->name, format); + break; + } + + f = (union flong *) data; + printf(" %-23s = %g\n", par->name, f[par->prop_offset].f); + break; + } - XFree(data); + XFree(data); } } static void usage(void) { - fprintf(stderr, "Usage: synclient [-s] [-m interval] [-h] [-l] [-V] [-?] [var1=value1 [var2=value2] ...]\n"); - fprintf(stderr, " -m monitor changes to the touchpad state (implies -s)\n" - " interval specifies how often (in ms) to poll the touchpad state\n"); + fprintf(stderr, + "Usage: synclient [-s] [-m interval] [-h] [-l] [-V] [-?] [var1=value1 [var2=value2] ...]\n"); + fprintf(stderr, + " -m monitor changes to the touchpad state (implies -s)\n" + " interval specifies how often (in ms) to poll the touchpad state\n"); fprintf(stderr, " -l List current user settings\n"); fprintf(stderr, " -V Print synclient version string and exit\n"); fprintf(stderr, " -? Show this help message\n"); @@ -597,26 +605,26 @@ /* Parse command line parameters */ while ((c = getopt(argc, argv, "sm:hlV")) != -1) { - switch (c) { - case 'm': - do_monitor = 1; - if ((delay = atoi(optarg)) < 0) - usage(); - break; - case 'l': - dump_settings = 1; - break; - case 'V': - printf("%s\n", VERSION); - exit(0); - default: - usage(); - } + switch (c) { + case 'm': + do_monitor = 1; + if ((delay = atoi(optarg)) < 0) + usage(); + break; + case 'l': + dump_settings = 1; + break; + case 'V': + printf("%s\n", VERSION); + exit(0); + default: + usage(); + } } first_cmd = optind; if (!do_monitor && !dump_settings && first_cmd == argc) - usage(); + usage(); /* Connect to the shared memory area */ if (do_monitor) diff -Nru xserver-xorg-input-synaptics-1.6.0/tools/syndaemon.c xserver-xorg-input-synaptics-1.6.2/tools/syndaemon.c --- xserver-xorg-input-synaptics-1.6.0/tools/syndaemon.c 2012-04-30 00:33:11.000000000 +0000 +++ xserver-xorg-input-synaptics-1.6.2/tools/syndaemon.c 2012-06-12 01:23:34.000000000 +0000 @@ -34,7 +34,7 @@ #ifdef HAVE_X11_EXTENSIONS_RECORD_H #include #include -#endif /* HAVE_X11_EXTENSIONS_RECORD_H */ +#endif /* HAVE_X11_EXTENSIONS_RECORD_H */ #include #include @@ -54,8 +54,8 @@ TappingOff = 2 } TouchpadState; - -static Bool pad_disabled /* internal flag, this does not correspond to device state */; +static Bool pad_disabled + /* internal flag, this does not correspond to device state */ ; static int ignore_modifier_combos; static int ignore_modifier_keys; static int background; @@ -73,15 +73,19 @@ static void usage(void) { - fprintf(stderr, "Usage: syndaemon [-i idle-time] [-m poll-delay] [-d] [-t] [-k]\n"); - fprintf(stderr, " -i How many seconds to wait after the last key press before\n"); + fprintf(stderr, + "Usage: syndaemon [-i idle-time] [-m poll-delay] [-d] [-t] [-k]\n"); + fprintf(stderr, + " -i How many seconds to wait after the last key press before\n"); fprintf(stderr, " enabling the touchpad. (default is 2.0s)\n"); fprintf(stderr, " -m How many milli-seconds to wait until next poll.\n"); fprintf(stderr, " (default is 200ms)\n"); fprintf(stderr, " -d Start as a daemon, i.e. in the background.\n"); fprintf(stderr, " -p Create a pid file with the specified name.\n"); - fprintf(stderr, " -t Only disable tapping and scrolling, not mouse movements.\n"); - fprintf(stderr, " -k Ignore modifier keys when monitoring keyboard activity.\n"); + fprintf(stderr, + " -t Only disable tapping and scrolling, not mouse movements.\n"); + fprintf(stderr, + " -k Ignore modifier keys when monitoring keyboard activity.\n"); fprintf(stderr, " -K Like -k but also ignore Modifier+Key combos.\n"); fprintf(stderr, " -R Use the XRecord extension.\n"); fprintf(stderr, " -v Print diagnostic messages.\n"); @@ -96,9 +100,10 @@ unsigned long nitems, bytes_after; unsigned char *data; - if ((XGetDeviceProperty (display, dev, touchpad_off_prop, 0, 1, False, - XA_INTEGER, &real_type, &real_format, &nitems, - &bytes_after, &data) == Success) && (real_type != None)) { + if ((XGetDeviceProperty(display, dev, touchpad_off_prop, 0, 1, False, + XA_INTEGER, &real_type, &real_format, &nitems, + &bytes_after, &data) == Success) && + (real_type != None)) { previous_state = data[0]; } } @@ -110,25 +115,27 @@ toggle_touchpad(Bool enable) { unsigned char data; + if (pad_disabled && enable) { data = previous_state; pad_disabled = False; if (verbose) printf("Enable\n"); - } else if (!pad_disabled && !enable && - previous_state != disable_state && - previous_state != TouchpadOff) { + } + else if (!pad_disabled && !enable && + previous_state != disable_state && previous_state != TouchpadOff) { store_current_touchpad_state(); pad_disabled = True; data = disable_state; if (verbose) printf("Disable\n"); - } else + } + else return; - /* This potentially overwrites a different client's setting, but ...*/ + /* This potentially overwrites a different client's setting, but ... */ XChangeDeviceProperty(display, dev, touchpad_off_prop, XA_INTEGER, 8, - PropModeReplace, &data, 1); + PropModeReplace, &data, 1); XFlush(display); } @@ -138,7 +145,7 @@ toggle_touchpad(True); if (pid_file) - unlink(pid_file); + unlink(pid_file); kill(getpid(), signum); } @@ -146,11 +153,11 @@ install_signal_handler(void) { static int signals[] = { - SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, - SIGBUS, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE, - SIGALRM, SIGTERM, + SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, + SIGBUS, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE, + SIGALRM, SIGTERM, #ifdef SIGPWR - SIGPWR + SIGPWR #endif }; int i; @@ -167,10 +174,10 @@ #endif for (i = 0; i < sizeof(signals) / sizeof(int); i++) { - if (sigaction(signals[i], &act, NULL) == -1) { - perror("sigaction"); - exit(2); - } + if (sigaction(signals[i], &act, NULL) == -1) { + perror("sigaction"); + exit(2); + } } } @@ -178,31 +185,31 @@ * Return non-zero if the keyboard state has changed since the last call. */ static int -keyboard_activity(Display *display) +keyboard_activity(Display * display) { static unsigned char old_key_state[KEYMAP_SIZE]; unsigned char key_state[KEYMAP_SIZE]; int i; int ret = 0; - XQueryKeymap(display, (char*)key_state); + XQueryKeymap(display, (char *) key_state); for (i = 0; i < KEYMAP_SIZE; i++) { - if ((key_state[i] & ~old_key_state[i]) & keyboard_mask[i]) { - ret = 1; - break; - } + if ((key_state[i] & ~old_key_state[i]) & keyboard_mask[i]) { + ret = 1; + break; + } } if (ignore_modifier_combos) { - for (i = 0; i < KEYMAP_SIZE; i++) { - if (key_state[i] & ~keyboard_mask[i]) { - ret = 0; - break; - } - } + for (i = 0; i < KEYMAP_SIZE; i++) { + if (key_state[i] & ~keyboard_mask[i]) { + ret = 0; + break; + } + } } for (i = 0; i < KEYMAP_SIZE; i++) - old_key_state[i] = key_state[i]; + old_key_state[i] = key_state[i]; return ret; } @@ -210,12 +217,13 @@ get_time(void) { struct timeval tv; + gettimeofday(&tv, NULL); return tv.tv_sec + tv.tv_usec / 1000000.0; } static void -main_loop(Display *display, double idle_time, int poll_delay) +main_loop(Display * display, double idle_time, int poll_delay) { double last_activity = 0.0; double current_time; @@ -223,22 +231,23 @@ keyboard_activity(display); for (;;) { - current_time = get_time(); - if (keyboard_activity(display)) - last_activity = current_time; - - /* If system times goes backwards, touchpad can get locked. Make - * sure our last activity wasn't in the future and reset if it was. */ - if (last_activity > current_time) - last_activity = current_time - idle_time - 1; - - if (current_time > last_activity + idle_time) { /* Enable touchpad */ - toggle_touchpad(True); - } else { /* Disable touchpad */ - toggle_touchpad(False); - } + current_time = get_time(); + if (keyboard_activity(display)) + last_activity = current_time; + + /* If system times goes backwards, touchpad can get locked. Make + * sure our last activity wasn't in the future and reset if it was. */ + if (last_activity > current_time) + last_activity = current_time - idle_time - 1; + + if (current_time > last_activity + idle_time) { /* Enable touchpad */ + toggle_touchpad(True); + } + else { /* Disable touchpad */ + toggle_touchpad(False); + } - usleep(poll_delay); + usleep(poll_delay); } } @@ -247,26 +256,28 @@ { int byte_num = bit / 8; int bit_num = bit % 8; + ptr[byte_num] &= ~(1 << bit_num); } static void -setup_keyboard_mask(Display *display, int ignore_modifier_keys) +setup_keyboard_mask(Display * display, int ignore_modifier_keys) { XModifierKeymap *modifiers; int i; for (i = 0; i < KEYMAP_SIZE; i++) - keyboard_mask[i] = 0xff; + keyboard_mask[i] = 0xff; if (ignore_modifier_keys) { - modifiers = XGetModifierMapping(display); - for (i = 0; i < 8 * modifiers->max_keypermod; i++) { - KeyCode kc = modifiers->modifiermap[i]; - if (kc != 0) - clear_bit(keyboard_mask, kc); - } - XFreeModifiermap(modifiers); + modifiers = XGetModifierMapping(display); + for (i = 0; i < 8 * modifiers->max_keypermod; i++) { + KeyCode kc = modifiers->modifiermap[i]; + + if (kc != 0) + clear_bit(keyboard_mask, kc); + } + XFreeModifiermap(modifiers); } } @@ -284,96 +295,104 @@ }; /* test if the xrecord extension is found */ -Bool check_xrecord(Display *display) { +Bool +check_xrecord(Display * display) +{ - Bool found; + Bool found; Status status; - int major_opcode, minor_opcode, first_error; - int version[2]; + int major_opcode, minor_opcode, first_error; + int version[2]; found = XQueryExtension(display, - "RECORD", - &major_opcode, - &minor_opcode, - &first_error); + "RECORD", + &major_opcode, &minor_opcode, &first_error); - status = XRecordQueryVersion(display, version, version+1); + status = XRecordQueryVersion(display, version, version + 1); if (verbose && status) { - printf("X RECORD extension version %d.%d\n", version[0], version[1]); + printf("X RECORD extension version %d.%d\n", version[0], version[1]); } return found; } /* called by XRecordProcessReplies() */ -void xrecord_callback( XPointer closure, XRecordInterceptData* recorded_data) { +void +xrecord_callback(XPointer closure, XRecordInterceptData * recorded_data) +{ struct xrecord_callback_results *cbres; xEvent *xev; int nxev; - cbres = (struct xrecord_callback_results *)closure; + cbres = (struct xrecord_callback_results *) closure; if (recorded_data->category != XRecordFromServer) { - XRecordFreeData(recorded_data); - return; + XRecordFreeData(recorded_data); + return; } nxev = recorded_data->data_len / 8; - xev = (xEvent *)recorded_data->data; - while(nxev--) { + xev = (xEvent *) recorded_data->data; + while (nxev--) { - if ( (xev->u.u.type == KeyPress) || (xev->u.u.type == KeyRelease)) { - int i; - int is_modifier = 0; - - cbres->key_event = 1; /* remember, a key was pressed or released. */ - - /* test if it was a modifier */ - for (i = 0; i < 8 * cbres->modifiers->max_keypermod; i++) { - KeyCode kc = cbres->modifiers->modifiermap[i]; - - if (kc == xev->u.u.detail) { - is_modifier = 1; /* yes, it is a modifier. */ - break; - } - } - - if (is_modifier) { - if (xev->u.u.type == KeyPress) { - for (i=0; i < MAX_MODIFIERS; ++i) - if (!cbres->pressed_modifiers[i]) { - cbres->pressed_modifiers[i] = xev->u.u.detail; - break; - } - } else { /* KeyRelease */ - for (i=0; i < MAX_MODIFIERS; ++i) - if (cbres->pressed_modifiers[i] == xev->u.u.detail) - cbres->pressed_modifiers[i] = 0; - } - - } else { - /* remember, a non-modifier was pressed. */ - cbres->non_modifier_event = 1; - } - } + if ((xev->u.u.type == KeyPress) || (xev->u.u.type == KeyRelease)) { + int i; + int is_modifier = 0; + + cbres->key_event = 1; /* remember, a key was pressed or released. */ + + /* test if it was a modifier */ + for (i = 0; i < 8 * cbres->modifiers->max_keypermod; i++) { + KeyCode kc = cbres->modifiers->modifiermap[i]; + + if (kc == xev->u.u.detail) { + is_modifier = 1; /* yes, it is a modifier. */ + break; + } + } + + if (is_modifier) { + if (xev->u.u.type == KeyPress) { + for (i = 0; i < MAX_MODIFIERS; ++i) + if (!cbres->pressed_modifiers[i]) { + cbres->pressed_modifiers[i] = xev->u.u.detail; + break; + } + } + else { /* KeyRelease */ + for (i = 0; i < MAX_MODIFIERS; ++i) + if (cbres->pressed_modifiers[i] == xev->u.u.detail) + cbres->pressed_modifiers[i] = 0; + } + + } + else { + /* remember, a non-modifier was pressed. */ + cbres->non_modifier_event = 1; + } + } - xev++; + xev++; } - XRecordFreeData(recorded_data); /* cleanup */ + XRecordFreeData(recorded_data); /* cleanup */ } -static int is_modifier_pressed(const struct xrecord_callback_results *cbres) { +static int +is_modifier_pressed(const struct xrecord_callback_results *cbres) +{ int i; for (i = 0; i < MAX_MODIFIERS; ++i) - if (cbres->pressed_modifiers[i]) - return 1; + if (cbres->pressed_modifiers[i]) + return 1; return 0; } -void record_main_loop(Display* display, double idle_time) { +void +record_main_loop(Display * display, double idle_time) +{ struct xrecord_callback_results cbres; XRecordContext context; @@ -382,141 +401,139 @@ XRecordRange *range; int i; - dpy_data = XOpenDisplay(NULL); /* we need an additional data connection. */ - range = XRecordAllocRange(); + dpy_data = XOpenDisplay(NULL); /* we need an additional data connection. */ + range = XRecordAllocRange(); range->device_events.first = KeyPress; - range->device_events.last = KeyRelease; + range->device_events.last = KeyRelease; - context = XRecordCreateContext(dpy_data, 0, - &cspec,1, - &range, 1); + context = XRecordCreateContext(dpy_data, 0, &cspec, 1, &range, 1); - XRecordEnableContextAsync(dpy_data, context, xrecord_callback, (XPointer)&cbres); + XRecordEnableContextAsync(dpy_data, context, xrecord_callback, + (XPointer) & cbres); - cbres.modifiers = XGetModifierMapping(display); + cbres.modifiers = XGetModifierMapping(display); /* clear list of modifiers */ for (i = 0; i < MAX_MODIFIERS; ++i) - cbres.pressed_modifiers[i] = 0; + cbres.pressed_modifiers[i] = 0; while (1) { - int fd = ConnectionNumber(dpy_data); - fd_set read_fds; - int ret; - int disable_event = 0; - struct timeval timeout; - - FD_ZERO(&read_fds); - FD_SET(fd, &read_fds); - - ret = select(fd+1 /* =(max descriptor in read_fds) + 1 */, - &read_fds, NULL, NULL, - pad_disabled ? &timeout : NULL /* timeout only required for enabling */ ); - - if (FD_ISSET(fd, &read_fds)) { - - cbres.key_event = 0; - cbres.non_modifier_event = 0; - - XRecordProcessReplies(dpy_data); - - /* If there are any events left over, they are in error. Drain them - * from the connection queue so we don't get stuck. */ - while (XEventsQueued(dpy_data, QueuedAlready) > 0) { - XEvent event; - XNextEvent(dpy_data, &event); - fprintf(stderr, "bad event received, major opcode %d\n", event.type); - } - - if (!ignore_modifier_keys && cbres.key_event) { - disable_event = 1; - } - - if (cbres.non_modifier_event && - !(ignore_modifier_combos && is_modifier_pressed(&cbres)) ) { - disable_event = 1; - } - } - - if (disable_event) { - /* adjust the enable_time */ - timeout.tv_sec = (int)idle_time; - timeout.tv_usec = (idle_time-(double)timeout.tv_sec) * 1.e6; - - toggle_touchpad(False); - } - - if (ret == 0 && pad_disabled) { /* timeout => enable event */ - toggle_touchpad(True); - } + int fd = ConnectionNumber(dpy_data); + fd_set read_fds; + int ret; + int disable_event = 0; + struct timeval timeout; + + FD_ZERO(&read_fds); + FD_SET(fd, &read_fds); + + ret = select(fd + 1 /* =(max descriptor in read_fds) + 1 */ , + &read_fds, NULL, NULL, + pad_disabled ? &timeout : NULL + /* timeout only required for enabling */ ); + + if (FD_ISSET(fd, &read_fds)) { + + cbres.key_event = 0; + cbres.non_modifier_event = 0; + + XRecordProcessReplies(dpy_data); + + /* If there are any events left over, they are in error. Drain them + * from the connection queue so we don't get stuck. */ + while (XEventsQueued(dpy_data, QueuedAlready) > 0) { + XEvent event; + + XNextEvent(dpy_data, &event); + fprintf(stderr, "bad event received, major opcode %d\n", + event.type); + } + + if (!ignore_modifier_keys && cbres.key_event) { + disable_event = 1; + } + + if (cbres.non_modifier_event && + !(ignore_modifier_combos && is_modifier_pressed(&cbres))) { + disable_event = 1; + } + } + + if (disable_event) { + /* adjust the enable_time */ + timeout.tv_sec = (int) idle_time; + timeout.tv_usec = (idle_time - (double) timeout.tv_sec) * 1.e6; + + toggle_touchpad(False); + } + + if (ret == 0 && pad_disabled) { /* timeout => enable event */ + toggle_touchpad(True); + } - } /* end while(1) */ + } /* end while(1) */ XFreeModifiermap(cbres.modifiers); } -#endif /* HAVE_X11_EXTENSIONS_RECORD_H */ +#endif /* HAVE_X11_EXTENSIONS_RECORD_H */ static XDevice * -dp_get_device(Display *dpy) +dp_get_device(Display * dpy) { - XDevice* dev = NULL; - XDeviceInfo *info = NULL; - int ndevices = 0; - Atom touchpad_type = 0; - Atom *properties = NULL; - int nprops = 0; - int error = 0; + XDevice *dev = NULL; + XDeviceInfo *info = NULL; + int ndevices = 0; + Atom touchpad_type = 0; + Atom *properties = NULL; + int nprops = 0; + int error = 0; touchpad_type = XInternAtom(dpy, XI_TOUCHPAD, True); touchpad_off_prop = XInternAtom(dpy, SYNAPTICS_PROP_OFF, True); info = XListInputDevices(dpy, &ndevices); - while(ndevices--) { - if (info[ndevices].type == touchpad_type) { - dev = XOpenDevice(dpy, info[ndevices].id); - if (!dev) { - fprintf(stderr, "Failed to open device '%s'.\n", - info[ndevices].name); - error = 1; - goto unwind; - } - - properties = XListDeviceProperties(dpy, dev, &nprops); - if (!properties || !nprops) - { - fprintf(stderr, "No properties on device '%s'.\n", - info[ndevices].name); - error = 1; - goto unwind; - } - - while(nprops--) - { - if (properties[nprops] == touchpad_off_prop) - break; - } - if (nprops < 0) - { - fprintf(stderr, "No synaptics properties on device '%s'.\n", - info[ndevices].name); - error = 1; - goto unwind; - } + while (ndevices--) { + if (info[ndevices].type == touchpad_type) { + dev = XOpenDevice(dpy, info[ndevices].id); + if (!dev) { + fprintf(stderr, "Failed to open device '%s'.\n", + info[ndevices].name); + error = 1; + goto unwind; + } + + properties = XListDeviceProperties(dpy, dev, &nprops); + if (!properties || !nprops) { + fprintf(stderr, "No properties on device '%s'.\n", + info[ndevices].name); + error = 1; + goto unwind; + } + + while (nprops--) { + if (properties[nprops] == touchpad_off_prop) + break; + } + if (nprops < 0) { + fprintf(stderr, "No synaptics properties on device '%s'.\n", + info[ndevices].name); + error = 1; + goto unwind; + } - break; /* Yay, device is suitable */ - } + break; /* Yay, device is suitable */ + } } -unwind: + unwind: XFree(properties); XFreeDeviceList(info); if (!dev) - fprintf(stderr, "Unable to find a synaptics device.\n"); - else if (error && dev) - { - XCloseDevice(dpy, dev); - dev = NULL; + fprintf(stderr, "Unable to find a synaptics device.\n"); + else if (error && dev) { + XCloseDevice(dpy, dev); + dev = NULL; } return dev; } @@ -525,106 +542,109 @@ main(int argc, char *argv[]) { double idle_time = 2.0; - int poll_delay = 200000; /* 200 ms */ + int poll_delay = 200000; /* 200 ms */ int c; int use_xrecord = 0; /* Parse command line parameters */ while ((c = getopt(argc, argv, "i:m:dtp:kKR?v")) != EOF) { - switch(c) { - case 'i': - idle_time = atof(optarg); - break; - case 'm': - poll_delay = atoi(optarg) * 1000; - break; - case 'd': - background = 1; - break; - case 't': - disable_state = TappingOff; - break; - case 'p': - pid_file = optarg; - break; - case 'k': - ignore_modifier_keys = 1; - break; - case 'K': - ignore_modifier_combos = 1; - ignore_modifier_keys = 1; - break; - case 'R': - use_xrecord = 1; - break; - case 'v': - verbose = 1; - break; - default: - usage(); - break; - } + switch (c) { + case 'i': + idle_time = atof(optarg); + break; + case 'm': + poll_delay = atoi(optarg) * 1000; + break; + case 'd': + background = 1; + break; + case 't': + disable_state = TappingOff; + break; + case 'p': + pid_file = optarg; + break; + case 'k': + ignore_modifier_keys = 1; + break; + case 'K': + ignore_modifier_combos = 1; + ignore_modifier_keys = 1; + break; + case 'R': + use_xrecord = 1; + break; + case 'v': + verbose = 1; + break; + default: + usage(); + break; + } } if (idle_time <= 0.0) - usage(); + usage(); /* Open a connection to the X server */ display = XOpenDisplay(NULL); if (!display) { - fprintf(stderr, "Can't open display.\n"); - exit(2); + fprintf(stderr, "Can't open display.\n"); + exit(2); } if (!(dev = dp_get_device(display))) - exit(2); + exit(2); /* Install a signal handler to restore synaptics parameters on exit */ install_signal_handler(); if (background) { - pid_t pid; - if ((pid = fork()) < 0) { - perror("fork"); - exit(3); - } else if (pid != 0) - exit(0); - - /* Child (daemon) is running here */ - setsid(); /* Become session leader */ - chdir("/"); /* In case the file system gets unmounted */ - umask(0); /* We don't want any surprises */ - if (pid_file) { - FILE *fd = fopen(pid_file, "w"); - if (!fd) { - perror("Can't create pid file"); - exit(3); - } - fprintf(fd, "%d\n", getpid()); - fclose(fd); - } + pid_t pid; + + if ((pid = fork()) < 0) { + perror("fork"); + exit(3); + } + else if (pid != 0) + exit(0); + + /* Child (daemon) is running here */ + setsid(); /* Become session leader */ + chdir("/"); /* In case the file system gets unmounted */ + umask(0); /* We don't want any surprises */ + if (pid_file) { + FILE *fd = fopen(pid_file, "w"); + + if (!fd) { + perror("Can't create pid file"); + exit(3); + } + fprintf(fd, "%d\n", getpid()); + fclose(fd); + } } pad_disabled = False; store_current_touchpad_state(); #ifdef HAVE_X11_EXTENSIONS_RECORD_H - if (use_xrecord) - { - if(check_xrecord(display)) - record_main_loop(display, idle_time); - else { - fprintf(stderr, "Use of XRecord requested, but failed to " - " initialize.\n"); + if (use_xrecord) { + if (check_xrecord(display)) + record_main_loop(display, idle_time); + else { + fprintf(stderr, "Use of XRecord requested, but failed to " + " initialize.\n"); exit(4); } - } else -#endif /* HAVE_X11_EXTENSIONS_RECORD_H */ - { - setup_keyboard_mask(display, ignore_modifier_keys); - - /* Run the main loop */ - main_loop(display, idle_time, poll_delay); - } + } + else +#endif /* HAVE_X11_EXTENSIONS_RECORD_H */ + { + setup_keyboard_mask(display, ignore_modifier_keys); + + /* Run the main loop */ + main_loop(display, idle_time, poll_delay); + } return 0; }