diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 4f02157944..e88d33a560 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -259,6 +259,13 @@ typedef enum _Edje_Load_Error EDJE_LOAD_ERROR_RECURSIVE_REFERENCE = 9 } Edje_Load_Error; +typedef enum _Edje_Text_Filter_Type +{ + EDJE_TEXT_FILTER_TEXT = 0, + EDJE_TEXT_FILTER_FORMAT = 1, + EDJE_TEXT_FILTER_MARKUP = 2 +} Edje_Text_Filter_Type; + typedef enum _Edje_External_Param_Type { EDJE_EXTERNAL_PARAM_TYPE_INT, @@ -468,9 +475,11 @@ struct _Edje_External_Type_Info }; typedef struct _Edje_External_Type_Info Edje_External_Type_Info; -typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source); -typedef void (*Edje_Text_Change_Cb) (void *data, Evas_Object *obj, const char *part); -typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg); +typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source); +typedef void (*Edje_Text_Change_Cb) (void *data, Evas_Object *obj, const char *part); +typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg); +typedef void (*Edje_Text_Filter_Cb) (void *data, Evas_Object *obj, const char *part, Edje_Text_Filter_Type type, char **text); +typedef Evas_Object *(*Edje_Item_Provider_Cb) (void *data, Evas_Object *obj, const char *part, const char *item); /* edje_main.c */ EAPI int edje_init (void); @@ -556,7 +565,7 @@ typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Mess EAPI const Evas_Object *edje_object_part_object_get (const Evas_Object *obj, const char *part); EAPI Eina_Bool edje_object_part_geometry_get (const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); - EAPI void edje_object_item_provider_set (Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item), void *data); + EAPI void edje_object_item_provider_set (Evas_Object *obj, Edje_Item_Provider_Cb func, void *data); EAPI void edje_object_text_change_cb_set (Evas_Object *obj, Edje_Text_Change_Cb func, void *data); @@ -593,8 +602,8 @@ typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Mess EAPI Eina_Bool edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur); EAPI const char *edje_object_part_text_cursor_content_get (const Evas_Object *obj, const char *part, Edje_Cursor cur); - EAPI void edje_object_text_insert_filter_callback_add (Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data); - EAPI void edje_object_text_insert_filter_callback_del (Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data); + EAPI void edje_object_text_insert_filter_callback_add (Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data); + EAPI void *edje_object_text_insert_filter_callback_del (Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func); EAPI Eina_Bool edje_object_part_swallow (Evas_Object *obj, const char *part, Evas_Object *obj_swallow); EAPI void edje_object_part_unswallow (Evas_Object *obj, Evas_Object *obj_swallow); diff --git a/legacy/edje/src/lib/edje_entry.c b/legacy/edje/src/lib/edje_entry.c index 9cd81a42f8..c32550c002 100644 --- a/legacy/edje/src/lib/edje_entry.c +++ b/legacy/edje/src/lib/edje_entry.c @@ -153,9 +153,8 @@ _edje_focus_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, #endif } -// need one for markup and format too - how to do it? extra type param? -static void __UNUSED__ -_text_filter_prepend(Entry *en, const char *text) +static void +_text_filter_text_prepend(Entry *en, const char *text) { char *text2; Edje_Text_Insert_Filter_Callback *cb; @@ -166,7 +165,7 @@ _text_filter_prepend(Entry *en, const char *text) { if (!strcmp(cb->part, en->rp->part->name)) { - cb->func(cb->data, en->rp->edje->obj, cb->part, &text2); + cb->func(cb->data, en->rp->edje->obj, cb->part, EDJE_TEXT_FILTER_TEXT, &text2); if (!text2) break; } } @@ -177,6 +176,52 @@ _text_filter_prepend(Entry *en, const char *text) } } +static void +_text_filter_format_prepend(Entry *en, const char *text) +{ + char *text2; + Edje_Text_Insert_Filter_Callback *cb; + Eina_List *l; + + text2 = strdup(text); + EINA_LIST_FOREACH(en->rp->edje->text_insert_filter_callbacks, l, cb) + { + if (!strcmp(cb->part, en->rp->part->name)) + { + cb->func(cb->data, en->rp->edje->obj, cb->part, EDJE_TEXT_FILTER_FORMAT, &text2); + if (!text2) break; + } + } + if (text2) + { + evas_textblock_cursor_format_prepend(en->cursor, text2); + free(text2); + } +} + +static void +_text_filter_markup_prepend(Entry *en, const char *text) +{ + char *text2; + Edje_Text_Insert_Filter_Callback *cb; + Eina_List *l; + + text2 = strdup(text); + EINA_LIST_FOREACH(en->rp->edje->text_insert_filter_callbacks, l, cb) + { + if (!strcmp(cb->part, en->rp->part->name)) + { + cb->func(cb->data, en->rp->edje->obj, cb->part, EDJE_TEXT_FILTER_MARKUP, &text2); + if (!text2) break; + } + } + if (text2) + { + evas_object_textblock_text_markup_prepend(en->cursor, text2); + free(text2); + } +} + static void _curs_update_from_curs(Evas_Textblock_Cursor *c, Evas_Object *o __UNUSED__, Entry *en) { @@ -1163,7 +1208,8 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v else { //yy - evas_textblock_cursor_format_prepend(en->cursor, "\t"); +// evas_textblock_cursor_format_prepend(en->cursor, "\t"); + _text_filter_format_prepend(en, "\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); @@ -1216,11 +1262,15 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v _sel_clear(en->cursor, rp->object, en); if (shift) { - evas_textblock_cursor_format_prepend(en->cursor, "\n"); + //yy +// evas_textblock_cursor_format_prepend(en->cursor, "\n"); + _text_filter_format_prepend(en, "\n"); } else { - evas_textblock_cursor_format_prepend(en->cursor, "ps"); + //yy +// evas_textblock_cursor_format_prepend(en->cursor, "ps"); + _text_filter_format_prepend(en, "ps"); } _curs_update_from_curs(en->cursor, rp->object, en); _anchors_get(en->cursor, rp->object, en); @@ -1239,7 +1289,8 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v _range_del(en->cursor, rp->object, en); _sel_clear(en->cursor, rp->object, en); //zz - evas_textblock_cursor_text_prepend(en->cursor, ev->string); +// evas_textblock_cursor_text_prepend(en->cursor, ev->string); + _text_filter_text_prepend(en, 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); @@ -1879,7 +1930,8 @@ _edje_entry_text_markup_insert(Edje_Real_Part *rp, const char *text) _range_del(en->cursor, rp->object, en); _sel_clear(en->cursor, rp->object, en); //xx - evas_object_textblock_text_markup_prepend(en->cursor, text); +// evas_object_textblock_text_markup_prepend(en->cursor, text); + _text_filter_markup_prepend(en, 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); @@ -2509,7 +2561,8 @@ _edje_entry_imf_event_commit_cb(void *data, int type __UNUSED__, void *event) } //yy - evas_textblock_cursor_text_prepend(en->cursor, ev->str); +// evas_textblock_cursor_text_prepend(en->cursor, ev->str); + _text_filter_text_prepend(en, ev->str); _curs_update_from_curs(en->cursor, rp->object, en); _anchors_get(en->cursor, rp->object, en); @@ -2564,7 +2617,8 @@ _edje_entry_imf_event_changed_cb(void *data, int type __UNUSED__, void *event) en->have_composition = EINA_TRUE; //xx - evas_object_textblock_text_markup_prepend(en->cursor, preedit_string); +// evas_object_textblock_text_markup_prepend(en->cursor, preedit_string); + _text_filter_markup_prepend(en, preedit_string); _curs_update_from_curs(en->cursor, rp->object, en); _anchors_get(en->cursor, rp->object, en); diff --git a/legacy/edje/src/lib/edje_message_queue.c b/legacy/edje/src/lib/edje_message_queue.c index 6ace9be2b6..8d0b0293f6 100644 --- a/legacy/edje/src/lib/edje_message_queue.c +++ b/legacy/edje/src/lib/edje_message_queue.c @@ -71,7 +71,7 @@ edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void */ EAPI void -edje_object_message_handler_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg), void *data) +edje_object_message_handler_set(Evas_Object *obj, Edje_Message_Handler_Cb func, void *data) { Edje *ed; diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 77d44c6b45..a6c1dd8320 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -983,14 +983,14 @@ struct _Edje FLOAT_T scale; struct { - void (*func) (void *data, Evas_Object *obj, const char *part); - void *data; + Edje_Text_Change_Cb func; + void *data; } text_change; struct { - void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg); - void *data; - int num; + Edje_Message_Handler_Cb func; + void *data; + int num; } message; int processing_messages; @@ -1025,8 +1025,8 @@ struct _Edje int lua_ref; struct { - Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item); - void *data; + Edje_Item_Provider_Cb func; + void *data; } item_provider; }; @@ -1183,16 +1183,16 @@ struct _Edje_Signal_Callback { const char *signal; const char *source; - void (*func) (void *data, Evas_Object *o, const char *emission, const char *source); - void *data; - unsigned char just_added : 1; - unsigned char delete_me : 1; + Edje_Signal_Cb func; + void *data; + unsigned char just_added : 1; + unsigned char delete_me : 1; }; struct _Edje_Text_Insert_Filter_Callback { const char *part; - void (*func) (void *data, Evas_Object *obj, const char *part, char **text); + Edje_Text_Filter_Cb func; void *data; }; diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index 11dde2c471..7f3c1b2382 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -1190,7 +1190,7 @@ edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coo * Edje object is deleted (or file is set to a new file). */ EAPI void -edje_object_item_provider_set(Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item), void *data) +edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data) { Edje *ed; @@ -1215,7 +1215,7 @@ edje_object_item_provider_set(Evas_Object *obj, Evas_Object *(*func) (void *data * */ EAPI void -edje_object_text_change_cb_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, const char *part), void *data) +edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data) { Edje *ed; unsigned int i; @@ -1230,8 +1230,8 @@ edje_object_text_change_cb_set(Evas_Object *obj, void (*func) (void *data, Evas_ Edje_Real_Part *rp; rp = ed->table_parts[i]; - if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object) - edje_object_text_change_cb_set(rp->swallowed_object, func, data); + if ((rp->part->type == EDJE_PART_TYPE_GROUP) && (rp->swallowed_object)) + edje_object_text_change_cb_set(rp->swallowed_object, func, data); } } @@ -2145,8 +2145,14 @@ edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *par return NULL; } +/** + * @brief XX + * + * @param obj A valid Evas_Object handle + * @param part The part name + */ EAPI void -edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data) +edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data) { Edje *ed; Edje_Text_Insert_Filter_Callback *cb; @@ -2156,31 +2162,39 @@ edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback)); cb->part = eina_stringshare_add(part); cb->func = func; - cb->data = (void*) data; + cb->data = (void *)data; ed->text_insert_filter_callbacks = eina_list_append(ed->text_insert_filter_callbacks, cb); } -EAPI void -edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data) +/** + * @brief XX + * + * @param obj A valid Evas_Object handle + * @param part The part name + */ +EAPI void * +edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func) { Edje *ed; Edje_Text_Insert_Filter_Callback *cb; Eina_List *l; ed = _edje_fetch(obj); - if ((!ed) || (!part)) return; + if ((!ed) || (!part)) return NULL; EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb) { - if ((!strcmp(cb->part, part)) && (cb->func == func) && (cb->data == data)) + if ((!strcmp(cb->part, part)) && (cb->func == func)) { + void *data = cb->data; ed->text_insert_filter_callbacks = - eina_list_remove_list(ed->text_insert_filter_callbacks, l); + eina_list_remove_list(ed->text_insert_filter_callbacks, l); eina_stringshare_del(cb->part); free(cb); - return; + return data; } } + return NULL; } /**