=== modified file 'gnome-settings-daemon/gnome-settings-mouse.c'
--- gnome-settings-daemon/gnome-settings-mouse.c	
+++ gnome-settings-daemon/gnome-settings-mouse.c	
@@ -33,24 +33,57 @@
                          gint      n_buttons,
                          gboolean  left_handed)
 {
-  const gint left_button = 0;
+  const gint left_button = 1;
   gint right_button;
+  gint i;
 
   /* if the button is higher than 2 (3rd button) then it's
    * probably one direction of a scroll wheel or something else
    * uninteresting
    */
-  right_button = MIN (n_buttons - 1, 2);
-
-  if (left_handed)
-    {
-      buttons[left_button] = right_button + 1;
-      buttons[right_button] = left_button + 1;
-    }
-  else
-    {
-      buttons[left_button] = left_button + 1;
-      buttons[right_button] = right_button + 1;
+  right_button = MIN (n_buttons, 3);
+
+  /* If we change things we need to make sure we only swap buttons.
+   * If we end up with multiple physical buttons assigned to the same
+   * logical button the server will complain. This code assumes physical
+   * button 0 is the physical left mouse button, and that the physical
+   * button other than 0 currently assigned left_button or right_button
+   * is the physical right mouse button.
+   */
+
+  /* check if the current mapping satisfies the above assumptions */
+  if (buttons[left_button] != left_button && 
+      buttons[left_button] != right_button)
+      /* The current mapping is weird. Swapping buttons is probably not a
+       * good idea.
+       */
+      return;
+
+  /* check if we are left_handed and currently not swapped */
+  if (left_handed && buttons[left_button - 1] == left_button)
+    {
+      /* find the right button */
+      for (i = 0; i < n_buttons; i++)
+        {
+          if (buttons[i] == right_button)
+              break;
+      }
+      /* swap the buttons */
+      buttons[left_button - 1] = right_button;
+      buttons[i] = left_button;
+    }
+  /* check if we are not left_handed but are swapped */
+  else if (!left_handed && buttons[left_button - 1] == right_button)
+    {
+      /* find the right button */
+      for (i = 0; i < n_buttons; i++)
+        {
+          if (buttons[i] == left_button)
+              break;
+      }
+      /* swap the buttons */
+      buttons[i] = right_button;
+      buttons[left_button - 1] = left_button;
   }
 }
 

