summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-11-10 15:49:50 +1000
committerJens Granseuer <jensgr@gmx.net>2009-11-13 17:54:16 +0100
commita5bf115175ea52c5cdc184b3844d06bdb7ad775c (patch)
treee5dfc41f668e04ae9b811748608404caea4b824d
parentd081be4045e4338462daa2cd33b6c897a17f1ae5 (diff)
downloadgnome-control-center-a5bf115175ea52c5cdc184b3844d06bdb7ad775c.tar.gz
Disable two-finger scrolling/tapping based on touchpad capabilities.
Touchpads that can't do two-finger cannot two-finger scroll - disable this scroll method. Touchpads that don't have physical buttons mustn't disable tapping - set to on by default and disable checkbox. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--capplets/mouse/gnome-mouse-properties.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/capplets/mouse/gnome-mouse-properties.c b/capplets/mouse/gnome-mouse-properties.c
index 816eab51d..fe88434f1 100644
--- a/capplets/mouse/gnome-mouse-properties.c
+++ b/capplets/mouse/gnome-mouse-properties.c
@@ -327,6 +327,56 @@ scrollmethod_changed_event (GConfPropertyEditor *peditor,
!gtk_toggle_button_get_active (disabled));
}
+static void
+synaptics_check_capabilities (GtkBuilder *dialog)
+{
+#ifdef HAVE_XINPUT
+ int numdevices, i;
+ XDeviceInfo *devicelist;
+ Atom realtype, prop;
+ int realformat;
+ unsigned long nitems, bytes_after;
+ unsigned char *data;
+
+ prop = XInternAtom (GDK_DISPLAY (), "Synaptics Capabilities", True);
+ if (!prop)
+ return;
+
+ devicelist = XListInputDevices (GDK_DISPLAY (), &numdevices);
+ for (i = 0; i < numdevices; i++) {
+ if (devicelist[i].use != IsXExtensionPointer)
+ continue;
+
+ gdk_error_trap_push ();
+ XDevice *device = XOpenDevice (GDK_DISPLAY (),
+ devicelist[i].id);
+ if (gdk_error_trap_pop ())
+ continue;
+
+ gdk_error_trap_push ();
+ if ((XGetDeviceProperty (GDK_DISPLAY (), device, prop, 0, 2, False,
+ XA_INTEGER, &realtype, &realformat, &nitems,
+ &bytes_after, &data) == Success) && (realtype != None)) {
+ /* Property data is booleans for has_left, has_middle,
+ * has_right, has_double, has_triple */
+ if (!data[0] || !data[1] || !data[2]) {
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (WID ("tap_to_click_toggle")), TRUE);
+ gtk_widget_set_sensitive (WID ("tap_to_click_toggle"), FALSE);
+ }
+
+ if (!data[3])
+ gtk_widget_set_sensitive (WID ("scroll_twofinger_radio"), FALSE);
+
+ XFree (data);
+ }
+ gdk_error_trap_pop ();
+
+ XCloseDevice (GDK_DISPLAY (), device);
+ }
+ XFreeDeviceList (devicelist);
+#endif
+}
+
static gboolean
find_synaptics (void)
{
@@ -451,6 +501,7 @@ setup_dialog (GtkBuilder *dialog, GConfChangeSet *changeset)
(changeset, "/desktop/gnome/peripherals/touchpad/scroll_method", gtk_radio_button_get_group (radio),
NULL);
+ synaptics_check_capabilities (dialog);
scrollmethod_changed_event (GCONF_PROPERTY_EDITOR (peditor), NULL, NULL, dialog);
g_signal_connect (peditor, "value-changed",
G_CALLBACK (scrollmethod_changed_event), dialog);