[gnome-settings-daemon] Add wacom g-s-d plugin.



commit 9863ccf9d99fdd712778b31197365723b9caa0be
Author: Peter Hutterer <peter hutterer who-t net>
Date:   Tue Feb 23 20:32:26 2010 +1000

    Add wacom g-s-d plugin.
    
    This plugin is essentially a copy of the mouse plugin with a lot of
    search/replace for the framework needed (hence the copyright messages).
    
    Since the wacom driver puts a lot of emphasis on the different tools, the
    schemas create a nested structure. The keys are stored in
    org.gnome.settings-daemon.peripherals.wacom.{stylus|erasor|cursor|pad},
    with tablet-wide settings in wacom and the tool-specific settings in the
    tool-specific schema.
    
    Supported keys with this commit:
    .wacom rotation .. for tablet rotation in 90deg steps
    .wacom touch    .. only emit events when touching the device
    .wacom tablet-pc-button .. tablet PC stylus button behaviour
    
    .wacom.stylus pressureshreshold .. threshold before click is registered
    .wacom.stylus pressurecurve	.. adjust 'hardness/softness' of the tip
    .wacom.stylus is-absolute	.. switch between relative/absolute mode
    .wacom.stylus area		.. usable area (also for calibration)
    .wacom.stylus buttonmapping	.. logical button mapping
    
    The above settings are also available for eraser, and subsets on
    cursor and pad.
    
    Signed-off-by: Peter Hutterer <peter hutterer who-t net>

 configure.ac                                       |    2 +
 data/Makefile.am                                   |    1 +
 data/gsd-enums.h                                   |    8 +
 ...ings-daemon.peripherals.wacom.gschema.xml.in.in |  119 ++++
 plugins/Makefile.am                                |    1 +
 plugins/wacom/Makefile.am                          |   38 ++
 plugins/wacom/gsd-wacom-manager.c                  |  685 ++++++++++++++++++++
 plugins/wacom/gsd-wacom-manager.h                  |   58 ++
 plugins/wacom/gsd-wacom-plugin.c                   |  111 ++++
 plugins/wacom/gsd-wacom-plugin.h                   |   60 ++
 plugins/wacom/wacom.gnome-settings-plugin.in       |    8 +
 11 files changed, 1091 insertions(+), 0 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index a46178f..e5939d8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -453,6 +453,7 @@ plugins/media-keys/cut-n-paste/Makefile
 plugins/mouse/Makefile
 plugins/smartcard/Makefile
 plugins/sound/Makefile
+plugins/wacom/Makefile
 plugins/xrandr/Makefile
 plugins/xsettings/Makefile
 data/Makefile
@@ -467,6 +468,7 @@ data/org.gnome.settings-daemon.plugins.media-keys.gschema.xml.in
 data/org.gnome.settings-daemon.peripherals.gschema.xml.in
 data/org.gnome.settings-daemon.plugins.housekeeping.gschema.xml.in
 data/org.gnome.settings-daemon.plugins.xrandr.gschema.xml.in
+data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in
 po/Makefile.in
 ])
 
diff --git a/data/Makefile.am b/data/Makefile.am
index d32b944..db669ee 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -14,6 +14,7 @@ gsettings_SCHEMAS =							\
 	org.gnome.settings-daemon.plugins.media-keys.gschema.xml	\
 	org.gnome.settings-daemon.plugins.xsettings.gschema.xml		\
 	org.gnome.settings-daemon.plugins.housekeeping.gschema.xml	\
+	org.gnome.settings-daemon.peripherals.wacom.gschema.xml		\
 	org.gnome.settings-daemon.plugins.xrandr.gschema.xml
 
 @INTLTOOL_XML_NOMERGE_RULE@
diff --git a/data/gsd-enums.h b/data/gsd-enums.h
index e955c30..0d0fe98 100644
--- a/data/gsd-enums.h
+++ b/data/gsd-enums.h
@@ -82,4 +82,12 @@ typedef enum
   GSD_XRANDR_BOOT_BEHAVIOUR_DOCK
 } GsdXrandrBootBehaviour;
 
+typedef enum
+{
+  GSD_WACOM_ROTATION_NONE,
+  GSD_WACOM_ROTATION_CW,
+  GSD_WACOM_ROTATION_CCW,
+  GSD_WACOM_ROTATION_HALF
+} GsdWacomRotation;
+
 #endif /* __gsd_enums_h__ */
diff --git a/data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in b/data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in
new file mode 100644
index 0000000..738b26a
--- /dev/null
+++ b/data/org.gnome.settings-daemon.peripherals.wacom.gschema.xml.in.in
@@ -0,0 +1,119 @@
+<schemalist>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.plugins.wacom" path="/org/gnome/settings-daemon/plugins/wacom/">
+    <key name="active" type="b">
+      <default>true</default>
+      <_summary>Activation of this plugin</_summary>
+      <_description>Whether this plugin would be activated by gnome-settings-daemon or not.</_description>
+    </key>
+    <key name="priority" type="i">
+      <default>6</default>
+      <_summary>Priority to use for this plugin</_summary>
+      <_description>Priority to use for this plugin in gnome-settings-daemon startup queue.</_description>
+    </key>
+  </schema>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals.wacom" path="/org/gnome/settings-daemon/peripherals/wacom/">
+    <child name="stylus" schema="org.gnome.settings-daemon.peripherals.wacom.stylus"/>
+    <child name="eraser" schema="org.gnome.settings-daemon.peripherals.wacom.eraser"/>
+    <child name="cursor" schema="org.gnome.settings-daemon.peripherals.wacom.cursor"/>
+    <child name="pad" schema="org.gnome.settings-daemon.peripherals.wacom.pad"/>
+
+    <key name="rotation" enum="org.gnome.settings-daemon.GsdWacomRotation">
+    <default>'none'</default>
+    <_summary>Wacom tablet rotation</_summary>
+    <_description>Set this to 'none', 'cw' for 90 degree clockwise, 'half' for 180 degree, and 'ccw' for 90 degree counterclockwise.</_description>
+    </key>
+    <key name="touch" type="b">
+      <default>false</default>
+      <_summary>Wacom touch feature</_summary>
+      <_description>Enable this to only move the cursor when the user touches the tablet.</_description>
+    </key>
+    <key name="tablet-pc-button" type="b">
+      <default>false</default>
+      <_summary>Wacom tablet PC feature</_summary>
+      <_description>Enable this to only report stylus events when the tip is pressed.</_description>
+    </key>
+  </schema>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals.wacom.stylus" path="/org/gnome/settings-daemon/peripherals/wacom/stylus/">
+    <key name="is-absolute" type="b">
+      <default>true</default>
+      <_summary>Wacom stylus absolute mode</_summary>
+      <_description>Enable this to set the stylus to absolute mode.</_description>
+    </key>
+    <key name="pressurecurve" type="ai">
+      <default>[0, 0, 100, 100]</default>
+      <_summary>Wacom stylus pressure curve</_summary>
+      <_description>Set this to x1, y1 and x2, y2 of the pressure curve applied to the stylus.</_description>
+    </key>
+    <key name="area" type="ai">
+      <default>[-1, -1, -1, -1]</default>
+      <_summary>Wacom stylus tablet area</_summary>
+      <_description>Set this to x1, y1 and x2, y2 of the area usable by the stylus.</_description>
+    </key>
+    <key name="buttonmapping" type="ai">
+      <default>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]</default>
+      <_summary>Wacom stylus button mapping</_summary>
+      <_description>Set this to the logical button mapping.</_description>
+    </key>
+    <key name="pressurethreshold" type="i">
+      <default>-1</default>
+      <_summary>Wacom stylus pressure threshold</_summary>
+      <_description>Set this to the pressure value at which a stylus click event is generated.</_description>
+    </key>
+  </schema>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals.wacom.eraser" path="/org/gnome/settings-daemon/peripherals/wacom/eraser/">
+    <key name="is-absolute" type="b">
+      <default>true</default>
+      <_summary>Wacom eraser absolute mode</_summary>
+      <_description>Enable this to set the eraser to absolute mode.</_description>
+    </key>
+    <key name="pressurecurve" type="ai">
+      <default>[0, 0, 100, 100]</default>
+      <_summary>Wacom eraser pressure curve</_summary>
+      <_description>Set this to x1, y1 and x2, y2 of the pressure curve applied to the eraser.</_description>
+    </key>
+    <key name="area" type="ai">
+      <default>[-1, -1, -1, -1]</default>
+      <_summary>Wacom eraser tablet area</_summary>
+      <_description>Set this to x1, y1 and x2, y2 of the area usable by the eraser.</_description>
+    </key>
+    <key name="buttonmapping" type="ai">
+      <default>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]</default>
+      <_summary>Wacom eraser button mapping</_summary>
+      <_description>Set this to the logical button mapping.</_description>
+    </key>
+    <key name="pressurethreshold" type="i">
+      <default>-1</default>
+      <_summary>Wacom eraser pressure threshold</_summary>
+      <_description>Set this to the pressure value at which an eraser click event is generated.</_description>
+    </key>
+  </schema>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals.wacom.cursor" path="/org/gnome/settings-daemon/peripherals/wacom/cursor/">
+    <key name="is-absolute" type="b">
+      <default>true</default>
+      <_summary>Wacom cursor absolute mode</_summary>
+      <_description>Enable this to set the cursor to absolute mode.</_description>
+    </key>
+    <key name="area" type="ai">
+      <default>[-1, -1, -1, -1]</default>
+      <_summary>Wacom cursor tablet area</_summary>
+      <_description>Set this to x1, y1 and x2, y2 of the area usable by the cursor.</_description>
+    </key>
+    <key name="buttonmapping" type="ai">
+      <default>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]</default>
+      <_summary>Wacom cursor button mapping</_summary>
+      <_description>Set this to the logical button mapping.</_description>
+    </key>
+  </schema>
+  <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.peripherals.wacom.pad" path="/org/gnome/settings-daemon/peripherals/wacom/pad/">
+    <key name="area" type="ai">
+      <default>[-1, -1, -1, -1]</default>
+      <_summary>Wacom pad tablet area</_summary>
+      <_description>Set this to x1, y1 and x2, y2 of the area usable by the pad.</_description>
+    </key>
+    <key name="buttonmapping" type="ai">
+      <default>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]</default>
+      <_summary>Wacom pad button mapping</_summary>
+      <_description>Set this to the logical button mapping.</_description>
+    </key>
+  </schema>
+</schemalist>
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 1132771..4d6381a 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -12,6 +12,7 @@ enabled_plugins =	\
 	media-keys	\
 	mouse		\
 	sound		\
+	wacom		\
 	xrandr		\
 	xsettings	\
 	$(NULL)
diff --git a/plugins/wacom/Makefile.am b/plugins/wacom/Makefile.am
new file mode 100644
index 0000000..445f986
--- /dev/null
+++ b/plugins/wacom/Makefile.am
@@ -0,0 +1,38 @@
+plugin_LTLIBRARIES = libwacom.la
+
+libwacom_la_SOURCES = 		\
+	gsd-wacom-plugin.h	\
+	gsd-wacom-plugin.c	\
+	gsd-wacom-manager.h	\
+	gsd-wacom-manager.c
+
+libwacom_la_CPPFLAGS = \
+	-I$(top_srcdir)/gnome-settings-daemon		\
+	-I$(top_srcdir)/plugins/common/			\
+	-I$(top_srcdir)/data/				\
+	-DGNOME_SETTINGS_LOCALEDIR=\""$(datadir)/locale"\" \
+	-DLIBEXECDIR=\""$(libexecdir)"\" 		\
+	$(AM_CPPFLAGS)
+
+libwacom_la_CFLAGS = \
+	$(SETTINGS_PLUGIN_CFLAGS)	\
+	$(AM_CFLAGS)
+
+libwacom_la_LDFLAGS = 		\
+	$(GSD_PLUGIN_LDFLAGS)
+
+libwacom_la_LIBADD  = 							\
+	$(top_builddir)/plugins/common/libcommon.la			\
+	$(SETTINGS_PLUGIN_LIBS)						\
+	$(X11_LIBS)							\
+	$(XINPUT_LIBS)
+
+plugin_in_files = wacom.gnome-settings-plugin.in
+
+plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin)
+
+EXTRA_DIST = $(plugin_in_files)
+CLEANFILES = $(plugin_DATA)
+DISTCLEANFILES = $(plugin_DATA)
+
+ GSD_INTLTOOL_PLUGIN_RULE@
diff --git a/plugins/wacom/gsd-wacom-manager.c b/plugins/wacom/gsd-wacom-manager.c
new file mode 100644
index 0000000..826895f
--- /dev/null
+++ b/plugins/wacom/gsd-wacom-manager.c
@@ -0,0 +1,685 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann jhu edu>
+ * Copyright (C) 2010 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#include <locale.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+#include <X11/Xatom.h>
+
+#include <X11/extensions/XInput.h>
+
+#include "gsd-enums.h"
+#include "gnome-settings-profile.h"
+#include "gsd-wacom-manager.h"
+
+/* Maximum number of buttons map-able. */
+#define WACOM_MAX_BUTTONS 32
+/* Device types to apply a setting to */
+#define WACOM_TYPE_STYLUS       (1 << 1)
+#define WACOM_TYPE_ERASER       (1 << 2)
+#define WACOM_TYPE_CURSOR       (1 << 3)
+#define WACOM_TYPE_PAD          (1 << 4)
+#define WACOM_TYPE_ALL          WACOM_TYPE_STYLUS | WACOM_TYPE_ERASER | WACOM_TYPE_CURSOR | WACOM_TYPE_PAD
+
+#define GSD_WACOM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_WACOM_MANAGER, GsdWacomManagerPrivate))
+
+/* we support two types of settings:
+ * Tablet-wide settings: applied to each tool on the tablet. e.g. rotation
+ * Tool-specific settings: applied to one tool only.
+ */
+#define SETTINGS_WACOM_DIR         "org.gnome.settings-daemon.peripherals.wacom"
+#define SETTINGS_STYLUS_DIR        SETTINGS_WACOM_DIR ".stylus"
+#define SETTINGS_CURSOR_DIR        SETTINGS_WACOM_DIR ".cursor"
+#define SETTINGS_ERASER_DIR        SETTINGS_WACOM_DIR ".eraser"
+#define SETTINGS_PAD_DIR           SETTINGS_WACOM_DIR ".pad"
+
+#define KEY_ROTATION            "rotation"
+#define KEY_TOUCH               "touch"
+#define KEY_TPCBUTTON           "tablet-pc-button"
+#define KEY_PRESSURECURVE       "pressurecurve"
+#define KEY_IS_ABSOLUTE         "is-absolute"
+#define KEY_AREA                "area"
+#define KEY_BUTTONS             "buttonmapping"
+#define KEY_PRESSURETHRESHOLD   "pressurethreshold"
+
+struct GsdWacomManagerPrivate
+{
+        GSettings *wacom_settings;
+        GSettings *stylus_settings;
+        GSettings *eraser_settings;
+        GSettings *cursor_settings;
+        GSettings *pad_settings;
+        GdkDeviceManager *device_manager;
+};
+
+static void     gsd_wacom_manager_class_init  (GsdWacomManagerClass *klass);
+static void     gsd_wacom_manager_init        (GsdWacomManager      *wacom_manager);
+static void     gsd_wacom_manager_finalize    (GObject              *object);
+static void     set_wacom_settings            (GsdWacomManager      *manager);
+static XDevice* device_is_wacom               (const gint            type,
+                                               const XDeviceInfo deviceinfo);
+
+G_DEFINE_TYPE (GsdWacomManager, gsd_wacom_manager, G_TYPE_OBJECT)
+
+static gpointer manager_object = NULL;
+
+static void
+gsd_wacom_manager_set_property (GObject        *object,
+                                guint           prop_id,
+                                const GValue   *value,
+                                GParamSpec     *pspec)
+{
+        GsdWacomManager *self;
+
+        self = GSD_WACOM_MANAGER (object);
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+}
+
+static void
+gsd_wacom_manager_get_property (GObject        *object,
+                               guint            prop_id,
+                               GValue          *value,
+                               GParamSpec      *pspec)
+{
+        GsdWacomManager *self;
+
+        self = GSD_WACOM_MANAGER (object);
+
+        switch (prop_id) {
+        default:
+                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                break;
+        }
+}
+
+static GObject *
+gsd_wacom_manager_constructor (GType                     type,
+                              guint                      n_construct_properties,
+                              GObjectConstructParam     *construct_properties)
+{
+        GsdWacomManager      *wacom_manager;
+        GsdWacomManagerClass *klass;
+
+        klass = GSD_WACOM_MANAGER_CLASS (g_type_class_peek (GSD_TYPE_WACOM_MANAGER));
+
+        wacom_manager = GSD_WACOM_MANAGER (G_OBJECT_CLASS (gsd_wacom_manager_parent_class)->constructor (type,
+                                                                                                         n_construct_properties,
+                                                                                                         construct_properties));
+
+        return G_OBJECT (wacom_manager);
+}
+
+static void
+gsd_wacom_manager_dispose (GObject *object)
+{
+        GsdWacomManager *wacom_manager;
+
+        wacom_manager = GSD_WACOM_MANAGER (object);
+
+        G_OBJECT_CLASS (gsd_wacom_manager_parent_class)->dispose (object);
+}
+
+static void
+gsd_wacom_manager_class_init (GsdWacomManagerClass *klass)
+{
+        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
+
+        object_class->get_property = gsd_wacom_manager_get_property;
+        object_class->set_property = gsd_wacom_manager_set_property;
+        object_class->constructor = gsd_wacom_manager_constructor;
+        object_class->dispose = gsd_wacom_manager_dispose;
+        object_class->finalize = gsd_wacom_manager_finalize;
+
+        g_type_class_add_private (klass, sizeof (GsdWacomManagerPrivate));
+}
+
+static void
+device_added_cb (GdkDeviceManager *device_manager,
+                 GdkDevice        *device,
+                 gpointer          user_data)
+{
+        set_wacom_settings ((GsdWacomManager *) user_data);
+}
+
+static void
+set_devicepresence_handler (GsdWacomManager *manager)
+{
+        GdkDeviceManager *device_manager;
+
+        device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
+        if (device_manager == NULL)
+                return;
+
+        g_signal_connect (G_OBJECT (device_manager), "device-added",
+                          G_CALLBACK (device_added_cb), manager);
+        manager->priv->device_manager = device_manager;
+}
+
+static gboolean
+device_is_type (const gint type,
+                const XDeviceInfo *dev)
+{
+        static Atom stylus, cursor, eraser, pad;
+
+        if (!stylus)
+                stylus = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "STYLUS", False);
+        if (!eraser)
+                eraser = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "ERASER", False);
+        if (!cursor)
+                cursor = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "CURSOR", False);
+        if (!pad)
+                pad = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "PAD", False);
+
+        if ((type & WACOM_TYPE_STYLUS) && dev->type == stylus)
+                return TRUE;
+
+        if ((type & WACOM_TYPE_ERASER) && dev->type == eraser)
+                return TRUE;
+
+        if ((type & WACOM_TYPE_CURSOR) && dev->type == cursor)
+                return TRUE;
+
+        if ((type & WACOM_TYPE_PAD) && dev->type == pad)
+                return TRUE;
+
+         return FALSE;
+}
+
+static XDevice*
+device_is_wacom (const gint type,
+                 const XDeviceInfo deviceinfo)
+{
+        XDevice *device;
+        Atom realtype, prop;
+        int realformat;
+        unsigned long nitems, bytes_after;
+        unsigned char *data = NULL;
+        int rc;
+
+        if ((deviceinfo.use == IsXPointer) || (deviceinfo.use == IsXKeyboard))
+                return NULL;
+
+        if (!device_is_type (type, &deviceinfo))
+                return NULL;
+
+        /* There is currently no good way of detecting the driver for a device
+         * other than checking for a driver-specific property.
+         * Wacom Tool Type exists on all tools
+         */ 
+        prop = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), "Wacom Tool Type", False);
+        if (!prop)
+                return NULL;
+
+        gdk_error_trap_push ();
+        device = XOpenDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), deviceinfo.id);
+        if (gdk_error_trap_pop () || (device == NULL))
+                return NULL;
+
+        gdk_error_trap_push ();
+
+        rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+                                 device, prop, 0, 1, False,
+                                 XA_ATOM, &realtype, &realformat, &nitems,
+                                 &bytes_after, &data);
+        if (gdk_error_trap_pop () || rc != Success || realtype == None) {
+                XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
+                device = NULL;
+        }
+
+        XFree (data);
+        return device;
+}
+
+/* Generic property setting code. Fill up the struct property with the property
+ * data and pass it into device_set_property together with the device to be
+ * changed.  Note: doesn't cater for non-zero offsets yet, but we don't have
+ * any settings that require that.
+ */
+struct property {
+        const gchar *name;      /* property name */
+        gint nitems;            /* number of items in data */
+        gint format;            /* 8 or 32 */
+        union {
+                const gchar *c; /* 8 bit data */
+                const gint *i;  /* 32 bit data */
+        } data;
+};
+
+static void
+device_set_property (XDevice            *device,
+                     const char         *device_name,
+                     struct property    *property)
+{
+        int rc;
+        Atom prop;
+        Atom realtype;
+        int realformat;
+        unsigned long nitems, bytes_after;
+        unsigned char *data;
+
+        prop = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+                            property->name, False);
+        if (!prop)
+                return;
+
+        gdk_error_trap_push ();
+
+        rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+                                 device, prop, 0, property->nitems, False,
+                                 XA_INTEGER, &realtype, &realformat, &nitems,
+                                 &bytes_after, &data);
+
+        if (rc == Success && realtype == XA_INTEGER &&
+            realformat == property->format && nitems >= property->nitems) {
+                int i;
+                for (i = 0; i < nitems; i++) {
+                        switch (property->format) {
+                                case 8:
+                                        data[i] = property->data.c[i];
+                                        break;
+                                case 32:
+                                        ((long*)data)[i] = property->data.i[i];
+                                        break;
+                        }
+                }
+
+                XChangeDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+                                       device, prop, XA_INTEGER, realformat,
+                                       PropModeReplace, data, nitems);
+        }
+
+        if (gdk_error_trap_pop ())
+                g_warning ("Error in setting \"%s\" for \"%s\"", property->name, device_name);
+}
+
+static void
+wacom_set_property (gint wacom_type,
+                    struct property *property)
+{
+        XDeviceInfo *device_info;
+        gint n_devices;
+        gint i;
+
+        device_info = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &n_devices);
+
+        for (i = 0; i < n_devices; i++) {
+                XDevice *device = NULL;
+
+                device = device_is_wacom (wacom_type, device_info[i]);
+                if (device == NULL)
+                        continue;
+
+                device_set_property (device, device_info[i].name, property);
+
+                XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
+        }
+
+        if (device_info != NULL)
+                XFreeDeviceList (device_info);
+}
+
+static void
+set_rotation (GsdWacomRotation rotation)
+{
+        gchar rot = rotation;
+        struct property property = {
+                .name = "Wacom Rotation",
+                .nitems = 1,
+                .format = 8,
+                .data.c = &rot,
+        };
+
+        wacom_set_property (WACOM_TYPE_ALL, &property);
+}
+
+static void
+set_pressurecurve (const gint    wacom_type,
+                   GVariant      *value)
+{
+        struct property property = {
+                .name = "Wacom Pressurecurve",
+                .nitems = 4,
+                .format = 32,
+        };
+        gsize nvalues;
+
+        property.data.i = g_variant_get_fixed_array (value, &nvalues, sizeof (gint32));
+
+        if (nvalues != 4) {
+                g_error ("Pressurecurve requires 4 values.");
+                return;
+        }
+
+        wacom_set_property (wacom_type, &property);
+}
+
+/* Area handling. Each area is defined as top x/y, bottom x/y and limits the
+ * usable area of the physical device to the given area (in device coords)
+ */
+static void
+set_area (const gint      wacom_type,
+          GVariant        *value)
+{
+        struct property property = {
+                .name = "Wacom Tablet Area",
+                .nitems = 4,
+                .format = 32,
+        };
+        gsize nvalues;
+
+        property.data.i = g_variant_get_fixed_array (value, &nvalues, sizeof (gint32));
+
+        if (nvalues != 4) {
+                g_error ("Area configuration requires 4 values.");
+                return;
+        }
+
+        wacom_set_property (wacom_type, &property);
+}
+
+static void
+set_absolute (const gint wacom_type, gint is_absolute)
+{
+        XDeviceInfo *device_info;
+        gint n_devices;
+        gint i;
+
+        device_info = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &n_devices);
+
+        for (i = 0; i < n_devices; i++) {
+                XDevice *device = NULL;
+
+                device = device_is_wacom (wacom_type, device_info[i]);
+                if (device == NULL)
+                        continue;
+
+                gdk_error_trap_push ();
+                XSetDeviceMode (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, is_absolute ? Absolute : Relative);
+                if (gdk_error_trap_pop ())
+                        g_error ("Failed to set mode \"%s\" for \"%s\".",
+                                 is_absolute ? "Absolute" : "Relative", device_info[i].name);
+
+                XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
+        }
+
+        if (device_info != NULL)
+                XFreeDeviceList (device_info);
+}
+
+static void
+set_device_buttonmap (gint wacom_type,
+                      GVariant *value)
+{
+        XDeviceInfo *device_info;
+        gint n_devices;
+        gint i;
+        gsize nmap;
+        const gint *intmap;
+        unsigned char map[WACOM_MAX_BUTTONS] = {};
+
+        intmap = g_variant_get_fixed_array (value, &nmap, sizeof (gint32));
+        for (i = 0; i < nmap && i < sizeof (map); i++)
+                map[i] = intmap[i];
+
+        device_info = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &n_devices);
+
+        for (i = 0; i < n_devices; i++) {
+                XDevice *device = NULL;
+                int rc, j;
+
+                device = device_is_wacom (wacom_type, device_info[i]);
+                if (device == NULL)
+                        continue;
+
+                gdk_error_trap_push ();
+
+                /* X refuses to change the mapping while buttons are engaged,
+                 * so if this is the case we'll retry a few times
+                 */
+                for (j = 0;
+                     j < 20 && (rc = XSetDeviceButtonMapping (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, map, nmap)) == MappingBusy;
+                     ++j) {
+                        g_usleep (300);
+                }
+
+                if (gdk_error_trap_pop () || rc != Success)
+                        g_warning ("Error in setting button mapping for \"%s\"", device_info->name);
+
+                XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device);
+        }
+
+        if (device_info != NULL)
+                XFreeDeviceList (device_info);
+}
+
+static void
+set_touch (gboolean touch)
+{
+        gchar data = touch;
+        struct property property = {
+                .name = "Wacom Enable Touch",
+                .nitems = 1,
+                .format = 8,
+                .data.c = &data,
+        };
+
+        wacom_set_property (WACOM_TYPE_ALL, &property);
+}
+
+static void
+set_tpcbutton (gboolean tpcbutton)
+{
+        gchar data = tpcbutton;
+        struct property property = {
+                .name = "Wacom Hover Click",
+                .nitems = 1,
+                .format = 8,
+                .data.c = &data,
+        };
+
+        wacom_set_property (WACOM_TYPE_ALL, &property);
+}
+
+static void
+set_pressurethreshold (const gint wacom_type, gint threshold)
+{
+        struct property property = {
+                .name = "Wacom Pressure Threshold",
+                .nitems = 1,
+                .format = 32,
+                .data.i = &threshold,
+        };
+
+        wacom_set_property (wacom_type, &property);
+}
+
+static void
+set_wacom_settings (GsdWacomManager *manager)
+{
+        set_rotation (g_settings_get_enum (manager->priv->wacom_settings, KEY_ROTATION));
+        set_touch (g_settings_get_boolean (manager->priv->wacom_settings, KEY_TOUCH));
+        set_tpcbutton (g_settings_get_boolean (manager->priv->wacom_settings, KEY_TPCBUTTON));
+
+        /* only pen and eraser have pressure threshold and curve settings */
+        set_pressurecurve (WACOM_TYPE_STYLUS,
+                           g_settings_get_value (manager->priv->stylus_settings, KEY_PRESSURECURVE));
+        set_pressurecurve (WACOM_TYPE_ERASER,
+                           g_settings_get_value (manager->priv->eraser_settings, KEY_PRESSURECURVE));
+        set_pressurethreshold (WACOM_TYPE_STYLUS,
+                               g_settings_get_int (manager->priv->stylus_settings, KEY_PRESSURETHRESHOLD));
+        set_pressurethreshold (WACOM_TYPE_ERASER,
+                               g_settings_get_int (manager->priv->eraser_settings, KEY_PRESSURETHRESHOLD));
+
+        set_absolute (WACOM_TYPE_STYLUS,
+                      g_settings_get_boolean (manager->priv->stylus_settings, KEY_IS_ABSOLUTE));
+        set_absolute (WACOM_TYPE_ERASER,
+                      g_settings_get_boolean (manager->priv->eraser_settings, KEY_IS_ABSOLUTE));
+        set_absolute (WACOM_TYPE_CURSOR,
+                      g_settings_get_boolean (manager->priv->cursor_settings, KEY_IS_ABSOLUTE));
+        /* pad can't be set to absolute */
+
+        set_area (WACOM_TYPE_STYLUS,
+                  g_settings_get_value (manager->priv->stylus_settings, KEY_AREA));
+        set_area (WACOM_TYPE_ERASER,
+                  g_settings_get_value (manager->priv->eraser_settings, KEY_AREA));
+        set_area (WACOM_TYPE_CURSOR,
+                  g_settings_get_value (manager->priv->cursor_settings, KEY_AREA));
+        /* pad has no area */
+
+        set_device_buttonmap (WACOM_TYPE_STYLUS,
+                              g_settings_get_value (manager->priv->stylus_settings, KEY_BUTTONS));
+        set_device_buttonmap (WACOM_TYPE_ERASER,
+                              g_settings_get_value (manager->priv->eraser_settings, KEY_BUTTONS));
+        set_device_buttonmap (WACOM_TYPE_PAD,
+                              g_settings_get_value (manager->priv->pad_settings, KEY_BUTTONS));
+        set_device_buttonmap (WACOM_TYPE_CURSOR,
+                              g_settings_get_value (manager->priv->cursor_settings, KEY_BUTTONS));
+}
+
+static void
+wacom_callback (GSettings          *settings,
+                const gchar        *key,
+                GsdWacomManager    *manager)
+{
+        set_wacom_settings (manager);
+}
+
+static void
+gsd_wacom_manager_init (GsdWacomManager *manager)
+{
+        manager->priv = GSD_WACOM_MANAGER_GET_PRIVATE (manager);
+}
+
+static gboolean
+gsd_wacom_manager_idle_cb (GsdWacomManager *manager)
+{
+        gnome_settings_profile_start (NULL);
+
+        manager->priv->wacom_settings = g_settings_new (SETTINGS_WACOM_DIR);
+        g_signal_connect (manager->priv->wacom_settings, "changed",
+                          G_CALLBACK (wacom_callback), manager);
+
+        manager->priv->stylus_settings = g_settings_new (SETTINGS_STYLUS_DIR);
+        g_signal_connect (manager->priv->stylus_settings, "changed",
+                          G_CALLBACK (wacom_callback), manager);
+
+        manager->priv->eraser_settings = g_settings_new (SETTINGS_ERASER_DIR);
+        g_signal_connect (manager->priv->eraser_settings, "changed",
+                          G_CALLBACK (wacom_callback), manager);
+
+        manager->priv->cursor_settings = g_settings_new (SETTINGS_CURSOR_DIR);
+        g_signal_connect (manager->priv->cursor_settings, "changed",
+                          G_CALLBACK (wacom_callback), manager);
+
+        manager->priv->pad_settings = g_settings_new (SETTINGS_PAD_DIR);
+        g_signal_connect (manager->priv->pad_settings, "changed",
+                          G_CALLBACK (wacom_callback), manager);
+
+        set_devicepresence_handler (manager);
+        set_wacom_settings (manager);
+
+        gnome_settings_profile_end (NULL);
+
+        return FALSE;
+}
+
+gboolean
+gsd_wacom_manager_start (GsdWacomManager *manager,
+                         GError         **error)
+{
+        gnome_settings_profile_start (NULL);
+
+        g_idle_add ((GSourceFunc) gsd_wacom_manager_idle_cb, manager);
+
+        gnome_settings_profile_end (NULL);
+
+        return TRUE;
+}
+
+void
+gsd_wacom_manager_stop (GsdWacomManager *manager)
+{
+        GsdWacomManagerPrivate *p = manager->priv;
+
+        g_debug ("Stopping wacom manager");
+
+        if (p->device_manager != NULL) {
+                g_object_unref (p->device_manager);
+                p->device_manager = NULL;
+        }
+
+        g_object_unref (p->wacom_settings);
+        p->wacom_settings = NULL;
+
+        g_object_unref (p->stylus_settings);
+        p->stylus_settings = NULL;
+
+        g_object_unref (p->eraser_settings);
+        p->eraser_settings = NULL;
+
+        g_object_unref (p->cursor_settings);
+        p->cursor_settings = NULL;
+
+        g_object_unref (p->pad_settings);
+        p->pad_settings = NULL;
+}
+
+static void
+gsd_wacom_manager_finalize (GObject *object)
+{
+        GsdWacomManager *wacom_manager;
+
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GSD_IS_WACOM_MANAGER (object));
+
+        wacom_manager = GSD_WACOM_MANAGER (object);
+
+        g_return_if_fail (wacom_manager->priv != NULL);
+
+        G_OBJECT_CLASS (gsd_wacom_manager_parent_class)->finalize (object);
+}
+
+GsdWacomManager *
+gsd_wacom_manager_new (void)
+{
+        if (manager_object != NULL) {
+                g_object_ref (manager_object);
+        } else {
+                manager_object = g_object_new (GSD_TYPE_WACOM_MANAGER, NULL);
+                g_object_add_weak_pointer (manager_object,
+                                           (gpointer *) &manager_object);
+        }
+
+        return GSD_WACOM_MANAGER (manager_object);
+}
diff --git a/plugins/wacom/gsd-wacom-manager.h b/plugins/wacom/gsd-wacom-manager.h
new file mode 100644
index 0000000..2aba48a
--- /dev/null
+++ b/plugins/wacom/gsd-wacom-manager.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann jhu edu>
+ * Copyright (C) 2010 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __GSD_WACOM_MANAGER_H
+#define __GSD_WACOM_MANAGER_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define GSD_TYPE_WACOM_MANAGER         (gsd_wacom_manager_get_type ())
+#define GSD_WACOM_MANAGER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_WACOM_MANAGER, GsdWacomManager))
+#define GSD_WACOM_MANAGER_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), GSD_TYPE_WACOM_MANAGER, GsdWacomManagerClass))
+#define GSD_IS_WACOM_MANAGER(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_WACOM_MANAGER))
+#define GSD_IS_WACOM_MANAGER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_WACOM_MANAGER))
+#define GSD_WACOM_MANAGER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_WACOM_MANAGER, GsdWacomManagerClass))
+
+typedef struct GsdWacomManagerPrivate GsdWacomManagerPrivate;
+
+typedef struct
+{
+        GObject                     parent;
+        GsdWacomManagerPrivate *priv;
+} GsdWacomManager;
+
+typedef struct
+{
+        GObjectClass   parent_class;
+} GsdWacomManagerClass;
+
+GType                   gsd_wacom_manager_get_type            (void);
+
+GsdWacomManager *       gsd_wacom_manager_new                 (void);
+gboolean                gsd_wacom_manager_start               (GsdWacomManager *manager,
+                                                               GError         **error);
+void                    gsd_wacom_manager_stop                (GsdWacomManager *manager);
+
+G_END_DECLS
+
+#endif /* __GSD_WACOM_MANAGER_H */
diff --git a/plugins/wacom/gsd-wacom-plugin.c b/plugins/wacom/gsd-wacom-plugin.c
new file mode 100644
index 0000000..835c6cd
--- /dev/null
+++ b/plugins/wacom/gsd-wacom-plugin.c
@@ -0,0 +1,111 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann jhu edu>
+ * Copyright (C) 2010 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <glib/gi18n-lib.h>
+#include <gmodule.h>
+
+#include "gnome-settings-plugin.h"
+#include "gsd-wacom-plugin.h"
+#include "gsd-wacom-manager.h"
+
+struct GsdWacomPluginPrivate {
+        GsdWacomManager *manager;
+};
+
+#define GSD_WACOM_PLUGIN_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), GSD_TYPE_WACOM_PLUGIN, GsdWacomPluginPrivate))
+
+GNOME_SETTINGS_PLUGIN_REGISTER (GsdWacomPlugin, gsd_wacom_plugin)
+
+static void
+gsd_wacom_plugin_init (GsdWacomPlugin *plugin)
+{
+        plugin->priv = GSD_WACOM_PLUGIN_GET_PRIVATE (plugin);
+
+        g_debug ("GsdWacomPlugin initializing");
+
+        plugin->priv->manager = gsd_wacom_manager_new ();
+}
+
+static void
+gsd_wacom_plugin_finalize (GObject *object)
+{
+        GsdWacomPlugin *plugin;
+
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GSD_IS_WACOM_PLUGIN (object));
+
+        g_debug ("GsdWacomPlugin finalizing");
+
+        plugin = GSD_WACOM_PLUGIN (object);
+
+        g_return_if_fail (plugin->priv != NULL);
+
+        if (plugin->priv->manager != NULL) {
+                g_object_unref (plugin->priv->manager);
+        }
+
+        G_OBJECT_CLASS (gsd_wacom_plugin_parent_class)->finalize (object);
+}
+
+static void
+impl_activate (GnomeSettingsPlugin *plugin)
+{
+        gboolean res;
+        GError  *error;
+
+        g_debug ("Activating wacom plugin");
+
+        error = NULL;
+        res = gsd_wacom_manager_start (GSD_WACOM_PLUGIN (plugin)->priv->manager, &error);
+        if (! res) {
+                g_warning ("Unable to start wacom manager: %s", error->message);
+                g_error_free (error);
+        }
+}
+
+static void
+impl_deactivate (GnomeSettingsPlugin *plugin)
+{
+        g_debug ("Deactivating wacom plugin");
+        gsd_wacom_manager_stop (GSD_WACOM_PLUGIN (plugin)->priv->manager);
+}
+
+static void
+gsd_wacom_plugin_class_init (GsdWacomPluginClass *klass)
+{
+        GObjectClass           *object_class = G_OBJECT_CLASS (klass);
+        GnomeSettingsPluginClass *plugin_class = GNOME_SETTINGS_PLUGIN_CLASS (klass);
+
+        object_class->finalize = gsd_wacom_plugin_finalize;
+
+        plugin_class->activate = impl_activate;
+        plugin_class->deactivate = impl_deactivate;
+
+        g_type_class_add_private (klass, sizeof (GsdWacomPluginPrivate));
+}
+
+static void
+gsd_wacom_plugin_class_finalize (GsdWacomPluginClass *klass)
+{
+}
+
diff --git a/plugins/wacom/gsd-wacom-plugin.h b/plugins/wacom/gsd-wacom-plugin.h
new file mode 100644
index 0000000..2669411
--- /dev/null
+++ b/plugins/wacom/gsd-wacom-plugin.h
@@ -0,0 +1,60 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2007 William Jon McCann <mccann jhu edu>
+ * Copyright (C) 2010 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __GSD_WACOM_PLUGIN_H__
+#define __GSD_WACOM_PLUGIN_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gmodule.h>
+
+#include "gnome-settings-plugin.h"
+
+G_BEGIN_DECLS
+
+#define GSD_TYPE_WACOM_PLUGIN                (gsd_wacom_plugin_get_type ())
+#define GSD_WACOM_PLUGIN(o)                  (G_TYPE_CHECK_INSTANCE_CAST ((o), GSD_TYPE_WACOM_PLUGIN, GsdWacomPlugin))
+#define GSD_WACOM_PLUGIN_CLASS(k)            (G_TYPE_CHECK_CLASS_CAST((k), GSD_TYPE_WACOM_PLUGIN, GsdWacomPluginClass))
+#define GSD_IS_WACOM_PLUGIN(o)               (G_TYPE_CHECK_INSTANCE_TYPE ((o), GSD_TYPE_WACOM_PLUGIN))
+#define GSD_IS_WACOM_PLUGIN_CLASS(k)         (G_TYPE_CHECK_CLASS_TYPE ((k), GSD_TYPE_WACOM_PLUGIN))
+#define GSD_WACOM_PLUGIN_GET_CLASS(o)        (G_TYPE_INSTANCE_GET_CLASS ((o), GSD_TYPE_WACOM_PLUGIN, GsdWacomPluginClass))
+
+typedef struct GsdWacomPluginPrivate GsdWacomPluginPrivate;
+
+typedef struct
+{
+        GnomeSettingsPlugin    parent;
+        GsdWacomPluginPrivate *priv;
+} GsdWacomPlugin;
+
+typedef struct
+{
+        GnomeSettingsPluginClass parent_class;
+} GsdWacomPluginClass;
+
+GType   gsd_wacom_plugin_get_type            (void) G_GNUC_CONST;
+
+/* All the plugins must implement this function */
+G_MODULE_EXPORT GType register_gnome_settings_plugin (GTypeModule *module);
+
+G_END_DECLS
+
+#endif /* __GSD_WACOM_PLUGIN_H__ */
diff --git a/plugins/wacom/wacom.gnome-settings-plugin.in b/plugins/wacom/wacom.gnome-settings-plugin.in
new file mode 100644
index 0000000..768360f
--- /dev/null
+++ b/plugins/wacom/wacom.gnome-settings-plugin.in
@@ -0,0 +1,8 @@
+[GNOME Settings Plugin]
+Module=wacom
+IAge=0
+_Name=Wacom
+_Description=Wacom plugin
+Authors=Peter Hutterer
+Copyright=Copyright © 2010
+Website=



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