6f51df7
From ca4c9a0d9c269e51b8f6955277553f61ece9899a Mon Sep 17 00:00:00 2001
6f51df7
From: Peter Hutterer <peter.hutterer@who-t.net>
6f51df7
Date: Mon, 26 Oct 2009 15:24:48 +1000
6f51df7
Subject: [PATCH] mouse: allow left-handed setting for touchpads.
6f51df7
MIME-Version: 1.0
6f51df7
Content-Type: text/plain; charset=UTF-8
6f51df7
Content-Transfer-Encoding: 8bit
6f51df7
6f51df7
Button mapping is handled in the server, tapping is handled in the driver.
6f51df7
Thus, if the tapping is enabled and the device is left-handed, the tapping
6f51df7
order must be reversed to counter the effect of the left-handed button
6f51df7
mapping.
6f51df7
6f51df7
For right-handed setup:
6f51df7
phys. button 1          → logical button 1
6f51df7
one-finger tapping      → phys button 1
6f51df7
6f51df7
For left-handed setup:
6f51df7
phys. button 3          → logical button 1
6f51df7
one-finger-tapping      → phys. button 3
6f51df7
6f51df7
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
6f51df7
---
6f51df7
 plugins/mouse/gsd-mouse-manager.c |   27 ++++++++++++++++++---------
6f51df7
 1 files changed, 18 insertions(+), 9 deletions(-)
6f51df7
6f51df7
diff --git a/plugins/mouse/gsd-mouse-manager.c b/plugins/mouse/gsd-mouse-manager.c
6f51df7
index 4c463eb..21acca6 100644
6f51df7
--- a/plugins/mouse/gsd-mouse-manager.c
6f51df7
+++ b/plugins/mouse/gsd-mouse-manager.c
6f51df7
@@ -84,6 +84,7 @@ static void     gsd_mouse_manager_class_init  (GsdMouseManagerClass *klass);
6f51df7
 static void     gsd_mouse_manager_init        (GsdMouseManager      *mouse_manager);
6f51df7
 static void     gsd_mouse_manager_finalize    (GObject             *object);
6f51df7
 static void     set_mouse_settings            (GsdMouseManager      *manager);
6f51df7
+static int      set_tap_to_click              (gboolean state, gboolean left_handed);
6f51df7
 static XDevice* device_is_touchpad            (XDeviceInfo deviceinfo);
6f51df7
 
6f51df7
 G_DEFINE_TYPE (GsdMouseManager, gsd_mouse_manager, G_TYPE_OBJECT)
6f51df7
@@ -289,8 +290,12 @@ set_xinput_devices_left_handed (gboolean left_handed)
6f51df7
                  * around, otherwise a tap would be a right-click */
6f51df7
                 device = device_is_touchpad (device_info[i]);
6f51df7
                 if (device != NULL) {
6f51df7
+                        GConfClient *client = gconf_client_get_default ();
6f51df7
+                        gboolean tap = gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL);
6f51df7
+
6f51df7
+                        if (tap)
6f51df7
+                                set_tap_to_click (tap, left_handed);
6f51df7
                         XCloseDevice (GDK_DISPLAY (), device);
6f51df7
-                        continue;
6f51df7
                 }
6f51df7
 
6f51df7
                 gdk_error_trap_push ();
6f51df7
@@ -540,7 +545,7 @@ set_disable_w_typing (GsdMouseManager *manager, gboolean state)
6f51df7
 }
6f51df7
 
6f51df7
 static int
6f51df7
-set_tap_to_click (gboolean state)
6f51df7
+set_tap_to_click (gboolean state, gboolean left_handed)
6f51df7
 {
6f51df7
         int numdevices, i, format, rc;
6f51df7
         unsigned long nitems, bytes_after;
6f51df7
@@ -567,8 +572,8 @@ set_tap_to_click (gboolean state)
6f51df7
                         if (rc == Success && type == XA_INTEGER && format == 8 && nitems >= 7)
6f51df7
                         {
6f51df7
                                 /* Set RLM mapping for 1/2/3 fingers*/
6f51df7
-                                data[4] = (state) ? 1 : 0;
6f51df7
-                                data[5] = (state) ? 3 : 0;
6f51df7
+                                data[4] = (state) ? ((left_handed) ? 3 : 1) : 0;
6f51df7
+                                data[5] = (state) ? ((left_handed) ? 1 : 3) : 0;
6f51df7
                                 data[6] = (state) ? 2 : 0;
6f51df7
                                 XChangeDeviceProperty (GDK_DISPLAY (), device, prop, XA_INTEGER, 8,
6f51df7
                                                         PropModeReplace, data, nitems);
6f51df7
@@ -812,13 +817,14 @@ static void
6f51df7
 set_mouse_settings (GsdMouseManager *manager)
6f51df7
 {
6f51df7
         GConfClient *client = gconf_client_get_default ();
6f51df7
+        gboolean left_handed = gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL);
6f51df7
 
6f51df7
-        set_left_handed (manager, gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
6f51df7
+        set_left_handed (manager, left_handed);
6f51df7
         set_motion_acceleration (manager, gconf_client_get_float (client, KEY_MOTION_ACCELERATION , NULL));
6f51df7
         set_motion_threshold (manager, gconf_client_get_int (client, KEY_MOTION_THRESHOLD, NULL));
6f51df7
 
6f51df7
         set_disable_w_typing (manager, gconf_client_get_bool (client, KEY_TOUCHPAD_DISABLE_W_TYPING, NULL));
6f51df7
-        set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL));
6f51df7
+        set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL), left_handed);
6f51df7
         set_edge_scroll (gconf_client_get_int (client, KEY_SCROLL_METHOD, NULL));
6f51df7
         set_horiz_scroll (gconf_client_get_bool (client, KEY_PAD_HORIZ_SCROLL, NULL));
6f51df7
 
6f51df7
@@ -847,8 +853,10 @@ mouse_callback (GConfClient        *client,
6f51df7
                 if (entry->value->type == GCONF_VALUE_BOOL)
6f51df7
                         set_disable_w_typing (manager, gconf_value_get_bool (entry->value));
6f51df7
         } else if (! strcmp (entry->key, KEY_TAP_TO_CLICK)) {
6f51df7
-                if (entry->value->type == GCONF_VALUE_BOOL)
6f51df7
-                        set_tap_to_click (gconf_value_get_bool (entry->value));
6f51df7
+                if (entry->value->type == GCONF_VALUE_BOOL) {
6f51df7
+                        set_tap_to_click (gconf_value_get_bool (entry->value),
6f51df7
+                                          gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
6f51df7
+                }
6f51df7
         } else if (! strcmp (entry->key, KEY_SCROLL_METHOD)) {
6f51df7
                 if (entry->value->type == GCONF_VALUE_INT) {
6f51df7
                         set_edge_scroll (gconf_value_get_int (entry->value));
6f51df7
@@ -928,7 +936,8 @@ gsd_mouse_manager_idle_cb (GsdMouseManager *manager)
6f51df7
                                 gconf_client_get_bool (client, KEY_DELAY_ENABLE, NULL));
6f51df7
 
6f51df7
         set_disable_w_typing (manager, gconf_client_get_bool (client, KEY_TOUCHPAD_DISABLE_W_TYPING, NULL));
6f51df7
-        set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL));
6f51df7
+        set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL),
6f51df7
+                          gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
6f51df7
         set_edge_scroll (gconf_client_get_int (client, KEY_SCROLL_METHOD, NULL));
6f51df7
         set_horiz_scroll (gconf_client_get_bool (client, KEY_PAD_HORIZ_SCROLL, NULL));
6f51df7
 
6f51df7
-- 
6f51df7
1.6.5.rc2
6f51df7