[gnome-control-center] wacom: Implement g-c-c calibration functionality



commit 4fecb4c01d4da7eef317ec4dd4c1e1160ceba993
Author: Jason Gerecke <killertofu gmail com>
Date:   Mon Jan 9 16:01:14 2012 -0800

    wacom: Implement g-c-c calibration functionality
    
    Adds and handles callback from the "Calibrate" button.
    When clicked, we get the current calibration and feed
    it in to the calibration utility. After it completes
    we get back a modified calibration and an indication
    of success. If it was successful we apply the changes,
    if not, we ignore the modifed calibration.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=657423

 panels/wacom/calibrator/gui_gtk.c |    1 -
 panels/wacom/cc-wacom-page.c      |  112 +++++++++++++++++++++++++++++++++++++
 panels/wacom/gsd-wacom-device.c   |   36 ++++++++++++
 panels/wacom/gsd-wacom-device.h   |    2 +
 4 files changed, 150 insertions(+), 1 deletions(-)
---
diff --git a/panels/wacom/calibrator/gui_gtk.c b/panels/wacom/calibrator/gui_gtk.c
index 2a3e970..dddf12a 100644
--- a/panels/wacom/calibrator/gui_gtk.c
+++ b/panels/wacom/calibrator/gui_gtk.c
@@ -408,4 +408,3 @@ run_gui(struct Calib *c,
 
    return success;
 }
-
diff --git a/panels/wacom/cc-wacom-page.c b/panels/wacom/cc-wacom-page.c
index 8cbe710..5853311 100644
--- a/panels/wacom/cc-wacom-page.c
+++ b/panels/wacom/cc-wacom-page.c
@@ -24,6 +24,7 @@
 
 #include "cc-wacom-page.h"
 #include "cc-wacom-nav-button.h"
+#include "gui_gtk.h"
 #include <gtk/gtk.h>
 
 #include <string.h>
@@ -114,6 +115,114 @@ eraser_feel_value_changed_cb (GtkRange *range, gpointer user_data)
 }
 
 static void
+get_calibration (gint      ** cal,
+                 gsize      * ncal,
+                 GSettings  * settings)
+{
+	GVariant *current = g_settings_get_value (settings, "area");
+	*cal = g_variant_get_fixed_array (current, ncal, sizeof (gint32));
+}
+
+static void
+set_calibration (gint      *cal,
+                 gsize      ncal,
+                 GSettings *settings)
+{
+	GVariant    *current; /* current calibration */
+	GVariant    *array;   /* new calibration */
+	GVariant   **tmp;
+	gsize        nvalues;
+	const gint  *values;
+	int          i;
+
+	current = g_settings_get_value (settings, "area");
+	values = g_variant_get_fixed_array (current, &nvalues, sizeof (gint32));
+	if ((ncal != 4) || (nvalues != 4))
+	{
+		g_warning("Unable set set device calibration property. Got %d items to put in %d slots; expected %d items.\n", ncal, nvalues, 4);
+		return;
+	}
+
+	tmp = g_malloc (nvalues * sizeof (GVariant*));
+	for (i = 0; i < ncal; i++)
+		tmp[i] = g_variant_new_int32 (cal[i]);
+
+	array = g_variant_new_array (G_VARIANT_TYPE_INT32, tmp, nvalues);
+	g_settings_set_value (settings, "area", array);
+
+	g_free (tmp);
+	g_variant_unref (array);
+}
+
+static gboolean
+run_calibration (gint  *cal,
+                 gsize  ncal)
+{
+	gboolean success = FALSE;
+	XYinfo axys;
+	bool swap_xy;
+	struct Calib calibrator;
+
+	if (ncal != 4)
+	{
+		g_warning("Unable to run calibration. Got %d items; expected %d.\n", ncal, 4);
+		goto quit_calibration;
+	}
+
+	calibrator.threshold_misclick = 15;
+	calibrator.threshold_doubleclick = 7;
+	calibrator.geometry = NULL;
+	calibrator.old_axys.x_min = cal[0];
+	calibrator.old_axys.y_min = cal[1];
+	calibrator.old_axys.x_max = cal[2];
+	calibrator.old_axys.y_max = cal[3];
+
+	/* !!NOTE!! This call blocks on the calibration
+         * !!NOTE!! process. It will be several seconds
+         * !!NOTE!! before this returns.
+         */
+	if(run_gui(&calibrator, &axys, &swap_xy))
+		success = TRUE;
+
+quit_calibration:
+	if (success)
+	{
+		cal[0] = axys.x_min;
+		cal[1] = axys.y_min;
+		cal[2] = axys.x_max;
+		cal[3] = axys.y_max;
+	}
+
+	return success;
+}
+
+static void
+calibrate_button_clicked_cb (GtkButton *button, gpointer user_data)
+{
+    GSettings *tablet = CC_WACOM_PAGE(user_data)->priv->wacom_settings;
+    gint i, calibration[4];
+    gint *current;
+    gsize s;
+
+    get_calibration (&current, &s, tablet);
+    if (s != 4)
+    {
+        g_warning("Device calibration property has wrong length. Got %d items; expected %d.\n", s, 4);
+        return;
+    }
+
+    for (i = 0; i < 4; i++)
+        calibration[i] = current[i];
+
+    if (calibration[0] == -1 && calibration[1] == -1 && calibration[2] == -1 && calibration[3] == -1)
+        gsd_wacom_device_get_area(CC_WACOM_PAGE(user_data)->priv->stylus, &calibration);
+
+    if (run_calibration(calibration, 4))
+        set_calibration(calibration, 4, tablet);
+}
+
+
+static void
 set_feel_from_gsettings (GtkAdjustment *adjustment, GSettings *settings)
 {
 	GVariant	*variant;
@@ -391,6 +500,9 @@ cc_wacom_page_init (CcWacomPage *self)
 			  G_CALLBACK (tip_feel_value_changed_cb), self);
 	g_signal_connect (WID ("scale-eraser-feel"), "value-changed",
 			  G_CALLBACK (eraser_feel_value_changed_cb), self);
+	g_signal_connect (WID ("button-calibrate"), "clicked",
+			  G_CALLBACK (calibrate_button_clicked_cb), self);
+
 
 	combo = GTK_COMBO_BOX (WID ("combo-topbutton"));
 	combobox_text_cellrenderer (combo, BUTTONNAME_COLUMN);
diff --git a/panels/wacom/gsd-wacom-device.c b/panels/wacom/gsd-wacom-device.c
index 281abb4..c3c6d47 100644
--- a/panels/wacom/gsd-wacom-device.c
+++ b/panels/wacom/gsd-wacom-device.c
@@ -734,6 +734,42 @@ gsd_wacom_device_get_device_type (GsdWacomDevice *device)
 	return device->priv->type;
 }
 
+gboolean
+gsd_wacom_device_get_area (GsdWacomDevice *dev, gint *device_area)
+{
+        int i, id;
+        XDevice *device;
+        Atom area, realtype;
+        int rc, realformat;
+        unsigned long nitems, bytes_after;
+        unsigned char *data = NULL;
+
+        g_object_get (dev->priv->gdk_device, "device-id", &id, NULL);
+
+        area = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "Wacom Tablet Area", False);
+
+        gdk_error_trap_push ();
+        device = XOpenDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), id);
+        if (gdk_error_trap_pop () || (device == NULL))
+                return FALSE;
+
+        gdk_error_trap_push ();
+        rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+                                 device, area, 0, 4, False,
+                                 XA_INTEGER, &realtype, &realformat, &nitems,
+                                 &bytes_after, &data);
+        if (gdk_error_trap_pop () || rc != Success || realtype == None || bytes_after != 0 || nitems != 4) {
+                XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
+                return FALSE;
+        }
+
+        for (i = 0; i < nitems; i++)
+                device_area[i] = ((long*)data)[i];
+
+        XFree (data);
+        return TRUE;
+}
+
 const char *
 gsd_wacom_device_type_to_string (GsdWacomDeviceType type)
 {
diff --git a/panels/wacom/gsd-wacom-device.h b/panels/wacom/gsd-wacom-device.h
index 235e75a..1caa309 100644
--- a/panels/wacom/gsd-wacom-device.h
+++ b/panels/wacom/gsd-wacom-device.h
@@ -96,6 +96,8 @@ void             gsd_wacom_device_set_current_stylus (GsdWacomDevice *device,
 						      int             stylus_id);
 
 GsdWacomDeviceType gsd_wacom_device_get_device_type (GsdWacomDevice *device);
+gboolean         gsd_wacom_device_get_area         (GsdWacomDevice *dev,
+                                                    int *device_area);
 const char     * gsd_wacom_device_type_to_string   (GsdWacomDeviceType type);
 
 /* Helper and debug functions */



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