[evolution-patches] gtkhtml preedit_changed callback



This is a still uncomplete implementation for the
gtk_im_context_preedit_changed callback. Japanese input (with XIM and
im-ja) now works. The preedit pango attribs need to be set. I haven't had
the time to figure this out. 



--- gtkhtml_1.521.c	Sat Jun 28 16:40:03 2003
+++ gtkhtml_new.c	Sat Jun 28 15:54:30 2003
@@ -789,10 +790,17 @@
 void
 gtk_html_im_reset (GtkHTML *html)
 {
+	/* I don't know why this is called for every keypress, but it f***s up the preedit totally.
+	   gtk_im_context_reset() should only be called if we really want to do a reset,
+	   e.g. a selection is made with somewhere else in the text. 
+	   Adding a character to the text shouldn't trigger this. => FIXME
+	*/
+	/* 
 	if (html->priv->need_im_reset) {
 		html->priv->need_im_reset = FALSE;
-		gtk_im_context_reset (html->priv->im_context);
+		gtk_im_context_reset (html->priv->im_context); 
 	}
+	*/
 }
 
 static gint
@@ -2662,16 +2670,57 @@
 	}
 }
 
+static gint last_length; /* FIXME: put these somewhere else */
+static gint last_pos;
+static void 
+gtk_html_delete_preedit(GtkHTML *html)
+{
+	/* delete previous preedit string */
+	if ((last_pos - last_length >= 0) && (last_length > 0)) {
+		html_cursor_jump_to_position_no_spell (html->engine->cursor, html->engine, last_pos - last_length);
+		html_engine_set_mark (html->engine);
+		html_cursor_jump_to_position_no_spell (html->engine->cursor, html->engine, last_pos);
+		html_engine_delete (html->engine);
+	}
+}
+
 static void
 gtk_html_im_commit_cb (GtkIMContext *context, const gchar *str, GtkHTML *html)
 {
+	gint orig_position = html->engine->cursor->position;
+	gtk_html_delete_preedit(html);
+
 	html_engine_paste_text (html->engine, str, -1);
+	last_length = 0;
+	last_pos = html->engine->cursor->position;
 }
 
 static void
 gtk_html_im_preedit_changed_cb (GtkIMContext *context, GtkHTML *html)
 {
-	g_warning ("preedit changed callback: implement me");
+	gint position;
+	gchar *str;
+	PangoAttrList *attribs;
+	gint preedit_cursor_position;
+
+	gtk_im_context_get_preedit_string (context, &str, &attribs, &preedit_cursor_position);
+
+	gtk_html_delete_preedit(html);
+
+	last_length = g_utf8_strlen(str, -1); /* store new string length */
+
+	position = html->engine->cursor->position + preedit_cursor_position;
+	
+	/* FIXME: Apply the pango attributes to the string */
+	html_engine_insert_text (html->engine, str, -1);
+	last_pos = html->engine->cursor->position;
+
+	/* Move the cursor inside the preedit string as requested */
+	if (position >= 0) html_cursor_jump_to_position_no_spell (html->engine->cursor, html->engine, position);
+	
+	pango_attr_list_unref (attribs);
+	g_free (str);
+
 }
 
 static gchar *



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