packages: gpointing-device-settings/gpointing-device-settings-1.5.1-crash.p...

gotar gotar at pld-linux.org
Sun Jul 3 18:09:26 CEST 2011


Author: gotar                        Date: Sun Jul  3 16:09:26 2011 GMT
Module: packages                      Tag: HEAD
---- Log message:
- initial PLD release with patches from
http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/gnome-extra/gpointing-device-settings/files/
  - upstream plugin, reboot, crash,
  - GTK 2.2+ build and VT switch crash from Alexandre Rostovtsev

---- Files affected:
packages/gpointing-device-settings:
   gpointing-device-settings-1.5.1-crash.patch (NONE -> 1.1)  (NEW), gpointing-device-settings-1.5.1-gsd-crash.patch (NONE -> 1.1)  (NEW), gpointing-device-settings-1.5.1-gtk22.patch (NONE -> 1.1)  (NEW), gpointing-device-settings-1.5.1-plugin.patch (NONE -> 1.1)  (NEW), gpointing-device-settings-1.5.1-reboot.patch (NONE -> 1.1)  (NEW), gpointing-device-settings.spec (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/gpointing-device-settings/gpointing-device-settings-1.5.1-crash.patch
diff -u /dev/null packages/gpointing-device-settings/gpointing-device-settings-1.5.1-crash.patch:1.1
--- /dev/null	Sun Jul  3 18:09:26 2011
+++ packages/gpointing-device-settings/gpointing-device-settings-1.5.1-crash.patch	Sun Jul  3 18:09:21 2011
@@ -0,0 +1,30 @@
+commit 70add06dec8413965f3e98b6ba9a3c82168ea72c
+Author: Hiroyuki Ikezoe <poincare at 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");

================================================================
Index: packages/gpointing-device-settings/gpointing-device-settings-1.5.1-gsd-crash.patch
diff -u /dev/null packages/gpointing-device-settings/gpointing-device-settings-1.5.1-gsd-crash.patch:1.1
--- /dev/null	Sun Jul  3 18:09:27 2011
+++ packages/gpointing-device-settings/gpointing-device-settings-1.5.1-gsd-crash.patch	Sun Jul  3 18:09:21 2011
@@ -0,0 +1,35 @@
+diff -ru gpointing-device-settings-1.5.1-orig/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c gpointing-device-settings-1.5.1/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c
+--- gpointing-device-settings-1.5.1-orig/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c	2010-12-20 01:29:09.204274003 -0500
++++ gpointing-device-settings-1.5.1/modules/gnome-settings-daemon-plugins/gsd-pointing-device-plugin.c	2010-12-20 02:15:21.652274002 -0500
+@@ -96,19 +96,21 @@
+         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 (device_info) {
++            if (notify_event->devchange == DeviceEnabled) {
++                GsdPointingDeviceManager *manager;
+ 
+-            if (has_manager(plugin, device_info->name))
+-                return GDK_FILTER_CONTINUE;
++                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);
++                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) {
+             }
+-        } else if (notify_event->devchange == DeviceRemoved) {
+         }
+     }
+ 

================================================================
Index: packages/gpointing-device-settings/gpointing-device-settings-1.5.1-gtk22.patch
diff -u /dev/null packages/gpointing-device-settings/gpointing-device-settings-1.5.1-gtk22.patch:1.1
--- /dev/null	Sun Jul  3 18:09:27 2011
+++ packages/gpointing-device-settings/gpointing-device-settings-1.5.1-gtk22.patch	Sun Jul  3 18:09:21 2011
@@ -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);
+ }

================================================================
Index: packages/gpointing-device-settings/gpointing-device-settings-1.5.1-plugin.patch
diff -u /dev/null packages/gpointing-device-settings/gpointing-device-settings-1.5.1-plugin.patch:1.1
--- /dev/null	Sun Jul  3 18:09:27 2011
+++ packages/gpointing-device-settings/gpointing-device-settings-1.5.1-plugin.patch	Sun Jul  3 18:09:21 2011
@@ -0,0 +1,107 @@
+commit 255334e6749ec4d4358e627dc6693b4159aaf912
+Author: Hiroyuki Ikezoe <poincare at 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);
+ 

================================================================
Index: packages/gpointing-device-settings/gpointing-device-settings-1.5.1-reboot.patch
diff -u /dev/null packages/gpointing-device-settings/gpointing-device-settings-1.5.1-reboot.patch:1.1
--- /dev/null	Sun Jul  3 18:09:27 2011
+++ packages/gpointing-device-settings/gpointing-device-settings-1.5.1-reboot.patch	Sun Jul  3 18:09:21 2011
@@ -0,0 +1,266 @@
+commit ff25a24d387887bc3bbacfb5bcaf2756695df096
+Author: Hiroyuki Ikezoe <hiikezoe at 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) {
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list