diff options
author | Peter Volkov <pva@gentoo.org> | 2010-11-10 12:33:38 +0000 |
---|---|---|
committer | Peter Volkov <pva@gentoo.org> | 2010-11-10 12:33:38 +0000 |
commit | 47503552c95ea2228ca14ffb1ff9085961ea20ff (patch) | |
tree | 3f09d408bd8a05db0fa984f8e53e7132afd49fb3 /gnome-extra/gpointing-device-settings | |
parent | Added version 0.35 (diff) | |
download | gentoo-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')
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' +} |