2960cc
From 6ab152961de63dec953981aea24a7f0b4e7949ec Mon Sep 17 00:00:00 2001
2960cc
From: Carlos Garnacho <carlosg@gnome.org>
2960cc
Date: Fri, 3 Dec 2021 23:38:50 +0100
2960cc
Subject: [PATCH 1/3] xsettings: Adopt code to look up GTK IM module
2960cc
2960cc
Right now, gsd-keyboard and gsd-xsettings have a strange relation
2960cc
where the first sets the gtk-im-module dconf setting for the latter
2960cc
to read the setting and forward it through XSettings.
2960cc
2960cc
Since this detection is highly X11 specific, make it happen in the
2960cc
Xsettings daemon itself, from the relevant setting and device presence.
2960cc
2960cc
This makes users still able to shoot themselves in the foot by changing
2960cc
the setting, X11 clients able to be told to switch to ibus if it turns
2960cc
out necessary, and Wayland clients unaffected otherwise.
2960cc
2960cc
Related: https://gitlab.gnome.org/GNOME/gtk/-/issues/4443
2960cc
---
2960cc
 plugins/keyboard/gsd-keyboard-manager.c   | 147 ---------------------
2960cc
 plugins/xsettings/gsd-xsettings-manager.c | 153 ++++++++++++++++++++++
2960cc
 2 files changed, 153 insertions(+), 147 deletions(-)
2960cc
2960cc
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
2960cc
index cb4ea98b..d41393bc 100644
2960cc
--- a/plugins/keyboard/gsd-keyboard-manager.c
2960cc
+++ b/plugins/keyboard/gsd-keyboard-manager.c
2960cc
@@ -57,10 +57,6 @@
2960cc
 
2960cc
 #define GNOME_DESKTOP_INTERFACE_DIR "org.gnome.desktop.interface"
2960cc
 
2960cc
-#define KEY_GTK_IM_MODULE    "gtk-im-module"
2960cc
-#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
2960cc
-#define GTK_IM_MODULE_IBUS   "ibus"
2960cc
-
2960cc
 #define GNOME_DESKTOP_INPUT_SOURCES_DIR "org.gnome.desktop.input-sources"
2960cc
 
2960cc
 #define KEY_INPUT_SOURCES        "sources"
2960cc
@@ -71,9 +67,6 @@
2960cc
 
2960cc
 #define DEFAULT_LAYOUT "us"
2960cc
 
2960cc
-#define GNOME_A11Y_APPLICATIONS_INTERFACE_DIR "org.gnome.desktop.a11y.applications"
2960cc
-#define KEY_OSK_ENABLED "screen-keyboard-enabled"
2960cc
-
2960cc
 struct _GsdKeyboardManager
2960cc
 {
2960cc
         GObject    parent;
2960cc
@@ -81,21 +74,14 @@ struct _GsdKeyboardManager
2960cc
         guint      start_idle_id;
2960cc
         GSettings *settings;
2960cc
         GSettings *input_sources_settings;
2960cc
-        GSettings *a11y_settings;
2960cc
         GDBusProxy *localed;
2960cc
         GCancellable *cancellable;
2960cc
-
2960cc
-        GdkDeviceManager *device_manager;
2960cc
-        guint device_added_id;
2960cc
-        guint device_removed_id;
2960cc
 };
2960cc
 
2960cc
 static void     gsd_keyboard_manager_class_init  (GsdKeyboardManagerClass *klass);
2960cc
 static void     gsd_keyboard_manager_init        (GsdKeyboardManager      *keyboard_manager);
2960cc
 static void     gsd_keyboard_manager_finalize    (GObject                 *object);
2960cc
 
2960cc
-static void     update_gtk_im_module (GsdKeyboardManager *manager);
2960cc
-
2960cc
 G_DEFINE_TYPE (GsdKeyboardManager, gsd_keyboard_manager, G_TYPE_OBJECT)
2960cc
 
2960cc
 static gpointer manager_object = NULL;
2960cc
@@ -218,121 +204,6 @@ settings_changed (GSettings          *settings,
2960cc
 
2960cc
 }
2960cc
 
2960cc
-static void
2960cc
-device_added_cb (GdkDeviceManager   *device_manager,
2960cc
-                 GdkDevice          *device,
2960cc
-                 GsdKeyboardManager *manager)
2960cc
-{
2960cc
-        GdkInputSource source;
2960cc
-
2960cc
-        source = gdk_device_get_source (device);
2960cc
-        if (source == GDK_SOURCE_TOUCHSCREEN) {
2960cc
-                update_gtk_im_module (manager);
2960cc
-        }
2960cc
-}
2960cc
-
2960cc
-static void
2960cc
-device_removed_cb (GdkDeviceManager   *device_manager,
2960cc
-                   GdkDevice          *device,
2960cc
-                   GsdKeyboardManager *manager)
2960cc
-{
2960cc
-        GdkInputSource source;
2960cc
-
2960cc
-        source = gdk_device_get_source (device);
2960cc
-        if (source == GDK_SOURCE_TOUCHSCREEN)
2960cc
-                update_gtk_im_module (manager);
2960cc
-}
2960cc
-
2960cc
-static void
2960cc
-set_devicepresence_handler (GsdKeyboardManager *manager)
2960cc
-{
2960cc
-        GdkDeviceManager *device_manager;
2960cc
-
2960cc
-        if (gnome_settings_is_wayland ())
2960cc
-                return;
2960cc
-
2960cc
-        device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
2960cc
-
2960cc
-        manager->device_added_id = g_signal_connect (G_OBJECT (device_manager), "device-added",
2960cc
-                                                           G_CALLBACK (device_added_cb), manager);
2960cc
-        manager->device_removed_id = g_signal_connect (G_OBJECT (device_manager), "device-removed",
2960cc
-                                                             G_CALLBACK (device_removed_cb), manager);
2960cc
-        manager->device_manager = device_manager;
2960cc
-}
2960cc
-
2960cc
-static gboolean
2960cc
-need_ibus (GVariant *sources)
2960cc
-{
2960cc
-        GVariantIter iter;
2960cc
-        const gchar *type;
2960cc
-
2960cc
-        g_variant_iter_init (&iter, sources);
2960cc
-        while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL))
2960cc
-                if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS))
2960cc
-                        return TRUE;
2960cc
-
2960cc
-        return FALSE;
2960cc
-}
2960cc
-
2960cc
-static gboolean
2960cc
-need_osk (GsdKeyboardManager *manager)
2960cc
-{
2960cc
-        gboolean has_touchscreen = FALSE;
2960cc
-        GList *devices;
2960cc
-        GdkSeat *seat;
2960cc
-
2960cc
-        if (g_settings_get_boolean (manager->a11y_settings,
2960cc
-                                    KEY_OSK_ENABLED))
2960cc
-                return TRUE;
2960cc
-
2960cc
-        seat = gdk_display_get_default_seat (gdk_display_get_default ());
2960cc
-        devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH);
2960cc
-
2960cc
-        has_touchscreen = devices != NULL;
2960cc
-
2960cc
-        g_list_free (devices);
2960cc
-
2960cc
-        return has_touchscreen;
2960cc
-}
2960cc
-
2960cc
-static void
2960cc
-set_gtk_im_module (GsdKeyboardManager *manager,
2960cc
-                   GSettings          *settings,
2960cc
-                   GVariant           *sources)
2960cc
-{
2960cc
-        const gchar *new_module;
2960cc
-        gchar *current_module;
2960cc
-
2960cc
-        if (need_ibus (sources) || need_osk (manager))
2960cc
-                new_module = GTK_IM_MODULE_IBUS;
2960cc
-        else
2960cc
-                new_module = GTK_IM_MODULE_SIMPLE;
2960cc
-
2960cc
-        current_module = g_settings_get_string (settings, KEY_GTK_IM_MODULE);
2960cc
-        if (!g_str_equal (current_module, new_module))
2960cc
-                g_settings_set_string (settings, KEY_GTK_IM_MODULE, new_module);
2960cc
-        g_free (current_module);
2960cc
-}
2960cc
-
2960cc
-static void
2960cc
-update_gtk_im_module (GsdKeyboardManager *manager)
2960cc
-{
2960cc
-        GSettings *interface_settings;
2960cc
-        GVariant *sources;
2960cc
-
2960cc
-        /* Gtk+ uses the IM module advertised in XSETTINGS so, if we
2960cc
-         * have IBus input sources, we want it to load that
2960cc
-         * module. Otherwise we can use the default "simple" module
2960cc
-         * which is builtin gtk+
2960cc
-         */
2960cc
-        interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_DIR);
2960cc
-        sources = g_settings_get_value (manager->input_sources_settings,
2960cc
-                                        KEY_INPUT_SOURCES);
2960cc
-        set_gtk_im_module (manager, interface_settings, sources);
2960cc
-        g_object_unref (interface_settings);
2960cc
-        g_variant_unref (sources);
2960cc
-}
2960cc
-
2960cc
 static void
2960cc
 get_sources_from_xkb_config (GsdKeyboardManager *manager)
2960cc
 {
2960cc
@@ -580,18 +451,7 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
2960cc
 
2960cc
         manager->settings = g_settings_new (GSD_KEYBOARD_DIR);
2960cc
 
2960cc
-	set_devicepresence_handler (manager);
2960cc
-
2960cc
         manager->input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR);
2960cc
-        g_signal_connect_swapped (manager->input_sources_settings,
2960cc
-                                  "changed::" KEY_INPUT_SOURCES,
2960cc
-                                  G_CALLBACK (update_gtk_im_module), manager);
2960cc
-
2960cc
-        manager->a11y_settings = g_settings_new (GNOME_A11Y_APPLICATIONS_INTERFACE_DIR);
2960cc
-        g_signal_connect_swapped (manager->a11y_settings,
2960cc
-                                  "changed::" KEY_OSK_ENABLED,
2960cc
-                                  G_CALLBACK (update_gtk_im_module), manager);
2960cc
-        update_gtk_im_module (manager);
2960cc
 
2960cc
         manager->cancellable = g_cancellable_new ();
2960cc
 
2960cc
@@ -645,14 +505,7 @@ gsd_keyboard_manager_stop (GsdKeyboardManager *manager)
2960cc
 
2960cc
         g_clear_object (&manager->settings);
2960cc
         g_clear_object (&manager->input_sources_settings);
2960cc
-        g_clear_object (&manager->a11y_settings);
2960cc
         g_clear_object (&manager->localed);
2960cc
-
2960cc
-        if (manager->device_manager != NULL) {
2960cc
-                g_signal_handler_disconnect (manager->device_manager, manager->device_added_id);
2960cc
-                g_signal_handler_disconnect (manager->device_manager, manager->device_removed_id);
2960cc
-                manager->device_manager = NULL;
2960cc
-        }
2960cc
 }
2960cc
 
2960cc
 static void
2960cc
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c
2960cc
index 5f1b4583..1aa020db 100644
2960cc
--- a/plugins/xsettings/gsd-xsettings-manager.c
2960cc
+++ b/plugins/xsettings/gsd-xsettings-manager.c
2960cc
@@ -56,6 +56,9 @@
2960cc
 #define PRIVACY_SETTINGS_SCHEMA     "org.gnome.desktop.privacy"
2960cc
 #define WM_SETTINGS_SCHEMA        "org.gnome.desktop.wm.preferences"
2960cc
 #define A11Y_SCHEMA               "org.gnome.desktop.a11y"
2960cc
+#define A11Y_INTERFACE_SCHEMA     "org.gnome.desktop.a11y.interface"
2960cc
+#define A11Y_APPLICATIONS_SCHEMA   "org.gnome.desktop.a11y.applications"
2960cc
+#define INPUT_SOURCES_SCHEMA       "org.gnome.desktop.input-sources"
2960cc
 #define CLASSIC_WM_SETTINGS_SCHEMA "org.gnome.shell.extensions.classic-overrides"
2960cc
 
2960cc
 #define XSETTINGS_PLUGIN_SCHEMA "org.gnome.settings-daemon.plugins.xsettings"
2960cc
@@ -72,9 +75,18 @@
2960cc
 #define FONT_HINTING_KEY      "font-hinting"
2960cc
 #define FONT_RGBA_ORDER_KEY   "font-rgba-order"
2960cc
 
2960cc
+#define INPUT_SOURCES_KEY      "sources"
2960cc
+#define OSK_ENABLED_KEY        "screen-keyboard-enabled"
2960cc
+#define GTK_IM_MODULE_KEY      "gtk-im-module"
2960cc
+
2960cc
 #define GTK_SETTINGS_DBUS_PATH "/org/gtk/Settings"
2960cc
 #define GTK_SETTINGS_DBUS_NAME "org.gtk.Settings"
2960cc
 
2960cc
+#define INPUT_SOURCE_TYPE_IBUS "ibus"
2960cc
+
2960cc
+#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
2960cc
+#define GTK_IM_MODULE_IBUS   "ibus"
2960cc
+
2960cc
 static const gchar introspection_xml[] =
2960cc
 "<node name='/org/gtk/Settings'>"
2960cc
 "  <interface name='org.gtk.Settings'>"
2960cc
@@ -277,6 +289,11 @@ struct _GsdXSettingsManager
2960cc
         FcMonitor         *fontconfig_monitor;
2960cc
         gint64             fontconfig_timestamp;
2960cc
 
2960cc
+        GSettings         *interface_settings;
2960cc
+        GSettings         *input_sources_settings;
2960cc
+        GSettings         *a11y_settings;
2960cc
+        GdkSeat           *user_seat;
2960cc
+
2960cc
         GsdXSettingsGtk   *gtk;
2960cc
 
2960cc
         guint              introspect_properties_changed_id;
2960cc
@@ -286,6 +303,9 @@ struct _GsdXSettingsManager
2960cc
         guint              display_config_watch_id;
2960cc
         guint              monitors_changed_id;
2960cc
 
2960cc
+        guint              device_added_id;
2960cc
+        guint              device_removed_id;
2960cc
+
2960cc
         guint              shell_name_watch_id;
2960cc
         gboolean           have_shell;
2960cc
 
2960cc
@@ -1291,6 +1311,112 @@ migrate_settings (void)
2960cc
                                     mouse_entries, G_N_ELEMENTS (mouse_entries));
2960cc
 }
2960cc
 
2960cc
+static gboolean
2960cc
+need_ibus (GsdXSettingsManager *manager)
2960cc
+{
2960cc
+        GVariant *sources;
2960cc
+        GVariantIter iter;
2960cc
+        const gchar *type;
2960cc
+        gboolean needs_ibus = FALSE;
2960cc
+
2960cc
+        sources = g_settings_get_value (manager->input_sources_settings,
2960cc
+                                        INPUT_SOURCES_KEY);
2960cc
+
2960cc
+        g_variant_iter_init (&iter, sources);
2960cc
+        while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL)) {
2960cc
+                if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
2960cc
+                        needs_ibus = TRUE;
2960cc
+                        break;
2960cc
+                }
2960cc
+        }
2960cc
+
2960cc
+        g_variant_unref (sources);
2960cc
+
2960cc
+        return needs_ibus;
2960cc
+}
2960cc
+
2960cc
+static gboolean
2960cc
+need_osk (GsdXSettingsManager *manager)
2960cc
+{
2960cc
+        gboolean has_touchscreen = FALSE;
2960cc
+        GList *devices;
2960cc
+        GdkSeat *seat;
2960cc
+
2960cc
+        if (g_settings_get_boolean (manager->a11y_settings,
2960cc
+                                    OSK_ENABLED_KEY))
2960cc
+                return TRUE;
2960cc
+
2960cc
+        seat = gdk_display_get_default_seat (gdk_display_get_default ());
2960cc
+        devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH);
2960cc
+
2960cc
+        has_touchscreen = devices != NULL;
2960cc
+
2960cc
+        g_list_free (devices);
2960cc
+
2960cc
+        return has_touchscreen;
2960cc
+}
2960cc
+
2960cc
+static void
2960cc
+update_gtk_im_module (GsdXSettingsManager *manager)
2960cc
+{
2960cc
+        const gchar *module;
2960cc
+        gchar *setting;
2960cc
+
2960cc
+        setting = g_settings_get_string (manager->interface_settings,
2960cc
+                                         GTK_IM_MODULE_KEY);
2960cc
+        if (setting && *setting)
2960cc
+                module = setting;
2960cc
+        else if (need_ibus (manager) || need_osk (manager))
2960cc
+                module = GTK_IM_MODULE_IBUS;
2960cc
+        else
2960cc
+                module = GTK_IM_MODULE_SIMPLE;
2960cc
+
2960cc
+        xsettings_manager_set_string (manager->manager, "Gtk/IMModule", module);
2960cc
+        g_free (setting);
2960cc
+}
2960cc
+
2960cc
+static void
2960cc
+device_added_cb (GdkSeat             *user_seat,
2960cc
+                 GdkDevice           *device,
2960cc
+                 GsdXSettingsManager *manager)
2960cc
+{
2960cc
+        GdkInputSource source;
2960cc
+
2960cc
+        source = gdk_device_get_source (device);
2960cc
+        if (source == GDK_SOURCE_TOUCHSCREEN) {
2960cc
+                update_gtk_im_module (manager);
2960cc
+        }
2960cc
+}
2960cc
+
2960cc
+static void
2960cc
+device_removed_cb (GdkSeat             *user_seat,
2960cc
+                   GdkDevice           *device,
2960cc
+                   GsdXSettingsManager *manager)
2960cc
+{
2960cc
+        GdkInputSource source;
2960cc
+
2960cc
+        source = gdk_device_get_source (device);
2960cc
+        if (source == GDK_SOURCE_TOUCHSCREEN)
2960cc
+                update_gtk_im_module (manager);
2960cc
+}
2960cc
+
2960cc
+static void
2960cc
+set_devicepresence_handler (GsdXSettingsManager *manager)
2960cc
+{
2960cc
+        GdkSeat *user_seat;
2960cc
+
2960cc
+        if (gnome_settings_is_wayland ())
2960cc
+                return;
2960cc
+
2960cc
+        user_seat = gdk_display_get_default_seat (gdk_display_get_default ());
2960cc
+
2960cc
+        manager->device_added_id = g_signal_connect (G_OBJECT (user_seat), "device-added",
2960cc
+                                                     G_CALLBACK (device_added_cb), manager);
2960cc
+        manager->device_removed_id = g_signal_connect (G_OBJECT (user_seat), "device-removed",
2960cc
+                                                       G_CALLBACK (device_removed_cb), manager);
2960cc
+        manager->user_seat = user_seat;
2960cc
+}
2960cc
+
2960cc
 gboolean
2960cc
 gsd_xsettings_manager_start (GsdXSettingsManager *manager,
2960cc
                              GError             **error)
2960cc
@@ -1312,6 +1438,23 @@ gsd_xsettings_manager_start (GsdXSettingsManager *manager,
2960cc
                 return FALSE;
2960cc
         }
2960cc
 
2960cc
+	set_devicepresence_handler (manager);
2960cc
+        manager->interface_settings = g_settings_new (INTERFACE_SETTINGS_SCHEMA);
2960cc
+        g_signal_connect_swapped (manager->interface_settings,
2960cc
+                                  "changed::" GTK_IM_MODULE_KEY,
2960cc
+                                  G_CALLBACK (update_gtk_im_module), manager);
2960cc
+
2960cc
+        manager->input_sources_settings = g_settings_new (INPUT_SOURCES_SCHEMA);
2960cc
+        g_signal_connect_swapped (manager->input_sources_settings,
2960cc
+                                  "changed::" INPUT_SOURCES_KEY,
2960cc
+                                  G_CALLBACK (update_gtk_im_module), manager);
2960cc
+
2960cc
+        manager->a11y_settings = g_settings_new (A11Y_APPLICATIONS_SCHEMA);
2960cc
+        g_signal_connect_swapped (manager->a11y_settings,
2960cc
+                                  "changed::" OSK_ENABLED_KEY,
2960cc
+                                  G_CALLBACK (update_gtk_im_module), manager);
2960cc
+        update_gtk_im_module (manager);
2960cc
+
2960cc
         manager->monitors_changed_id =
2960cc
                 g_dbus_connection_signal_subscribe (manager->dbus_connection,
2960cc
                                                     "org.gnome.Mutter.DisplayConfig",
2960cc
@@ -1507,6 +1650,16 @@ gsd_xsettings_manager_stop (GsdXSettingsManager *manager)
2960cc
                 g_object_unref (manager->gtk);
2960cc
                 manager->gtk = NULL;
2960cc
         }
2960cc
+
2960cc
+        if (manager->user_seat != NULL) {
2960cc
+                g_signal_handler_disconnect (manager->user_seat, manager->device_added_id);
2960cc
+                g_signal_handler_disconnect (manager->user_seat, manager->device_removed_id);
2960cc
+                manager->user_seat = NULL;
2960cc
+        }
2960cc
+
2960cc
+        g_clear_object (&manager->a11y_settings);
2960cc
+        g_clear_object (&manager->input_sources_settings);
2960cc
+        g_clear_object (&manager->interface_settings);
2960cc
 }
2960cc
 
2960cc
 static void
2960cc
-- 
2960cc
2.37.1
2960cc
2960cc
2960cc
From c1de15e0c7f145491482045c688e9f2d444cb041 Mon Sep 17 00:00:00 2001
2960cc
From: Carlos Garnacho <carlosg@gnome.org>
2960cc
Date: Tue, 15 Mar 2022 13:31:23 +0100
2960cc
Subject: [PATCH 2/3] keyboard: "Migrate" gtk-im-context setting before giving
2960cc
 control to user
2960cc
2960cc
This setting used to be modified by gsd-keyboard at runtime, but it no
2960cc
longer does. We want to leave this setting in a pristine state before
2960cc
we lend control to the user in order to avoid setting leftovers make
2960cc
GTK and others use the unintended IM module.
2960cc
2960cc
Since the setting is actually staying on the same schema/path, there is
2960cc
no nice mechanism that would help us in doing a one-time port, so rely
2960cc
on a file at ~/.cache to make this happen once. In the common case, it
2960cc
just adds one stat() more at startup.
2960cc
2960cc
After this migration is done, the gtk-im-module setting can be considered
2960cc
in full control of the user.
2960cc
---
2960cc
 plugins/keyboard/gsd-keyboard-manager.c | 35 +++++++++++++++++++++++++
2960cc
 1 file changed, 35 insertions(+)
2960cc
2960cc
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
2960cc
index d41393bc..15247c78 100644
2960cc
--- a/plugins/keyboard/gsd-keyboard-manager.c
2960cc
+++ b/plugins/keyboard/gsd-keyboard-manager.c
2960cc
@@ -67,6 +67,8 @@
2960cc
 
2960cc
 #define DEFAULT_LAYOUT "us"
2960cc
 
2960cc
+#define SETTINGS_PORTED_FILE ".gsd-keyboard.settings-ported"
2960cc
+
2960cc
 struct _GsdKeyboardManager
2960cc
 {
2960cc
         GObject    parent;
2960cc
@@ -541,6 +543,14 @@ gsd_keyboard_manager_finalize (GObject *object)
2960cc
         G_OBJECT_CLASS (gsd_keyboard_manager_parent_class)->finalize (object);
2960cc
 }
2960cc
 
2960cc
+static GVariant *
2960cc
+reset_gtk_im_module (GVariant *variant,
2960cc
+                     GVariant *old_default,
2960cc
+                     GVariant *new_default)
2960cc
+{
2960cc
+        return NULL;
2960cc
+}
2960cc
+
2960cc
 static void
2960cc
 migrate_keyboard_settings (void)
2960cc
 {
2960cc
@@ -550,12 +560,37 @@ migrate_keyboard_settings (void)
2960cc
                 { "delay",                  "delay",                  NULL },
2960cc
                 { "remember-numlock-state", "remember-numlock-state", NULL },
2960cc
         };
2960cc
+        g_autofree char *filename = NULL;
2960cc
 
2960cc
         gsd_settings_migrate_check ("org.gnome.settings-daemon.peripherals.keyboard.deprecated",
2960cc
                                     "/org/gnome/settings-daemon/peripherals/keyboard/",
2960cc
                                     "org.gnome.desktop.peripherals.keyboard",
2960cc
                                     "/org/gnome/desktop/peripherals/keyboard/",
2960cc
                                     entries, G_N_ELEMENTS (entries));
2960cc
+
2960cc
+        /* In prior versions to GNOME 42, the gtk-im-module setting was
2960cc
+         * owned by gsd-keyboard. Reset it once before giving it back
2960cc
+         * to the user.
2960cc
+         */
2960cc
+        filename = g_build_filename (g_get_user_config_dir (),
2960cc
+                                     SETTINGS_PORTED_FILE,
2960cc
+                                     NULL);
2960cc
+
2960cc
+        if (!g_file_test (filename, G_FILE_TEST_EXISTS)) {
2960cc
+                GsdSettingsMigrateEntry im_entry[] = {
2960cc
+                        { "gtk-im-module", "gtk-im-module", reset_gtk_im_module },
2960cc
+                };
2960cc
+                g_autoptr(GError) error = NULL;
2960cc
+
2960cc
+                gsd_settings_migrate_check ("org.gnome.desktop.interface",
2960cc
+                                            "/org/gnome/desktop/interface/",
2960cc
+                                            "org.gnome.desktop.interface",
2960cc
+                                            "/org/gnome/desktop/interface/",
2960cc
+                                            im_entry, G_N_ELEMENTS (im_entry));
2960cc
+
2960cc
+                if (!g_file_set_contents (filename, "", -1, &error))
2960cc
+                        g_warning ("Error migrating gtk-im-module: %s", error->message);
2960cc
+        }
2960cc
 }
2960cc
 
2960cc
 GsdKeyboardManager *
2960cc
-- 
2960cc
2.37.1
2960cc
2960cc
2960cc
From 46452c04aee1bfd51e23a53dba89ac95e0c06823 Mon Sep 17 00:00:00 2001
2960cc
From: Carlos Garnacho <carlosg@gnome.org>
2960cc
Date: Fri, 29 Apr 2022 14:37:27 +0200
2960cc
Subject: [PATCH 3/3] xsettings: Remove direct mapping from gtk-im-module to
2960cc
 Gtk/IMModule
2960cc
2960cc
This is now handled dynamically since commit e2d268eb00, so we should
2960cc
not tie dconf setting and Xsetting automatically here. Doing so, we
2960cc
are clobbering the dynamic value on startup, making it only effective
2960cc
on later changes.
2960cc
2960cc
Fixes: https://gitlab.gnome.org/GNOME/gnome-settings-daemon/-/issues/682
2960cc
---
2960cc
 plugins/xsettings/gsd-xsettings-manager.c | 1 -
2960cc
 1 file changed, 1 deletion(-)
2960cc
2960cc
diff --git a/plugins/xsettings/gsd-xsettings-manager.c b/plugins/xsettings/gsd-xsettings-manager.c
2960cc
index 1aa020db..d692cefb 100644
2960cc
--- a/plugins/xsettings/gsd-xsettings-manager.c
2960cc
+++ b/plugins/xsettings/gsd-xsettings-manager.c
2960cc
@@ -498,7 +498,6 @@ static TranslationEntry translations [] = {
2960cc
         { "org.gnome.desktop.interface", "cursor-blink-time",      "Net/CursorBlinkTime",     translate_int_int },
2960cc
         { "org.gnome.desktop.interface", "cursor-blink-timeout",   "Gtk/CursorBlinkTimeout",  translate_int_int },
2960cc
         { "org.gnome.desktop.interface", "gtk-theme",              "Net/ThemeName",           translate_string_string },
2960cc
-        { "org.gnome.desktop.interface", "gtk-im-module",          "Gtk/IMModule",            translate_string_string },
2960cc
         { "org.gnome.desktop.interface", "icon-theme",             "Net/IconThemeName",       translate_string_string },
2960cc
         { "org.gnome.desktop.interface", "cursor-theme",           "Gtk/CursorThemeName",     translate_string_string },
2960cc
         { "org.gnome.desktop.interface", "gtk-enable-primary-paste", "Gtk/EnablePrimaryPaste", translate_bool_int },
2960cc
-- 
2960cc
2.37.1
2960cc