Currently the GtkIMMultiContext may stick to a delegate GtkIMContext
that no longer applies after the multicontext is dissociated from
any widget.
Handle set_client_widget() so that it can handle changes between
widgets from 2 different display, but also so the delegate is made
NULL whenever the context has a NULL widget.
Doing so, any new client widget results in a new delegate IM context
lookup from the right GdkDisplay and GtkSettings, which avoids any
mix up.
Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/4805
GtkIMContext *delegate;
GtkSettings *settings;
+ if (priv->client_widget == widget)
+ return;
+
+ gtk_im_multicontext_set_delegate (self, NULL, TRUE);
+
if (priv->client_widget != NULL)
{
settings = gtk_widget_get_settings (priv->client_widget);
g_signal_connect (settings, "notify::gtk-im-module",
G_CALLBACK (im_module_setting_changed),
self);
- }
- delegate = gtk_im_multicontext_get_delegate (self);
- if (delegate)
- gtk_im_context_set_client_widget (delegate, widget);
+ delegate = gtk_im_multicontext_get_delegate (self);
+ if (delegate)
+ gtk_im_context_set_client_widget (delegate, widget);
+ }
}
static void