summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Volkov <pva@gentoo.org>2010-11-10 12:33:38 +0000
committerPeter Volkov <pva@gentoo.org>2010-11-10 12:33:38 +0000
commit47503552c95ea2228ca14ffb1ff9085961ea20ff (patch)
tree3f09d408bd8a05db0fa984f8e53e7132afd49fb3 /gnome-extra/gpointing-device-settings
parentAdded version 0.35 (diff)
downloadgentoo-2-47503552c95ea2228ca14ffb1ff9085961ea20ff.tar.gz
gentoo-2-47503552c95ea2228ca14ffb1ff9085961ea20ff.tar.bz2
gentoo-2-47503552c95ea2228ca14ffb1ff9085961ea20ff.zip
Fix gtk22 build issue, bug #339198, thank Diego Elio Pettenò for report and Alexandre Rostovtsev for fix. Added upstream patchs to fix crash and to preserve state on reboot.
(Portage version: 2.1.9.24/cvs/Linux x86_64)
Diffstat (limited to 'gnome-extra/gpointing-device-settings')
-rw-r--r--gnome-extra/gpointing-device-settings/ChangeLog14
-rw-r--r--gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-crash.patch30
-rw-r--r--gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-gtk22.patch201
-rw-r--r--gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-plugin.patch107
-rw-r--r--gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-reboot.patch266
-rw-r--r--gnome-extra/gpointing-device-settings/gpointing-device-settings-1.5.1-r1.ebuild49
6 files changed, 666 insertions, 1 deletions
diff --git a/gnome-extra/gpointing-device-settings/ChangeLog b/gnome-extra/gpointing-device-settings/ChangeLog
index 277a1016dea6..e0edce7a4383 100644
--- a/gnome-extra/gpointing-device-settings/ChangeLog
+++ b/gnome-extra/gpointing-device-settings/ChangeLog
@@ -1,6 +1,18 @@
# ChangeLog for gnome-extra/gpointing-device-settings
# Copyright 1999-2010 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/gnome-extra/gpointing-device-settings/ChangeLog,v 1.7 2010/06/13 16:40:52 phajdan.jr Exp $
+# $Header: /var/cvsroot/gentoo-x86/gnome-extra/gpointing-device-settings/ChangeLog,v 1.8 2010/11/10 12:33:38 pva Exp $
+
+*gpointing-device-settings-1.5.1-r1 (10 Nov 2010)
+
+ 10 Nov 2010; Peter Volkov <pva@gentoo.org>
+ +gpointing-device-settings-1.5.1-r1.ebuild,
+ +files/gpointing-device-settings-1.5.1-crash.patch,
+ +files/gpointing-device-settings-1.5.1-gtk22.patch,
+ +files/gpointing-device-settings-1.5.1-plugin.patch,
+ +files/gpointing-device-settings-1.5.1-reboot.patch:
+ Fix gtk22 build issue, bug #339198, thank Diego Elio Pettenò for report
+ and Alexandre Rostovtsev for fix. Added upstream patchs to fix crash and
+ to preserve state on reboot.
13 Jun 2010; Pawel Hajdan jr <phajdan.jr@gentoo.org>
gpointing-device-settings-1.5.1.ebuild:
diff --git a/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-crash.patch b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-crash.patch
new file mode 100644
index 000000000000..789925c0bc97
--- /dev/null
+++ b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-crash.patch
@@ -0,0 +1,30 @@
+commit 70add06dec8413965f3e98b6ba9a3c82168ea72c
+Author: Hiroyuki Ikezoe <poincare@ikezoe.net>
+Date: Tue Mar 16 19:56:17 2010 +0900
+
+ Fix crash.
+
+ We need to get xinput property if there is no gconf value for tapping time.
+
+ Fix for #613022.
+
+diff --git a/modules/gpds-touchpad-ui.c b/modules/gpds-touchpad-ui.c
+index 3bbcda6..a1cd31b 100644
+--- a/modules/gpds-touchpad-ui.c
++++ b/modules/gpds-touchpad-ui.c
+@@ -1067,8 +1067,14 @@ set_tapping_time_from_preference (GpdsUI *ui, GtkBuilder *builder)
+ }
+ }
+
+- if (!gpds_ui_get_gconf_int(ui, GPDS_TOUCHPAD_TAP_TIME_KEY, &value))
++ if (!gpds_ui_get_gconf_int(ui, GPDS_TOUCHPAD_TAP_TIME_KEY, &value) && !values) {
++ if (!gpds_xinput_ui_get_xinput_int_property(GPDS_XINPUT_UI(ui),
++ GPDS_TOUCHPAD_TAP_TIME,
++ &values, &n_values)) {
++ return;
++ }
+ value = values[0];
++ }
+
+ double_value = value;
+ object = gpds_ui_get_ui_object_by_name(GPDS_UI(ui), "tapping_time_scale");
diff --git a/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-gtk22.patch b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-gtk22.patch
new file mode 100644
index 000000000000..154c54728540
--- /dev/null
+++ b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-gtk22.patch
@@ -0,0 +1,201 @@
+diff --git a/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c b/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
+index 8a2d98f..ac0bcf1 100644
+--- a/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
++++ b/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
+@@ -124,7 +124,9 @@ add_device_presence_filter (GsdPointingDevicePlugin *plugin)
+
+ gint op_code, event, error;
+
+- if (!XQueryExtension(GDK_DISPLAY(),
++ display = gdk_x11_get_default_xdisplay();
++
++ if (!XQueryExtension(display,
+ "XInputExtension",
+ &op_code,
+ &event,
+@@ -132,8 +134,6 @@ add_device_presence_filter (GsdPointingDevicePlugin *plugin)
+ return;
+ }
+
+- display = gdk_x11_get_default_xdisplay();
+-
+ gdk_error_trap_push();
+ DevicePresence(display, xi_presence, class_presence);
+ XSelectExtensionEvent(display,
+diff --git a/modules/gnome-settings-daemon-plugins/gsd-touchpad-manager.c b/modules/gnome-settings-daemon-plugins/gsd-touchpad-manager.c
+index 2038d53..f47e0a4 100644
+--- a/modules/gnome-settings-daemon-plugins/gsd-touchpad-manager.c
++++ b/modules/gnome-settings-daemon-plugins/gsd-touchpad-manager.c
+@@ -348,7 +348,9 @@ add_device_presence_filter (GsdPointingDeviceManager *manager)
+
+ gint op_code, event, error;
+
+- if (!XQueryExtension(GDK_DISPLAY(),
++ display = gdk_x11_get_default_xdisplay();
++
++ if (!XQueryExtension(display,
+ "XInputExtension",
+ &op_code,
+ &event,
+@@ -356,8 +358,6 @@ add_device_presence_filter (GsdPointingDeviceManager *manager)
+ return;
+ }
+
+- display = gdk_x11_get_default_xdisplay();
+-
+ gdk_error_trap_push();
+ DevicePresence(display, xi_presence, class_presence);
+ XSelectExtensionEvent(display,
+diff --git a/src/gpds-xinput-pointer-info.c b/src/gpds-xinput-pointer-info.c
+index d38afad..ce9a952 100644
+--- a/src/gpds-xinput-pointer-info.c
++++ b/src/gpds-xinput-pointer-info.c
+@@ -55,7 +55,8 @@ gpds_xinput_utils_collect_pointer_infos (void)
+ XDeviceInfo *device_infos;
+ gint i, n_device_infos;
+
+- device_infos = XListInputDevices(GDK_DISPLAY(), &n_device_infos);
++ device_infos = XListInputDevices(gdk_x11_get_default_xdisplay(),
++ &n_device_infos);
+
+ for (i = 0; i < n_device_infos; i++) {
+ GpdsXInputPointerInfo *info;
+diff --git a/src/gpds-xinput-utils.c b/src/gpds-xinput-utils.c
+index 0f7ceea..5a3e3a2 100644
+--- a/src/gpds-xinput-utils.c
++++ b/src/gpds-xinput-utils.c
+@@ -41,7 +41,8 @@ gpds_xinput_utils_get_device_info (const gchar *device_name, GError **error)
+ XDeviceInfo *device_infos;
+ gint i, n_device_infos;
+
+- device_infos = XListInputDevices(GDK_DISPLAY(), &n_device_infos);
++ device_infos = XListInputDevices(gdk_x11_get_default_xdisplay(),
++ &n_device_infos);
+
+ for (i = 0; i < n_device_infos; i++) {
+ if (device_infos[i].use != IsXExtensionPointer)
+@@ -68,7 +69,7 @@ gpds_xinput_utils_get_device_info_from_id (XID id, GError **error)
+ XDeviceInfo *device_infos;
+ gint i, n_device_infos;
+
+- device_infos = XListInputDevices(GDK_DISPLAY(), &n_device_infos);
++ device_infos = XListInputDevices(gdk_x11_get_default_xdisplay(), &n_device_infos);
+
+ for (i = 0; i < n_device_infos; i++) {
+ if (device_infos[i].use != IsXExtensionPointer)
+@@ -125,7 +126,7 @@ gpds_xinput_utils_open_device (const gchar *device_name, GError **error)
+ return NULL;
+
+ gdk_error_trap_push();
+- device = XOpenDevice(GDK_DISPLAY(), device_info->id);
++ device = XOpenDevice(gdk_x11_get_default_xdisplay(), device_info->id);
+ gdk_error_trap_pop();
+ if (!device) {
+ g_set_error(error,
+diff --git a/src/gpds-xinput.c b/src/gpds-xinput.c
+index d8bd1a2..66634b3 100644
+--- a/src/gpds-xinput.c
++++ b/src/gpds-xinput.c
+@@ -100,7 +100,7 @@ dispose (GObject *object)
+ g_free(priv->device_name);
+
+ if (priv->device) {
+- XCloseDevice(GDK_DISPLAY(), priv->device);
++ XCloseDevice(gdk_x11_get_default_xdisplay(), priv->device);
+ priv->device = NULL;
+ }
+
+@@ -199,7 +199,8 @@ get_x_error_text (int x_error_code)
+ {
+ gchar buf[64];
+
+- XGetErrorText(GDK_DISPLAY(), x_error_code, buf, sizeof(buf) - 1);
++ XGetErrorText(gdk_x11_get_default_xdisplay(), x_error_code,
++ buf, sizeof(buf) - 1);
+
+ return g_strdup(buf);
+ }
+@@ -273,7 +274,7 @@ gpds_xinput_set_int_properties_by_name_with_format_type
+ }
+
+ gdk_error_trap_push();
+- XChangeDeviceProperty(GDK_DISPLAY(),
++ XChangeDeviceProperty(gdk_x11_get_default_xdisplay(),
+ device, property_atom,
+ XA_INTEGER, format_type, PropModeReplace,
+ (unsigned char*)property_data, n_properties);
+@@ -383,7 +384,8 @@ get_atom (GpdsXInput *xinput, const gchar *property_name, GError **error)
+ if (!device)
+ return -1;
+
+- properties = XListDeviceProperties(GDK_DISPLAY(), device, &n_properties);
++ properties = XListDeviceProperties(gdk_x11_get_default_xdisplay(),
++ device, &n_properties);
+ for (i = 0; i < n_properties; i++) {
+ const gchar *name;
+
+@@ -427,9 +429,9 @@ gpds_xinput_get_int_properties_by_name (GpdsXInput *xinput,
+ return FALSE;
+
+ gdk_error_trap_push();
+- status = XGetDeviceProperty(GDK_DISPLAY(), device, atom, 0, 1000, False,
+- XA_INTEGER, &actual_type, &actual_format,
+- n_values, &bytes_after, &data);
++ status = XGetDeviceProperty(gdk_x11_get_default_xdisplay(), device, atom,
++ 0, 1000, False, XA_INTEGER, &actual_type,
++ &actual_format, n_values, &bytes_after, &data);
+ gdk_flush();
+ x_error_code = gdk_error_trap_pop();
+ if (status != Success || x_error_code != 0) {
+@@ -523,7 +525,7 @@ gpds_xinput_set_float_properties_by_name (GpdsXInput *xinput,
+ *(property_data + i) = (gfloat)properties[i];
+
+ gdk_error_trap_push();
+- XChangeDeviceProperty(GDK_DISPLAY(),
++ XChangeDeviceProperty(gdk_x11_get_default_xdisplay(),
+ device, property_atom,
+ float_atom, 32, PropModeReplace,
+ (unsigned char*)property_data, n_properties);
+@@ -594,7 +596,8 @@ gpds_xinput_get_float_properties_by_name (GpdsXInput *xinput,
+ return FALSE;
+
+ gdk_error_trap_push();
+- status = XGetDeviceProperty(GDK_DISPLAY(), device, property_atom, 0, 1000, False,
++ status = XGetDeviceProperty(gdk_x11_get_default_xdisplay(), device,
++ property_atom, 0, 1000, False,
+ float_atom, &actual_type, &actual_format,
+ n_properties, &bytes_after, &data);
+ gdk_flush();
+@@ -676,7 +679,8 @@ gpds_xinput_get_button_map (GpdsXInput *xinput,
+ *map = g_new0(guchar, *n_buttons);
+
+ gdk_error_trap_push();
+- status = XGetDeviceButtonMapping(GDK_DISPLAY(), device, *map, *n_buttons);
++ status = XGetDeviceButtonMapping(gdk_x11_get_default_xdisplay(),
++ device, *map, *n_buttons);
+ gdk_flush();
+
+ x_error_code = gdk_error_trap_pop();
+@@ -705,7 +709,8 @@ gpds_xinput_set_button_map (GpdsXInput *xinput,
+ return FALSE;
+
+ gdk_error_trap_push();
+- status = XSetDeviceButtonMapping(GDK_DISPLAY(), device, map, n_buttons);
++ status = XSetDeviceButtonMapping(gdk_x11_get_default_xdisplay(),
++ device, map, n_buttons);
+ gdk_flush();
+
+ x_error_code = gdk_error_trap_pop();
+diff --git a/test/test-xinput-utils.c b/test/test-xinput-utils.c
+index a06dcbc..f97f9d4 100644
+--- a/test/test-xinput-utils.c
++++ b/test/test-xinput-utils.c
+@@ -29,7 +29,7 @@ void
+ teardown (void)
+ {
+ if (device)
+- XCloseDevice(GDK_DISPLAY(), device);
++ XCloseDevice(gdk_x11_get_default_xdisplay(), device);
+ g_clear_error(&error);
+ g_clear_error(&expected_error);
+ }
diff --git a/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-plugin.patch b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-plugin.patch
new file mode 100644
index 000000000000..3e8612d96a53
--- /dev/null
+++ b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-plugin.patch
@@ -0,0 +1,107 @@
+commit 255334e6749ec4d4358e627dc6693b4159aaf912
+Author: Hiroyuki Ikezoe <poincare@ikezoe.net>
+Date: Fri Mar 12 19:13:54 2010 +0900
+
+ mouse extension -> pointing device.
+
+ Why did I use this weird name?
+
+diff --git a/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c b/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
+index db4dd8e..31dd336 100644
+--- a/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
++++ b/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
+@@ -29,34 +29,34 @@
+ #include "gpds-gconf.h"
+ #include "gpds-xinput-pointer-info.h"
+
+-#define GSD_TYPE_MOUSE_EXTENSION_PLUGIN (gsd_mouse_extension_plugin_get_type ())
+-#define GSD_MOUSE_EXTENSION_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSD_TYPE_MOUSE_EXTENSION_PLUGIN, GsdMouseExtensionPlugin))
+-#define GSD_MOUSE_EXTENSION_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSD_TYPE_MOUSE_EXTENSION_PLUGIN, GsdTracklassPointPluginClass))
+-#define GSD_IS_MOUSE_EXTENSION_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSD_TYPE_MOUSE_EXTENSION_PLUGIN))
+-#define GSD_IS_MOUSE_EXTENSION_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSD_TYPE_MOUSE_EXTENSION_PLUGIN))
+-#define GSD_MOUSE_EXTENSION_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSD_TYPE_MOUSE_EXTENSION_PLUGIN, GsdTracklassPointPluginClass))
++#define GSD_TYPE_POINTING_DEVICE_PLUGIN (gsd_pointing_device_plugin_get_type ())
++#define GSD_POINTING_DEVICE_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSD_TYPE_POINTING_DEVICE_PLUGIN, GsdPointingDevicePlugin))
++#define GSD_POINTING_DEVICE_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GSD_TYPE_POINTING_DEVICE_PLUGIN, GsdTracklassPointPluginClass))
++#define GSD_IS_POINTING_DEVICE_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GSD_TYPE_POINTING_DEVICE_PLUGIN))
++#define GSD_IS_POINTING_DEVICE_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GSD_TYPE_POINTING_DEVICE_PLUGIN))
++#define GSD_POINTING_DEVICE_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GSD_TYPE_POINTING_DEVICE_PLUGIN, GsdTracklassPointPluginClass))
+
+-typedef struct _GsdMouseExtensionPlugin GsdMouseExtensionPlugin;
+-typedef struct _GsdMouseExtensionPluginClass GsdMouseExtensionPluginClass;
++typedef struct _GsdPointingDevicePlugin GsdPointingDevicePlugin;
++typedef struct _GsdPointingDevicePluginClass GsdPointingDevicePluginClass;
+
+-struct _GsdMouseExtensionPlugin
++struct _GsdPointingDevicePlugin
+ {
+ GnomeSettingsPlugin parent;
+ GList *managers;
+ };
+
+-struct _GsdMouseExtensionPluginClass
++struct _GsdPointingDevicePluginClass
+ {
+ GnomeSettingsPluginClass parent_class;
+ };
+
+-GType gsd_mouse_extension_plugin_get_type (void) G_GNUC_CONST;
++GType gsd_pointing_device_plugin_get_type (void) G_GNUC_CONST;
+ G_MODULE_EXPORT GType register_gnome_settings_plugin (GTypeModule *module);
+
+-GNOME_SETTINGS_PLUGIN_REGISTER(GsdMouseExtensionPlugin, gsd_mouse_extension_plugin)
++GNOME_SETTINGS_PLUGIN_REGISTER(GsdPointingDevicePlugin, gsd_pointing_device_plugin)
+
+ static void
+-gsd_mouse_extension_plugin_init (GsdMouseExtensionPlugin *plugin)
++gsd_pointing_device_plugin_init (GsdPointingDevicePlugin *plugin)
+ {
+ plugin->managers = NULL;
+ }
+@@ -104,10 +104,10 @@ collect_pointer_device_infos_from_gconf (void)
+ static void
+ activate (GnomeSettingsPlugin *plugin)
+ {
+- GsdMouseExtensionPlugin *mouse_extension_plugin;
++ GsdPointingDevicePlugin *pointing_device_plugin;
+ GList *pointer_device_infos, *node;
+
+- mouse_extension_plugin = GSD_MOUSE_EXTENSION_PLUGIN(plugin);
++ pointing_device_plugin = GSD_POINTING_DEVICE_PLUGIN(plugin);
+
+ pointer_device_infos = collect_pointer_device_infos_from_gconf();
+ for (node = pointer_device_infos; node; node = g_list_next(node)) {
+@@ -120,8 +120,8 @@ activate (GnomeSettingsPlugin *plugin)
+ continue;
+
+ gsd_pointing_device_manager_start(manager, NULL);
+- mouse_extension_plugin->managers =
+- g_list_prepend(mouse_extension_plugin->managers, manager);
++ pointing_device_plugin->managers =
++ g_list_prepend(pointing_device_plugin->managers, manager);
+ }
+ g_list_foreach(pointer_device_infos,
+ (GFunc)gpds_xinput_pointer_info_free, NULL);
+@@ -129,7 +129,7 @@ activate (GnomeSettingsPlugin *plugin)
+ }
+
+ static void
+-stop_all_managers (GsdMouseExtensionPlugin *plugin)
++stop_all_managers (GsdPointingDevicePlugin *plugin)
+ {
+ GList *node;
+
+@@ -147,11 +147,11 @@ stop_all_managers (GsdMouseExtensionPlugin *plugin)
+ static void
+ deactivate (GnomeSettingsPlugin *plugin)
+ {
+- stop_all_managers(GSD_MOUSE_EXTENSION_PLUGIN(plugin));
++ stop_all_managers(GSD_POINTING_DEVICE_PLUGIN(plugin));
+ }
+
+ static void
+-gsd_mouse_extension_plugin_class_init (GsdMouseExtensionPluginClass *klass)
++gsd_pointing_device_plugin_class_init (GsdPointingDevicePluginClass *klass)
+ {
+ GnomeSettingsPluginClass *plugin_class = GNOME_SETTINGS_PLUGIN_CLASS(klass);
+
diff --git a/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-reboot.patch b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-reboot.patch
new file mode 100644
index 000000000000..1793bdfaa0a0
--- /dev/null
+++ b/gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-reboot.patch
@@ -0,0 +1,266 @@
+commit ff25a24d387887bc3bbacfb5bcaf2756695df096
+Author: Hiroyuki Ikezoe <hiikezoe@gnome.org>
+Date: Sat Jun 26 19:55:40 2010 +0900
+
+ Watch DevicePresenceNotify event.
+
+ Some devices are not reported by xserver at the time of startiung up
+ of gnome-settings-daemon, so we need to watch DevicePresenceNotify
+ event at that time.
+
+ Fix for bug #609050.
+
+diff --git a/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c b/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
+index 31dd336..8a2d98f 100644
+--- a/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
++++ b/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
+@@ -24,10 +24,13 @@
+ #include <gnome-settings-daemon/gnome-settings-plugin.h>
+ #include <glib/gi18n.h>
+ #include <gconf/gconf-client.h>
++#include <gdk/gdkx.h>
++#include <X11/extensions/XInput.h>
+
+ #include "gsd-pointing-device-manager.h"
+ #include "gpds-gconf.h"
+ #include "gpds-xinput-pointer-info.h"
++#include "gpds-xinput-utils.h"
+
+ #define GSD_TYPE_POINTING_DEVICE_PLUGIN (gsd_pointing_device_plugin_get_type ())
+ #define GSD_POINTING_DEVICE_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GSD_TYPE_POINTING_DEVICE_PLUGIN, GsdPointingDevicePlugin))
+@@ -61,44 +64,90 @@ gsd_pointing_device_plugin_init (GsdPointingDevicePlugin *plugin)
+ plugin->managers = NULL;
+ }
+
+-static GList *
+-collect_pointer_device_infos_from_gconf (void)
++static gboolean
++has_manager (GsdPointingDevicePlugin *plugin, const gchar *device_name)
+ {
+- GConfClient *gconf;
+- GSList *dirs, *node;
+- GList *infos = NULL;
+-
+- gconf = gconf_client_get_default();
+- dirs = gconf_client_all_dirs(gconf, GPDS_GCONF_DIR, NULL);
+-
+- for (node = dirs; node; node = g_slist_next(node)) {
+- const gchar *dir = node->data;
+- gchar *device_type;
+- gchar *device_type_key;
+-
+- device_type_key = gconf_concat_dir_and_key(dir, GPDS_GCONF_DEVICE_TYPE_KEY);
+- device_type = gconf_client_get_string(gconf, device_type_key, NULL);
+- if (device_type) {
+- GpdsXInputPointerInfo *info;
+- gchar *device_name, *unescaped_device_name;
+-
+- device_name = g_path_get_basename(dir);
+- unescaped_device_name = gconf_unescape_key(device_name, -1);
+- info = gpds_xinput_pointer_info_new(unescaped_device_name, device_type);
+- infos = g_list_prepend(infos, info);
+- g_free(unescaped_device_name);
+- g_free(device_name);
++ GList *node;
++
++ for (node = plugin->managers; node; node = g_list_next(node)) {
++ GsdPointingDeviceManager *manager = node->data;
++
++ if (g_str_equal(gsd_pointing_device_manager_get_device_name(manager), device_name))
++ return TRUE;
++ }
++
++ return FALSE;
++}
++
++static GdkFilterReturn
++device_presence_filter (GdkXEvent *xevent,
++ GdkEvent *event,
++ gpointer data)
++{
++ XEvent *xev = (XEvent *)xevent;
++ XEventClass class_presence;
++ int xi_presence;
++ GsdPointingDevicePlugin *plugin = GSD_POINTING_DEVICE_PLUGIN(data);
++
++ DevicePresence(gdk_x11_get_default_xdisplay(), xi_presence, class_presence);
++
++ if (xev->type == xi_presence) {
++ XDeviceInfo *device_info = NULL;
++ XDevicePresenceNotifyEvent *notify_event = (XDevicePresenceNotifyEvent *)xev;
++
++ device_info = gpds_xinput_utils_get_device_info_from_id(notify_event->deviceid, NULL);
++ if (notify_event->devchange == DeviceEnabled) {
++ GsdPointingDeviceManager *manager;
++
++ if (has_manager(plugin, device_info->name))
++ return GDK_FILTER_CONTINUE;
++
++ manager = gsd_pointing_device_manager_new(gdk_x11_get_xatom_name(device_info->type),
++ device_info->name);
++ if (manager) {
++ gsd_pointing_device_manager_start(manager, NULL);
++ plugin->managers = g_list_prepend(plugin->managers, manager);
++ }
++ } else if (notify_event->devchange == DeviceRemoved) {
+ }
++ }
+
+- g_free(device_type_key);
+- g_free(device_type);
++ return GDK_FILTER_CONTINUE;
++}
++
++static void
++add_device_presence_filter (GsdPointingDevicePlugin *plugin)
++{
++ Display *display;
++ XEventClass class_presence;
++ gint xi_presence;
++
++ gint op_code, event, error;
++
++ if (!XQueryExtension(GDK_DISPLAY(),
++ "XInputExtension",
++ &op_code,
++ &event,
++ &error)) {
++ return;
+ }
+
+- g_slist_foreach(dirs, (GFunc)g_free, NULL);
+- g_slist_free(dirs);
+- g_object_unref(gconf);
++ display = gdk_x11_get_default_xdisplay();
+
+- return infos;
++ gdk_error_trap_push();
++ DevicePresence(display, xi_presence, class_presence);
++ XSelectExtensionEvent(display,
++ RootWindow(display, DefaultScreen(display)),
++ &class_presence, 1);
++ gdk_flush();
++ if (!gdk_error_trap_pop())
++ gdk_window_add_filter(NULL, device_presence_filter, plugin);
++}
++
++static void
++remove_device_presence_filter (GsdPointingDevicePlugin *plugin)
++{
++ gdk_window_remove_filter(NULL, device_presence_filter, plugin);
+ }
+
+ static void
+@@ -109,7 +158,10 @@ activate (GnomeSettingsPlugin *plugin)
+
+ pointing_device_plugin = GSD_POINTING_DEVICE_PLUGIN(plugin);
+
+- pointer_device_infos = collect_pointer_device_infos_from_gconf();
++ add_device_presence_filter(pointing_device_plugin);
++
++ pointer_device_infos = gpds_xinput_utils_collect_pointer_infos();
++
+ for (node = pointer_device_infos; node; node = g_list_next(node)) {
+ GsdPointingDeviceManager *manager;
+ GpdsXInputPointerInfo *info = node->data;
+@@ -133,6 +185,8 @@ stop_all_managers (GsdPointingDevicePlugin *plugin)
+ {
+ GList *node;
+
++ remove_device_presence_filter(plugin);
++
+ for (node = plugin->managers; node; node = g_list_next(node)) {
+ GsdPointingDeviceManager *manager = node->data;
+
+diff --git a/src/gpds-xinput-utils.c b/src/gpds-xinput-utils.c
+index 48dc2a5..0f7ceea 100644
+--- a/src/gpds-xinput-utils.c
++++ b/src/gpds-xinput-utils.c
+@@ -62,6 +62,33 @@ gpds_xinput_utils_get_device_info (const gchar *device_name, GError **error)
+ return NULL;
+ }
+
++XDeviceInfo *
++gpds_xinput_utils_get_device_info_from_id (XID id, GError **error)
++{
++ XDeviceInfo *device_infos;
++ gint i, n_device_infos;
++
++ device_infos = XListInputDevices(GDK_DISPLAY(), &n_device_infos);
++
++ for (i = 0; i < n_device_infos; i++) {
++ if (device_infos[i].use != IsXExtensionPointer)
++ continue;
++ if (device_infos[i].id == id) {
++ XFreeDeviceList(device_infos);
++ return &device_infos[i];
++ }
++ }
++
++ XFreeDeviceList(device_infos);
++
++ g_set_error(error,
++ GPDS_XINPUT_UTILS_ERROR,
++ GPDS_XINPUT_UTILS_ERROR_NO_DEVICE,
++ _("No device found for %d."), (int)id);
++
++ return NULL;
++}
++
+ gshort
+ gpds_xinput_utils_get_device_num_buttons (const gchar *device_name, GError **error)
+ {
+diff --git a/src/gpds-xinput-utils.h b/src/gpds-xinput-utils.h
+index 9cc4564..74e491a 100644
+--- a/src/gpds-xinput-utils.h
++++ b/src/gpds-xinput-utils.h
+@@ -38,6 +38,8 @@ typedef enum
+ GQuark gpds_xinput_utils_error_quark (void);
+ XDeviceInfo *gpds_xinput_utils_get_device_info (const gchar *device_name,
+ GError **error);
++XDeviceInfo *gpds_xinput_utils_get_device_info_from_id (XID id,
++ GError **error);
+ XDevice *gpds_xinput_utils_open_device (const gchar *device_name, GError **error);
+ Atom gpds_xinput_utils_get_float_atom (GError **error);
+ gshort gpds_xinput_utils_get_device_num_buttons (const gchar *device_name, GError **error);
+diff --git a/test/test-xinput-utils.c b/test/test-xinput-utils.c
+index 29b3f4e..a06dcbc 100644
+--- a/test/test-xinput-utils.c
++++ b/test/test-xinput-utils.c
+@@ -6,6 +6,7 @@
+ void test_exist_device (void);
+ void test_get_float_atom (void);
+ void test_get_device_info (void);
++void test_get_device_info_from_id (void);
+ void test_open_device (void);
+ void test_open_no_device (void);
+ void test_get_device_num_buttons (void);
+@@ -49,7 +50,7 @@ test_get_float_atom (void)
+ void
+ test_get_device_info (void)
+ {
+- XDeviceInfo *device_info = NULL;
++ XDeviceInfo *device_info = NULL;
+ device_info = gpds_xinput_utils_get_device_info(DEVICE_NAME, &error);
+ cut_assert(device_info);
+
+@@ -57,6 +58,19 @@ test_get_device_info (void)
+ }
+
+ void
++test_get_device_info_from_id (void)
++{
++ XDeviceInfo *device_info = NULL;
++ device_info = gpds_xinput_utils_get_device_info(DEVICE_NAME, &error);
++ cut_assert(device_info);
++
++ gcut_assert_error(error);
++
++ device_info = gpds_xinput_utils_get_device_info_from_id(device_info->id, &error);
++ cut_assert_equal_string(DEVICE_NAME, device_info->name);
++}
++
++void
+ test_open_device (void)
+ {
+ device = gpds_xinput_utils_open_device(DEVICE_NAME, &error);
diff --git a/gnome-extra/gpointing-device-settings/gpointing-device-settings-1.5.1-r1.ebuild b/gnome-extra/gpointing-device-settings/gpointing-device-settings-1.5.1-r1.ebuild
new file mode 100644
index 000000000000..a737aa06438b
--- /dev/null
+++ b/gnome-extra/gpointing-device-settings/gpointing-device-settings-1.5.1-r1.ebuild
@@ -0,0 +1,49 @@
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/gnome-extra/gpointing-device-settings/gpointing-device-settings-1.5.1-r1.ebuild,v 1.1 2010/11/10 12:33:38 pva Exp $
+
+EAPI="2"
+GCONF_DEBUG="no"
+inherit eutils gnome2
+
+DESCRIPTION="A GTK+ based configuration utility for the synaptics driver"
+HOMEPAGE="http://live.gnome.org/GPointingDeviceSettings"
+SRC_URI="mirror://sourceforge.jp/gsynaptics/45812/${P}.tar.gz"
+
+LICENSE="GPL-3"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE=""
+
+# recent enough x11-base/xorg-server required
+RDEPEND=">=dev-libs/glib-2.10
+ >=x11-libs/gtk+-2.14.0
+ >=gnome-base/gconf-2.24
+ >=gnome-base/gnome-settings-daemon-2.28
+ >=x11-libs/libXi-1.2
+ >=x11-libs/libX11-1.2.0
+ !<=x11-base/xorg-server-1.6.0
+ !gnome-extra/gsynaptics"
+DEPEND="${RDEPEND}
+ >=dev-util/pkgconfig-0.19
+ >=dev-util/intltool-0.35.5"
+
+DOCS="MAINTAINERS NEWS TODO"
+
+src_prepare() {
+ epatch "${FILESDIR}/${P}-crash.patch"
+ epatch "${FILESDIR}/${P}-plugin.patch"
+ epatch "${FILESDIR}/${P}-reboot.patch"
+ epatch "${FILESDIR}/${P}-gtk22.patch"
+ gnome2_src_prepare
+}
+
+src_install() {
+ gnome2_src_install
+
+ doicon data/touchpad.png
+ make_desktop_entry gpointing-device-settings \
+ gpointing-device-settings \
+ touchpad \
+ 'GNOME;GTK;Settings;HardwareSettings'
+}