[gnome-control-center] wacom: Update from gnome-settings-daemon



commit a37720f11f9d43bf31b5c99b4f49f0af2dcd7141
Author: Olivier Fourdan <ofourdan redhat com>
Date:   Fri Oct 19 15:42:56 2012 +0200

    wacom: Update from gnome-settings-daemon

 panels/wacom/gsd-input-helper.c |   29 +++++++-
 panels/wacom/gsd-input-helper.h |    2 +
 panels/wacom/gsd-wacom-device.c |  163 +++++++++++++++++++++++++++++++--------
 panels/wacom/gsd-wacom-device.h |    2 +
 4 files changed, 164 insertions(+), 32 deletions(-)
---
diff --git a/panels/wacom/gsd-input-helper.c b/panels/wacom/gsd-input-helper.c
index c15e135..cbf757d 100644
--- a/panels/wacom/gsd-input-helper.c
+++ b/panels/wacom/gsd-input-helper.c
@@ -20,6 +20,8 @@
 
 #include "config.h"
 
+#include <string.h>
+
 #include <gdk/gdk.h>
 #include <gdk/gdkx.h>
 
@@ -194,6 +196,24 @@ device_info_is_mouse (XDeviceInfo *device_info)
         return (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_MOUSE, False));
 }
 
+gboolean
+device_info_is_trackball (XDeviceInfo *device_info)
+{
+        gboolean retval;
+
+        retval = (device_info->type == XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), XI_TRACKBALL, False));
+        if (retval == FALSE &&
+            device_info->name != NULL) {
+                char *lowercase;
+
+                lowercase = g_ascii_strdown (device_info->name, -1);
+                retval = strstr (lowercase, "trackball") != NULL;
+                g_free (lowercase);
+        }
+
+        return retval;
+}
+
 static gboolean
 device_type_is_present (InfoIdentifyFunc info_func,
                         DeviceIdentifyFunc device_func)
@@ -263,6 +283,13 @@ mouse_is_present (void)
                                        NULL);
 }
 
+gboolean
+trackball_is_present (void)
+{
+        return device_type_is_present (device_info_is_trackball,
+                                       NULL);
+}
+
 char *
 xdevice_get_device_node (int deviceid)
 {
@@ -493,7 +520,7 @@ run_custom_command (GdkDevice              *device,
         g_free (argv[4]);
         g_free (argv[5]);
 
-        return (exit_status == 0);
+        return (exit_status == 1);
 }
 
 GList *
diff --git a/panels/wacom/gsd-input-helper.h b/panels/wacom/gsd-input-helper.h
index fb898b0..f86d2a4 100644
--- a/panels/wacom/gsd-input-helper.h
+++ b/panels/wacom/gsd-input-helper.h
@@ -62,10 +62,12 @@ gboolean  device_is_touchpad       (XDevice                *xdevice);
 gboolean  device_info_is_touchpad    (XDeviceInfo         *device_info);
 gboolean  device_info_is_touchscreen (XDeviceInfo         *device_info);
 gboolean  device_info_is_mouse       (XDeviceInfo         *device_info);
+gboolean  device_info_is_trackball   (XDeviceInfo         *device_info);
 
 gboolean  touchpad_is_present     (void);
 gboolean  touchscreen_is_present  (void);
 gboolean  mouse_is_present        (void);
+gboolean  trackball_is_present    (void);
 
 gboolean  device_set_property     (XDevice                *xdevice,
                                    const char             *device_name,
diff --git a/panels/wacom/gsd-wacom-device.c b/panels/wacom/gsd-wacom-device.c
index c1de506..1a78530 100644
--- a/panels/wacom/gsd-wacom-device.c
+++ b/panels/wacom/gsd-wacom-device.c
@@ -335,6 +335,8 @@ struct GsdWacomDevicePrivate
 	GList *styli;
 	GsdWacomStylus *last_stylus;
 	GList *buttons;
+	gint num_rings;
+	gint num_strips;
 	GHashTable *modes; /* key = int (group), value = int (index) */
 	GHashTable *num_modes; /* key = int (group), value = int (index) */
 	GSettings *wacom_settings;
@@ -999,6 +1001,7 @@ gsd_wacom_device_add_ring_modes (WacomDevice      *wacom_device,
 {
 	GList *l;
 	guint num_modes;
+	guint group;
 	guint i;
 	char *name, *id;
 
@@ -1006,21 +1009,53 @@ gsd_wacom_device_add_ring_modes (WacomDevice      *wacom_device,
 
 	if ((direction & WACOM_BUTTON_POSITION_LEFT) && libwacom_has_ring (wacom_device)) {
 		num_modes = libwacom_get_ring_num_modes (wacom_device);
-		for (i = 1; i <= num_modes; i++) {
-			name = g_strdup_printf (_("Left Ring Mode #%d"), i);
-			id = g_strdup_printf ("left-ring-mode-%d", i);
-			l = g_list_append (l, gsd_wacom_tablet_button_new (name, id, settings_path, WACOM_TABLET_BUTTON_TYPE_ELEVATOR, flags_to_group (WACOM_BUTTON_RING_MODESWITCH), i - 1));
-			g_free (name);
-			g_free (id);
+		group = flags_to_group (WACOM_BUTTON_RING_MODESWITCH);
+		if (num_modes == 0) {
+			/* If no mode is available, we use "left-ring-mode-1" for backward compat */
+			l = g_list_append (l, gsd_wacom_tablet_button_new (_("Left Ring"),
+									   "left-ring-mode-1",
+									   settings_path,
+									   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+									   group,
+									   0));
+		} else {
+			for (i = 1; i <= num_modes; i++) {
+				name = g_strdup_printf (_("Left Ring Mode #%d"), i);
+				id = g_strdup_printf ("left-ring-mode-%d", i);
+				l = g_list_append (l, gsd_wacom_tablet_button_new (name,
+				                                                   id,
+				                                                   settings_path,
+				                                                   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+				                                                   group,
+				                                                   i - 1));
+				g_free (name);
+				g_free (id);
+			}
 		}
 	} else if ((direction & WACOM_BUTTON_POSITION_RIGHT) && libwacom_has_ring2 (wacom_device)) {
 		num_modes = libwacom_get_ring2_num_modes (wacom_device);
-		for (i = 1; i <= num_modes; i++) {
-			name = g_strdup_printf (_("Right Ring Mode #%d"), i);
-			id = g_strdup_printf ("right-ring-mode-%d", i);
-			l = g_list_append (l, gsd_wacom_tablet_button_new (name, id, settings_path, WACOM_TABLET_BUTTON_TYPE_ELEVATOR, flags_to_group (WACOM_BUTTON_RING2_MODESWITCH), i - 1));
-			g_free (name);
-			g_free (id);
+		group = flags_to_group (WACOM_BUTTON_RING2_MODESWITCH);
+		if (num_modes == 0) {
+			/* If no mode is available, we use "right-ring-mode-1" for backward compat */
+			l = g_list_append (l, gsd_wacom_tablet_button_new (_("Right Ring"),
+									   "right-ring-mode-1",
+									   settings_path,
+									   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+									   group,
+									   0));
+		} else {
+			for (i = 1; i <= num_modes; i++) {
+				name = g_strdup_printf (_("Right Ring Mode #%d"), i);
+				id = g_strdup_printf ("right-ring-mode-%d", i);
+				l = g_list_append (l, gsd_wacom_tablet_button_new (name,
+				                                                   id,
+				                                                   settings_path,
+				                                                   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+				                                                   group,
+				                                                   i - 1));
+				g_free (name);
+				g_free (id);
+			}
 		}
 	}
 
@@ -1035,6 +1070,7 @@ gsd_wacom_device_add_strip_modes (WacomDevice      *wacom_device,
 	GList *l;
 	guint num_modes;
 	guint num_strips;
+	guint group;
 	guint i;
 	char *name, *id;
 
@@ -1045,21 +1081,53 @@ gsd_wacom_device_add_strip_modes (WacomDevice      *wacom_device,
 
 	if ((direction & WACOM_BUTTON_POSITION_LEFT) && num_strips >= 1) {
 		num_modes = libwacom_get_strips_num_modes (wacom_device);
-		for (i = 1; i <= num_modes; i++) {
-			name = g_strdup_printf (_("Left Touchstrip Mode #%d"), i);
-			id = g_strdup_printf ("left-strip-mode-%d", i);
-			l = g_list_append (l, gsd_wacom_tablet_button_new (name, id, settings_path, WACOM_TABLET_BUTTON_TYPE_ELEVATOR, flags_to_group (WACOM_BUTTON_TOUCHSTRIP_MODESWITCH), i - 1));
-			g_free (name);
-			g_free (id);
+		group = flags_to_group (WACOM_BUTTON_TOUCHSTRIP_MODESWITCH);
+		if (num_modes == 0) {
+			/* If no mode is available, we use "left-strip-mode-1" for backward compat */
+			l = g_list_append (l, gsd_wacom_tablet_button_new (_("Left Touchstrip"),
+									   "left-strip-mode-1",
+									   settings_path,
+									   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+									   group,
+									   0));
+		} else {
+			for (i = 1; i <= num_modes; i++) {
+				name = g_strdup_printf (_("Left Touchstrip Mode #%d"), i);
+				id = g_strdup_printf ("left-strip-mode-%d", i);
+				l = g_list_append (l, gsd_wacom_tablet_button_new (name,
+				                                                   id,
+				                                                   settings_path,
+				                                                   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+				                                                   group,
+				                                                   i - 1));
+				g_free (name);
+				g_free (id);
+			}
 		}
 	} else if ((direction & WACOM_BUTTON_POSITION_RIGHT) && num_strips >= 2) {
 		num_modes = libwacom_get_strips_num_modes (wacom_device);
-		for (i = 1; i <= num_modes; i++) {
-			name = g_strdup_printf (_("Right Touchstrip Mode #%d"), i);
-			id = g_strdup_printf ("right-strip-mode-%d", i);
-			l = g_list_append (l, gsd_wacom_tablet_button_new (name, id, settings_path, WACOM_TABLET_BUTTON_TYPE_ELEVATOR, flags_to_group (WACOM_BUTTON_TOUCHSTRIP2_MODESWITCH), i - 1));
-			g_free (name);
-			g_free (id);
+		group = flags_to_group (WACOM_BUTTON_TOUCHSTRIP2_MODESWITCH);
+		if (num_modes == 0) {
+			/* If no mode is available, we use "right-strip-mode-1" for backward compat */
+			l = g_list_append (l, gsd_wacom_tablet_button_new (_("Right Touchstrip"),
+									   "right-strip-mode-1",
+									   settings_path,
+									   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+									   group,
+									   0));
+		} else {
+			for (i = 1; i <= num_modes; i++) {
+				name = g_strdup_printf (_("Right Touchstrip Mode #%d"), i);
+				id = g_strdup_printf ("right-strip-mode-%d", i);
+				l = g_list_append (l, gsd_wacom_tablet_button_new (name,
+				                                                   id,
+				                                                   settings_path,
+				                                                   WACOM_TABLET_BUTTON_TYPE_ELEVATOR,
+				                                                   group,
+				                                                   i - 1));
+				g_free (name);
+				g_free (id);
+			}
 		}
 	}
 
@@ -1135,15 +1203,14 @@ gsd_wacom_device_add_buttons_dir (WacomDevice      *wacom_device,
 		l = g_list_append (l, gsd_wacom_tablet_button_new (name, id, settings_path, WACOM_TABLET_BUTTON_TYPE_HARDCODED, flags_to_group (flags), -1));
 		g_free (name);
 		g_free (id);
-
-		if (flags & WACOM_BUTTON_RINGS_MODESWITCH)
-			l = g_list_concat (l, gsd_wacom_device_add_ring_modes (wacom_device, settings_path, direction));
-		else if (flags & WACOM_BUTTON_TOUCHSTRIPS_MODESWITCH)
-			l = g_list_concat (l, gsd_wacom_device_add_strip_modes (wacom_device, settings_path, direction));
-		else
-			g_warning ("Unhandled modeswitches");
 	}
 
+	/* Handle touch{strips,rings} */
+	if (libwacom_has_ring2 (wacom_device) || libwacom_has_ring (wacom_device))
+		l = g_list_concat (l, gsd_wacom_device_add_ring_modes (wacom_device, settings_path, direction));
+	if  (libwacom_get_num_strips (wacom_device) > 0)
+		l = g_list_concat (l, gsd_wacom_device_add_strip_modes (wacom_device, settings_path, direction));
+
 	return l;
 }
 
@@ -1173,6 +1240,21 @@ gsd_wacom_device_add_buttons (GsdWacomDevice *device,
 }
 
 static void
+gsd_wacom_device_get_modeswitches (WacomDevice      *wacom_device,
+				   gint             *num_rings,
+				   gint             *num_strips)
+{
+	*num_strips = libwacom_get_num_strips (wacom_device);
+
+	if (libwacom_has_ring2 (wacom_device))
+		*num_rings = 2;
+	else if  (libwacom_has_ring (wacom_device))
+		*num_rings = 1;
+	else
+		*num_rings = 0;
+}
+
+static void
 gsd_wacom_device_add_modes (GsdWacomDevice *device,
 			    WacomDevice    *wacom_device)
 {
@@ -1230,6 +1312,9 @@ gsd_wacom_device_update_from_db (GsdWacomDevice *device,
 	}
 
 	if (device->priv->type == WACOM_TYPE_PAD) {
+		gsd_wacom_device_get_modeswitches (wacom_device,
+						   &device->priv->num_rings,
+						   &device->priv->num_strips);
 		gsd_wacom_device_add_buttons (device, wacom_device, settings_path);
 		gsd_wacom_device_add_modes (device, wacom_device);
 	}
@@ -1558,6 +1643,22 @@ gsd_wacom_device_is_fallback (GsdWacomDevice *device)
 	return device->priv->is_fallback;
 }
 
+gint
+gsd_wacom_device_get_num_strips (GsdWacomDevice *device)
+{
+	g_return_val_if_fail (GSD_IS_WACOM_DEVICE (device), 0);
+
+	return device->priv->num_strips;
+}
+
+gint
+gsd_wacom_device_get_num_rings (GsdWacomDevice *device)
+{
+	g_return_val_if_fail (GSD_IS_WACOM_DEVICE (device), 0);
+
+	return device->priv->num_rings;
+}
+
 GSettings *
 gsd_wacom_device_get_settings (GsdWacomDevice *device)
 {
diff --git a/panels/wacom/gsd-wacom-device.h b/panels/wacom/gsd-wacom-device.h
index 8604ee4..24e6e06 100644
--- a/panels/wacom/gsd-wacom-device.h
+++ b/panels/wacom/gsd-wacom-device.h
@@ -143,6 +143,8 @@ const char     * gsd_wacom_device_get_tool_name    (GsdWacomDevice *device);
 gboolean         gsd_wacom_device_reversible       (GsdWacomDevice *device);
 gboolean         gsd_wacom_device_is_screen_tablet (GsdWacomDevice *device);
 gboolean         gsd_wacom_device_is_fallback      (GsdWacomDevice *device);
+gint             gsd_wacom_device_get_num_strips   (GsdWacomDevice *device);
+gint             gsd_wacom_device_get_num_rings    (GsdWacomDevice *device);
 GSettings      * gsd_wacom_device_get_settings     (GsdWacomDevice *device);
 void             gsd_wacom_device_set_current_stylus (GsdWacomDevice *device,
 						      int             stylus_id);



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