diff --git a/.cvsignore b/.cvsignore index 679af12..3282fa3 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1 @@ -gnome-settings-daemon-2.24.0.tar.bz2 +gnome-settings-daemon-2.24.1.tar.bz2 diff --git a/fix-gdm-layout.patch b/fix-gdm-layout.patch deleted file mode 100644 index 2f3051d..0000000 --- a/fix-gdm-layout.patch +++ /dev/null @@ -1,95 +0,0 @@ -diff -up gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c.fix-gdm-layout gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c ---- gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c.fix-gdm-layout 2008-10-14 09:26:57.000000000 -0400 -+++ gnome-settings-daemon-2.24.0/plugins/keyboard/gsd-keyboard-xkb.c 2008-10-14 09:27:09.000000000 -0400 -@@ -142,12 +142,39 @@ apply_xkb_settings (void) - { - GConfClient *conf_client; - GkbdKeyboardConfig current_sys_kbd_config; -+ int group_to_activate = -1; -+ const char *gdm_layout; - - if (!inited_ok) - return; - - conf_client = gconf_client_get_default (); - -+ /* With GDM the user can already set a layout from the login -+ * screen. Try to keep that setting. -+ * We clear gdm_keyboard_layout early, so we don't risk -+ * recursion from gconf notification. -+ */ -+ gdm_layout = gdm_keyboard_layout; -+ gdm_keyboard_layout = NULL; -+ if (gdm_layout != NULL) { -+ GSList *layouts; -+ layouts = gconf_client_get_list (conf_client, -+ GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS, -+ GCONF_VALUE_STRING, -+ NULL); -+ if (layouts == NULL) { -+ layouts = g_slist_append (layouts, g_strdup (gdm_layout)); -+ gconf_client_set_list (conf_client, -+ GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS, -+ GCONF_VALUE_STRING, -+ layouts, -+ NULL); -+ } -+ g_slist_foreach (layouts, (GFunc)g_free, NULL); -+ g_slist_free (layouts); -+ } -+ - gkbd_keyboard_config_init (¤t_sys_kbd_config, - conf_client, - xkl_engine); -@@ -158,29 +185,20 @@ apply_xkb_settings (void) - gkbd_keyboard_config_load_from_x_current (¤t_sys_kbd_config, - NULL); - -- /* With GDM the user can already set a layout from the login -- * screen. Try to keep that setting */ -- if (gdm_keyboard_layout != NULL) { -- if (current_kbd_config.layouts_variants == NULL) { -- current_kbd_config.layouts_variants = g_slist_append (NULL, (char *) gdm_keyboard_layout); -- gconf_client_set_list (conf_client, -- GKBD_KEYBOARD_CONFIG_KEY_LAYOUTS, -- GCONF_VALUE_STRING, -- current_kbd_config.layouts_variants, -- NULL); -- } else { -- GSList *l; -- int i; -- size_t len = strlen (gdm_keyboard_layout); -- for (i = 0, l = current_kbd_config.layouts_variants; l; i++, l = l->next) { -- char *lv = l->data; -- if (strncmp (lv, gdm_keyboard_layout, len) == 0 && (lv[len] == '\0' || lv[len] == '\t')) { -- xkl_engine_lock_group (current_config.engine, i); -- break; -- } -- } -+ if (gdm_layout != NULL) { -+ /* If there are multiple layouts, -+ * try to find the one closest to the gdm layout -+ */ -+ GSList *l; -+ int i; -+ size_t len = strlen (gdm_layout); -+ for (i = 0, l = current_kbd_config.layouts_variants; l; i++, l = l->next) { -+ char *lv = l->data; -+ if (strncmp (lv, gdm_layout, len) == 0 && (lv[len] == '\0' || lv[len] == '\t')) { -+ group_to_activate = i; -+ break; -+ } - } -- gdm_keyboard_layout = NULL; - } - - /* Activate - only if different! */ -@@ -199,6 +217,8 @@ apply_xkb_settings (void) - xkl_debug (100, - "Actual KBD configuration was not changed: redundant notification\n"); - -+ if (group_to_activate != -1) -+ xkl_engine_lock_group (current_config.engine, group_to_activate); - gkbd_keyboard_config_term (¤t_sys_kbd_config); - } - diff --git a/gnome-settings-daemon.spec b/gnome-settings-daemon.spec index 3e2807e..5a24b5b 100644 --- a/gnome-settings-daemon.spec +++ b/gnome-settings-daemon.spec @@ -1,6 +1,6 @@ Name: gnome-settings-daemon -Version: 2.24.0 -Release: 14%{?dist} +Version: 2.24.1 +Release: 1%{?dist} Summary: The daemon sharing settings from GNOME to GTK+/KDE applications Group: System Environment/Daemons @@ -38,11 +38,7 @@ Patch7: gnome-settings-daemon-2.23.91-fnf7-cycle.patch # http://bugzilla.gnome.org/show_bug.cgi?id=552857 Patch8: gnome-settings-daemon-2.24.0-fade.patch -# http://bugzilla.gnome.org/show_bug.cgi?id=555873 -Patch9: fix-gdm-layout.patch - -# http://bugzilla.gnome.org/show_bug.cgi?id=556307 -Patch10: power-button.patch +Patch11: gsd-patches-behdad-f10.patch %description A daemon to share settings from GNOME to other applications. It also @@ -65,8 +61,7 @@ developing applications that use %{name}. %patch6 -p1 -b .drop-sample-cache %patch7 -p1 -b .fnf7-cycle %patch8 -p1 -b .fade -%patch9 -p1 -b .fix-gdm-layout -%patch10 -p1 -b .power-button +%patch11 -p1 -b .behdad %build aclocal @@ -169,6 +164,10 @@ fi %{_libdir}/pkgconfig/gnome-settings-daemon.pc %changelog +* Tue Nov 25 2008 Matthias Clasen - 2.24.1-1 +- Update to 2.24.1 +- Backport performance fixes + * Fri Oct 24 2008 Ray Strode - 2.24.0-14 - At fontconfig-devel buildrequires (bug 468304) diff --git a/gsd-patches-behdad-f10.patch b/gsd-patches-behdad-f10.patch new file mode 100644 index 0000000..2ae1ad7 --- /dev/null +++ b/gsd-patches-behdad-f10.patch @@ -0,0 +1,1875 @@ +diff --git a/data/gnome-settings-daemon.schemas.in b/data/gnome-settings-daemon.schemas.in +index 3f6a426..9b7d711 100644 +--- a/data/gnome-settings-daemon.schemas.in ++++ b/data/gnome-settings-daemon.schemas.in +@@ -41,7 +41,7 @@ + /apps/gnome_settings_daemon/plugins/background/priority + gnome-settings-daemon + int +- 5 ++ 97 + + + +@@ -64,7 +64,7 @@ + /apps/gnome_settings_daemon/plugins/clipboard/priority + gnome-settings-daemon + int +- 100 ++ 99 + + + +@@ -179,7 +179,7 @@ + /apps/gnome_settings_daemon/plugins/media-keys/priority + gnome-settings-daemon + int +- 20 ++ 98 + + + +@@ -306,7 +306,7 @@ + /apps/gnome_settings_daemon/plugins/xrdb/active + gnome-settings-daemon + bool +- TRUE ++ FALSE + + Enable xrdb plugin + Set to True to enable the plugin to manage xrdb settings. +diff --git a/gnome-settings-daemon/gnome-settings-manager.c b/gnome-settings-daemon/gnome-settings-manager.c +index 0bc3f61..475c883 100644 +--- a/gnome-settings-daemon/gnome-settings-manager.c ++++ b/gnome-settings-daemon/gnome-settings-manager.c +@@ -49,6 +49,7 @@ + struct GnomeSettingsManagerPrivate + { + DBusGConnection *connection; ++ GConfClient *gconf_client; + char *settings_prefix; + GSList *plugins; + }; +@@ -157,24 +158,21 @@ _load_file (GnomeSettingsManager *manager, + { + GnomeSettingsPluginInfo *info; + char *key_name; +- GConfClient *client; + int priority; + GError *error; + GSList *l; + + g_debug ("Loading plugin: %s", filename); +- gnome_settings_profile_start (NULL); ++ gnome_settings_profile_start ("%s", filename); + + info = gnome_settings_plugin_info_new_from_file (filename); + if (info == NULL) { + goto out; + } + +- gnome_settings_profile_start ("seeing if already loaded"); + l = g_slist_find_custom (manager->priv->plugins, + info, + (GCompareFunc) compare_location); +- gnome_settings_profile_end ("seeing if already loaded"); + if (l != NULL) { + goto out; + } +@@ -187,21 +185,17 @@ _load_file (GnomeSettingsManager *manager, + g_signal_connect (info, "deactivated", + G_CALLBACK (on_plugin_deactivated), manager); + +- gnome_settings_profile_start ("setting active property"); + key_name = g_strdup_printf ("%s/%s/active", + manager->priv->settings_prefix, + gnome_settings_plugin_info_get_location (info)); + gnome_settings_plugin_info_set_enabled_key_name (info, key_name); + g_free (key_name); +- gnome_settings_profile_end ("setting active property"); + +- gnome_settings_profile_start ("setting priority property"); + key_name = g_strdup_printf ("%s/%s/priority", + manager->priv->settings_prefix, + gnome_settings_plugin_info_get_location (info)); +- client = gconf_client_get_default (); + error = NULL; +- priority = gconf_client_get_int (client, key_name, &error); ++ priority = gconf_client_get_int (manager->priv->gconf_client, key_name, &error); + if (error == NULL) { + if (priority > 0) { + gnome_settings_plugin_info_set_priority (info, priority); +@@ -210,15 +204,13 @@ _load_file (GnomeSettingsManager *manager, + g_error_free (error); + } + g_free (key_name); +- g_object_unref (client); +- gnome_settings_profile_end ("setting priority property"); + + out: + if (info != NULL) { + g_object_unref (info); + } + +- gnome_settings_profile_end (NULL); ++ gnome_settings_profile_end ("%s", filename); + } + + static void +@@ -345,6 +337,15 @@ gnome_settings_manager_start (GnomeSettingsManager *manager, + goto out; + } + ++ manager->priv->gconf_client = gconf_client_get_default (); ++ ++ gnome_settings_profile_start ("preloading gconf keys"); ++ gconf_client_add_dir (manager->priv->gconf_client, ++ manager->priv->settings_prefix, ++ GCONF_CLIENT_PRELOAD_RECURSIVE, ++ NULL); ++ gnome_settings_profile_end ("preloading gconf keys"); ++ + _load_all (manager); + + ret = TRUE; +@@ -379,6 +380,12 @@ gnome_settings_manager_stop (GnomeSettingsManager *manager) + #endif + + _unload_all (manager); ++ ++ gconf_client_remove_dir (manager->priv->gconf_client, ++ manager->priv->settings_prefix, ++ NULL); ++ g_object_unref (manager->priv->gconf_client); ++ manager->priv->gconf_client = NULL; + } + + static void +diff --git a/gnome-settings-daemon/gnome-settings-plugin-info.c b/gnome-settings-daemon/gnome-settings-plugin-info.c +index 983a3e1..a4a10a8 100644 +--- a/gnome-settings-daemon/gnome-settings-plugin-info.c ++++ b/gnome-settings-daemon/gnome-settings-plugin-info.c +@@ -185,7 +185,7 @@ gnome_settings_plugin_info_fill_from_file (GnomeSettingsPluginInfo *info, + int priority; + gboolean ret; + +- gnome_settings_profile_start (NULL); ++ gnome_settings_profile_start ("%s", filename); + + ret = FALSE; + +@@ -290,7 +290,7 @@ gnome_settings_plugin_info_fill_from_file (GnomeSettingsPluginInfo *info, + + ret = TRUE; + out: +- gnome_settings_profile_end (NULL); ++ gnome_settings_profile_end ("%s", filename); + + return ret; + } +@@ -312,15 +312,6 @@ void + gnome_settings_plugin_info_set_enabled_key_name (GnomeSettingsPluginInfo *info, + const char *key_name) + { +- char *dirname; +- +- dirname = g_path_get_dirname (key_name); +- if (dirname != NULL) { +- g_debug ("Monitoring dir %s for changes", dirname); +- gconf_client_add_dir (info->priv->client, dirname, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); +- g_free (dirname); +- } +- + info->priv->enabled_notification_id = gconf_client_notify_add (info->priv->client, + key_name, + (GConfClientNotifyFunc)plugin_enabled_cb, +@@ -388,7 +379,7 @@ load_plugin_module (GnomeSettingsPluginInfo *info) + g_return_val_if_fail (info->priv->plugin == NULL, FALSE); + g_return_val_if_fail (info->priv->available, FALSE); + +- gnome_settings_profile_start (NULL); ++ gnome_settings_profile_start ("%s", info->priv->location); + + switch (info->priv->loader) { + case GNOME_SETTINGS_PLUGIN_LOADER_C: +@@ -484,7 +475,7 @@ load_plugin_module (GnomeSettingsPluginInfo *info) + g_type_module_unuse (info->priv->module); + ret = TRUE; + out: +- gnome_settings_profile_end (NULL); ++ gnome_settings_profile_end ("%s", info->priv->location); + return ret; + } + +diff --git a/gnome-settings-daemon/main.c b/gnome-settings-daemon/main.c +index b4c43d2..c96381b 100644 +--- a/gnome-settings-daemon/main.c ++++ b/gnome-settings-daemon/main.c +@@ -24,6 +24,9 @@ + #include + #include + #include ++#include ++#include ++#include + + #include + #include +@@ -44,6 +47,7 @@ + static char *gconf_prefix = NULL; + static gboolean no_daemon = FALSE; + static gboolean debug = FALSE; ++static int pipefds[2]; + + static GOptionEntry entries[] = { + {"debug", 0, 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging code"), NULL }, +@@ -187,10 +191,10 @@ set_session_over_handler (DBusGConnection *bus, GnomeSettingsManager *manager) + GNOME_SESSION_DBUS_OBJECT, + GNOME_SESSION_DBUS_INTERFACE); + +- dbus_g_object_register_marshaller ( +- g_cclosure_marshal_VOID__VOID, +- G_TYPE_NONE, +- G_TYPE_INVALID); ++ dbus_g_object_register_marshaller ( ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, ++ G_TYPE_INVALID); + + dbus_g_proxy_add_signal (session_proxy, + "SessionOver", +@@ -223,6 +227,119 @@ gsd_log_default_handler (const gchar *log_domain, + unused_data); + } + ++ ++/* We want the parent process to quit after initializing all plugins, ++ * but we have to do all the work in the child process. We can't ++ * initialize in parent and then fork here: that is not clean with ++ * X display and DBUS where we would make the connection from one ++ * process and continue using it from the other. So, we just make the ++ * parent to fork early and wait. */ ++ ++static void ++daemon_start (void) ++{ ++ int child_pid; ++ char buf[1]; ++ ++ if (no_daemon) ++ return; ++ ++ gnome_settings_profile_msg ("forking daemon"); ++ ++ signal (SIGPIPE, SIG_IGN); ++ if (-1 == pipe (pipefds)) { ++ g_error ("Could not create pipe: %s", g_strerror (errno)); ++ exit (EXIT_FAILURE); ++ } ++ ++ child_pid = fork (); ++ ++ switch (child_pid) { ++ case -1: ++ g_error ("Could not daemonize: %s", g_strerror (errno)); ++ exit (EXIT_FAILURE); ++ ++ case 0: ++ /* child */ ++ ++ close (pipefds[0]); ++ ++ return; ++ ++ default: ++ /* parent */ ++ ++ close (pipefds[1]); ++ ++ /* Wait for child to signal that we are good to go. */ ++ read (pipefds[0], buf, 1); ++ ++ exit (EXIT_SUCCESS); ++ } ++} ++ ++static void ++daemon_detach (void) ++{ ++ if (no_daemon) ++ return; ++ ++ gnome_settings_profile_msg ("detaching daemon"); ++ ++ /* disconnect */ ++ setsid (); ++ close (0); ++ close (1); ++ open ("/dev/null", O_RDONLY); ++ open ("/dev/null", O_WRONLY); ++ ++ /* get outta the way */ ++ chdir ("/"); ++ umask (0117); ++} ++ ++static void ++daemon_terminate_parent (void) ++{ ++ if (no_daemon) ++ return; ++ ++ gnome_settings_profile_msg ("terminating parent"); ++ ++ write (pipefds[1], "1", 1); ++ close (pipefds[1]); ++} ++ ++static void ++parse_args (int *argc, char ***argv) ++{ ++ GError *error; ++ GOptionContext *context; ++ ++ gnome_settings_profile_start (NULL); ++ ++ ++ context = g_option_context_new (NULL); ++ ++ g_option_context_add_main_entries (context, entries, NULL); ++ g_option_context_add_group (context, gtk_get_option_group (FALSE)); ++ ++ error = NULL; ++ if (!g_option_context_parse (context, argc, argv, &error)) { ++ if (error != NULL) { ++ g_warning ("%s", error->message); ++ g_error_free (error); ++ } else { ++ g_warning ("Unable to initialize GTK+"); ++ } ++ exit (EXIT_FAILURE); ++ } ++ ++ g_option_context_free (context); ++ ++ gnome_settings_profile_end (NULL); ++} ++ + int + main (int argc, char *argv[]) + { +@@ -238,29 +355,25 @@ main (int argc, char *argv[]) + bindtextdomain (GETTEXT_PACKAGE, GNOME_SETTINGS_LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); +- + setlocale (LC_ALL, ""); + ++ parse_args (&argc, &argv); ++ ++ daemon_start (); ++ + g_type_init (); + +- gnome_settings_profile_start ("gtk init"); +- error = NULL; +- if (! gtk_init_with_args (&argc, &argv, NULL, entries, NULL, &error)) { +- if (error != NULL) { +- g_warning (error->message); +- g_error_free (error); +- } else { +- g_warning ("Unable to initialize GTK+"); +- } +- exit (1); ++ gnome_settings_profile_start ("opening gtk display"); ++ if (! gtk_init_check (NULL, NULL)) { ++ g_warning ("Unable to initialize GTK+"); ++ daemon_terminate_parent (); ++ exit (EXIT_FAILURE); + } +- gnome_settings_profile_end ("gtk init"); ++ gnome_settings_profile_end ("opening gtk display"); + +- g_log_set_default_handler (gsd_log_default_handler, NULL); ++ daemon_detach (); + +- if (! no_daemon && daemon (0, 0)) { +- g_error ("Could not daemonize: %s", g_strerror (errno)); +- } ++ g_log_set_default_handler (gsd_log_default_handler, NULL); + + bus = get_session_bus (); + if (bus == NULL) { +@@ -298,6 +411,8 @@ main (int argc, char *argv[]) + } + } + ++ daemon_terminate_parent (); ++ + gtk_main (); + + out: +diff --git a/plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c b/plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c +index eaea1a3..3a990db 100644 +--- a/plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c ++++ b/plugins/a11y-keyboard/gsd-a11y-keyboard-manager.c +@@ -71,15 +71,10 @@ struct GsdA11yKeyboardManagerPrivate + #endif /* HAVE_LIBNOTIFY */ + }; + +-#define GSD_KBD_A11Y_ERROR gsd_kbd_a11y_error_quark () +- +-enum { +- GSD_KBD_A11Y_ERROR_NOT_AVAILABLE +-}; +- + static void gsd_a11y_keyboard_manager_class_init (GsdA11yKeyboardManagerClass *klass); + static void gsd_a11y_keyboard_manager_init (GsdA11yKeyboardManager *a11y_keyboard_manager); + static void gsd_a11y_keyboard_manager_finalize (GObject *object); ++static void gsd_a11y_keyboard_manager_ensure_status_icon (GsdA11yKeyboardManager *manager); + + G_DEFINE_TYPE (GsdA11yKeyboardManager, gsd_a11y_keyboard_manager, G_TYPE_OBJECT) + +@@ -92,19 +87,12 @@ static gpointer manager_object = NULL; + #define d(str) do { } while (0) + #endif + +-static GQuark +-gsd_kbd_a11y_error_quark (void) +-{ +- return g_quark_from_static_string ("gsd-kbd-a11y-error-quark"); +-} +- + static gboolean + xkb_enabled (GsdA11yKeyboardManager *manager) + { + gboolean have_xkb; + int opcode, errorBase, major, minor; + +- gdk_error_trap_push (); + have_xkb = XkbQueryExtension (GDK_DISPLAY (), + &opcode, + &manager->priv->xkbEventBase, +@@ -112,8 +100,6 @@ xkb_enabled (GsdA11yKeyboardManager *manager) + &major, + &minor) + && XkbUseExtension (GDK_DISPLAY (), &major, &minor); +- XSync (GDK_DISPLAY (), FALSE); +- gdk_error_trap_pop (); + + return have_xkb; + } +@@ -130,7 +116,6 @@ get_xkb_desc_rec (GsdA11yKeyboardManager *manager) + desc->ctrls = NULL; + status = XkbGetControls (GDK_DISPLAY (), XkbAllControlsMask, desc); + } +- XSync (GDK_DISPLAY (), FALSE); + gdk_error_trap_pop (); + + g_return_val_if_fail (desc != NULL, NULL); +@@ -449,6 +434,10 @@ maybe_show_status_icon (GsdA11yKeyboardManager *manager) + show = gconf_client_get_bool (client, CONFIG_ROOT "/enable", NULL); + g_object_unref (client); + ++ if (!show && manager->priv->status_icon == NULL) ++ return; ++ ++ gsd_a11y_keyboard_manager_ensure_status_icon (manager); + gtk_status_icon_set_visible (manager->priv->status_icon, show); + } + +@@ -538,7 +527,7 @@ ax_slowkeys_warning_post_bubble (GsdA11yKeyboardManager *manager, + message = _("You just held down the Shift key for 8 seconds. This is the shortcut " + "for the Slow Keys feature, which affects the way your keyboard works."); + +- if (! gtk_status_icon_is_embedded (manager->priv->status_icon)) { ++ if (manager->priv->status_icon == NULL || ! gtk_status_icon_is_embedded (manager->priv->status_icon)) { + return FALSE; + } + +@@ -553,6 +542,7 @@ ax_slowkeys_warning_post_bubble (GsdA11yKeyboardManager *manager, + manager->priv->notification = NULL; + } + ++ gsd_a11y_keyboard_manager_ensure_status_icon (manager); + manager->priv->notification = notify_notification_new_with_status_icon (title, + message, + "preferences-desktop-accessibility", +@@ -681,7 +671,7 @@ ax_stickykeys_warning_post_bubble (GsdA11yKeyboardManager *manager, + _("You just pressed two keys at once, or pressed the Shift key 5 times in a row. " + "This turns off the Sticky Keys feature, which affects the way your keyboard works."); + +- if (! gtk_status_icon_is_embedded (manager->priv->status_icon)) { ++ if (manager->priv->status_icon == NULL || ! gtk_status_icon_is_embedded (manager->priv->status_icon)) { + return FALSE; + } + +@@ -696,6 +686,7 @@ ax_stickykeys_warning_post_bubble (GsdA11yKeyboardManager *manager, + manager->priv->notification = NULL; + } + ++ gsd_a11y_keyboard_manager_ensure_status_icon (manager); + manager->priv->notification = notify_notification_new_with_status_icon (title, + message, + "preferences-desktop-accessibility", +@@ -997,27 +988,21 @@ register_config_callback (GsdA11yKeyboardManager *manager, + GConfClientNotifyFunc func, + guint *notify) + { +- gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_NONE, NULL); ++ gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + *notify = gconf_client_notify_add (client, path, func, manager, NULL, NULL); + } + +-gboolean +-gsd_a11y_keyboard_manager_start (GsdA11yKeyboardManager *manager, +- GError **error) ++static gboolean ++start_a11y_keyboard_idle_cb (GsdA11yKeyboardManager *manager) + { + guint event_mask; + GConfClient *client; +- gboolean ret = FALSE; + + g_debug ("Starting a11y_keyboard manager"); + gnome_settings_profile_start (NULL); + +- if (!xkb_enabled (manager)) { +- g_set_error (error, GSD_KBD_A11Y_ERROR, +- GSD_KBD_A11Y_ERROR_NOT_AVAILABLE, +- "XKB functionality is disabled."); ++ if (!xkb_enabled (manager)) + goto out; +- } + + client = gconf_client_get_default (); + +@@ -1036,26 +1021,35 @@ gsd_a11y_keyboard_manager_start (GsdA11yKeyboardManager *manager, + set_server_from_gconf (manager, client); + g_object_unref (client); + +- gdk_error_trap_push (); + XkbSelectEvents (GDK_DISPLAY (), + XkbUseCoreKbd, + event_mask, + event_mask); + +- XSync (GDK_DISPLAY (), FALSE); +- gdk_error_trap_pop (); +- + gdk_window_add_filter (NULL, + (GdkFilterFunc) cb_xkb_event_filter, + manager); + + maybe_show_status_icon (manager); + +- ret = TRUE; +- + out: + gnome_settings_profile_end (NULL); +- return ret; ++ ++ return FALSE; ++} ++ ++ ++gboolean ++gsd_a11y_keyboard_manager_start (GsdA11yKeyboardManager *manager, ++ GError **error) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ g_idle_add ((GSourceFunc) start_a11y_keyboard_idle_cb, manager); ++ ++ gnome_settings_profile_end (NULL); ++ ++ return TRUE; + } + + void +@@ -1065,7 +1059,8 @@ gsd_a11y_keyboard_manager_stop (GsdA11yKeyboardManager *manager) + + g_debug ("Stopping a11y_keyboard manager"); + +- gtk_status_icon_set_visible (manager->priv->status_icon, FALSE); ++ if (manager->priv->status_icon) ++ gtk_status_icon_set_visible (manager->priv->status_icon, FALSE); + + if (p->gconf_notify != 0) { + GConfClient *client = gconf_client_get_default (); +@@ -1199,16 +1194,27 @@ on_status_icon_activate (GtkStatusIcon *status_icon, + } + + static void ++gsd_a11y_keyboard_manager_ensure_status_icon (GsdA11yKeyboardManager *manager) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ if (!manager->priv->status_icon) { ++ ++ manager->priv->status_icon = gtk_status_icon_new_from_icon_name ("preferences-desktop-accessibility"); ++ g_signal_connect (manager->priv->status_icon, ++ "activate", ++ G_CALLBACK (on_status_icon_activate), ++ manager); ++ } ++ ++ gnome_settings_profile_end (NULL); ++} ++ ++static void + gsd_a11y_keyboard_manager_init (GsdA11yKeyboardManager *manager) + { + manager->priv = GSD_A11Y_KEYBOARD_MANAGER_GET_PRIVATE (manager); + +- manager->priv->status_icon = gtk_status_icon_new_from_icon_name ("preferences-desktop-accessibility"); +- g_signal_connect (manager->priv->status_icon, +- "activate", +- G_CALLBACK (on_status_icon_activate), +- manager); +- + #ifdef HAVE_LIBNOTIFY + notify_init ("gnome-settings-daemon"); + #endif /* HAVE_LIBNOTIFY */ +diff --git a/plugins/clipboard/gsd-clipboard-manager.c b/plugins/clipboard/gsd-clipboard-manager.c +index 5f407df..f8cb7ec 100644 +--- a/plugins/clipboard/gsd-clipboard-manager.c ++++ b/plugins/clipboard/gsd-clipboard-manager.c +@@ -82,13 +82,6 @@ typedef struct + int offset; + } IncrConversion; + +-#define GSD_CLIPBOARD_ERROR gsd_clipboard_error_quark () +- +-enum { +- GSD_CLIPBOARD_ERROR_RUNNING, +- GSD_CLIPBOARD_ERROR_FAILED +-}; +- + static void gsd_clipboard_manager_class_init (GsdClipboardManagerClass *klass); + static void gsd_clipboard_manager_init (GsdClipboardManager *clipboard_manager); + static void gsd_clipboard_manager_finalize (GObject *object); +@@ -103,12 +96,6 @@ G_DEFINE_TYPE (GsdClipboardManager, gsd_clipboard_manager, G_TYPE_OBJECT) + + static gpointer manager_object = NULL; + +-static GQuark +-gsd_clipboard_error_quark (void) +-{ +- return g_quark_from_static_string ("gsd-clipboard-error-quark"); +-} +- + /* We need to use reference counting for the target data, since we may + * need to keep the data around after loosing the CLIPBOARD ownership + * to complete incremental transfers. +@@ -858,22 +845,19 @@ clipboard_manager_watch_cb (GsdClipboardManager *manager, + } + } + +-gboolean +-gsd_clipboard_manager_start (GsdClipboardManager *manager, +- GError **error) ++static gboolean ++start_clipboard_idle_cb (GsdClipboardManager *manager) + { + XClientMessageEvent xev; + +- g_debug ("Starting clipboard manager"); ++ + gnome_settings_profile_start (NULL); + + init_atoms (manager->priv->display); + + /* check if there is a clipboard manager running */ + if (XGetSelectionOwner (manager->priv->display, XA_CLIPBOARD_MANAGER)) { +- g_set_error (error, GSD_CLIPBOARD_ERROR, +- GSD_CLIPBOARD_ERROR_RUNNING, +- "Clipboard manager is already running."); ++ g_warning ("Clipboard manager is already running."); + return FALSE; + } + +@@ -929,15 +913,23 @@ gsd_clipboard_manager_start (GsdClipboardManager *manager, + 0, + NULL); + /* FIXME: manager->priv->terminate (manager->priv->cb_data); */ +- +- g_set_error (error, GSD_CLIPBOARD_ERROR, +- GSD_CLIPBOARD_ERROR_FAILED, +- "Failed to claim selection."); +- return FALSE; + } + + gnome_settings_profile_end (NULL); + ++ return FALSE; ++} ++ ++gboolean ++gsd_clipboard_manager_start (GsdClipboardManager *manager, ++ GError **error) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ g_idle_add ((GSourceFunc) start_clipboard_idle_cb, manager); ++ ++ gnome_settings_profile_end (NULL); ++ + return TRUE; + } + +diff --git a/plugins/common/gsd-keygrab.c b/plugins/common/gsd-keygrab.c +index 6f47b36..cdb7605 100644 +--- a/plugins/common/gsd-keygrab.c ++++ b/plugins/common/gsd-keygrab.c +@@ -42,7 +42,7 @@ static GdkModifierType gsd_ignored_mods = 0; + static GdkModifierType gsd_used_mods = 0; + + static void +-setup_modifiers () ++setup_modifiers (void) + { + if (gsd_used_mods == 0 || gsd_ignored_mods == 0) { + GdkModifierType dynmods; +@@ -67,13 +67,12 @@ setup_modifiers () + } + } + +-static gboolean ++static void + grab_key_real (guint keycode, + GdkWindow *root, + gboolean grab, + int mask) + { +- gdk_error_trap_push (); + if (grab) { + XGrabKey (GDK_DISPLAY (), + keycode, +@@ -88,21 +87,33 @@ grab_key_real (guint keycode, + mask, + GDK_WINDOW_XID (root)); + } +- +- gdk_flush (); +- return gdk_error_trap_pop () == 0; + } + + /* Grab the key. In order to ignore GSD_IGNORED_MODS we need to grab + * all combinations of the ignored modifiers and those actually used + * for the binding (if any). + * +- * inspired by all_combinations from gnome-panel/gnome-panel/global-keys.c */ ++ * inspired by all_combinations from gnome-panel/gnome-panel/global-keys.c ++ * ++ * This may generate X errors. The correct way to use this is like: ++ * ++ * gdk_error_trap_push (); ++ * ++ * grab_key_unsafe (key, grab, screens); ++ * ++ * gdk_flush (); ++ * if (gdk_error_trap_pop ()) ++ * g_warning ("Grab failed, another application may already have access to key '%u'", ++ * key->keycode); ++ * ++ * This is not done in the function itself, to allow doing multiple grab_key ++ * operations with one flush only. ++ */ + #define N_BITS 32 + void +-grab_key (Key *key, +- gboolean grab, +- GSList *screens) ++grab_key_unsafe (Key *key, ++ gboolean grab, ++ GSList *screens) + { + int indexes[N_BITS]; /* indexes of bits we need to flip */ + int i; +@@ -141,14 +152,10 @@ grab_key (Key *key, + + for (l = screens; l; l = l->next) { + GdkScreen *screen = l->data; +- if (!grab_key_real (key->keycode, +- gdk_screen_get_root_window (screen), +- grab, +- result | key->state)) { +- g_warning ("Grab failed, another application may already have access to key '%u'", +- key->keycode); +- return; +- } ++ grab_key_real (key->keycode, ++ gdk_screen_get_root_window (screen), ++ grab, ++ result | key->state); + } + } + } +@@ -162,7 +169,6 @@ have_xkb (Display *dpy) + #ifdef HAVE_X11_EXTENSIONS_XKB_H + int opcode, error_base, major, minor, xkb_event_base; + +- gdk_error_trap_push (); + have_xkb = XkbQueryExtension (dpy, + &opcode, + &xkb_event_base, +@@ -170,7 +176,6 @@ have_xkb (Display *dpy) + &major, + &minor) + && XkbUseExtension (dpy, &major, &minor); +- gdk_error_trap_pop (); + #else + have_xkb = 0; + #endif +diff --git a/plugins/common/gsd-keygrab.h b/plugins/common/gsd-keygrab.h +index 6dde2a0..035aee8 100644 +--- a/plugins/common/gsd-keygrab.h ++++ b/plugins/common/gsd-keygrab.h +@@ -32,7 +32,7 @@ typedef struct { + } Key; + + +-void grab_key (Key *key, ++void grab_key_unsafe (Key *key, + gboolean grab, + GSList *screens); + +diff --git a/plugins/font/gsd-font-manager.c b/plugins/font/gsd-font-manager.c +index bb2fd28..7b6ce89 100644 +--- a/plugins/font/gsd-font-manager.c ++++ b/plugins/font/gsd-font-manager.c +@@ -78,6 +78,7 @@ child_watch_cb (GPid pid, + { + char *command = user_data; + ++ gnome_settings_profile_end ("%s", command); + if (!WIFEXITED (status) || WEXITSTATUS (status)) { + g_warning ("Command %s failed", command); + } +@@ -100,6 +101,7 @@ spawn_with_input (const char *command, + return; + } + ++ gnome_settings_profile_start ("%s", command); + error = NULL; + res = g_spawn_async_with_pipes (NULL, + argv, +@@ -177,134 +179,185 @@ load_xcursor_theme (GConfClient *client) + gnome_settings_profile_end (NULL); + } + +-static void +-load_cursor (GConfClient *client) ++static char* ++setup_dir (const char *font_dir_name, gboolean create) + { +- DIR *dir; +- char *font_dir_name; +- char *dir_name; +- struct dirent *file_dirent; +- char *cursor_font; +- char **font_path; +- char **new_font_path; +- int n_fonts; +- int new_n_fonts; +- int i; +- char *mkfontdir_cmd; ++ char *font_dir; + +- gnome_settings_profile_start (NULL); ++ font_dir = g_build_path (G_DIR_SEPARATOR_S, g_get_home_dir (), ".gnome2", "share", font_dir_name, NULL); + +- /* setting up the dir */ +- font_dir_name = g_build_path (G_DIR_SEPARATOR_S, g_get_home_dir (), ".gnome2/share/fonts", NULL); +- if (! g_file_test (font_dir_name, G_FILE_TEST_EXISTS)) { +- if (g_mkdir_with_parents (font_dir_name, 0755) != 0) { +- GtkWidget *dialog; +- +- dialog = gtk_message_dialog_new (NULL, +- 0, +- GTK_MESSAGE_ERROR, +- GTK_BUTTONS_CLOSE, +- _("Cannot create the directory \"%s\".\n"\ +- "This is needed to allow changing the mouse pointer theme."), +- font_dir_name); +- g_signal_connect (dialog, +- "response", +- G_CALLBACK (gtk_widget_destroy), +- NULL); +- gnome_settings_delayed_show_dialog (dialog); +- g_free (font_dir_name); +- +- return; ++ if (create) { ++ if (g_mkdir_with_parents (font_dir, 0755) != 0) { ++ g_warning ("Cannot create needed directory \"%s\".", font_dir); ++ g_free (font_dir); ++ font_dir = NULL; + } ++ } else if (! g_file_test (font_dir, G_FILE_TEST_EXISTS)) { ++ g_free (font_dir); ++ font_dir = NULL; + } + +- dir_name = g_build_path (G_DIR_SEPARATOR_S, g_get_home_dir (), ".gnome2/share/cursor-fonts", NULL); +- if (! g_file_test (dir_name, G_FILE_TEST_EXISTS)) { +- if (g_mkdir_with_parents (dir_name, 0755) != 0) { +- GtkWidget *dialog; +- +- dialog = gtk_message_dialog_new (NULL, +- 0, +- GTK_MESSAGE_ERROR, +- GTK_BUTTONS_CLOSE, +- (_("Cannot create the directory \"%s\".\n"\ +- "This is needed to allow changing cursors.")), +- dir_name); +- g_signal_connect (dialog, "response", +- G_CALLBACK (gtk_widget_destroy), NULL); +- gnome_settings_delayed_show_dialog (dialog); +- g_free (dir_name); +- +- return; +- } +- } ++ return font_dir; ++} + +- dir = opendir (dir_name); ++static char * ++empty_check_dir (char *font_dir) ++{ ++ char *file_name; + +- while ((file_dirent = readdir (dir)) != NULL) { +- struct stat st; +- char *link_name; ++ if (!font_dir) ++ return NULL; + +- link_name = g_build_filename (dir_name, file_dirent->d_name, NULL); +- if (lstat (link_name, &st)) { +- g_free (link_name); +- continue; +- } +- g_free (link_name); ++ /* remove the fonts.dir and fonts.scale files that mkfontdir generates. */ + +- if (S_ISLNK (st.st_mode)) +- unlink (link_name); ++ file_name = g_build_filename (G_DIR_SEPARATOR_S, font_dir, "fonts.dir", NULL); ++ unlink (file_name); ++ g_free (file_name); ++ ++ file_name = g_build_filename (G_DIR_SEPARATOR_S, font_dir, "fonts.scale", NULL); ++ unlink (file_name); ++ g_free (file_name); ++ ++ /* if it's empty, get rid of it. */ ++ if (0 == rmdir (font_dir)) { ++ g_free (font_dir); ++ font_dir = NULL; + } + +- closedir (dir); ++ return font_dir; ++} ++ ++static char* ++setup_font_dir (GConfClient *client) ++{ ++ return empty_check_dir (setup_dir ("fonts", FALSE)); ++} ++ ++static char* ++setup_cursor_dir (GConfClient *client) ++{ ++ char *cursor_dir; ++ char *cursor_font; ++ DIR *dir; ++ struct dirent *file_dirent; + + cursor_font = gconf_client_get_string (client, + "/desktop/gnome/peripherals/mouse/cursor_font", + NULL); ++ if (cursor_font != NULL) { ++ if (!g_path_is_absolute (cursor_font) || ++ !g_file_test (cursor_font, G_FILE_TEST_IS_REGULAR)) { ++ /* font file is not usable */ ++ g_free (cursor_font); ++ cursor_font = NULL; ++ } ++ } ++ ++ cursor_dir = setup_dir ("cursor-fonts", cursor_font != NULL); ++ ++ /* remove previously made symlinks, if any */ ++ if (cursor_dir) { ++ dir = opendir (cursor_dir); ++ while ((file_dirent = readdir (dir)) != NULL) { ++ struct stat st; ++ char *link_name; ++ ++ link_name = g_build_filename (cursor_dir, file_dirent->d_name, NULL); ++ if (lstat (link_name, &st)) { ++ g_free (link_name); ++ continue; ++ } ++ g_free (link_name); + +- if ((cursor_font != NULL) && +- (g_file_test (cursor_font, G_FILE_TEST_IS_REGULAR)) && +- (g_path_is_absolute (cursor_font))) { ++ if (S_ISLNK (st.st_mode)) ++ unlink (link_name); ++ } ++ closedir (dir); ++ } ++ ++ if (cursor_font && cursor_dir) { + char *newpath; + char *font_name; + + font_name = strrchr (cursor_font, G_DIR_SEPARATOR); +- newpath = g_build_filename (dir_name, font_name, NULL); ++ newpath = g_build_filename (cursor_dir, font_name, NULL); + symlink (cursor_font, newpath); + g_free (newpath); ++ g_free (cursor_font); ++ cursor_font = NULL; ++ } else { ++ cursor_dir = empty_check_dir (cursor_dir); + } +- g_free (cursor_font); ++ ++ return cursor_dir; ++} ++ ++static void ++load_font_paths (GConfClient *client) ++{ ++ char *font_dir_name; ++ char *cursor_dir_name; ++ ++ char **font_path; ++ char **new_font_path; ++ int n_fonts; ++ int new_n_fonts; ++ ++ int i; ++ ++ const char *argv[4]; ++ int argc = 0; ++ ++ gnome_settings_profile_start (NULL); ++ ++ font_dir_name = setup_font_dir (client); ++ cursor_dir_name = setup_cursor_dir (client); ++ ++ if (font_dir_name == NULL && cursor_dir_name == NULL) ++ goto done; + + /* run mkfontdir */ +- mkfontdir_cmd = g_strdup_printf ("mkfontdir %s %s", dir_name, font_dir_name); +- /* maybe check for error... +- * also, it's not going to like that if there are spaces in dir_name/font_dir_name. +- */ +- g_spawn_command_line_sync (mkfontdir_cmd, NULL, NULL, NULL, NULL); +- g_free (mkfontdir_cmd); ++ argv[argc++] = "mkfontdir"; ++ if (font_dir_name) ++ argv[argc++] = font_dir_name; ++ if (cursor_dir_name) ++ argv[argc++] = cursor_dir_name; ++ argv[argc] = NULL; ++ g_spawn_sync (NULL, /* current dir */ ++ (char **) (void *) argv, NULL /* envp */, ++ G_SPAWN_SEARCH_PATH, ++ NULL, NULL, /* child_setup */ ++ NULL, NULL, NULL, NULL); + + /* Set the font path */ + font_path = XGetFontPath (gdk_x11_get_default_xdisplay (), &n_fonts); + new_n_fonts = n_fonts; +- if (n_fonts == 0 || strcmp (font_path[0], dir_name)) ++ if (cursor_dir_name && (n_fonts == 0 || strcmp (font_path[0], cursor_dir_name))) + new_n_fonts++; +- if (n_fonts == 0 || strcmp (font_path[n_fonts-1], font_dir_name)) ++ if (font_dir_name && (n_fonts == 0 || strcmp (font_path[n_fonts-1], font_dir_name))) + new_n_fonts++; + +- new_font_path = g_new0 (char *, new_n_fonts); +- if (n_fonts == 0 || strcmp (font_path[0], dir_name)) { +- new_font_path[0] = dir_name; +- for (i = 0; i < n_fonts; i++) +- new_font_path [i+1] = font_path [i]; +- } else { +- for (i = 0; i < n_fonts; i++) +- new_font_path [i] = font_path [i]; +- } ++ if (new_n_fonts == n_fonts) ++ new_font_path = font_path; ++ else { ++ new_font_path = g_new0 (char *, new_n_fonts); ++ ++ if (cursor_dir_name && (n_fonts == 0 || strcmp (font_path[0], cursor_dir_name))) { ++ new_font_path[0] = cursor_dir_name; ++ for (i = 0; i < n_fonts; i++) ++ new_font_path [i+1] = font_path [i]; ++ } else { ++ for (i = 0; i < n_fonts; i++) ++ new_font_path [i] = font_path [i]; ++ } + +- if (n_fonts == 0 || strcmp (font_path[n_fonts-1], font_dir_name)) { +- new_font_path[new_n_fonts-1] = font_dir_name; ++ if (font_dir_name && (n_fonts == 0 || strcmp (font_path[n_fonts-1], font_dir_name))) { ++ new_font_path[new_n_fonts-1] = font_dir_name; ++ } + } + ++ /* We set font path even if it was not changed, to enforce dropping ++ * caches in the server */ + gdk_error_trap_push (); + XSetFontPath (gdk_display, new_font_path, new_n_fonts); + gdk_flush (); +@@ -314,13 +367,16 @@ load_cursor (GConfClient *client) + XSetFontPath (gdk_display, font_path, n_fonts); + } + ++ g_free (font_dir_name); ++ g_free (cursor_dir_name); ++ ++ if (new_font_path != font_path) ++ g_free (new_font_path); ++ + XFreeFontPath (font_path); + ++done: + gnome_settings_profile_end (NULL); +- +- g_free (new_font_path); +- g_free (font_dir_name); +- g_free (dir_name); + } + + gboolean +@@ -335,7 +391,7 @@ gsd_font_manager_start (GsdFontManager *manager, + client = gconf_client_get_default (); + + load_xcursor_theme (client); +- load_cursor (client); ++ load_font_paths (client); + + g_object_unref (client); + +diff --git a/plugins/keybindings/gsd-keybindings-manager.c b/plugins/keybindings/gsd-keybindings-manager.c +index 509a721..9c75b3b 100644 +--- a/plugins/keybindings/gsd-keybindings-manager.c ++++ b/plugins/keybindings/gsd-keybindings-manager.c +@@ -255,6 +255,7 @@ static void + binding_register_keys (GsdKeybindingsManager *manager) + { + GSList *li; ++ gboolean need_flush = FALSE; + + gdk_error_trap_push (); + +@@ -266,10 +267,11 @@ binding_register_keys (GsdKeybindingsManager *manager) + binding->previous_key.state != binding->key.state) { + /* Ungrab key if it changed and not clashing with previously set binding */ + if (! key_already_used (manager, binding)) { ++ need_flush = TRUE; + if (binding->previous_key.keycode) { +- grab_key (&binding->previous_key, FALSE, manager->priv->screens); ++ grab_key_unsafe (&binding->previous_key, FALSE, manager->priv->screens); + } +- grab_key (&binding->key, TRUE, manager->priv->screens); ++ grab_key_unsafe (&binding->key, TRUE, manager->priv->screens); + + binding->previous_key.keysym = binding->key.keysym; + binding->previous_key.state = binding->key.state; +@@ -278,8 +280,11 @@ binding_register_keys (GsdKeybindingsManager *manager) + g_warning ("Key binding (%s) is already in use", binding->binding_str); + } + } +- gdk_flush (); +- gdk_error_trap_pop (); ++ ++ if (need_flush) ++ gdk_flush (); ++ if (gdk_error_trap_pop ()) ++ g_warning ("Grab failed for some keys, another application may already have access the them."); + } + + extern char **environ; +@@ -453,7 +458,7 @@ register_config_callback (GsdKeybindingsManager *manager, + const char *path, + GConfClientNotifyFunc func) + { +- gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_NONE, NULL); ++ gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + return gconf_client_notify_add (client, path, func, manager, NULL, NULL); + } + +@@ -472,6 +477,13 @@ gsd_keybindings_manager_start (GsdKeybindingsManager *manager, + g_debug ("Starting keybindings manager"); + gnome_settings_profile_start (NULL); + ++ client = gconf_client_get_default (); ++ ++ manager->priv->notify = register_config_callback (manager, ++ client, ++ GCONF_BINDING_DIR, ++ (GConfClientNotifyFunc) bindings_callback); ++ + dpy = gdk_display_get_default (); + screen_num = gdk_display_get_n_screens (dpy); + +@@ -482,13 +494,6 @@ gsd_keybindings_manager_start (GsdKeybindingsManager *manager, + manager); + } + +- client = gconf_client_get_default (); +- +- manager->priv->notify = register_config_callback (manager, +- client, +- GCONF_BINDING_DIR, +- (GConfClientNotifyFunc) bindings_callback); +- + list = gconf_client_all_dirs (client, GCONF_BINDING_DIR, NULL); + manager->priv->screens = get_screens_list (); + +diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c +index 2f08ec1..ae01b0b 100644 +--- a/plugins/keyboard/gsd-keyboard-manager.c ++++ b/plugins/keyboard/gsd-keyboard-manager.c +@@ -59,16 +59,16 @@ + + #define GSD_KEYBOARD_KEY "/desktop/gnome/peripherals/keyboard" + +-#define KEY_REPEAT "/desktop/gnome/peripherals/keyboard/repeat" +-#define KEY_CLICK "/desktop/gnome/peripherals/keyboard/click" +-#define KEY_RATE "/desktop/gnome/peripherals/keyboard/rate" +-#define KEY_DELAY "/desktop/gnome/peripherals/keyboard/delay" +-#define KEY_CLICK_VOLUME "/desktop/gnome/peripherals/keyboard/click_volume" ++#define KEY_REPEAT GSD_KEYBOARD_KEY "/repeat" ++#define KEY_CLICK GSD_KEYBOARD_KEY "/click" ++#define KEY_RATE GSD_KEYBOARD_KEY "/rate" ++#define KEY_DELAY GSD_KEYBOARD_KEY "/delay" ++#define KEY_CLICK_VOLUME GSD_KEYBOARD_KEY "/click_volume" + +-#define KEY_BELL_VOLUME "/desktop/gnome/peripherals/keyboard/bell_volume" +-#define KEY_BELL_PITCH "/desktop/gnome/peripherals/keyboard/bell_pitch" +-#define KEY_BELL_DURATION "/desktop/gnome/peripherals/keyboard/bell_duration" +-#define KEY_BELL_MODE "/desktop/gnome/peripherals/keyboard/bell_mode" ++#define KEY_BELL_VOLUME GSD_KEYBOARD_KEY "/bell_volume" ++#define KEY_BELL_PITCH GSD_KEYBOARD_KEY "/bell_pitch" ++#define KEY_BELL_DURATION GSD_KEYBOARD_KEY "/bell_duration" ++#define KEY_BELL_MODE GSD_KEYBOARD_KEY "/bell_mode" + + struct GsdKeyboardManagerPrivate + { +@@ -165,7 +165,6 @@ numlock_xkb_init (GsdKeyboardManager *manager) + gboolean have_xkb; + int opcode, error_base, major, minor; + +- gdk_error_trap_push (); + have_xkb = XkbQueryExtension (dpy, + &opcode, + &manager->priv->xkb_event_base, +@@ -184,9 +183,6 @@ numlock_xkb_init (GsdKeyboardManager *manager) + g_warning ("XKB extension not available"); + } + +- XSync (dpy, FALSE); +- gdk_error_trap_pop (); +- + manager->priv->have_xkb = have_xkb; + } + +@@ -374,19 +370,8 @@ apply_settings (GConfClient *client, + gdk_error_trap_pop (); + } + +-static guint +-register_config_callback (GsdKeyboardManager *manager, +- GConfClient *client, +- const char *path, +- GConfClientNotifyFunc func) +-{ +- gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_NONE, NULL); +- return gconf_client_notify_add (client, path, func, manager, NULL, NULL); +-} +- +-gboolean +-gsd_keyboard_manager_start (GsdKeyboardManager *manager, +- GError **error) ++static gboolean ++start_keyboard_idle_cb (GsdKeyboardManager *manager) + { + GConfClient *client; + +@@ -397,6 +382,8 @@ gsd_keyboard_manager_start (GsdKeyboardManager *manager, + manager->priv->have_xkb = 0; + client = gconf_client_get_default (); + ++ gconf_client_add_dir (client, GSD_KEYBOARD_KEY, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ + /* Essential - xkb initialization should happen before */ + gsd_keyboard_xkb_set_post_activation_callback ((PostActivationCallback) gsd_load_modmap_files, NULL); + gsd_keyboard_xkb_init (client); +@@ -408,10 +395,9 @@ gsd_keyboard_manager_start (GsdKeyboardManager *manager, + /* apply current settings before we install the callback */ + apply_settings (client, 0, NULL, manager); + +- manager->priv->notify = register_config_callback (manager, +- client, +- GSD_KEYBOARD_KEY, +- (GConfClientNotifyFunc) apply_settings); ++ manager->priv->notify = gconf_client_notify_add (client, GSD_KEYBOARD_KEY, ++ (GConfClientNotifyFunc) apply_settings, manager, ++ NULL, NULL); + + g_object_unref (client); + +@@ -421,6 +407,19 @@ gsd_keyboard_manager_start (GsdKeyboardManager *manager, + + gnome_settings_profile_end (NULL); + ++ return FALSE; ++} ++ ++gboolean ++gsd_keyboard_manager_start (GsdKeyboardManager *manager, ++ GError **error) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ g_idle_add ((GSourceFunc) start_keyboard_idle_cb, manager); ++ ++ gnome_settings_profile_end (NULL); ++ + return TRUE; + } + +diff --git a/plugins/keyboard/gsd-keyboard-xkb.c b/plugins/keyboard/gsd-keyboard-xkb.c +index 037f606..04608e2 100644 +--- a/plugins/keyboard/gsd-keyboard-xkb.c ++++ b/plugins/keyboard/gsd-keyboard-xkb.c +@@ -37,6 +37,7 @@ + #include "gsd-xmodmap.h" + #include "gsd-keyboard-xkb.h" + #include "delayed-dialog.h" ++#include "gnome-settings-profile.h" + + static XklEngine *xkl_engine; + +@@ -338,19 +339,22 @@ register_config_callback (GConfClient *client, + const char *path, + GConfClientNotifyFunc func) + { +- gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_NONE, NULL); ++ gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + return gconf_client_notify_add (client, path, func, NULL, NULL, NULL); + } + + void + gsd_keyboard_xkb_init (GConfClient *client) + { ++ gnome_settings_profile_start (NULL); + #ifdef GSDKX + xkl_set_debug_level (200); + logfile = fopen ("/tmp/gsdkx.log", "a"); + xkl_set_log_appender (gsd_keyboard_log_appender); + #endif ++ gnome_settings_profile_start ("xkl_engine_get_instance"); + xkl_engine = xkl_engine_get_instance (GDK_DISPLAY ()); ++ gnome_settings_profile_end ("xkl_engine_get_instance"); + if (xkl_engine) { + inited_ok = TRUE; + +@@ -364,7 +368,9 @@ gsd_keyboard_xkb_init (GConfClient *client) + xkl_engine); + xkl_engine_backup_names_prop (xkl_engine); + gsd_keyboard_xkb_analyze_sysconfig (); ++ gnome_settings_profile_start ("gsd_keyboard_xkb_chk_lcl_xmm"); + gsd_keyboard_xkb_chk_lcl_xmm (); ++ gnome_settings_profile_end ("gsd_keyboard_xkb_chk_lcl_xmm"); + + notify_desktop = + register_config_callback (client, +@@ -379,13 +385,21 @@ gsd_keyboard_xkb_init (GConfClient *client) + gdk_window_add_filter (NULL, (GdkFilterFunc) + gsd_keyboard_xkb_evt_filter, + NULL); ++ ++ gnome_settings_profile_start ("xkl_engine_start_listen"); + xkl_engine_start_listen (xkl_engine, + XKLL_MANAGE_LAYOUTS | + XKLL_MANAGE_WINDOW_STATES); ++ gnome_settings_profile_end ("xkl_engine_start_listen"); + ++ gnome_settings_profile_start ("apply_settings"); + apply_settings (); ++ gnome_settings_profile_end ("apply_settings"); ++ gnome_settings_profile_start ("apply_xkb_settings"); + apply_xkb_settings (); ++ gnome_settings_profile_end ("apply_xkb_settings"); + } ++ gnome_settings_profile_end (NULL); + } + + void +diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c +index a31cc61..964c95f 100644 +--- a/plugins/media-keys/gsd-media-keys-manager.c ++++ b/plugins/media-keys/gsd-media-keys-manager.c +@@ -276,9 +276,12 @@ update_kbd_cb (GConfClient *client, + GsdMediaKeysManager *manager) + { + int i; ++ gboolean need_flush = TRUE; + + g_return_if_fail (entry->key != NULL); + ++ gdk_error_trap_push (); ++ + /* Find the key that was modified */ + for (i = 0; i < HANDLED_KEYS; i++) { + if (strcmp (entry->key, keys[i].gconf_key) == 0) { +@@ -286,7 +289,8 @@ update_kbd_cb (GConfClient *client, + Key *key; + + if (keys[i].key != NULL) { +- grab_key (keys[i].key, FALSE, manager->priv->screens); ++ need_flush = TRUE; ++ grab_key_unsafe (keys[i].key, FALSE, manager->priv->screens); + } + + g_free (keys[i].key); +@@ -308,7 +312,8 @@ update_kbd_cb (GConfClient *client, + break; + } + +- grab_key (key, TRUE, manager->priv->screens); ++ need_flush = TRUE; ++ grab_key_unsafe (key, TRUE, manager->priv->screens); + keys[i].key = key; + + g_free (tmp); +@@ -316,15 +321,23 @@ update_kbd_cb (GConfClient *client, + break; + } + } ++ ++ if (need_flush) ++ gdk_flush (); ++ if (gdk_error_trap_pop ()) ++ g_warning ("Grab failed for some keys, another application may already have access the them."); + } + + static void + init_kbd (GsdMediaKeysManager *manager) + { + int i; ++ gboolean need_flush = FALSE; + + gnome_settings_profile_start (NULL); + ++ gdk_error_trap_push (); ++ + for (i = 0; i < HANDLED_KEYS; i++) { + char *tmp; + Key *key; +@@ -340,6 +353,7 @@ init_kbd (GsdMediaKeysManager *manager) + tmp = gconf_client_get_string (manager->priv->conf_client, + keys[i].gconf_key, + NULL); ++ + if (!is_valid_shortcut (tmp)) { + g_debug ("Not a valid shortcut: '%s'", tmp); + g_free (tmp); +@@ -367,9 +381,15 @@ init_kbd (GsdMediaKeysManager *manager) + + keys[i].key = key; + +- grab_key (key, TRUE, manager->priv->screens); ++ need_flush = TRUE; ++ grab_key_unsafe (key, TRUE, manager->priv->screens); + } + ++ if (need_flush) ++ gdk_flush (); ++ if (gdk_error_trap_pop ()) ++ g_warning ("Grab failed for some keys, another application may already have access the them."); ++ + gnome_settings_profile_end (NULL); + } + +@@ -894,9 +914,8 @@ acme_filter_events (GdkXEvent *xevent, + return GDK_FILTER_CONTINUE; + } + +-gboolean +-gsd_media_keys_manager_start (GsdMediaKeysManager *manager, +- GError **error) ++static gboolean ++start_media_keys_idle_cb (GsdMediaKeysManager *manager) + { + GSList *l; + +@@ -912,11 +931,6 @@ gsd_media_keys_manager_start (GsdMediaKeysManager *manager, + init_screens (manager); + init_kbd (manager); + +- /* initialise Volume handler */ +- gnome_settings_profile_start ("acme_volume_new"); +- manager->priv->volume = acme_volume_new (); +- gnome_settings_profile_end ("acme_volume_new"); +- + /* Start filtering the events */ + for (l = manager->priv->screens; l != NULL; l = l->next) { + gnome_settings_profile_start ("gdk_window_add_filter"); +@@ -932,6 +946,29 @@ gsd_media_keys_manager_start (GsdMediaKeysManager *manager, + + gnome_settings_profile_end (NULL); + ++ return FALSE; ++} ++ ++gboolean ++gsd_media_keys_manager_start (GsdMediaKeysManager *manager, ++ GError **error) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ /* initialise Volume handler ++ * ++ * We do this one here to force checking gstreamer cache, etc. ++ * The rest (grabbing and setting the keys) can happen in an ++ * idle. ++ */ ++ gnome_settings_profile_start ("acme_volume_new"); ++ manager->priv->volume = acme_volume_new (); ++ gnome_settings_profile_end ("acme_volume_new"); ++ ++ g_idle_add ((GSourceFunc) start_media_keys_idle_cb, manager); ++ ++ gnome_settings_profile_end (NULL); ++ + return TRUE; + } + +diff --git a/plugins/mouse/gsd-mouse-manager.c b/plugins/mouse/gsd-mouse-manager.c +index 8e930eb..3280cfe 100644 +--- a/plugins/mouse/gsd-mouse-manager.c ++++ b/plugins/mouse/gsd-mouse-manager.c +@@ -55,17 +55,19 @@ + #define GCONF_MOUSE_DIR "/desktop/gnome/peripherals/mouse" + #define GCONF_MOUSE_A11Y_DIR "/desktop/gnome/accessibility/mouse" + +-#define KEY_LEFT_HANDED "/desktop/gnome/peripherals/mouse/left_handed" +-#define KEY_MOTION_ACCELERATION "/desktop/gnome/peripherals/mouse/motion_acceleration" +-#define KEY_MOTION_THRESHOLD "/desktop/gnome/peripherals/mouse/motion_threshold" +-#define KEY_LOCATE_POINTER "/desktop/gnome/peripherals/mouse/locate_pointer" +-#define KEY_DWELL_ENABLE "/desktop/gnome/accessibility/mouse/dwell_enable" +-#define KEY_DELAY_ENABLE "/desktop/gnome/accessibility/mouse/delay_enable" ++#define KEY_LEFT_HANDED GCONF_MOUSE_DIR "/left_handed" ++#define KEY_MOTION_ACCELERATION GCONF_MOUSE_DIR "/motion_acceleration" ++#define KEY_MOTION_THRESHOLD GCONF_MOUSE_DIR "/motion_threshold" ++#define KEY_LOCATE_POINTER GCONF_MOUSE_DIR "/locate_pointer" ++#define KEY_DWELL_ENABLE GCONF_MOUSE_A11Y_DIR "/dwell_enable" ++#define KEY_DELAY_ENABLE GCONF_MOUSE_A11Y_DIR "/delay_enable" + + struct GsdMouseManagerPrivate + { + guint notify; + guint notify_a11y; ++ ++ gboolean mousetweaks_daemon_running; + }; + + static void gsd_mouse_manager_class_init (GsdMouseManagerClass *klass); +@@ -583,9 +585,17 @@ set_mousetweaks_daemon (GsdMouseManager *manager, + { + GError *error = NULL; + gchar *comm; ++ gboolean run_daemon = dwell_enable || delay_enable; ++ ++ if (run_daemon || manager->priv->mousetweaks_daemon_running) ++ comm = g_strdup_printf ("mousetweaks %s", ++ run_daemon ? "" : "-s"); ++ else ++ return; ++ ++ if (run_daemon) ++ manager->priv->mousetweaks_daemon_running = TRUE; + +- comm = g_strdup_printf ("mousetweaks %s", +- (dwell_enable || delay_enable) ? "" : "-s"); + + if (! g_spawn_command_line_async (comm, &error)) { + if (error->code == G_SPAWN_ERROR_NOENT && +@@ -678,7 +688,7 @@ register_config_callback (GsdMouseManager *manager, + const char *path, + GConfClientNotifyFunc func) + { +- gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_NONE, NULL); ++ gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + return gconf_client_notify_add (client, path, func, manager, NULL, NULL); + } + +@@ -688,13 +698,11 @@ gsd_mouse_manager_init (GsdMouseManager *manager) + manager->priv = GSD_MOUSE_MANAGER_GET_PRIVATE (manager); + } + +-gboolean +-gsd_mouse_manager_start (GsdMouseManager *manager, +- GError **error) ++static gboolean ++gsd_mouse_manager_idle_cb (GsdMouseManager *manager) + { + GConfClient *client; + +- g_debug ("Starting mouse manager"); + gnome_settings_profile_start (NULL); + + client = gconf_client_get_default (); +@@ -723,6 +731,19 @@ gsd_mouse_manager_start (GsdMouseManager *manager, + + gnome_settings_profile_end (NULL); + ++ return FALSE; ++} ++ ++gboolean ++gsd_mouse_manager_start (GsdMouseManager *manager, ++ GError **error) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ g_idle_add ((GSourceFunc) gsd_mouse_manager_idle_cb, manager); ++ ++ gnome_settings_profile_end (NULL); ++ + return TRUE; + } + +diff --git a/plugins/typing-break/gsd-typing-break-manager.c b/plugins/typing-break/gsd-typing-break-manager.c +index d71d5c3..8d3a111 100644 +--- a/plugins/typing-break/gsd-typing-break-manager.c ++++ b/plugins/typing-break/gsd-typing-break-manager.c +@@ -61,16 +61,6 @@ G_DEFINE_TYPE (GsdTypingBreakManager, gsd_typing_break_manager, G_TYPE_OBJECT) + + static gpointer manager_object = NULL; + +-static guint +-register_config_callback (GsdTypingBreakManager *manager, +- GConfClient *client, +- const char *path, +- GConfClientNotifyFunc func) +-{ +- gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_NONE, NULL); +- return gconf_client_notify_add (client, path, func, manager, NULL, NULL); +-} +- + static gboolean + typing_break_timeout (GsdTypingBreakManager *manager) + { +@@ -178,13 +168,14 @@ gsd_typing_break_manager_start (GsdTypingBreakManager *manager, + + client = gconf_client_get_default (); + ++ gconf_client_add_dir (client, GCONF_BREAK_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + manager->priv->notify = +- register_config_callback (manager, +- client, +- GCONF_BREAK_DIR, +- (GConfClientNotifyFunc) typing_break_callback); ++ gconf_client_notify_add (client, ++ GCONF_BREAK_DIR, ++ (GConfClientNotifyFunc) typing_break_callback, manager, ++ NULL, NULL); + +- enabled = gconf_client_get_bool (client, "/desktop/gnome/typing_break/enabled", NULL); ++ enabled = gconf_client_get_bool (client, GCONF_BREAK_DIR "/enabled", NULL); + g_object_unref (client); + if (enabled) { + manager->priv->setup_id = +diff --git a/plugins/xrandr/gsd-xrandr-manager.c b/plugins/xrandr/gsd-xrandr-manager.c +index da7dbbe..1db5106 100644 +--- a/plugins/xrandr/gsd-xrandr-manager.c ++++ b/plugins/xrandr/gsd-xrandr-manager.c +@@ -692,6 +692,7 @@ gsd_xrandr_manager_start (GsdXrandrManager *manager, + GError **error) + { + g_debug ("Starting xrandr manager"); ++ gnome_settings_profile_start (NULL); + + manager->priv->rw_screen = gnome_rr_screen_new ( + gdk_screen_get_default (), on_randr_event, manager); +@@ -707,7 +708,7 @@ gsd_xrandr_manager_start (GsdXrandrManager *manager, + g_assert (manager->priv->notify_id == 0); + + gconf_client_add_dir (manager->priv->client, CONF_DIR, +- GCONF_CLIENT_PRELOAD_NONE, ++ GCONF_CLIENT_PRELOAD_ONELEVEL, + NULL); + + manager->priv->notify_id = +@@ -745,6 +746,8 @@ gsd_xrandr_manager_start (GsdXrandrManager *manager, + + start_or_stop_icon (manager); + ++ gnome_settings_profile_end (NULL); ++ + return TRUE; + } + +diff --git a/plugins/xsettings/fontconfig-monitor.c b/plugins/xsettings/fontconfig-monitor.c +index 7b6df2b..bfb15ed 100644 +--- a/plugins/xsettings/fontconfig-monitor.c ++++ b/plugins/xsettings/fontconfig-monitor.c +@@ -33,6 +33,18 @@ stuff_changed (GFileMonitor *monitor, + GFileMonitorEvent event_type, + gpointer handle); + ++void ++fontconfig_cache_init (void) ++{ ++ FcInit (); ++} ++ ++gboolean ++fontconfig_cache_update (void) ++{ ++ return !FcConfigUptoDate (NULL) && FcInitReinitialize (); ++} ++ + static void + monitor_files (GPtrArray *monitors, + FcStrList *list, +@@ -100,7 +112,7 @@ update (gpointer data) + + handle->timeout = 0; + +- if (!FcConfigUptoDate (NULL) && FcInitReinitialize ()) { ++ if (fontconfig_cache_update ()) { + notify = TRUE; + monitors_free (handle->monitors); + handle->monitors = monitors_create (data); +diff --git a/plugins/xsettings/fontconfig-monitor.h b/plugins/xsettings/fontconfig-monitor.h +index b3df8cd..eeeef7c 100644 +--- a/plugins/xsettings/fontconfig-monitor.h ++++ b/plugins/xsettings/fontconfig-monitor.h +@@ -25,6 +25,9 @@ + + G_BEGIN_DECLS + ++void fontconfig_cache_init (void); ++gboolean fontconfig_cache_update (void); ++ + typedef struct _fontconfig_monitor_handle fontconfig_monitor_handle_t; + + fontconfig_monitor_handle_t * +diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c +index e847e74..56e3a0d 100644 +--- a/plugins/xsettings/gsd-xsettings-manager.c ++++ b/plugins/xsettings/gsd-xsettings-manager.c +@@ -424,6 +424,7 @@ child_watch_cb (GPid pid, + { + char *command = user_data; + ++ gnome_settings_profile_end ("%s", command); + if (!WIFEXITED (status) || WEXITSTATUS (status)) { + g_warning ("Command %s failed", command); + } +@@ -446,6 +447,7 @@ spawn_with_input (const char *command, + return; + } + ++ gnome_settings_profile_start ("%s", command); + error = NULL; + res = g_spawn_async_with_pipes (NULL, + argv, +@@ -563,6 +565,38 @@ fontconfig_callback (fontconfig_monitor_handle_t *handle, + gnome_settings_profile_end (NULL); + } + ++static gboolean ++start_fontconfig_monitor_idle_cb (GnomeXSettingsManager *manager) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ manager->priv->fontconfig_handle = fontconfig_monitor_start ((GFunc) fontconfig_callback, manager); ++ ++ gnome_settings_profile_end (NULL); ++ ++ return FALSE; ++} ++ ++static void ++start_fontconfig_monitor (GnomeXSettingsManager *manager) ++{ ++ gnome_settings_profile_start (NULL); ++ ++ fontconfig_cache_init (); ++ ++ g_idle_add ((GSourceFunc) start_fontconfig_monitor_idle_cb, manager); ++ ++ gnome_settings_profile_end (NULL); ++} ++ ++static void ++stop_fontconfig_monitor (GnomeXSettingsManager *manager) ++{ ++ if (manager->priv->fontconfig_handle) { ++ fontconfig_monitor_stop (manager->priv->fontconfig_handle); ++ manager->priv->fontconfig_handle = NULL; ++ } ++} + #endif /* HAVE_FONTCONFIG */ + + static const char * +@@ -747,7 +781,6 @@ register_config_callback (GnomeXSettingsManager *manager, + const char *path, + GConfClientNotifyFunc func) + { +- gconf_client_add_dir (client, path, GCONF_CLIENT_PRELOAD_NONE, NULL); + return gconf_client_notify_add (client, path, func, manager, NULL, NULL); + } + +@@ -824,6 +857,13 @@ gnome_xsettings_manager_start (GnomeXSettingsManager *manager, + + client = gconf_client_get_default (); + ++ gconf_client_add_dir (client, MOUSE_SETTINGS_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ gconf_client_add_dir (client, GTK_SETTINGS_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ gconf_client_add_dir (client, INTERFACE_SETTINGS_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ gconf_client_add_dir (client, SOUND_SETTINGS_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ gconf_client_add_dir (client, GTK_MODULES_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ gconf_client_add_dir (client, FONT_RENDER_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); ++ + for (i = 0; i < G_N_ELEMENTS (translations); i++) { + GConfValue *val; + GError *err; +@@ -876,7 +916,7 @@ gnome_xsettings_manager_start (GnomeXSettingsManager *manager, + (GConfClientNotifyFunc) xft_callback); + update_xft_settings (manager, client); + +- manager->priv->fontconfig_handle = fontconfig_monitor_start ((GFunc) fontconfig_callback, manager); ++ start_fontconfig_monitor (manager); + #endif /* HAVE_FONTCONFIG */ + + g_object_unref (client); +@@ -923,8 +963,7 @@ gnome_xsettings_manager_stop (GnomeXSettingsManager *manager) + #ifdef HAVE_FONTCONFIG + gconf_client_remove_dir (client, FONT_RENDER_DIR, NULL); + +- fontconfig_monitor_stop (manager->priv->fontconfig_handle); +- manager->priv->fontconfig_handle = NULL; ++ stop_fontconfig_monitor (manager); + #endif /* HAVE_FONTCONFIG */ + + for (i = 0; i < G_N_ELEMENTS (p->notify); ++i) { diff --git a/power-button.patch b/power-button.patch deleted file mode 100644 index 2f08b76..0000000 --- a/power-button.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up gnome-settings-daemon-2.24.0/plugins/media-keys/gsd-media-keys-manager.c.power-button gnome-settings-daemon-2.24.0/plugins/media-keys/gsd-media-keys-manager.c ---- gnome-settings-daemon-2.24.0/plugins/media-keys/gsd-media-keys-manager.c.power-button 2008-10-14 14:28:35.000000000 -0400 -+++ gnome-settings-daemon-2.24.0/plugins/media-keys/gsd-media-keys-manager.c 2008-10-14 14:29:19.000000000 -0400 -@@ -556,7 +556,7 @@ do_www_action (GsdMediaKeysManager *mana - static void - do_exit_action (GsdMediaKeysManager *manager) - { -- execute (manager, "gnome-session-save --kill", FALSE, FALSE); -+ execute (manager, "gnome-session-save --shutdown-dialog", FALSE, FALSE); - } - - static void diff --git a/sources b/sources index 7bb04c6..66b15d5 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -2e30e9d17b810103d493e474fbfd20e5 gnome-settings-daemon-2.24.0.tar.bz2 +841447fa690a3a4712e9ddaec2584824 gnome-settings-daemon-2.24.1.tar.bz2