From: Ubuntu Desktop Team Date: Thu, 26 Jul 2018 16:19:06 +0100 Subject: keyboard: sync input sources to accountsservice --- meson.build | 1 + plugins/xsettings/gsd-xsettings-manager.c | 86 +++++++++++++++++++++++++++++++ plugins/xsettings/meson.build | 1 + 3 files changed, 88 insertions(+) diff --git a/meson.build b/meson.build index ee12198..799acb6 100644 --- a/meson.build +++ b/meson.build @@ -88,6 +88,7 @@ endif add_project_arguments(common_flags + compiler_flags, language: 'c') +accountsservice_dep = dependency('accountsservice') glib_dep = dependency('glib-2.0', version: '>=' + glib_min_version) geocode_glib_dep = dependency('geocode-glib-2.0', version: '>= 3.26.3', required: false) if not geocode_glib_dep.found() diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c index a357100..4963791 100644 --- a/plugins/xsettings/gsd-xsettings-manager.c +++ b/plugins/xsettings/gsd-xsettings-manager.c @@ -38,6 +38,8 @@ #include #include +#include + #include "gnome-settings-profile.h" #include "gsd-enums.h" #include "gsd-xsettings-manager.h" @@ -57,6 +59,7 @@ #define WM_SETTINGS_SCHEMA "org.gnome.desktop.wm.preferences" #define A11Y_SCHEMA "org.gnome.desktop.a11y" #define A11Y_INTERFACE_SCHEMA "org.gnome.desktop.a11y.interface" +#define INPUT_SOURCES_SCHEMA "org.gnome.desktop.input-sources" #define CLASSIC_WM_SETTINGS_SCHEMA "org.gnome.shell.extensions.classic-overrides" #define XSETTINGS_PLUGIN_SCHEMA "org.gnome.settings-daemon.plugins.xsettings" @@ -75,6 +78,7 @@ #define HIGH_CONTRAST_KEY "high-contrast" +#define INPUT_SOURCES_KEY "sources" #define GTK_IM_MODULE_KEY "gtk-im-module" #define GTK_SETTINGS_DBUS_PATH "/org/gtk/Settings" @@ -285,6 +289,7 @@ struct _GsdXSettingsManager gint64 fontconfig_timestamp; GSettings *interface_settings; + GSettings *input_sources_settings; GdkSeat *user_seat; GsdXSettingsGtk *gtk; @@ -1338,12 +1338,80 @@ migrate_settings (void) mouse_entries, G_N_ELEMENTS (mouse_entries)); } +void act_user_set_input_sources(ActUser *user, GVariant *sources) { + g_return_if_fail (ACT_IS_USER(user)); +} + +static void +user_notify_is_loaded_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + ActUser *user = ACT_USER (object); + GSettings *settings = user_data; + + if (act_user_is_loaded (user)) { + GVariant *sources; + GVariantIter iter; + const gchar *type; + const gchar *name; + GVariantBuilder builder; + + g_signal_handlers_disconnect_by_data (user, user_data); + + sources = g_settings_get_value (settings, INPUT_SOURCES_KEY); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{ss}")); + + g_variant_iter_init (&iter, sources); + while (g_variant_iter_next (&iter, "(&s&s)", &type, &name)) { + g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{ss}")); + g_variant_builder_add (&builder, "{ss}", type, name); + g_variant_builder_close (&builder); + } + + g_variant_unref (sources); + + sources = g_variant_ref_sink (g_variant_builder_end (&builder)); + act_user_set_input_sources (user, sources); + g_variant_unref (sources); + } +} + +static void +manager_notify_is_loaded_cb (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + ActUserManager *manager = ACT_USER_MANAGER (object); + + gboolean loaded; + g_object_get (manager, "is-loaded", &loaded, NULL); + + if (loaded) { + ActUser *user; + + g_signal_handlers_disconnect_by_data (manager, user_data); + + user = act_user_manager_get_user (manager, g_get_user_name ()); + + if (act_user_is_loaded (user)) + user_notify_is_loaded_cb (G_OBJECT (user), NULL, user_data); + else + g_signal_connect (user, "notify::is-loaded", + G_CALLBACK (user_notify_is_loaded_cb), user_data); + } +} + static void update_gtk_im_module (GsdXSettingsManager *manager) { const gchar *module; gchar *setting; + ActUserManager *user_manager; + gboolean user_manager_loaded; + setting = g_settings_get_string (manager->interface_settings, GTK_IM_MODULE_KEY); if (setting && *setting) @@ -1351,6 +1415,22 @@ update_gtk_im_module (GsdXSettingsManager *manager) else module = GTK_IM_MODULE_IBUS; + g_free (setting); + + user_manager = act_user_manager_get_default (); + if (user_manager) { + g_object_get (user_manager, "is-loaded", &user_manager_loaded, NULL); + if (user_manager_loaded) + manager_notify_is_loaded_cb (G_OBJECT (user_manager), + NULL, + manager->input_sources_settings); + else + g_signal_connect (user_manager, + "notify::is-loaded", + G_CALLBACK (manager_notify_is_loaded_cb), + manager->input_sources_settings); + } + xsettings_manager_set_string (manager->manager, "Gtk/IMModule", module); g_free (setting); } @@ -1423,6 +1503,10 @@ gsd_xsettings_manager_start (GsdXSettingsManager *manager, g_signal_connect_swapped (manager->interface_settings, "changed::" GTK_IM_MODULE_KEY, G_CALLBACK (update_gtk_im_module), manager); + manager->input_sources_settings = g_settings_new (INPUT_SOURCES_SCHEMA); + g_signal_connect_swapped (manager->input_sources_settings, + "changed::" INPUT_SOURCES_KEY, + G_CALLBACK (update_gtk_im_module), manager); update_gtk_im_module (manager); manager->monitors_changed_id = @@ -1629,6 +1713,7 @@ gsd_xsettings_manager_stop (GsdXSettingsManager *manager) manager->user_seat = NULL; } + g_clear_object (&manager->input_sources_settings); g_clear_object (&manager->interface_settings); } diff --git a/plugins/xsettings/meson.build b/plugins/xsettings/meson.build index 49ed70f..2975c40 100644 --- a/plugins/xsettings/meson.build +++ b/plugins/xsettings/meson.build @@ -12,6 +12,7 @@ sources = gsd_xsettings_gtk + fc_monitor + wm_button_layout_translation + files( ) deps = plugins_deps + [ + accountsservice_dep, gtk_dep, x11_dep, xfixes_dep,