[gnome-settings-daemon] keyboard: Convert old libgnomekbd and IBus settings
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] keyboard: Convert old libgnomekbd and IBus settings
- Date: Fri, 5 Oct 2012 17:17:56 +0000 (UTC)
commit a131ce97870ccb4aebe5f338abb421ae43f84f55
Author: Rui Matos <tiagomatos gmail com>
Date: Thu Oct 4 02:54:05 2012 +0200
keyboard: Convert old libgnomekbd and IBus settings
https://bugzilla.gnome.org/show_bug.cgi?id=685458
plugins/keyboard/gsd-keyboard-manager.c | 197 ++++++++++++++++++++++++++++---
1 files changed, 178 insertions(+), 19 deletions(-)
---
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index 6ad0e79..28a909d 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -128,6 +128,40 @@ G_DEFINE_TYPE (GsdKeyboardManager, gsd_keyboard_manager, G_TYPE_OBJECT)
static gpointer manager_object = NULL;
+static void
+init_builder_with_sources (GVariantBuilder *builder,
+ GSettings *settings)
+{
+ const gchar *type;
+ const gchar *id;
+ GVariantIter iter;
+ GVariant *sources;
+
+ sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
+
+ g_variant_builder_init (builder, G_VARIANT_TYPE ("a(ss)"));
+
+ g_variant_iter_init (&iter, sources);
+ while (g_variant_iter_next (&iter, "(&s&s)", &type, &id))
+ g_variant_builder_add (builder, "(ss)", type, id);
+
+ g_variant_unref (sources);
+}
+
+static gboolean
+schema_is_installed (const gchar *name)
+{
+ const gchar * const *schemas;
+ const gchar * const *s;
+
+ schemas = g_settings_list_schemas ();
+ for (s = schemas; *s; ++s)
+ if (g_str_equal (*s, name))
+ return TRUE;
+
+ return FALSE;
+}
+
#ifdef HAVE_IBUS
static void
clear_ibus (GsdKeyboardManager *manager)
@@ -535,38 +569,41 @@ engine_from_locale (void)
}
static void
-init_builder_with_sources (GVariantBuilder *builder,
- GSettings *settings)
+add_ibus_sources_from_locale (GSettings *settings)
{
- const gchar *type;
- const gchar *id;
- GVariantIter iter;
- GVariant *sources;
-
- sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
-
- g_variant_builder_init (builder, G_VARIANT_TYPE ("a(ss)"));
+ const gchar *locale_engine;
+ GVariantBuilder builder;
- g_variant_iter_init (&iter, sources);
- while (g_variant_iter_next (&iter, "(&s&s)", &type, &id))
- g_variant_builder_add (builder, "(ss)", type, id);
+ locale_engine = engine_from_locale ();
+ if (!locale_engine)
+ return;
- g_variant_unref (sources);
+ init_builder_with_sources (&builder, settings);
+ g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_IBUS, locale_engine);
+ g_settings_set_value (settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder));
}
static void
-add_ibus_sources_from_locale (GSettings *settings)
+convert_ibus (GSettings *settings)
{
- const gchar *locale_engine;
GVariantBuilder builder;
+ GSettings *ibus_settings;
+ gchar **engines, **e;
- locale_engine = engine_from_locale ();
- if (!locale_engine)
+ if (!schema_is_installed ("org.freedesktop.ibus.general"))
return;
init_builder_with_sources (&builder, settings);
- g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_IBUS, locale_engine);
+
+ ibus_settings = g_settings_new ("org.freedesktop.ibus.general");
+ engines = g_settings_get_strv (ibus_settings, "preload-engines");
+ for (e = engines; *e; ++e)
+ g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_IBUS, *e);
+
g_settings_set_value (settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder));
+
+ g_strfreev (engines);
+ g_object_unref (ibus_settings);
}
#endif /* HAVE_IBUS */
@@ -1364,6 +1401,125 @@ out:
}
static void
+convert_libgnomekbd_options (GSettings *settings)
+{
+ GPtrArray *opt_array;
+ GSettings *libgnomekbd_settings;
+ gchar **options, **o;
+
+ if (!schema_is_installed ("org.gnome.libgnomekbd.keyboard"))
+ return;
+
+ opt_array = g_ptr_array_new_with_free_func (g_free);
+
+ libgnomekbd_settings = g_settings_new ("org.gnome.libgnomekbd.keyboard");
+ options = g_settings_get_strv (libgnomekbd_settings, "options");
+
+ for (o = options; *o; ++o) {
+ gchar **strv;
+
+ strv = g_strsplit (*o, "\t", 2);
+ if (strv[0] && strv[1]) {
+ /* We don't want the group switcher because
+ * it's incompatible with the way we use XKB
+ * groups. */
+ if (!g_str_has_prefix (strv[1], "grp:"))
+ g_ptr_array_add (opt_array, g_strdup (strv[1]));
+ }
+ g_strfreev (strv);
+ }
+ g_ptr_array_add (opt_array, NULL);
+
+ g_settings_set_strv (settings, KEY_KEYBOARD_OPTIONS, (const gchar * const*) opt_array->pdata);
+
+ g_strfreev (options);
+ g_object_unref (libgnomekbd_settings);
+ g_ptr_array_free (opt_array, TRUE);
+}
+
+static void
+convert_libgnomekbd_layouts (GSettings *settings)
+{
+ GVariantBuilder builder;
+ GSettings *libgnomekbd_settings;
+ gchar **layouts, **l;
+
+ if (!schema_is_installed ("org.gnome.libgnomekbd.keyboard"))
+ return;
+
+ init_builder_with_sources (&builder, settings);
+
+ libgnomekbd_settings = g_settings_new ("org.gnome.libgnomekbd.keyboard");
+ layouts = g_settings_get_strv (libgnomekbd_settings, "layouts");
+
+ for (l = layouts; *l; ++l) {
+ gchar *id;
+ gchar **strv;
+
+ strv = g_strsplit (*l, "\t", 2);
+ if (strv[0] && !strv[1])
+ id = g_strdup (strv[0]);
+ else if (strv[0] && strv[1])
+ id = g_strdup_printf ("%s+%s", strv[0], strv[1]);
+ else
+ id = NULL;
+
+ if (id)
+ g_variant_builder_add (&builder, "(ss)", INPUT_SOURCE_TYPE_XKB, id);
+
+ g_free (id);
+ g_strfreev (strv);
+ }
+
+ g_settings_set_value (settings, KEY_INPUT_SOURCES, g_variant_builder_end (&builder));
+
+ g_strfreev (layouts);
+ g_object_unref (libgnomekbd_settings);
+}
+
+static void
+maybe_convert_old_settings (GSettings *settings)
+{
+ GVariant *sources;
+ gchar **options;
+ gchar *stamp_dir_path = NULL;
+ gchar *stamp_file_path = NULL;
+ GError *error = NULL;
+
+ stamp_dir_path = g_build_filename (g_get_user_data_dir (), PACKAGE_NAME, NULL);
+ if (g_mkdir_with_parents (stamp_dir_path, 0755)) {
+ g_warning ("Failed to create directory %s: %s", stamp_dir_path, g_strerror (errno));
+ goto out;
+ }
+
+ stamp_file_path = g_build_filename (stamp_dir_path, "input-sources-converted", NULL);
+ if (g_file_test (stamp_file_path, G_FILE_TEST_EXISTS))
+ goto out;
+
+ sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
+ if (g_variant_n_children (sources) < 1) {
+ convert_libgnomekbd_layouts (settings);
+#ifdef HAVE_IBUS
+ convert_ibus (settings);
+#endif
+ }
+ g_variant_unref (sources);
+
+ options = g_settings_get_strv (settings, KEY_KEYBOARD_OPTIONS);
+ if (g_strv_length (options) < 1)
+ convert_libgnomekbd_options (settings);
+ g_strfreev (options);
+
+ if (!g_file_set_contents (stamp_file_path, "", 0, &error)) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
+out:
+ g_free (stamp_file_path);
+ g_free (stamp_dir_path);
+}
+
+static void
maybe_create_input_sources (GsdKeyboardManager *manager)
{
GSettings *settings;
@@ -1376,6 +1532,9 @@ maybe_create_input_sources (GsdKeyboardManager *manager)
return;
}
+ maybe_convert_old_settings (settings);
+
+ /* if we still don't have anything do some educated guesses */
sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
if (g_variant_n_children (sources) < 1) {
create_sources_from_current_xkb_config (settings);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]