actually hook in filter callbacks - have 2 types and pass in enum to
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 2 Oct 2010 03:34:00 +0000 (03:34 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 2 Oct 2010 03:34:00 +0000 (03:34 +0000)
each as to what text they are seeing to filter. fix up other typdef
uses.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@52975 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/Edje.h
src/lib/edje_entry.c
src/lib/edje_message_queue.c
src/lib/edje_private.h
src/lib/edje_util.c

index 4f02157..e88d33a 100644 (file)
@@ -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);
index 9cd81a4..c32550c 100644 (file)
@@ -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;
           }
      }
@@ -178,6 +177,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)
 {
    Evas_Coord cx, cy, cw, ch;
@@ -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);
index 6ace9be..8d0b029 100644 (file)
@@ -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;
 
index 77d44c6..a6c1dd8 100644 (file)
@@ -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;
 };
 
index 11dde2c..7f3c1b2 100644 (file)
@@ -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;
 }
 
 /**