diff -u xserver-xorg-input-synaptics-1.5.99~git20120223/debian/changelog xserver-xorg-input-synaptics-1.5.99~git20120223/debian/changelog --- xserver-xorg-input-synaptics-1.5.99~git20120223/debian/changelog +++ xserver-xorg-input-synaptics-1.5.99~git20120223/debian/changelog @@ -1,3 +1,18 @@ +xserver-xorg-input-synaptics (1.5.99~git20120223-0ubuntu2) precise; urgency=low + + * Disable ClickPad support when there is no physical right button + (LP: #941046) + - This re-enables click actions, which was enabled by default previously + - Users can enable ClickPad support through xorg.conf, xinput, or synclient + - See + https://lists.ubuntu.com/archives/ubuntu-desktop/2012-February/003751.html + for the discussion guiding this change. + * Refresh ClickPad support patch with changes from upstream review + - No new functionality + * Remove bottom area mask for Dell netbook clickpads with two buttons + + -- Chase Douglas Fri, 02 Mar 2012 13:33:26 -0700 + xserver-xorg-input-synaptics (1.5.99~git20120223-0ubuntu1) precise; urgency=low * Update to latest code in git (0a2fd56) diff -u xserver-xorg-input-synaptics-1.5.99~git20120223/debian/patches/129_clickpad.patch xserver-xorg-input-synaptics-1.5.99~git20120223/debian/patches/129_clickpad.patch --- xserver-xorg-input-synaptics-1.5.99~git20120223/debian/patches/129_clickpad.patch +++ xserver-xorg-input-synaptics-1.5.99~git20120223/debian/patches/129_clickpad.patch @@ -1,7 +1,7 @@ -diff --git a/include/synaptics-properties.h b/include/synaptics-properties.h -index c550cef..8c20a0c 100644 ---- a/include/synaptics-properties.h -+++ b/include/synaptics-properties.h +Index: xserver-xorg-input-synaptics/include/synaptics-properties.h +=================================================================== +--- xserver-xorg-input-synaptics.orig/include/synaptics-properties.h 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/include/synaptics-properties.h 2012-03-02 11:50:06.235780000 -0800 @@ -49,6 +49,9 @@ #define SYNAPTICS_PROP_TAP_DURATIONS "Synaptics Tap Durations" @@ -12,7 +12,7 @@ #define SYNAPTICS_PROP_TAP_FAST "Synaptics Tap FastTap" /* 32 bit */ -@@ -155,6 +158,9 @@ +@@ -158,6 +161,9 @@ /* 32 bit, 4 values, left, right, top, bottom */ #define SYNAPTICS_PROP_AREA "Synaptics Area" @@ -22,11 +22,11 @@ /* 32 Bit Integer, 2 values, horizontal hysteresis, vertical hysteresis */ #define SYNAPTICS_PROP_NOISE_CANCELLATION "Synaptics Noise Cancellation" -diff --git a/man/synaptics.man b/man/synaptics.man -index b6b1dce..f50b249 100644 ---- a/man/synaptics.man -+++ b/man/synaptics.man -@@ -143,6 +143,12 @@ Maximum time (in milliseconds) for detecting a double tap. Property: +Index: xserver-xorg-input-synaptics/man/synaptics.man +=================================================================== +--- xserver-xorg-input-synaptics.orig/man/synaptics.man 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/man/synaptics.man 2012-03-02 11:50:06.235780000 -0800 +@@ -143,6 +143,12 @@ Maximum time (in milliseconds) for detec The duration of the mouse click generated by tapping. Property: "Synaptics Tap Durations" .TP 7 @@ -39,7 +39,7 @@ .BI "Option \*qFastTaps\*q \*q" boolean \*q Makes the driver react faster to a single tap, but also makes double clicks caused by double tapping slower. Property: "Synaptics Tap FastTap" -@@ -512,6 +518,20 @@ AreaBottomEdge option to any integer value other than zero. If supported by the +@@ -524,6 +530,20 @@ AreaBottomEdge option to any integer val server (version 1.9 and later), the edge may be specified in percent of the total height of the touchpad. Property: "Synaptics Area" . @@ -49,7 +49,7 @@ +parameters define the area of the right button, and the second four parameters +define the area of the middle button. The areas are defined by the left, right, +top, and bottom edges as sequential values of the property. If any edge is set -+to 0, the edge is assumed to extend to infinity in the given direction. ++to 0, the button is assumed to extend to infinity in the given direction. +. +When the user performs a click within the defined soft button areas, the right +or middle click action is performed. @@ -60,7 +60,7 @@ .SH CONFIGURATION DETAILS .SS Area handling -@@ -785,6 +805,10 @@ Properties supported: +@@ -797,6 +817,10 @@ Properties supported: duration of a single click. .TP 7 @@ -71,7 +71,7 @@ .BI "Synaptics Tap FastTap" 8 bit (BOOL). -@@ -917,6 +941,14 @@ default. +@@ -933,6 +957,14 @@ default. 32 bit, 4 values, left, right, top, bottom. 0 disables an element. .TP 7 @@ -86,11 +86,11 @@ .BI "Synaptics Capabilities" This read-only property expresses the physical capability of the touchpad, most notably whether the touchpad hardware supports multi-finger tapping and -diff --git a/src/eventcomm.c b/src/eventcomm.c -index 6147e41..92f99a9 100644 ---- a/src/eventcomm.c -+++ b/src/eventcomm.c -@@ -526,6 +526,18 @@ SynapticsReadEvent(InputInfoPtr pInfo, struct input_event *ev) +Index: xserver-xorg-input-synaptics/src/eventcomm.c +=================================================================== +--- xserver-xorg-input-synaptics.orig/src/eventcomm.c 2012-03-02 11:50:00.207780002 -0800 ++++ xserver-xorg-input-synaptics/src/eventcomm.c 2012-03-02 11:50:06.235780000 -0800 +@@ -526,6 +526,18 @@ SynapticsReadEvent(InputInfoPtr pInfo, s return rc; } @@ -109,7 +109,7 @@ static void EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw, struct input_event *ev) -@@ -566,8 +578,20 @@ EventProcessTouchEvent(InputInfoPtr pInfo, struct SynapticsHwState *hw, +@@ -566,8 +578,20 @@ EventProcessTouchEvent(InputInfoPtr pInf 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) @@ -169,10 +169,10 @@ } mtdev = mtdev_new_open(pInfo->fd); -diff --git a/src/properties.c b/src/properties.c -index 0a52801..3828229 100644 ---- a/src/properties.c -+++ b/src/properties.c +Index: xserver-xorg-input-synaptics/src/properties.c +=================================================================== +--- xserver-xorg-input-synaptics.orig/src/properties.c 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/src/properties.c 2012-03-02 11:50:06.239780000 -0800 @@ -58,6 +58,7 @@ Atom prop_finger = 0; Atom prop_tap_time = 0; Atom prop_tap_move = 0; @@ -181,7 +181,7 @@ Atom prop_tap_fast = 0; Atom prop_middle_timeout = 0; Atom prop_twofinger_pressure = 0; -@@ -91,6 +92,7 @@ Atom prop_gestures = 0; +@@ -92,6 +93,7 @@ Atom prop_gestures = 0; Atom prop_capabilities = 0; Atom prop_resolution = 0; Atom prop_area = 0; @@ -189,7 +189,7 @@ Atom prop_noise_cancellation = 0; Atom prop_product_id = 0; Atom prop_device_node = 0; -@@ -189,6 +191,8 @@ InitDeviceProperties(InputInfoPtr pInfo) +@@ -190,6 +192,8 @@ InitDeviceProperties(InputInfoPtr pInfo) values[2] = para->click_time; prop_tap_durations = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_DURATIONS, 32, 3, values); @@ -198,66 +198,74 @@ 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); -@@ -297,6 +301,16 @@ InitDeviceProperties(InputInfoPtr pInfo) +@@ -298,6 +302,16 @@ InitDeviceProperties(InputInfoPtr pInfo) values[3] = para->area_bottom_edge; prop_area = InitAtom(pInfo->dev, SYNAPTICS_PROP_AREA, 32, 4, values); -+ values[0] = para->softbutton_right_left_edge; -+ values[1] = para->softbutton_right_right_edge; -+ values[2] = para->softbutton_right_top_edge; -+ values[3] = para->softbutton_right_bottom_edge; -+ values[4] = para->softbutton_middle_left_edge; -+ values[5] = para->softbutton_middle_right_edge; -+ values[6] = para->softbutton_middle_top_edge; -+ values[7] = para->softbutton_middle_bottom_edge; ++ values[0] = para->softbutton_areas[0][0]; ++ values[1] = para->softbutton_areas[0][1]; ++ values[2] = para->softbutton_areas[0][2]; ++ values[3] = para->softbutton_areas[0][3]; ++ values[4] = para->softbutton_areas[1][0]; ++ 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); + values[0] = para->hyst_x; values[1] = para->hyst_y; prop_noise_cancellation = InitAtom(pInfo->dev, -@@ -392,7 +406,11 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop, +@@ -393,7 +407,25 @@ SetProperty(DeviceIntPtr dev, Atom prope para->single_tap_timeout = timeouts[0]; para->tap_time_2 = timeouts[1]; para->click_time = timeouts[2]; + } else if (property == prop_clickpad) { + if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) + return BadMatch; - ++ + para->clickpad = *(BOOL*)prop->data; ++ ++ /* ClickPad support conflicts with click action support. Reset click ++ * actions. The user can override afterwards if they really want. */ ++ if (para->clickpad) ++ { ++ CARD8 values[3] = {}; ++ ++ para->click_action[F1_CLICK1] = 0; ++ para->click_action[F2_CLICK1] = 0; ++ para->click_action[F3_CLICK1] = 0; + ++ XIChangeDeviceProperty(dev, prop_clickaction, XA_INTEGER, 8, ++ PropModeReplace, 3, values, TRUE); ++ } } else if (property == prop_tap_fast) { if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER) -@@ -704,6 +722,25 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop, +@@ -711,6 +743,19 @@ SetProperty(DeviceIntPtr dev, Atom prope para->area_right_edge = area[1]; para->area_top_edge = area[2]; para->area_bottom_edge = area[3]; + } else if (property == prop_softbutton_areas) + { -+ INT32 *areas; ++ int *areas; + + if (prop->size != 8 || prop->format != 32 || prop->type != XA_INTEGER) + return BadMatch; + -+ areas = (INT32*)prop->data; ++ areas = (int*)prop->data; + if (!SynapticsIsSoftButtonAreasValid(areas)) + return BadValue; + -+ para->softbutton_right_left_edge = areas[0]; -+ para->softbutton_right_right_edge = areas[1]; -+ para->softbutton_right_top_edge = areas[2]; -+ para->softbutton_right_bottom_edge = areas[3]; -+ para->softbutton_middle_left_edge = areas[4]; -+ para->softbutton_middle_right_edge = areas[5]; -+ para->softbutton_middle_top_edge = areas[6]; -+ para->softbutton_middle_bottom_edge = areas[7]; ++ 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) { INT32 *hyst; if (prop->size != 2 || prop->format != 32 || prop->type != XA_INTEGER) -diff --git a/src/synaptics.c b/src/synaptics.c -index 4784157..139f237 100644 ---- a/src/synaptics.c -+++ b/src/synaptics.c -@@ -410,6 +410,127 @@ static int set_percent_option(pointer options, const char* optname, +Index: xserver-xorg-input-synaptics/src/synaptics.c +=================================================================== +--- xserver-xorg-input-synaptics.orig/src/synaptics.c 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/src/synaptics.c 2012-03-02 11:50:19.495780001 -0800 +@@ -410,6 +410,120 @@ static int set_percent_option(pointer op return result; } @@ -285,13 +293,13 @@ + /* Check for overlapping button areas */ + if (!right_disabled && !middle_disabled) + { -+ int right_left = values[0] ? values[0] : -INT_MAX; ++ 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_MAX; ++ int right_top = values[2] ? values[2] : INT_MIN; + int right_bottom = values[3] ? values[3] : INT_MAX; -+ int middle_left = values[4] ? values[4] : -INT_MAX; ++ int middle_left = values[4] ? values[4] : INT_MIN; + int middle_right = values[5] ? values[5] : INT_MAX; -+ int middle_top = values[6] ? values[6] : -INT_MAX; ++ int middle_top = values[6] ? values[6] : INT_MIN; + int middle_bottom = values[7] ? values[7] : INT_MAX; + + /* If areas overlap in the Y axis */ @@ -365,27 +373,57 @@ + if (i < 8 || *next_num != '\0' || !SynapticsIsSoftButtonAreasValid(values)) + goto fail; + -+ pars->softbutton_right_left_edge = values[0]; -+ pars->softbutton_right_right_edge = values[1]; -+ pars->softbutton_right_top_edge = values[2]; -+ pars->softbutton_right_bottom_edge = values[3]; -+ pars->softbutton_middle_left_edge = values[4]; -+ pars->softbutton_middle_right_edge = values[5]; -+ pars->softbutton_middle_top_edge = values[6]; -+ pars->softbutton_middle_bottom_edge = values[7]; ++ memcpy(pars->softbutton_areas[0], values, 4 * sizeof(int)); ++ memcpy(pars->softbutton_areas[1], values + 4, 4 * sizeof(int)); + + return; + +fail: -+ xf86IDrvMsg(pInfo, X_WARNING, "invalid SoftButtonAreas value '%s'\n", ++ xf86IDrvMsg(pInfo, X_ERROR, "invalid SoftButtonAreas value '%s', keeping defaults\n", + option_string); +} -+ + static void set_default_parameters(InputInfoPtr pInfo) { SynapticsPrivate *priv = pInfo->private; /* read-only */ -@@ -534,6 +655,7 @@ static void set_default_parameters(InputInfoPtr pInfo) +@@ -428,7 +542,7 @@ static void set_default_parameters(Input + int pressureMotionMinZ, pressureMotionMaxZ; /* pressure */ + int palmMinWidth, palmMinZ; /* pressure */ + int tapButton1, tapButton2, tapButton3; +- int clickFinger1, clickFinger2, clickFinger3; ++ int clickFinger1 = 0, clickFinger2 = 0, clickFinger3 = 0; + Bool vertEdgeScroll, horizEdgeScroll; + Bool vertTwoFingerScroll, horizTwoFingerScroll; + int horizResolution = 1; +@@ -488,6 +602,11 @@ static void set_default_parameters(Input + palmMinWidth = priv->minw + range * (10.0/16); + emulateTwoFingerMinW = priv->minw + range * (7.0/16); + ++ /* Clickpad conflicts with click actions, disable by default unless there ++ * is a physical right button. */ ++ if (pars->clickpad && !priv->has_right) ++ pars->clickpad = 0; ++ + /* Enable tap */ + tapButton1 = 1; + tapButton2 = 2; +@@ -495,9 +614,12 @@ static void set_default_parameters(Input + + /* Enable multifinger-click if only have one physical button, + otherwise clickFinger is always button 1. */ +- clickFinger1 = 1; +- clickFinger2 = (priv->has_right || priv->has_middle) ? 1 : 3; +- clickFinger3 = 0; /* Disabled by default so three-touch gestures work */ ++ if (!pars->clickpad) ++ { ++ clickFinger1 = 1; ++ clickFinger2 = (priv->has_right || priv->has_middle) ? 1 : 3; ++ clickFinger3 = 0; /* Disabled by default so three-touch gestures work */ ++ } + + /* Enable vert edge scroll */ + vertEdgeScroll = TRUE; +@@ -534,6 +656,7 @@ static void set_default_parameters(Input pars->tap_move = xf86SetIntOption(opts, "MaxTapMove", tapMove); pars->tap_time_2 = xf86SetIntOption(opts, "MaxDoubleTapTime", 180); pars->click_time = xf86SetIntOption(opts, "ClickTime", 100); @@ -393,7 +431,7 @@ pars->fast_taps = xf86SetBoolOption(opts, "FastTaps", FALSE); pars->emulate_mid_button_time = xf86SetIntOption(opts, "EmulateMidButtonTime", 75); pars->emulate_twofinger_z = xf86SetIntOption(opts, "EmulateTwoFingerMinZ", emulateTwoFingerMinZ); -@@ -601,6 +723,8 @@ static void set_default_parameters(InputInfoPtr pInfo) +@@ -602,6 +725,8 @@ static void set_default_parameters(Input pars->bottom_edge = tmp; xf86IDrvMsg(pInfo, X_WARNING, "TopEdge is bigger than BottomEdge. Fixing.\n"); } @@ -402,7 +440,7 @@ } #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 14 -@@ -1354,6 +1478,60 @@ is_inside_active_area(SynapticsPrivate *priv, int x, int y) +@@ -1355,6 +1480,60 @@ is_inside_active_area(SynapticsPrivate * return inside_area; } @@ -411,23 +449,23 @@ +{ + Bool inside_area = TRUE; + -+ if (para->softbutton_right_left_edge == 0 && -+ para->softbutton_right_right_edge == 0 && -+ para->softbutton_right_top_edge == 0 && -+ para->softbutton_right_bottom_edge == 0) ++ if (para->softbutton_areas[0][0] == 0 && ++ para->softbutton_areas[0][1] == 0 && ++ para->softbutton_areas[0][2] == 0 && ++ para->softbutton_areas[0][3] == 0) + return FALSE; + -+ if (para->softbutton_right_left_edge && -+ x < para->softbutton_right_left_edge) ++ if (para->softbutton_areas[0][0] && ++ x < para->softbutton_areas[0][0]) + inside_area = FALSE; -+ else if (para->softbutton_right_right_edge && -+ x > para->softbutton_right_right_edge) ++ else if (para->softbutton_areas[0][1] && ++ x > para->softbutton_areas[0][1]) + inside_area = FALSE; -+ else if (para->softbutton_right_top_edge && -+ y < para->softbutton_right_top_edge) ++ else if (para->softbutton_areas[0][2] && ++ y < para->softbutton_areas[0][2]) + inside_area = FALSE; -+ else if (para->softbutton_right_bottom_edge && -+ y > para->softbutton_right_bottom_edge) ++ else if (para->softbutton_areas[0][3] && ++ y > para->softbutton_areas[0][3]) + inside_area = FALSE; + + return inside_area; @@ -438,23 +476,23 @@ +{ + Bool inside_area = TRUE; + -+ if (para->softbutton_middle_left_edge == 0 && -+ para->softbutton_middle_right_edge == 0 && -+ para->softbutton_middle_top_edge == 0 && -+ para->softbutton_middle_bottom_edge == 0) ++ if (para->softbutton_areas[1][0] == 0 && ++ para->softbutton_areas[1][1] == 0 && ++ para->softbutton_areas[1][2] == 0 && ++ para->softbutton_areas[1][3] == 0) + return FALSE; + -+ if (para->softbutton_middle_left_edge && -+ x < para->softbutton_middle_left_edge) ++ if (para->softbutton_areas[1][0] && ++ x < para->softbutton_areas[1][0]) + inside_area = FALSE; -+ else if (para->softbutton_middle_right_edge && -+ x > para->softbutton_middle_right_edge) ++ else if (para->softbutton_areas[1][1] && ++ x > para->softbutton_areas[1][1]) + inside_area = FALSE; -+ else if (para->softbutton_middle_top_edge && -+ y < para->softbutton_middle_top_edge) ++ else if (para->softbutton_areas[1][2] && ++ y < para->softbutton_areas[1][2]) + inside_area = FALSE; -+ else if (para->softbutton_middle_bottom_edge && -+ y > para->softbutton_middle_bottom_edge) ++ else if (para->softbutton_areas[1][3] && ++ y > para->softbutton_areas[1][3]) + inside_area = FALSE; + + return inside_area; @@ -463,7 +501,7 @@ static CARD32 timerFunc(OsTimerPtr timer, CARD32 now, pointer arg) { -@@ -1410,6 +1588,14 @@ ReadInput(InputInfoPtr pInfo) +@@ -1411,6 +1590,14 @@ ReadInput(InputInfoPtr pInfo) SynapticsResetTouchHwState(hw); while (SynapticsGetHwState(pInfo, priv, hw)) { @@ -478,7 +516,7 @@ SynapticsCopyHwState(priv->hwState, hw); delay = HandleState(pInfo, hw, hw->millis, FALSE); newDelay = TRUE; -@@ -1691,7 +1877,7 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw, +@@ -1692,7 +1879,7 @@ HandleTapProcessing(SynapticsPrivate *pr Bool inside_active_area) { SynapticsParameters *para = &priv->synpara; @@ -487,7 +525,7 @@ int timeleft, timeout; edge_type edge; int delay = 1000000000; -@@ -1705,6 +1891,7 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw, +@@ -1706,6 +1893,7 @@ HandleTapProcessing(SynapticsPrivate *pr (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))); @@ -495,7 +533,7 @@ if (touch) { priv->touch_on.x = hw->x; -@@ -1727,6 +1914,10 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw, +@@ -1728,6 +1916,10 @@ HandleTapProcessing(SynapticsPrivate *pr SetTapState(priv, TS_1, now); break; case TS_1: @@ -506,7 +544,7 @@ if (move) { SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); SetTapState(priv, TS_MOVE, now); -@@ -1750,6 +1941,10 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw, +@@ -1751,6 +1943,10 @@ HandleTapProcessing(SynapticsPrivate *pr } break; case TS_MOVE: @@ -517,7 +555,7 @@ if (move && priv->moving_state == MS_TRACKSTICK) { SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); } -@@ -1804,6 +1999,10 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw, +@@ -1805,6 +2001,10 @@ HandleTapProcessing(SynapticsPrivate *pr } break; case TS_DRAG: @@ -528,7 +566,7 @@ if (move) SetMovingState(priv, MS_TOUCHPAD_RELATIVE, now); if (release) { -@@ -1832,6 +2031,23 @@ HandleTapProcessing(SynapticsPrivate *priv, struct SynapticsHwState *hw, +@@ -1833,6 +2033,23 @@ HandleTapProcessing(SynapticsPrivate *pr SetTapState(priv, TS_START, now); } break; @@ -552,7 +590,7 @@ } timeout = GetTimeOut(priv); -@@ -1954,9 +2170,8 @@ get_delta(SynapticsPrivate *priv, const struct SynapticsHwState *hw, +@@ -1955,9 +2172,8 @@ get_delta(SynapticsPrivate *priv, const int x_edge_speed = 0; int y_edge_speed = 0; @@ -564,7 +602,7 @@ if ((priv->tap_state == TS_DRAG) || para->edge_motion_use_always) get_edge_speed(priv, hw, edge, &x_edge_speed, &y_edge_speed); -@@ -2025,7 +2240,7 @@ ComputeDeltas(SynapticsPrivate *priv, const struct SynapticsHwState *hw, +@@ -2026,7 +2242,7 @@ ComputeDeltas(SynapticsPrivate *priv, co * POLL_MS declaration. */ delay = MIN(delay, POLL_MS); @@ -573,7 +611,7 @@ goto out; /* skip the lot */ if (priv->moving_state == MS_TRACKSTICK) -@@ -2467,8 +2682,24 @@ update_hw_button_state(const InputInfoPtr pInfo, struct SynapticsHwState *hw, +@@ -2468,6 +2684,22 @@ update_hw_button_state(const InputInfoPt /* 3rd button emulation */ hw->middle |= HandleMidButtonEmulation(priv, hw, now, delay); @@ -594,28 +632,9 @@ + } + /* Fingers emulate other buttons */ -- if(hw->left && hw->numFingers >= 1){ -+ if(!para->clickpad && hw->left && hw->numFingers >= 1){ + if(hw->left && hw->numFingers >= 1){ handle_clickfinger(para, hw); - } - -@@ -2643,10 +2874,12 @@ HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw) - Bool restart_touches = FALSE; - int i; - -- if (para->click_action[F3_CLICK1] || para->tap_action[F3_TAP]) -+ if ((!para->clickpad && para->click_action[F3_CLICK1]) || -+ para->tap_action[F3_TAP]) - min_touches = 4; -- else if (para->click_action[F2_CLICK1] || para->tap_action[F2_TAP] || -- para->scroll_twofinger_vert || para->scroll_twofinger_horiz) -+ else if ((!para->clickpad && para->click_action[F2_CLICK1]) || -+ para->tap_action[F2_TAP] || para->scroll_twofinger_vert || -+ para->scroll_twofinger_horiz) - min_touches = 3; - - /* Count new number of active touches */ -@@ -2658,6 +2891,9 @@ HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw) +@@ -2659,6 +2891,9 @@ HandleTouches(InputInfoPtr pInfo, struct new_active_touches--; } @@ -625,7 +644,7 @@ if (priv->num_active_touches < min_touches && new_active_touches < min_touches) { -@@ -2751,6 +2987,14 @@ HandleState(InputInfoPtr pInfo, struct SynapticsHwState *hw, CARD32 now, +@@ -2752,6 +2987,14 @@ HandleState(InputInfoPtr pInfo, struct S return delay; } @@ -640,10 +659,10 @@ /* apply hysteresis before doing anything serious. This cancels * out a lot of noise which might surface in strange phenomena * like flicker in scrolling or noise motion. */ -diff --git a/src/synapticsstr.h b/src/synapticsstr.h -index ba1eb13..baee4d9 100644 ---- a/src/synapticsstr.h -+++ b/src/synapticsstr.h +Index: xserver-xorg-input-synaptics/src/synapticsstr.h +=================================================================== +--- xserver-xorg-input-synaptics.orig/src/synapticsstr.h 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/src/synapticsstr.h 2012-03-02 11:50:06.239780000 -0800 @@ -99,7 +99,8 @@ enum TapState { TS_3, /* After second touch */ TS_DRAG, /* Pointer drag enabled */ @@ -662,22 +681,15 @@ 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. */ -@@ -178,6 +180,14 @@ typedef struct _SynapticsParameters +@@ -179,6 +181,7 @@ typedef struct _SynapticsParameters 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_right_left_edge; -+ int softbutton_right_right_edge; -+ int softbutton_right_top_edge; -+ int softbutton_right_bottom_edge; -+ int softbutton_middle_left_edge; -+ int softbutton_middle_right_edge; -+ int softbutton_middle_top_edge; -+ int softbutton_middle_bottom_edge; /* soft button 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; -@@ -265,6 +275,7 @@ typedef struct _SynapticsPrivateRec +@@ -266,6 +269,7 @@ typedef struct _SynapticsPrivateRec Bool has_pressure; /* device reports pressure */ Bool has_width; /* device reports finger width */ Bool has_scrollbuttons; /* device has physical scrollbuttons */ @@ -685,11 +697,11 @@ enum TouchpadModel model; /* The detected model */ unsigned short id_vendor; /* vendor id */ -diff --git a/src/synproto.c b/src/synproto.c -index 0426e8f..e945f1e 100644 ---- a/src/synproto.c -+++ b/src/synproto.c -@@ -120,6 +120,8 @@ SynapticsCopyHwState(struct SynapticsHwState *dst, +Index: xserver-xorg-input-synaptics/src/synproto.c +=================================================================== +--- xserver-xorg-input-synaptics.orig/src/synproto.c 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/src/synproto.c 2012-03-02 11:50:06.239780000 -0800 +@@ -120,6 +120,8 @@ SynapticsCopyHwState(struct SynapticsHwS dst->x = src->x; dst->y = src->y; dst->z = src->z; @@ -698,10 +710,10 @@ dst->numFingers = src->numFingers; dst->fingerWidth = src->fingerWidth; dst->left = src->left; -diff --git a/src/synproto.h b/src/synproto.h -index 89392ac..3b9f803 100644 ---- a/src/synproto.h -+++ b/src/synproto.h +Index: xserver-xorg-input-synaptics/src/synproto.h +=================================================================== +--- xserver-xorg-input-synaptics.orig/src/synproto.h 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/src/synproto.h 2012-03-02 11:50:06.239780000 -0800 @@ -53,6 +53,8 @@ struct SynapticsHwState { int x; /* X position of finger */ int y; /* Y position of finger */ @@ -711,18 +723,18 @@ int numFingers; int fingerWidth; -@@ -115,4 +117,6 @@ extern void SynapticsCopyHwState(struct SynapticsHwState *dst, +@@ -115,4 +117,6 @@ extern void SynapticsCopyHwState(struct const struct SynapticsHwState *src); extern void SynapticsResetTouchHwState(struct SynapticsHwState *hw); +extern Bool SynapticsIsSoftButtonAreasValid(int *values); + #endif /* _SYNPROTO_H_ */ -diff --git a/test/fake-symbols.c b/test/fake-symbols.c -index 7f3f0ac..65fad46 100644 ---- a/test/fake-symbols.c -+++ b/test/fake-symbols.c -@@ -461,6 +461,11 @@ _X_EXPORT void valuator_mask_free(ValuatorMask **mask) +Index: xserver-xorg-input-synaptics/test/fake-symbols.c +=================================================================== +--- xserver-xorg-input-synaptics.orig/test/fake-symbols.c 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/test/fake-symbols.c 2012-03-02 11:50:06.239780000 -0800 +@@ -461,6 +461,11 @@ _X_EXPORT void valuator_mask_free(Valuat { } @@ -736,0 +749,28 @@ +Index: xserver-xorg-input-synaptics/tools/synclient.c +=================================================================== +--- xserver-xorg-input-synaptics.orig/tools/synclient.c 2012-03-02 11:50:00.000000000 -0800 ++++ xserver-xorg-input-synaptics/tools/synclient.c 2012-03-02 11:50:06.243780000 -0800 +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -144,6 +145,15 @@ static struct Parameter params[] = { + {"AreaRightEdge", PT_INT, 0, 10000, SYNAPTICS_PROP_AREA, 32, 1}, + {"AreaTopEdge", PT_INT, 0, 10000, SYNAPTICS_PROP_AREA, 32, 2}, + {"AreaBottomEdge", PT_INT, 0, 10000, SYNAPTICS_PROP_AREA, 32, 3}, ++ {"ClickPad", PT_BOOL, 0, 1, SYNAPTICS_PROP_CLICKPAD, 8, 0}, ++ {"RightButtonAreaLeft", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 0}, ++ {"RightButtonAreaRight", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 1}, ++ {"RightButtonAreaTop", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 2}, ++ {"RightButtonAreaBottom", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 3}, ++ {"MiddleButtonAreaLeft", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 4}, ++ {"MiddleButtonAreaRight", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 5}, ++ {"MiddleButtonAreaTop", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 6}, ++ {"MiddleButtonAreaBottom", PT_INT, INT_MIN, INT_MAX, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 7}, + { NULL, 0, 0, 0, 0 } + }; + diff -u xserver-xorg-input-synaptics-1.5.99~git20120223/debian/local/51-synaptics-quirks.conf xserver-xorg-input-synaptics-1.5.99~git20120223/debian/local/51-synaptics-quirks.conf --- xserver-xorg-input-synaptics-1.5.99~git20120223/debian/local/51-synaptics-quirks.conf +++ xserver-xorg-input-synaptics-1.5.99~git20120223/debian/local/51-synaptics-quirks.conf @@ -4,7 +4,6 @@ MatchDevicePath "/dev/input/event*" Driver "synaptics" Option "JumpyCursorThreshold" "90" - Option "AreaBottomEdge" "4100" EndSection Section "InputClass"