+static void invoke_pre_callback(widget_pre_callback_e type, const char *id)
+{
+ Eina_List *l;
+ Eina_List *n;
+ struct pre_callback_item *item;
+
+ EINA_LIST_FOREACH_SAFE(s_info.widget_pre_callback_list[type], l, n, item) {
+ item->cb(id, item->data);
+ }
+}
+
+int widget_provider_app_add_pre_callback(widget_pre_callback_e type, widget_pre_callback_t cb, void *data)
+{
+ struct pre_callback_item *item;
+ Eina_List *l;
+
+ if (!cb || type == WIDGET_PRE_CALLBACK_COUNT) {
+ return WIDGET_ERROR_INVALID_PARAMETER;
+ }
+
+ EINA_LIST_FOREACH(s_info.widget_pre_callback_list[type], l, item) {
+ if (item->cb == cb && item->data == data) {
+ return WIDGET_ERROR_ALREADY_EXIST;
+ }
+ }
+
+ item = malloc(sizeof(*item));
+ if (!item) {
+ ErrPrint("malloc: %d\n", errno);
+ return WIDGET_ERROR_OUT_OF_MEMORY;
+ }
+
+ item->cb = cb;
+ item->data = data;
+
+ s_info.widget_pre_callback_list[type] = eina_list_append(s_info.widget_pre_callback_list[type], item);
+ return 0;
+}
+
+int widget_provider_app_del_pre_callback(widget_pre_callback_e type, widget_pre_callback_t cb, void *data)
+{
+ Eina_List *l;
+ Eina_List *n;
+ struct pre_callback_item *item;
+
+ if (!cb || type == WIDGET_PRE_CALLBACK_COUNT) {
+ ErrPrint("Invalid parameter\n");
+ return WIDGET_ERROR_INVALID_PARAMETER;
+ }
+
+ EINA_LIST_FOREACH_SAFE(s_info.widget_pre_callback_list[type], l, n, item) {
+ if (item->cb == cb && item->data == data) {
+ s_info.widget_pre_callback_list[type] = eina_list_remove_list(s_info.widget_pre_callback_list[type], l);
+ free(item);
+ return WIDGET_ERROR_NONE;
+ }
+ }
+
+ return WIDGET_ERROR_NOT_EXIST;
+}
+