diff options
Diffstat (limited to 'gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-reboot.patch')
-rw-r--r-- | gnome-extra/gpointing-device-settings/files/gpointing-device-settings-1.5.1-reboot.patch | 266 |
1 files changed, 266 insertions, 0 deletions
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); |