--- 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)
