summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-10-27 14:20:30 +1000
committerBastien Nocera <hadess@hadess.net>2010-02-15 14:08:58 +0000
commit045935aff4693375221ca3011c51fc08fc6736df (patch)
tree2fe8de5b30c73611178628a37aa6b56eaf9831f4
parentc5b8b0058dbfac9b3ec7ca090e7b37589e9aef62 (diff)
downloadgnome-settings-daemon-045935aff4693375221ca3011c51fc08fc6736df.tar.gz
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
-rw-r--r--data/desktop_gnome_peripherals_touchpad.schemas.in11
-rw-r--r--plugins/mouse/gsd-mouse-manager.c45
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 381dc24d..78734e7c 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 d0ecf6b5..4371081a 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);