diff --git a/0001-Support-the-new-Lenovo-X1-Carbon-3rd-trackpoint-butt.patch b/0001-Support-the-new-Lenovo-X1-Carbon-3rd-trackpoint-butt.patch new file mode 100644 index 0000000..8a05c7e --- /dev/null +++ b/0001-Support-the-new-Lenovo-X1-Carbon-3rd-trackpoint-butt.patch @@ -0,0 +1,230 @@ +From 0642342b26752a15e961a4dcb2bc14de1156caba Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Thu, 29 Jan 2015 11:25:26 +1000 +Subject: [PATCH synaptics] Support the new Lenovo X1 Carbon 3rd trackpoint + buttons + +This device has the trackpoint buttons wired up to the touchpad to send BTN_0, +BTN_1 and BTN_2 for left, right, middle. This conflicts with previous +touchpads that used those event codes for dedicated scroll buttons. + +Add an option HasTrackpointButtons that can be set via a xorg.conf.d +snippets. This option is not intended as a user-set option, rather +we expect distributions to ship some conglomerate of udev/hal rules with +xorg.conf snippets that take effect. + +If the option is set, we look at the three affected buttons at the beginning +of HandleState and send button events immediately for them. The HW state is +reset to neutral and other processing continues. This saves us from having to +synchronize these buttons with software buttons (also present on this device), +tapping, etc. + +Since the buttons are physically different and (mentally) associated with the +trackpoint device we also don't need to worry about having finger motion event +correctly synced up with the button presses - it's acceptable to send the +presses before the motion events. + +Signed-off-by: Peter Hutterer +Reviewed-by: Hans de Goede +Tested-by: Benjamin Tissoires +(cherry picked from commit 064445364b4775b25ba49c2250b22b169f291147) +--- + conf/50-synaptics.conf | 7 +++++++ + conf/71-synaptics.rules | 10 ++++++++++ + conf/Makefile.am | 7 +++++++ + configure.ac | 10 ++++++++++ + man/synaptics.man | 14 ++++++++++++++ + src/synaptics.c | 42 ++++++++++++++++++++++++++++++++++++++++++ + src/synapticsstr.h | 2 ++ + 7 files changed, 92 insertions(+) + create mode 100644 conf/71-synaptics.rules + +diff --git a/conf/50-synaptics.conf b/conf/50-synaptics.conf +index aa50456..5fb131e 100644 +--- a/conf/50-synaptics.conf ++++ b/conf/50-synaptics.conf +@@ -44,3 +44,10 @@ Section "InputClass" + MatchDriver "synaptics" + Option "SoftButtonAreas" "0 0 0 0 0 0 0 0" + EndSection ++ ++Section "InputClass" ++ Identifier "Lenovo *50 and Carbon 3rd trackpoint buttons" ++ MatchDriver "synaptics" ++ MatchTag "has_trackpoint_buttons" ++ Option "HasTrackpointButtons" "on" ++EndSection +diff --git a/conf/71-synaptics.rules b/conf/71-synaptics.rules +new file mode 100644 +index 0000000..a707421 +--- /dev/null ++++ b/conf/71-synaptics.rules +@@ -0,0 +1,10 @@ ++ACTION=="remove", GOTO="touchpad_end" ++KERNEL!="event*", GOTO="touchpad_end" ++ENV{ID_INPUT_TOUCHPAD}=="", GOTO="touchpad_end" ++ ++# Lenovo X1 Carbon 3rd ++KERNELS=="serio1", \ ++ ATTRS{firmware_id}=="*LEN0048*", \ ++ ENV{ID_INPUT.tags}="has_trackpoint_buttons" ++ ++LABEL="touchpad_end" +diff --git a/conf/Makefile.am b/conf/Makefile.am +index 38d2a01..4dde902 100644 +--- a/conf/Makefile.am ++++ b/conf/Makefile.am +@@ -25,3 +25,10 @@ else + fdidir = $(datadir)/hal/fdi/policy/20thirdparty + dist_fdi_DATA = 11-x11-synaptics.fdi + endif ++ ++if HAVE_UDEV_RULES_DIR ++udevdir=$(UDEV_RULES_DIR) ++udev_DATA = 71-synaptics.rules ++endif ++ ++EXTRA_DIST = 71-synaptics.rules +diff --git a/configure.ac b/configure.ac +index b65adc7..ba75e73 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -128,6 +128,16 @@ AM_CONDITIONAL([BUILD_EVENTCOMM], [test "x${BUILD_EVENTCOMM}" = "xyes"]) + AM_CONDITIONAL([BUILD_PSMCOMM], [test "x${BUILD_PSMCOMM}" = "xyes"]) + AM_CONDITIONAL([BUILD_PS2COMM], [test "x${BUILD_PS2COMM}" = "xyes"]) + ++AC_ARG_WITH(udev-rules-dir, ++ AS_HELP_STRING([--with-udev-rules-dir=DIR], ++ [Directory where udev expects its rules files ++ [[default=$libdir/udev/rules.d]]]), ++ [udevdir="$withval"], ++ [udevdir="$libdir/udev/rules.d"]) ++UDEV_RULES_DIR=${udevdir} ++AC_SUBST(UDEV_RULES_DIR) ++AM_CONDITIONAL(HAVE_UDEV_RULES_DIR, [test "x$UDEV_RULES_DIR" != "xno"]) ++ + # ----------------------------------------------------------------------------- + # Dependencies for synclient and syndaemon + # ----------------------------------------------------------------------------- +diff --git a/man/synaptics.man b/man/synaptics.man +index 76756be..4e0137f 100644 +--- a/man/synaptics.man ++++ b/man/synaptics.man +@@ -518,6 +518,20 @@ initialized if + .B Option \*qHasSecondarySoftButtons\*q + is enabled and this option is set in the __xconfigfile__(__filemansuffix__). + . ++.TP ++.BI "Option \*qHasTrackpointButtons\*q \*q" boolean \*q ++This option is only available on selected devices. You should never need to ++set this option manually, your distribution should ship ++__xconfigfile__(__filemansuffix__) snippets to enable this option where ++required. Devices that require this option include the Lenovo X1 Carbon 3rd ++and the Lenovo *50 series (T450, T550, etc.). ++If enabled, the device is considered to have the trackpoint left, middle, ++right buttons wired to the touchpad. If set, this option disables scroll ++buttons, i.e. ++.B Option \*qUpDownScrolling\*q, \*qLeftRightScrolling\*q ++and the respective repeat options for scroll buttons. ++This options is considered a hardware property and is not exposed as ++configurable X Input device property. + + .SH CONFIGURATION DETAILS + .SS Area handling +diff --git a/src/synaptics.c b/src/synaptics.c +index d5db457..08b90f4 100644 +--- a/src/synaptics.c ++++ b/src/synaptics.c +@@ -703,6 +703,12 @@ set_default_parameters(InputInfoPtr pInfo) + pars->touchpad_off = xf86SetIntOption(opts, "TouchpadOff", TOUCHPAD_ON); + + if (priv->has_scrollbuttons) { ++ priv->has_trackpoint_buttons = xf86SetBoolOption(opts, "HasTrackpointButtons", FALSE); ++ if (priv->has_trackpoint_buttons) ++ priv->has_scrollbuttons = FALSE; ++ } ++ ++ if (priv->has_scrollbuttons) { + pars->updown_button_scrolling = + xf86SetBoolOption(opts, "UpDownScrolling", TRUE); + pars->leftright_button_scrolling = +@@ -1064,6 +1070,7 @@ SynapticsReset(SynapticsPrivate * priv) + priv->mid_emu_state = MBE_OFF; + priv->nextRepeat = 0; + priv->lastButtons = 0; ++ priv->lastTrackpointButtons = 0; + priv->prev_z = 0; + priv->prevFingers = 0; + priv->num_active_touches = 0; +@@ -2746,6 +2753,34 @@ handle_clickfinger(SynapticsPrivate * priv, struct SynapticsHwState *hw) + } + } + ++static void ++handle_trackpoint_buttons(const InputInfoPtr pInfo, ++ struct SynapticsHwState *hw) ++{ ++ SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private); ++ unsigned int buttons, change; ++ int id; ++ ++ buttons = (hw->multi[0] ? 0x1 : 0) | ++ (hw->multi[1] ? 0x4 : 0) | ++ (hw->multi[2] ? 0x2 : 0); ++ ++ change = buttons ^ priv->lastTrackpointButtons; ++ 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); ++ } ++ ++ hw->multi[0] = FALSE; ++ hw->multi[1] = FALSE; ++ hw->multi[2] = FALSE; ++ ++ priv->lastTrackpointButtons = buttons; ++} ++ + /* Adjust the hardware state according to the extra buttons (if the touchpad + * has any and not many touchpads do these days). These buttons are up/down + * tilt buttons and/or left/right buttons that then map into a specific +@@ -3101,6 +3136,13 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now, + Bool using_cumulative_coords = FALSE; + Bool ignore_motion; + ++ /* if we have phys. trackpoint buttons wired up to the touchpad, process ++ * them first. They belong to a different device so we don't care about ++ * sending out motion events before the trackpoint buttons. This makes ++ * the code a lot easier to slot in */ ++ if (priv->has_trackpoint_buttons) ++ handle_trackpoint_buttons(pInfo, hw); ++ + /* 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 +diff --git a/src/synapticsstr.h b/src/synapticsstr.h +index 4bd32ac..e245c60 100644 +--- a/src/synapticsstr.h ++++ b/src/synapticsstr.h +@@ -288,6 +288,7 @@ struct _SynapticsPrivateRec { + int repeatButtons; /* buttons for repeat */ + int nextRepeat; /* Time when to trigger next auto repeat event */ + int lastButtons; /* last state of the buttons */ ++ int lastTrackpointButtons; /* last state of the trackpoint 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 */ +@@ -307,6 +308,7 @@ struct _SynapticsPrivateRec { + Bool has_pressure; /* device reports pressure */ + Bool has_width; /* device reports finger width */ + Bool has_scrollbuttons; /* device has physical scrollbuttons */ ++ Bool has_trackpoint_buttons;/* device has trackpoint buttons wired to touchpad */ + Bool has_semi_mt; /* device is only semi-multitouch capable */ + + enum TouchpadModel model; /* The detected model */ +-- +2.1.0 + diff --git a/xorg-x11-drv-synaptics.spec b/xorg-x11-drv-synaptics.spec index 07cea70..49709c7 100644 --- a/xorg-x11-drv-synaptics.spec +++ b/xorg-x11-drv-synaptics.spec @@ -8,7 +8,7 @@ Name: xorg-x11-drv-synaptics Summary: Xorg X11 Synaptics touchpad input driver Version: 1.8.1 -Release: 1%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist} +Release: 2%{?gitdate:.%{gitdate}git%{gitversion}}%{?dist} URL: http://www.x.org License: MIT Group: User Interface/X Hardware Support @@ -23,6 +23,8 @@ Source0: ftp://ftp.x.org/pub/individual/driver/%{tarball}-%{version}.tar. Source3: 50-synaptics.conf Source4: 70-touchpad-quirks.rules +Patch01: 0001-Support-the-new-Lenovo-X1-Carbon-3rd-trackpoint-butt.patch + ExcludeArch: s390 s390x BuildRequires: git @@ -137,9 +139,12 @@ Development files for the Synaptics TouchPad for X.Org. %{_libdir}/pkgconfig/xorg-synaptics.pc %dir %{_includedir}/xorg %{_includedir}/xorg/synaptics-properties.h - +%{_libdir}/udev/rules.d/71-synaptics.rules %changelog +* Mon Feb 02 2015 Peter Hutterer 1.8.1-2 +- Add support for the X1 Carbon 3rd quirks + * Thu Sep 18 2014 Peter Hutterer 1.8.1-1 - synaptics 1.8.1