[gnome-settings-daemon] Add touchpad_enabled gconf key.



commit 045935aff4693375221ca3011c51fc08fc6736df
Author: Peter Hutterer <peter hutterer who-t net>
Date:   Tue Oct 27 14:20:30 2009 +1000

    Add touchpad_enabled gconf key.
    
    Boolean key that toggles the "Device Enabled" property on all touchpad
    devices. If TRUE, touchpads are enabled, otherwise, all touchpads are
    disabled.
    
    Touchpad disabled with this key will be visible to other X Input clients but
    cannot send events unless re-enabled.
    
    Signed-off-by: Peter Hutterer <peter hutterer who-t net>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=594831

 data/desktop_gnome_peripherals_touchpad.schemas.in |   11 +++++
 plugins/mouse/gsd-mouse-manager.c                  |   45 ++++++++++++++++++++
 2 files changed, 56 insertions(+), 0 deletions(-)
---
diff --git a/data/desktop_gnome_peripherals_touchpad.schemas.in b/data/desktop_gnome_peripherals_touchpad.schemas.in
index 381dc24..78734e7 100644
--- a/data/desktop_gnome_peripherals_touchpad.schemas.in
+++ b/data/desktop_gnome_peripherals_touchpad.schemas.in
@@ -50,5 +50,16 @@
       </locale>
     </schema>
 
+    <schema>
+      <key>/schemas/desktop/gnome/peripherals/touchpad/touchpad_enabled</key>
+      <applyto>/desktop/gnome/peripherals/touchpad/touchpad_enabled</applyto>
+      <owner>gnome</owner>
+      <type>bool</type>
+      <default>TRUE</default>
+      <locale name="C">
+        <short>Enable touchpad</short>
+        <long>Set this to TRUE to enable all touchpads.</long>
+      </locale>
+    </schema>
   </schemalist>
 </gconfschemafile>
diff --git a/plugins/mouse/gsd-mouse-manager.c b/plugins/mouse/gsd-mouse-manager.c
index d0ecf6b..4371081 100644
--- a/plugins/mouse/gsd-mouse-manager.c
+++ b/plugins/mouse/gsd-mouse-manager.c
@@ -66,6 +66,7 @@
 #define KEY_TAP_TO_CLICK        GCONF_TOUCHPAD_DIR "/tap_to_click"
 #define KEY_SCROLL_METHOD       GCONF_TOUCHPAD_DIR "/scroll_method"
 #define KEY_PAD_HORIZ_SCROLL    GCONF_TOUCHPAD_DIR "/horiz_scroll_enabled"
+#define KEY_TOUCHPAD_ENABLED    GCONF_TOUCHPAD_DIR "/touchpad_enabled"
 
 struct GsdMouseManagerPrivate
 {
@@ -757,6 +758,44 @@ set_edge_scroll (int method)
         return 0;
 }
 
+static int
+set_touchpad_enabled (gboolean state)
+{
+        int numdevices, i;
+        XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY (), &numdevices);
+        XDevice *device;
+        Atom prop_enabled;
+
+        if (devicelist == NULL)
+                return 0;
+
+        prop_enabled = XInternAtom (GDK_DISPLAY (), "Device Enabled", False);
+
+        if (!prop_enabled)
+            return 0;
+
+        for (i = 0; i < numdevices; i++) {
+                if ((device = device_is_touchpad (devicelist[i]))) {
+                        unsigned char data = state;
+                        gdk_error_trap_push ();
+                        XChangeDeviceProperty (GDK_DISPLAY (), device,
+                                               prop_enabled, XA_INTEGER, 8,
+                                               PropModeReplace, &data, 1);
+                        XCloseDevice (GDK_DISPLAY (), device);
+                        gdk_flush ();
+                        if (gdk_error_trap_pop ()) {
+                                g_warning ("Error %s device \"%s\"",
+                                           (state) ? "enabling" : "disabling",
+                                           devicelist[i].name);
+                                continue;
+                        }
+                }
+        }
+
+        XFreeDeviceList (devicelist);
+        return 0;
+}
+
 static void
 set_locate_pointer (GsdMouseManager *manager,
                     gboolean         state)
@@ -862,6 +901,7 @@ set_mouse_settings (GsdMouseManager *manager)
         set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL), left_handed);
         set_edge_scroll (gconf_client_get_int (client, KEY_SCROLL_METHOD, NULL));
         set_horiz_scroll (gconf_client_get_bool (client, KEY_PAD_HORIZ_SCROLL, NULL));
+        set_touchpad_enabled (gconf_client_get_bool (client, KEY_TOUCHPAD_ENABLED, NULL));
 
         g_object_unref (client);
 }
@@ -904,6 +944,10 @@ mouse_callback (GConfClient        *client,
                 if (entry->value->type == GCONF_VALUE_BOOL) {
                         set_locate_pointer (manager, gconf_value_get_bool (entry->value));
                 }
+        } else if (! strcmp (entry->key, KEY_TOUCHPAD_ENABLED)) {
+                if (entry->value->type == GCONF_VALUE_BOOL) {
+                    set_touchpad_enabled (gconf_value_get_bool (entry->value));
+                }
         } else if (! strcmp (entry->key, KEY_DWELL_ENABLE)) {
                 if (entry->value->type == GCONF_VALUE_BOOL) {
                         set_mousetweaks_daemon (manager,
@@ -975,6 +1019,7 @@ gsd_mouse_manager_idle_cb (GsdMouseManager *manager)
                           gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
         set_edge_scroll (gconf_client_get_int (client, KEY_SCROLL_METHOD, NULL));
         set_horiz_scroll (gconf_client_get_bool (client, KEY_PAD_HORIZ_SCROLL, NULL));
+        set_touchpad_enabled (gconf_client_get_bool (client, KEY_TOUCHPAD_ENABLED, NULL));
 
         g_object_unref (client);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]