X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkimmulticontext.c;h=712d5ca8736d83396e7295ca70b4f49796efd579;hb=fd51c8f5e9d6fb68c8e81b9b1e2ab80931f963f0;hp=dee54ec1743da9aae725ae3b493bfe34ed0696d0;hpb=bd97127e6c1a17835d9d02c252522c0218467528;p=~andy%2Fgtk diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c index dee54ec17..712d5ca87 100644 --- a/gtk/gtkimmulticontext.c +++ b/gtk/gtkimmulticontext.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" @@ -23,13 +21,14 @@ #include #include "gtkimmulticontext.h" -#include "gtkimmodule.h" +#include "gtkimmoduleprivate.h" +#include "gtkintl.h" #include "gtklabel.h" #include "gtkmain.h" +#include "gtkprivate.h" #include "gtkradiomenuitem.h" #include "gtkseparatormenuitem.h" -#include "gtkintl.h" -#include "gtkprivate.h" +#include "gtksettings.h" /** @@ -56,6 +55,8 @@ struct _GtkIMMulticontextPrivate guint focus_in : 1; }; +static void gtk_im_multicontext_notify (GObject *object, + GParamSpec *pspec); static void gtk_im_multicontext_finalize (GObject *object); static void gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext, @@ -101,6 +102,8 @@ static gboolean gtk_im_multicontext_delete_surrounding_cb (GtkIMContext * gint n_chars, GtkIMMulticontext *multicontext); +static void propagate_purpose (GtkIMMulticontext *context); + static const gchar *global_context_id = NULL; G_DEFINE_TYPE (GtkIMMulticontext, gtk_im_multicontext, GTK_TYPE_IM_CONTEXT) @@ -110,7 +113,9 @@ gtk_im_multicontext_class_init (GtkIMMulticontextClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); GtkIMContextClass *im_context_class = GTK_IM_CONTEXT_CLASS (class); - + + gobject_class->notify = gtk_im_multicontext_notify; + im_context_class->set_client_window = gtk_im_multicontext_set_client_window; im_context_class->get_preedit_string = gtk_im_multicontext_get_preedit_string; im_context_class->filter_keypress = gtk_im_multicontext_filter_keypress; @@ -199,13 +204,15 @@ gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext, if (!finalizing) need_preedit_changed = TRUE; } - + priv->slave = slave; if (priv->slave) { g_object_ref (priv->slave); + propagate_purpose (multicontext); + g_signal_connect (priv->slave, "preedit-start", G_CALLBACK (gtk_im_multicontext_preedit_start_cb), multicontext); @@ -224,7 +231,7 @@ gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext, g_signal_connect (priv->slave, "delete-surrounding", G_CALLBACK (gtk_im_multicontext_delete_surrounding_cb), multicontext); - + if (!priv->use_preedit) /* Default is TRUE */ gtk_im_context_set_use_preedit (slave, FALSE); if (priv->client_window) @@ -258,6 +265,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; @@ -291,7 +301,8 @@ gtk_im_multicontext_set_client_window (GtkIMContext *context, { GtkIMMulticontext *multicontext = GTK_IM_MULTICONTEXT (context); GtkIMMulticontextPrivate *priv = multicontext->priv; - GdkScreen *screen; + GtkIMContext *slave; + GdkScreen *screen; GtkSettings *settings; gboolean connected; @@ -315,11 +326,9 @@ gtk_im_multicontext_set_client_window (GtkIMContext *context, } } - if (g_strcmp0 (priv->context_id, get_effective_context_id (multicontext)) != 0) - gtk_im_multicontext_set_slave (multicontext, NULL, FALSE); - - if (priv->slave) - gtk_im_context_set_client_window (priv->slave, window); + slave = gtk_im_multicontext_get_slave (multicontext); + if (slave) + gtk_im_context_set_client_window (slave, window); } static void @@ -393,12 +402,7 @@ gtk_im_multicontext_focus_in (GtkIMContext *context) { GtkIMMulticontext *multicontext = GTK_IM_MULTICONTEXT (context); GtkIMMulticontextPrivate *priv = multicontext->priv; - GtkIMContext *slave; - - if (g_strcmp0 (priv->context_id, get_effective_context_id (multicontext)) != 0) - gtk_im_multicontext_set_slave (multicontext, NULL, FALSE); - - slave = gtk_im_multicontext_get_slave (multicontext); + GtkIMContext *slave = gtk_im_multicontext_get_slave (multicontext); priv->focus_in = TRUE; @@ -758,3 +762,26 @@ gtk_im_multicontext_set_context_id (GtkIMMulticontext *context, priv->context_id_aux = g_strdup (context_id); gtk_im_multicontext_set_slave (context, NULL, FALSE); } + +static void +propagate_purpose (GtkIMMulticontext *context) +{ + GtkInputPurpose purpose; + GtkInputHints hints; + + if (context->priv->slave == NULL) + return; + + g_object_get (context, "input-purpose", &purpose, NULL); + g_object_set (context->priv->slave, "input-purpose", purpose, NULL); + + g_object_get (context, "input-hints", &hints, NULL); + g_object_set (context->priv->slave, "input-hints", hints, NULL); +} + +static void +gtk_im_multicontext_notify (GObject *object, + GParamSpec *pspec) +{ + propagate_purpose (GTK_IM_MULTICONTEXT (object)); +}