[gtk/cherry-pick-b67da389] gtkimmulticontext: Handle switches between displays




commit bc4b2c142fa5076120ae5f5b26745d3536d9578b
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Mar 31 16:29:34 2022 +0200

    gtkimmulticontext: Handle switches between displays
    
    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
    
    
    (cherry picked from commit b67da38916b710ba6eedd65ffb569a29e47ddb4d)

 gtk/gtkimmulticontext.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c
index 47347d299b..0a5ef9a5a6 100644
--- a/gtk/gtkimmulticontext.c
+++ b/gtk/gtkimmulticontext.c
@@ -314,6 +314,11 @@ gtk_im_multicontext_set_client_widget (GtkIMContext *context,
   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);
@@ -332,11 +337,11 @@ gtk_im_multicontext_set_client_widget (GtkIMContext *context,
       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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]