Enlightenment CVS committal
Author : pfritz
Project : e17
Module : libs/ewl
Dir : e17/libs/ewl/src/lib
Modified Files:
ewl_text.c
Log Message:
fix some utf8 issues with ewl_text_obscure_set()
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_text.c,v
retrieving revision 1.192
retrieving revision 1.193
diff -u -3 -r1.192 -r1.193
--- ewl_text.c 5 Apr 2008 21:36:14 -0000 1.192
+++ ewl_text.c 5 Apr 2008 23:48:53 -0000 1.193
@@ -62,6 +62,8 @@
static void ewl_text_triggers_unrealize(Ewl_Text *t);
static void ewl_text_triggers_show(Ewl_Text *t);
static void ewl_text_triggers_hide(Ewl_Text *t);
+static unsigned int ewl_text_drawn_byte_to_char(Ewl_Text *t, unsigned int
byte_idx);
+static unsigned int ewl_text_char_to_drawn_byte(Ewl_Text *t, unsigned int
char_idx);
/**
* @return Returns a new Ewl_Text widget on success, NULL on failure.
@@ -291,8 +293,8 @@
shifting = 1;
}
- ewl_text_fmt_char_to_byte(t->formatting.nodes, char_idx,
- 0, &byte_idx, NULL);
+ byte_idx = ewl_text_char_to_drawn_byte(t, char_idx);
+
cursor = ewl_text_textblock_cursor_position(t, byte_idx);
evas_textblock_cursor_char_geometry_get(cursor, &tx, &ty, &tw, &th);
evas_textblock_cursor_free(cursor);
@@ -364,7 +366,7 @@
/* Increment if we're on the last line */
if (!txt || (strcmp(txt, "\n")))
- char_idx ++;
+ char_idx++;
}
}
else
@@ -378,12 +380,11 @@
evas_textblock_cursor_char_geometry_get(cursor,
&cx, &cy, &cw, &ch);
if (tx > (cx + ((cw + 1) >> 1)))
- char_idx ++;
+ char_idx++;
}
byte_idx = ewl_text_textblock_cursor_to_index(cursor);
- ewl_text_fmt_byte_to_char(t->formatting.nodes, byte_idx,
- 0, &ctmp, NULL);
+ ctmp = ewl_text_drawn_byte_to_char(t, byte_idx);
evas_textblock_cursor_free(cursor);
char_idx += ctmp;
@@ -1049,8 +1050,7 @@
DCHECK_TYPE_RET(t, EWL_TEXT_TYPE, t->cursor_position);
cur_char_idx = ewl_text_cursor_position_get(t);
- ewl_text_fmt_char_to_byte(t->formatting.nodes, cur_char_idx,
- 0, &byte_idx, NULL);
+ byte_idx = ewl_text_char_to_drawn_byte(t, cur_char_idx);
cursor = ewl_text_textblock_cursor_position(t, byte_idx);
line = evas_textblock_cursor_char_geometry_get(cursor, &cx, NULL,
@@ -1075,9 +1075,7 @@
}
byte_idx = ewl_text_textblock_cursor_to_index(cursor);
- cur_char_idx = 0;
- ewl_text_fmt_byte_to_char(t->formatting.nodes, byte_idx,
- 0, &cur_char_idx, NULL);
+ cur_char_idx = ewl_text_drawn_byte_to_char(t, byte_idx);
DRETURN_INT(cur_char_idx, DLEVEL_STABLE);
}
@@ -2987,7 +2985,6 @@
static void
ewl_text_cb_format(Ewl_Text_Fmt_Node *node, Ewl_Text *t, unsigned int byte_idx)
{
- char *ptr, tmp;
Evas_Textblock_Cursor *cursor;
DENTER_FUNCTION(DLEVEL_STABLE);
@@ -3007,6 +3004,7 @@
if (!t->obscure)
{
+ char *ptr, tmp;
ptr = t->text + byte_idx;
tmp = *(ptr + node->byte_len);
if (strlen(ptr) < node->byte_len)
@@ -3019,9 +3017,8 @@
}
else
{
- char *otxt;
+ char *otxt, *ptr;
size_t len;
-
int i;
len = strlen(t->obscure);
@@ -3094,10 +3091,10 @@
* character index. You _MUST_ call evas_textblock_cursor_free(cursor)
* on this object so it won't leak */
static Evas_Textblock_Cursor *
-ewl_text_textblock_cursor_position(Ewl_Text *t, unsigned int char_idx)
+ewl_text_textblock_cursor_position(Ewl_Text *t, unsigned int byte_idx)
{
Evas_Textblock_Cursor *cursor;
- unsigned int cur_char_idx = 0;
+ unsigned int cur_byte_idx = 0;
const char *txt;
DENTER_FUNCTION(DLEVEL_STABLE);
@@ -3119,13 +3116,13 @@
if ((!strcmp(txt, "\n")) || (!strcmp(txt, "\t")))
{
/* will this push us past the end? */
- if ((cur_char_idx + 1) > char_idx)
+ if ((cur_byte_idx + 1) > byte_idx)
{
evas_textblock_cursor_pos_set(cursor,
- char_idx - cur_char_idx);
+ byte_idx - cur_byte_idx);
break;
}
- else cur_char_idx ++;
+ else cur_byte_idx++;
}
}
else
@@ -3140,15 +3137,13 @@
/* if this would move us past our index, find the
* difference between our desired index and the
* current index and set that */
- /* XXX I thought evas uses for all things byte indices
- * shouldn't we transform thos char_idx to byte_idx? */
- if ((cur_char_idx + pos) > char_idx)
+ if ((cur_byte_idx + pos) > byte_idx)
{
evas_textblock_cursor_pos_set(cursor,
- char_idx - cur_char_idx);
+ byte_idx - cur_byte_idx);
break;
}
- cur_char_idx += pos;
+ cur_byte_idx += pos;
}
/* if we fail to goto the next node, just assume we're at
@@ -3162,7 +3157,7 @@
/* This shouldn't happen, we've moved past our index. Just
* checking so the loop isn't (hopefully) infinite */
- if (cur_char_idx > char_idx)
+ if (cur_byte_idx > byte_idx)
{
DWARNING("This shouldn't happen, breaking loop.");
break;
@@ -4054,5 +4049,47 @@
ecore_list_append(t->triggers, trigger);
DRETURN(DLEVEL_STABLE);
+}
+
+static unsigned int
+ewl_text_drawn_byte_to_char(Ewl_Text *t, unsigned int byte_idx)
+{
+ unsigned int char_idx = 0;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+ DCHECK_PARAM_PTR_RET(t, 0);
+ DCHECK_TYPE_RET(t, EWL_TEXT_TYPE, 0);
+
+ if (!t->obscure)
+ ewl_text_fmt_byte_to_char(t->formatting.nodes, byte_idx,
+ 0, &char_idx, NULL);
+ else {
+ size_t len = strlen(t->obscure);
+
+ if (len != 0)
+ char_idx = byte_idx / len;
+ else
+ char_idx = ewl_text_length_get(t);
+ }
+
+ DRETURN_INT(char_idx, DLEVEL_STABLE);
+}
+
+static unsigned int
+ewl_text_char_to_drawn_byte(Ewl_Text *t, unsigned int char_idx)
+{
+ unsigned int byte_idx = 0;
+
+ DENTER_FUNCTION(DLEVEL_STABLE);
+ DCHECK_PARAM_PTR_RET(t, 0);
+ DCHECK_TYPE_RET(t, EWL_TEXT_TYPE, 0);
+
+ if (!t->obscure)
+ ewl_text_fmt_char_to_byte(t->formatting.nodes, char_idx,
+ 0, &byte_idx, NULL);
+ else
+ byte_idx = char_idx * strlen(t->obscure);
+
+ DRETURN_INT(byte_idx, DLEVEL_STABLE);
}
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Register now and save $200. Hurry, offer ends at 11:59 p.m.,
Monday, April 7! Use priority code J8TLD2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs