https://bugs.gentoo.org/952006 https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/8554 From d9f722455b51fe64bc1565ef1eae7230319e73cd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 11 May 2025 09:18:22 -0400 Subject: [PATCH] Revert "immulticontext: Don't have a global_context_id" This reverts commit 39345212e8190aefa55a5266c123b2a7afc5c75f. This is causing eclipse crashes. Fixes: #7438 Part-of: --- gtk/gtkimmulticontext.c | 51 ++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c index 2d70cdeda06..7c91fee45d0 100644 --- a/gtk/gtkimmulticontext.c +++ b/gtk/gtkimmulticontext.c @@ -102,6 +102,8 @@ static gboolean gtk_im_multicontext_delete_surrounding_cb (GtkIMContext * static void propagate_purpose (GtkIMMulticontext *context); +static const gchar *global_context_id = NULL; + G_DEFINE_TYPE_WITH_PRIVATE (GtkIMMulticontext, gtk_im_multicontext, GTK_TYPE_IM_CONTEXT) static void @@ -254,7 +256,10 @@ get_effective_context_id (GtkIMMulticontext *multicontext) if (priv->context_id_aux) return priv->context_id_aux; - return _gtk_im_module_get_default_context_id (); + if (!global_context_id) + global_context_id = _gtk_im_module_get_default_context_id (); + + return global_context_id; } static GtkIMContext * @@ -262,6 +267,9 @@ gtk_im_multicontext_get_slave (GtkIMMulticontext *multicontext) { GtkIMMulticontextPrivate *priv = multicontext->priv; + if (g_strcmp0 (priv->context_id, get_effective_context_id (multicontext)) != 0) + gtk_im_multicontext_set_slave (multicontext, NULL, FALSE); + if (!priv->slave) { GtkIMContext *slave; @@ -286,28 +294,20 @@ im_module_setting_changed (GtkSettings *settings, GParamSpec *pspec, GtkIMMulticontext *self) { - gtk_im_multicontext_set_slave (self, NULL, FALSE); + global_context_id = NULL; } + static void gtk_im_multicontext_set_client_window (GtkIMContext *context, GdkWindow *window) { - GtkIMMulticontext *self = GTK_IM_MULTICONTEXT (context); - GtkIMMulticontextPrivate *priv = self->priv; + GtkIMMulticontext *multicontext = GTK_IM_MULTICONTEXT (context); + GtkIMMulticontextPrivate *priv = multicontext->priv; GtkIMContext *slave; GdkScreen *screen; GtkSettings *settings; - - if (priv->client_window != NULL) - { - screen = gdk_window_get_screen (priv->client_window); - settings = gtk_settings_get_for_screen (screen); - - g_signal_handlers_disconnect_by_func (settings, - im_module_setting_changed, - self); - } + gboolean connected; priv->client_window = window; @@ -316,12 +316,20 @@ gtk_im_multicontext_set_client_window (GtkIMContext *context, screen = gdk_window_get_screen (window); settings = gtk_settings_get_for_screen (screen); - g_signal_connect (settings, "notify::gtk-im-module", - G_CALLBACK (im_module_setting_changed), - self); + connected = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (settings), + "gtk-im-module-connected")); + if (!connected) + { + g_signal_connect (settings, "notify::gtk-im-module", + G_CALLBACK (im_module_setting_changed), NULL); + g_object_set_data (G_OBJECT (settings), "gtk-im-module-connected", + GINT_TO_POINTER (TRUE)); + + global_context_id = NULL; + } } - slave = gtk_im_multicontext_get_slave (self); + slave = gtk_im_multicontext_get_slave (multicontext); if (slave) gtk_im_context_set_client_window (slave, window); } @@ -716,14 +724,9 @@ gtk_im_multicontext_append_menuitems (GtkIMMulticontext *context, const char * gtk_im_multicontext_get_context_id (GtkIMMulticontext *context) { - GtkIMMulticontextPrivate *priv = context->priv; - g_return_val_if_fail (GTK_IS_IM_MULTICONTEXT (context), NULL); - if (priv->context_id == NULL) - gtk_im_multicontext_get_slave (context); - - return priv->context_id; + return context->priv->context_id; } /** -- GitLab