}
static void
-_text_prepend(Entry *en, const char *text)
+_text_prepend(Entry *en, Evas_Textblock_Cursor *cursor, const char *text)
{
char *str;
str[0] = toupper(str[0]);
}
- evas_textblock_cursor_text_prepend(en->cursor, str);
+ evas_textblock_cursor_text_prepend(cursor, str);
free(str);
}
}
evas_textblock_cursor_free(tc);
-
- en->have_preedit = EINA_FALSE;
}
static void
ecore_imf_context_cursor_position_set(en->imf_context, evas_textblock_cursor_pos_get(en->cursor));
ecore_imf_context_focus_out(en->imf_context);
-// _preedit_clear(en);
-
if (en->input_panel_enable)
{
keypad_show = EINA_FALSE;
ecore_imf_context_cursor_position_set(en->imf_context, evas_textblock_cursor_pos_get(en->cursor));
ecore_imf_context_focus_out(en->imf_context);
-// _preedit_clear(en);
-
if (en->input_panel_enable)
{
keypad_show = EINA_FALSE;
if (!strcmp(ev->key, "Escape"))
{
#ifdef HAVE_ECORE_IMF
- if (en->imf_context)
- {
- ecore_imf_context_reset(en->imf_context);
- }
+ if (en->imf_context) ecore_imf_context_reset(en->imf_context);
#endif
// dead keys here. Escape for now (should emit these)
_edje_emit(ed, "entry,key,escape", rp->part->name);
if (en->func(en->data, (void *)ev->string))
return;
- _text_prepend(en, ev->string);
+ _text_prepend(en, en->cursor, ev->string);
//evas_textblock_cursor_text_prepend(en->cursor, ev->string);
/*count characters*/
if(en->func)
if (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_BLOCK_HANDLE)
{
- _edje_entry_real_part_configure(rp);
+ _edje_entry_real_part_configure(rp);
}
else
{
Edje_Real_Part *rp = ed->focused_part;
Entry *en;
Ecore_IMF_Event_Commit *ev = event;
+ Evas_Textblock_Cursor *tc;
+ Eina_Bool cursor_move = EINA_FALSE;
if (!rp) return ECORE_CALLBACK_PASS_ON;
if (!en->imf_context) return ECORE_CALLBACK_PASS_ON;
if (en->imf_context != ev->ctx) return ECORE_CALLBACK_PASS_ON;
- //printf("\n[%s]\n", __func__);
-
if (en->have_selection)
{
if (strcmp(ev->str, ""))
}
}
+ tc = evas_object_textblock_cursor_new(rp->object);
+
+ /* calculate the cursor position to insert commit string */
+ if (en->preedit_start)
+ evas_textblock_cursor_copy(en->preedit_start, tc);
+ else
+ evas_textblock_cursor_copy(en->cursor, tc);
+
/* delete preedit characters */
_preedit_del(en);
_preedit_clear(en);
- //printf("[%s] commit str : '%s'\n", __func__, ev->str);
-
+ if (evas_textblock_cursor_compare(en->cursor, tc))
+ cursor_move = EINA_TRUE;
+
if (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_CHARACTER)
{
_edje_entry_hide_visible_password(en->rp);
if (en->func(en->data, (void *)ev->str))
return ECORE_CALLBACK_PASS_ON;
- evas_object_textblock_text_markup_prepend(en->cursor, "<password=off>");
- evas_object_textblock_text_markup_prepend(en->cursor, ev->str);
- evas_object_textblock_text_markup_prepend(en->cursor, "</password>");
+ evas_object_textblock_text_markup_prepend(tc, "<password=off>");
+ evas_object_textblock_text_markup_prepend(tc, ev->str);
+ evas_object_textblock_text_markup_prepend(tc, "</password>");
+
if (en->pw_timer)
{
ecore_timer_del(en->pw_timer);
if (en->func(en->data, ev->str))
return ECORE_CALLBACK_PASS_ON;
- _text_prepend(en, ev->str);
+ _text_prepend(en, tc, ev->str);
//evas_textblock_cursor_text_prepend(en->cursor, ev->str);
/*count characters*/
evas_textblock_cursor_text_prepend(en->cursor, ev->str);
#endif
}
+
+
+ if (!cursor_move)
+ {
+ /* move cursor to the end of commit string */
+ evas_textblock_cursor_copy(tc, en->cursor);
+ }
+
+ evas_textblock_cursor_free(tc);
+
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
_edje_emit(rp->edje, "entry,changed", rp->part->name);
int preedit_start_pos, preedit_end_pos;
char *preedit_string;
int i;
+ Eina_Bool preedit_end_state = EINA_FALSE;
+ Eina_List *attrs = NULL;
+ Ecore_IMF_Preedit_Attr *attr;
+ Eina_List *l;
if (!rp) return ECORE_CALLBACK_PASS_ON;
if (en->imf_context != ev->ctx) return ECORE_CALLBACK_PASS_ON;
- ecore_imf_context_preedit_string_get(en->imf_context, &preedit_string, &cursor_pos);
+// ecore_imf_context_preedit_string_get(en->imf_context, &preedit_string, &cursor_pos);
+ ecore_imf_context_preedit_string_with_attributes_get(en->imf_context, &preedit_string, &attrs, &cursor_pos);
- //printf("\n[%s]\n", __func__);
+ if (!strcmp(preedit_string, ""))
+ preedit_end_state = EINA_TRUE;
/*if inputtin text is not allowed, dont allow text input*/
if ((en->func) && !en->have_preedit)
/* delete preedit characters */
_preedit_del(en);
- //printf("[%s] insert preedit str : '%s'\n", __func__, preedit_string);
-
preedit_start_pos = evas_textblock_cursor_pos_get(en->cursor);
+ EINA_LIST_FOREACH(attrs, l, attr)
+ {
+ //printf("attribute type : %d, start : %d, end : %d\n", attr->preedit_type, attr->start_index, attr->end_index);
+ }
+
/* insert preedit character(s) */
//xx
evas_object_textblock_text_markup_prepend(en->cursor, preedit_string);
- /* set preedit start cursor */
- if (!en->preedit_start)
- en->preedit_start = evas_object_textblock_cursor_new(rp->object);
- evas_textblock_cursor_copy(en->cursor, en->preedit_start);
+ if (!preedit_end_state)
+ {
+ /* set preedit start cursor */
+ if (!en->preedit_start)
+ en->preedit_start = evas_object_textblock_cursor_new(rp->object);
+ evas_textblock_cursor_copy(en->cursor, en->preedit_start);
- /* set preedit end cursor */
- if (!en->preedit_end)
- en->preedit_end = evas_object_textblock_cursor_new(rp->object);
- evas_textblock_cursor_copy(en->cursor, en->preedit_end);
-
- preedit_end_pos = evas_textblock_cursor_pos_get(en->cursor);
+ /* set preedit end cursor */
+ if (!en->preedit_end)
+ en->preedit_end = evas_object_textblock_cursor_new(rp->object);
+ evas_textblock_cursor_copy(en->cursor, en->preedit_end);
- for (i = 0; i < (preedit_end_pos - preedit_start_pos); i++)
- {
- evas_textblock_cursor_char_prev(en->preedit_start);
- }
+ preedit_end_pos = evas_textblock_cursor_pos_get(en->cursor);
- if (!strcmp(preedit_string, ""))
- {
- _preedit_clear(en);
- en->have_preedit = EINA_FALSE;
+ for (i = 0; i < (preedit_end_pos - preedit_start_pos); i++)
+ {
+ evas_textblock_cursor_char_prev(en->preedit_start);
+ }
}
- else
+
+ if (!preedit_end_state)
{
en->have_preedit = EINA_TRUE;
_edje_emit(rp->edje, "entry,changed", rp->part->name);
_edje_emit(ed, "cursor,changed", rp->part->name);
+ /* delete attribute list */
+ EINA_LIST_FREE(attrs, attr)
+ free(attr);
+
free(preedit_string);
return ECORE_CALLBACK_DONE;