st-im-text: Support pre-edit

Use clutter_text_set_preedit_string() to wedge pre-edit text
into ClutterText.

https://bugzilla.gnome.org/show_bug.cgi?id=664041
This commit is contained in:
Daiki Ueno 2012-08-22 17:59:45 +09:00 committed by Rui Matos
parent 382310fe51
commit ee6086373b

View File

@ -81,6 +81,9 @@ static void st_im_text_commit_cb (GtkIMContext *context,
const gchar *str, const gchar *str,
StIMText *imtext); StIMText *imtext);
static void st_im_text_preedit_changed_cb (GtkIMContext *context,
StIMText *imtext);
G_DEFINE_TYPE (StIMText, st_im_text, CLUTTER_TYPE_TEXT) G_DEFINE_TYPE (StIMText, st_im_text, CLUTTER_TYPE_TEXT)
static void static void
@ -93,6 +96,9 @@ st_im_text_dispose (GObject *object)
g_signal_handlers_disconnect_by_func (priv->im_context, g_signal_handlers_disconnect_by_func (priv->im_context,
(void *) st_im_text_commit_cb, (void *) st_im_text_commit_cb,
object); object);
g_signal_handlers_disconnect_by_func (priv->im_context,
(void *) st_im_text_preedit_changed_cb,
object);
g_object_unref (priv->im_context); g_object_unref (priv->im_context);
priv->im_context = NULL; priv->im_context = NULL;
@ -140,6 +146,29 @@ st_im_text_commit_cb (GtkIMContext *context,
} }
} }
static void
st_im_text_preedit_changed_cb (GtkIMContext *context,
StIMText *imtext)
{
ClutterText *clutter_text = CLUTTER_TEXT (imtext);
gchar *preedit_str = NULL;
PangoAttrList *preedit_attrs = NULL;
gint cursor_pos = 0;
gtk_im_context_get_preedit_string (context,
&preedit_str,
&preedit_attrs,
&cursor_pos);
clutter_text_set_preedit_string (clutter_text,
preedit_str,
preedit_attrs,
cursor_pos);
g_free (preedit_str);
pango_attr_list_unref (preedit_attrs);
}
static void static void
reset_im_context (StIMText *self) reset_im_context (StIMText *self)
{ {
@ -445,6 +474,8 @@ st_im_text_init (StIMText *self)
priv->im_context = gtk_im_multicontext_new (); priv->im_context = gtk_im_multicontext_new ();
g_signal_connect (priv->im_context, "commit", g_signal_connect (priv->im_context, "commit",
G_CALLBACK (st_im_text_commit_cb), self); G_CALLBACK (st_im_text_commit_cb), self);
g_signal_connect (priv->im_context, "preedit-changed",
G_CALLBACK (st_im_text_preedit_changed_cb), self);
} }
/** /**