[prev in list] [next in list] [prev in thread] [next in thread]
List: enlightenment-svn
Subject: E SVN: tasn trunk/edje/src/lib
From: "Enlightenment SVN" <no-reply () enlightenment ! org>
Date: 2010-11-30 11:06:22
Message-ID: 20101130110622.EE06A10B01BA () e2 ! enlightenment ! org
[Download RAW message or body]
Log:
Edje entry: Fixed bug with preedit string. The text was committed to the current \
cursor position instead of the preedit cursor position (which may be different if you \
click the mouse somewhere in the tetx). Patch by Jihoon Kim.
Author: tasn
Date: 2010-11-30 03:06:22 -0800 (Tue, 30 Nov 2010)
New Revision: 55080
Trac: http://trac.enlightenment.org/e/changeset/55080
Modified:
trunk/edje/src/lib/edje_entry.c
Modified: trunk/edje/src/lib/edje_entry.c
===================================================================
--- trunk/edje/src/lib/edje_entry.c 2010-11-30 09:39:23 UTC (rev 55079)
+++ trunk/edje/src/lib/edje_entry.c 2010-11-30 11:06:22 UTC (rev 55080)
@@ -34,8 +34,7 @@
Eina_Bool select_mod_end : 1;
Eina_Bool had_sel : 1;
-#ifdef HAVE_ECORE_IMF
- int preedit_len;
+#ifdef HAVE_ECORE_IMF
Eina_Bool have_preedit : 1;
Ecore_IMF_Context *imf_context;
@@ -60,7 +59,36 @@
Eina_Bool item : 1;
};
-#ifdef HAVE_ECORE_IMF
+#ifdef HAVE_ECORE_IMF
+static void
+_preedit_clear(Entry *en)
+{
+ if (en->preedit_start)
+ {
+ evas_textblock_cursor_free(en->preedit_start);
+ en->preedit_start = NULL;
+ }
+
+ if (en->preedit_end)
+ {
+ evas_textblock_cursor_free(en->preedit_end);
+ en->preedit_end = NULL;
+ }
+
+ en->have_preedit = EINA_FALSE;
+}
+
+static void
+_preedit_del(Entry *en)
+{
+ if (!en || !en->have_preedit) return;
+ if (!en->preedit_start || !en->preedit_end) return;
+ if (!evas_textblock_cursor_compare(en->preedit_start, en->preedit_end)) return;
+
+ /* delete the preedit characters */
+ evas_textblock_cursor_range_delete(en->preedit_start, en->preedit_end);
+}
+
static void
_edje_entry_focus_in_cb(void *data, Evas_Object *o __UNUSED__, const char *emission \
__UNUSED__, const char *source __UNUSED__) {
@@ -95,9 +123,6 @@
ecore_imf_context_reset(en->imf_context);
ecore_imf_context_cursor_position_set(en->imf_context, \
evas_textblock_cursor_pos_get(en->cursor)); \
ecore_imf_context_focus_out(en->imf_context);
-
- en->preedit_len = 0;
- en->have_preedit = EINA_FALSE;
}
#endif
@@ -150,14 +175,11 @@
ecore_imf_context_reset(en->imf_context);
ecore_imf_context_cursor_position_set(en->imf_context, \
evas_textblock_cursor_pos_get(en->cursor)); \
ecore_imf_context_focus_out(en->imf_context);
-
- en->preedit_len = 0;
- en->have_preedit = EINA_FALSE;
#endif
}
static void
-_text_filter_text_prepend(Entry *en, const char *text)
+_text_filter_text_prepend(Entry *en, Evas_Textblock_Cursor *c, const char *text)
{
char *text2;
Edje_Text_Insert_Filter_Callback *cb;
@@ -174,13 +196,13 @@
}
if (text2)
{
- evas_textblock_cursor_text_prepend(en->cursor, text2);
+ evas_textblock_cursor_text_prepend(c, text2);
free(text2);
}
}
static void
-_text_filter_format_prepend(Entry *en, const char *text)
+_text_filter_format_prepend(Entry *en, Evas_Textblock_Cursor *c, const char *text)
{
char *text2;
Edje_Text_Insert_Filter_Callback *cb;
@@ -197,13 +219,13 @@
}
if (text2)
{
- evas_textblock_cursor_format_prepend(en->cursor, text2);
+ evas_textblock_cursor_format_prepend(c, text2);
free(text2);
}
}
static void
-_text_filter_markup_prepend(Entry *en, const char *text)
+_text_filter_markup_prepend(Entry *en, Evas_Textblock_Cursor *c, const char *text)
{
char *text2;
Edje_Text_Insert_Filter_Callback *cb;
@@ -220,7 +242,7 @@
}
if (text2)
{
- evas_object_textblock_text_markup_prepend(en->cursor, text2);
+ evas_object_textblock_text_markup_prepend(c, text2);
free(text2);
}
}
@@ -387,6 +409,12 @@
en->selection = NULL;
}
_edje_emit(en->rp->edje, "selection,changed", en->rp->part->name);
+
+#ifdef HAVE_ECORE_IMF
+ if (!en->imf_context) return;
+
+ ecore_imf_context_reset(en->imf_context);
+#endif
}
static void
@@ -402,6 +430,11 @@
en->selection = NULL;
}
_edje_emit(en->rp->edje, "selection,changed", en->rp->part->name);
+
+#ifdef HAVE_ECORE_IMF
+ if (!en->imf_context) return;
+ ecore_imf_context_reset(en->imf_context);
+#endif
}
static void
@@ -1210,7 +1243,7 @@
{
//yy
// evas_textblock_cursor_format_prepend(en->cursor, "\t");
- _text_filter_format_prepend(en, "\t");
+ _text_filter_format_prepend(en, en->cursor, "\t");
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
_edje_emit(ed, "entry,changed", rp->part->name);
@@ -1265,13 +1298,13 @@
{
//yy
// evas_textblock_cursor_format_prepend(en->cursor, "\n");
- _text_filter_format_prepend(en, "\n");
+ _text_filter_format_prepend(en, en->cursor, "\n");
}
else
{
//yy
// evas_textblock_cursor_format_prepend(en->cursor, "ps");
- _text_filter_format_prepend(en, "ps");
+ _text_filter_format_prepend(en, en->cursor, "ps");
}
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
@@ -1291,7 +1324,7 @@
_sel_clear(en->cursor, rp->object, en);
//zz
// evas_textblock_cursor_text_prepend(en->cursor, ev->string);
- _text_filter_text_prepend(en, ev->string);
+ _text_filter_text_prepend(en, en->cursor, ev->string);
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
_edje_emit(ed, "entry,changed", rp->part->name);
@@ -1848,6 +1881,7 @@
rp->entry_data = NULL;
_sel_clear(en->cursor, rp->object, en);
_anchors_clear(en->cursor, rp->object, en);
+ _preedit_clear(en);
rp->edje->subobjs = eina_list_remove(rp->edje->subobjs, en->cursor_bg);
rp->edje->subobjs = eina_list_remove(rp->edje->subobjs, en->cursor_fg);
evas_object_del(en->cursor_bg);
@@ -1962,7 +1996,7 @@
_sel_clear(en->cursor, rp->object, en);
//xx
// evas_object_textblock_text_markup_prepend(en->cursor, text);
- _text_filter_markup_prepend(en, text);
+ _text_filter_markup_prepend(en, en->cursor, text);
_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);
@@ -2568,7 +2602,8 @@
Edje_Real_Part *rp = ed->focused_part;
Entry *en;
Ecore_IMF_Event_Commit *ev = event;
- int i;
+ Evas_Textblock_Cursor *tc;
+ Eina_Bool cursor_move = EINA_FALSE;
if (!rp) return ECORE_CALLBACK_PASS_ON;
@@ -2577,25 +2612,46 @@
(rp->part->entry_mode < EDJE_ENTRY_EDIT_MODE_SELECTABLE))
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;
if (en->have_selection)
{
- _range_del(en->cursor, rp->object, en);
- _sel_clear(en->cursor, rp->object, en);
+ if (strcmp(ev->str, ""))
+ {
+ /* delete selected characters */
+ _range_del(en->cursor, rp->object, en);
+ _sel_clear(en->cursor, rp->object, en);
+ }
}
- if (en->have_preedit)
- {
- for (i = 0; i < en->preedit_len; i++)
- _backspace(en->cursor, rp->object, en);
- en->have_preedit = EINA_FALSE;
- }
+ 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);
+
+ if (evas_textblock_cursor_compare(en->cursor, tc))
+ cursor_move = EINA_TRUE;
+
//yy
// evas_textblock_cursor_text_prepend(en->cursor, ev->str);
- _text_filter_text_prepend(en, ev->str);
+ _text_filter_text_prepend(en, tc, ev->str);
+ 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);
@@ -2610,10 +2666,12 @@
Edje* ed = data;
Edje_Real_Part *rp = ed->focused_part;
Entry *en;
- int length = 0;
Ecore_IMF_Event_Preedit_Changed *ev = event;
- int i = 0;
+ int cursor_pos;
+ int preedit_start_pos, preedit_end_pos;
char *preedit_string;
+ int i;
+ Eina_Bool preedit_end_state = EINA_FALSE;
if (!rp) return ECORE_CALLBACK_PASS_ON;
@@ -2626,32 +2684,56 @@
if (en->imf_context != ev->ctx) return ECORE_CALLBACK_PASS_ON;
- ecore_imf_context_preedit_string_get(en->imf_context, &preedit_string, &length);
+ ecore_imf_context_preedit_string_get(en->imf_context, &preedit_string, \
&cursor_pos);
- // FIXME : check the maximum length of evas_textblock
- if ( 0 /* check the maximum length of evas_textblock */ )
- return ECORE_CALLBACK_PASS_ON;
+ if (!strcmp(preedit_string, ""))
+ preedit_end_state = EINA_TRUE;
- if (en->have_selection)
+ if (en->have_selection && !preedit_end_state)
{
+ /* delete selected characters */
_range_del(en->cursor, rp->object, en);
_sel_clear(en->cursor, rp->object, en);
}
- if (en->have_preedit)
- {
- // delete the preedit characters
- for (i = 0;i < en->preedit_len; i++)
- _backspace(en->cursor, rp->object, en);
- }
+ /* delete preedit characters */
+ _preedit_del(en);
- en->preedit_len = length;
- en->have_preedit = EINA_TRUE;
+ preedit_start_pos = evas_textblock_cursor_pos_get(en->cursor);
+ /* insert preedit character(s) */
//xx
// evas_object_textblock_text_markup_prepend(en->cursor, preedit_string);
- _text_filter_markup_prepend(en, preedit_string);
+ _text_filter_markup_prepend(en, en->cursor, preedit_string);
+ 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);
+
+ for (i = 0; i < (preedit_end_pos - preedit_start_pos); i++)
+ {
+ evas_textblock_cursor_char_prev(en->preedit_start);
+ }
+ }
+
+ if (!preedit_end_state)
+ {
+ en->have_preedit = EINA_TRUE;
+
+ /* set cursor position */
+ evas_textblock_cursor_pos_set(en->cursor, preedit_start_pos + cursor_pos);
+ }
+
_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);
------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
enlightenment-svn mailing list
enlightenment-svn@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic