diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-10-27 14:20:30 +1000 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2010-02-15 14:08:58 +0000 |
commit | 045935aff4693375221ca3011c51fc08fc6736df (patch) | |
tree | 2fe8de5b30c73611178628a37aa6b56eaf9831f4 | |
parent | c5b8b0058dbfac9b3ec7ca090e7b37589e9aef62 (diff) | |
download | gnome-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.in | 11 | ||||
-rw-r--r-- | 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 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); |