Files
gtk3/debian/patches/immulticontext-Don-t-have-a-global_context_id.patch
2024-08-20 16:28:24 -04:00

138 lines
4.6 KiB
Diff

From: Benjamin Otte <otte@redhat.com>
Date: Tue, 8 Jan 2019 00:16:52 +0100
Subject: immulticontext: Don't have a global_context_id
Context IDs are dependant on the display - both because displays can use
different backends, but also because changing the GtkSetting is a
per-display operation.
So just remove the cache.
If it turns out we need a per-display cache, we can add one to
GtkSettings.
(cherry picked from commit 16d4ce4d0301b7af2a67703e792efdcf27b1d397
with slight changes to use priv->client_window instead of
priv->client_widget)
(cherry picked from commit 39345212e8190aefa55a5266c123b2a7afc5c75f)
Origin: upstream gtk-3-24 branch, after 3.24.43
---
gtk/gtkimmulticontext.c | 55 +++++++++++++++++++++++--------------------------
1 file changed, 26 insertions(+), 29 deletions(-)
diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c
index ec67254..5036355 100644
--- a/gtk/gtkimmulticontext.c
+++ b/gtk/gtkimmulticontext.c
@@ -102,8 +102,6 @@ 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
@@ -256,10 +254,7 @@ get_effective_context_id (GtkIMMulticontext *multicontext)
if (priv->context_id_aux)
return priv->context_id_aux;
- if (!global_context_id)
- global_context_id = _gtk_im_module_get_default_context_id ();
-
- return global_context_id;
+ return _gtk_im_module_get_default_context_id ();
}
static GtkIMContext *
@@ -267,9 +262,6 @@ 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;
@@ -290,23 +282,31 @@ gtk_im_multicontext_get_slave (GtkIMMulticontext *multicontext)
}
static void
-im_module_setting_changed (GtkSettings *settings,
- gpointer data)
+im_module_setting_changed (GtkSettings *settings,
+ GtkIMMulticontext *self)
{
- global_context_id = NULL;
+ gtk_im_multicontext_set_slave (self, NULL, FALSE);
}
-
static void
gtk_im_multicontext_set_client_window (GtkIMContext *context,
GdkWindow *window)
{
- GtkIMMulticontext *multicontext = GTK_IM_MULTICONTEXT (context);
- GtkIMMulticontextPrivate *priv = multicontext->priv;
+ GtkIMMulticontext *self = GTK_IM_MULTICONTEXT (context);
+ GtkIMMulticontextPrivate *priv = self->priv;
GtkIMContext *slave;
GdkScreen *screen;
GtkSettings *settings;
- gboolean connected;
+
+ 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);
+ }
priv->client_window = window;
@@ -315,20 +315,12 @@ gtk_im_multicontext_set_client_window (GtkIMContext *context,
screen = gdk_window_get_screen (window);
settings = gtk_settings_get_for_screen (screen);
- 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;
- }
+ g_signal_connect (settings, "notify::gtk-im-module",
+ G_CALLBACK (im_module_setting_changed),
+ self);
}
- slave = gtk_im_multicontext_get_slave (multicontext);
+ slave = gtk_im_multicontext_get_slave (self);
if (slave)
gtk_im_context_set_client_window (slave, window);
}
@@ -723,9 +715,14 @@ 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);
- return context->priv->context_id;
+ if (priv->context_id == NULL)
+ gtk_im_multicontext_get_slave (context);
+
+ return priv->context_id;
}
/**