diff -ru synaptics-0.14.6/synaptics.c synaptics-two-finger-click-0.14.6/synaptics.c
--- synaptics-0.14.6/synaptics.c	2006-07-15 11:54:29.000000000 -0400
+++ synaptics-two-finger-click-0.14.6/synaptics.c	2007-10-12 08:38:52.000000000 -0400
@@ -1,4 +1,7 @@
 /*
+ *   Copyright 2007 Douglas Mayle <douglas@mayle.org>
+ *     patch for two-fingered click transformations
+ *
  *   Copyright 2006 Stefan Bethge <stefan.bethge@web.de>
  *     patch for two-fingered scrolling
  *
@@ -399,6 +402,9 @@
     pars->tap_action[F1_TAP] = xf86SetIntOption(opts, "TapButton1",     1);
     pars->tap_action[F2_TAP] = xf86SetIntOption(opts, "TapButton2",     2);
     pars->tap_action[F3_TAP] = xf86SetIntOption(opts, "TapButton3",     3);
+    pars->click_twofinger[B1_CLICK] = xf86SetIntOption(opts, "TwoFingerButton1",     0);
+    pars->click_twofinger[B2_CLICK] = xf86SetIntOption(opts, "TwoFingerButton2",     0);
+    pars->click_twofinger[B3_CLICK] = xf86SetIntOption(opts, "TwoFingerButton3",     0);
     pars->circular_scrolling = xf86SetBoolOption(opts, "CircularScrolling", FALSE);
     pars->circular_trigger   = xf86SetIntOption(opts, "CircScrollTrigger", 0);
     pars->circular_pad       = xf86SetBoolOption(opts, "CircularPad", FALSE);
@@ -1622,6 +1628,56 @@
     /* 3rd button emulation */
     hw->middle |= HandleMidButtonEmulation(priv, hw, &delay);
 
+    /* Two finger click */
+	if (hw->numFingers == 2)
+    {
+        switch(para->click_twofinger[B1_CLICK])
+        {
+            case 2:
+                hw->right = hw->left;
+                hw->left = FALSE;
+                break;
+            case 3:
+                hw->middle = hw->left;
+                hw->left = FALSE;
+                break;
+            case 1:
+            case 0:
+            default:
+                break;
+        }
+        switch(para->click_twofinger[B2_CLICK])
+        {
+            case 1:
+                hw->left = hw->right;
+                hw->right = FALSE;
+                break;
+            case 3:
+                hw->middle = hw->right;
+                hw->right = FALSE;
+                break;
+            case 2:
+            case 0:
+            default:
+                break;
+        }
+        switch(para->click_twofinger[B3_CLICK])
+        {
+            case 1:
+                hw->left = hw->middle;
+                hw->middle = FALSE;
+                break;
+            case 2:
+                hw->right = hw->middle;
+                hw->middle = FALSE;
+                break;
+            case 3:
+            case 0:
+            default:
+                break;
+        }
+    }
+
     /* Up/Down button scrolling or middle/double click */
     double_click = FALSE;
     if (!para->updown_button_scrolling) {
diff -ru synaptics-0.14.6/synaptics.h synaptics-two-finger-click-0.14.6/synaptics.h
--- synaptics-0.14.6/synaptics.h	2006-07-15 11:54:29.000000000 -0400
+++ synaptics-two-finger-click-0.14.6/synaptics.h	2007-10-12 08:30:30.000000000 -0400
@@ -18,6 +18,13 @@
     MAX_TAP
 } TapEvent;
 
+typedef enum {
+    B1_CLICK = 0,				/* Two finger click, button one */
+    B2_CLICK,				    /* Two finger click, button two */
+    B3_CLICK,			        /* Two finger click, button three */
+    MAX_CLICK
+} TwoFingerClick;
+
 #define SYN_MAX_BUTTONS 12		    /* Max number of mouse buttons */
 
 struct SynapticsHwInfo {
@@ -65,6 +72,7 @@
     Bool scroll_edge_horiz;		    /* Enable/disable horizontal scrolling on left edge */
     Bool scroll_twofinger_vert;		    /* Enable/disable vertical two-finger scrolling */
     Bool scroll_twofinger_horiz;	    /* Enable/disable horizontal two-finger scrolling */
+    int click_twofinger[MAX_CLICK];     /* Configure two-finger clicking */
     double min_speed, max_speed, accl;	    /* movement parameters */
     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 */
diff -ru synaptics-0.14.6/synclient.c synaptics-two-finger-click-0.14.6/synclient.c
--- synaptics-0.14.6/synclient.c	2006-07-15 11:54:29.000000000 -0400
+++ synaptics-two-finger-click-0.14.6/synclient.c	2007-10-12 08:30:50.000000000 -0400
@@ -91,6 +91,9 @@
     DEFINE_PAR("TapButton1",           tap_action[F1_TAP],      PT_INT,    0, SYN_MAX_BUTTONS),
     DEFINE_PAR("TapButton2",           tap_action[F2_TAP],      PT_INT,    0, SYN_MAX_BUTTONS),
     DEFINE_PAR("TapButton3",           tap_action[F3_TAP],      PT_INT,    0, SYN_MAX_BUTTONS),
+    DEFINE_PAR("TwoFingerButton1",     click_twofinger[B1_CLICK], PT_INT,  0, SYN_MAX_BUTTONS),
+    DEFINE_PAR("TwoFingerButton2",     click_twofinger[B2_CLICK], PT_INT,  0, SYN_MAX_BUTTONS),
+    DEFINE_PAR("TwoFingerButton3",     click_twofinger[B3_CLICK], PT_INT,  0, SYN_MAX_BUTTONS),
     DEFINE_PAR("CircularScrolling",    circular_scrolling,      PT_BOOL,   0, 1),
     DEFINE_PAR("CircScrollDelta",      scroll_dist_circ,        PT_DOUBLE, .01, 3),
     DEFINE_PAR("CircScrollTrigger",    circular_trigger,        PT_INT,    0, 8),
