--- src/synaptics.c.orig 2014-06-07 22:27:30.998147539 -0400 +++ src/synaptics.c 2014-06-08 01:18:43.608481075 -0400 @@ -1451,11 +1451,6 @@ { Bool inside_area = TRUE; - /* If a finger is down, then it must have started inside the active_area, - allow the motion to complete using the entire area */ - if (priv->finger_state >= FS_TOUCHED) - return TRUE; - if ((priv->synpara.area_left_edge != 0) && (x < priv->synpara.area_left_edge)) inside_area = FALSE; @@ -3099,7 +3094,43 @@ * like flicker in scrolling or noise motion. */ filter_jitter(priv, &hw->x, &hw->y); - inside_active_area = is_inside_active_area(priv, hw->x, hw->y); + /* If a finger is down, then it must have started inside the active_area, + allow the motion to complete using the entire area */ + if (priv->finger_state >= FS_TOUCHED) + inside_active_area = TRUE; + else + inside_active_area = is_inside_active_area(priv, hw->x, hw->y); + + if (para->clickpad) { + int i; + hw->numFingers = 0; + for (i = 0; i < hw->num_mt_mask; i++) { + ValuatorMask *f1; + Bool mt_inside; + double x1, y1; + + if (hw->slot_state[i] == SLOTSTATE_EMPTY || + hw->slot_state[i] == SLOTSTATE_CLOSE || + hw->slot_state[i] == SLOTSTATE_OPEN) { + continue; + } + + f1 = hw->mt_mask[i]; + x1 = valuator_mask_get_double(f1, 0); + y1 = valuator_mask_get_double(f1, 1); + mt_inside = is_inside_active_area(priv, x1, y1); + if (!mt_inside) { + hw->slot_state[i] = SLOTSTATE_EMPTY; + continue; + } + if (hw->numFingers == 0) { + inside_active_area = TRUE; + hw->x = x1; + hw->y = y1; + } + hw->numFingers++; + } + } /* Ignore motion *starting* inside softbuttonareas */ if (priv->finger_state < FS_TOUCHED)