Index: src/lib/elm_entry.c
===================================================================
--- src/lib/elm_entry.c	(revision 60650)
+++ src/lib/elm_entry.c	(working copy)
@@ -91,6 +91,7 @@
  * "selection,cleared" - The selection has been cleared
  * "cursor,changed" - The cursor has changed
  * "anchor,clicked" - The anchor has been clicked
+ * "preedit,changed" - The preedit string has changed
  */
 
 /* Maximum chunk size to be inserted to the entry at once
@@ -223,6 +224,7 @@ static const char SIG_SELECTION_CHANGED[] = "selec
 static const char SIG_SELECTION_CLEARED[] = "selection,cleared";
 static const char SIG_CURSOR_CHANGED[] = "cursor,changed";
 static const char SIG_ANCHOR_CLICKED[] = "anchor,clicked";
+static const char SIG_PREEDIT_CHANGED[] = "preedit,changed";
 static const Evas_Smart_Cb_Description _signals[] = {
        {SIG_CHANGED, ""},
        {SIG_ACTIVATED, ""},
@@ -240,6 +242,7 @@ static const Evas_Smart_Cb_Description _signals[]
        {SIG_SELECTION_CLEARED, ""},
        {SIG_CURSOR_CHANGED, ""},
        {SIG_ANCHOR_CLICKED, ""},
+       {SIG_PREEDIT_CHANGED, ""},
        {NULL, NULL}
 };
 
@@ -1326,6 +1329,31 @@ _signal_entry_changed(void *data, Evas_Object *obj
 }
 
 static void
+_signal_preedit_changed(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Evas_Coord minh;
+   if (!wd) return;
+   wd->changed = EINA_TRUE;
+   /* Reset the size hints which are no more relevant.
+    * Keep the height, this is a hack, but doesn't really matter
+    * cause we'll re-eval in a moment. */
+   evas_object_size_hint_min_get(data, NULL, &minh);
+   evas_object_size_hint_min_set(data, -1, minh);
+   _sizing_eval(data);
+   if (wd->text) eina_stringshare_del(wd->text);
+   wd->text = NULL;
+   evas_object_smart_callback_call(data, SIG_PREEDIT_CHANGED, NULL);
+   if (wd->delay_write)
+     {
+        ecore_timer_del(wd->delay_write);
+        wd->delay_write = NULL;
+     }
+   if ((!wd->autosave) || (!wd->file)) return;
+   wd->delay_write = ecore_timer_add(2.0, _delay_write, data);
+}
+
+static void
 _signal_selection_start(void *data, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
 {
    Widget_Data *wd = elm_widget_data_get(data);
@@ -1909,6 +1937,8 @@ elm_entry_add(Evas_Object *parent)
    _elm_theme_object_set(obj, wd->ent, "entry", "base", "default");
    edje_object_signal_callback_add(wd->ent, "entry,changed", "elm.text",
                                    _signal_entry_changed, obj);
+   edje_object_signal_callback_add(wd->ent, "preedit,changed", "elm.text",
+                                   _signal_preedit_changed, obj);
    edje_object_signal_callback_add(wd->ent, "selection,start", "elm.text",
                                    _signal_selection_start, obj);
    edje_object_signal_callback_add(wd->ent, "selection,changed", "elm.text",
