static void libclouseau_item_add(Evas_Object *o, Clouseau_Tree_Item *parent) { Clouseau_Tree_Item *treeit; Eina_List *children; Evas_Object *child; treeit = calloc(1, sizeof(Clouseau_Tree_Item)); if (!treeit) return ; treeit->ptr = (uintptr_t) o; treeit->is_obj = EINA_TRUE; treeit->name = eina_stringshare_add(evas_object_type_get(o)); treeit->is_clipper = !!evas_object_clipees_get(o); treeit->is_visible = evas_object_visible_get(o); treeit->info = clouseau_object_information_get(treeit); parent->children = eina_list_append(parent->children, treeit); /* if (!evas_object_smart_data_get(o)) return ; */ /* Do this only for smart object */ children = evas_object_smart_members_get(o); EINA_LIST_FREE(children, child) libclouseau_item_add(child, treeit); }
static JSBool elixir_evas_object_smart_members_get(JSContext *cx, uintN argc, jsval *vp) { Evas_Object *know = NULL; Eina_List *list; Eina_List *head; JSObject *array; int i; elixir_value_t val[1]; if (!elixir_params_check(cx, _evas_object_smart_params, val, argc, JS_ARGV(cx, vp))) return JS_FALSE; GET_PRIVATE(cx, val[0].v.obj, know); list = (Eina_List*) evas_object_smart_members_get(know); if (!list) { JS_SET_RVAL(cx, vp, JSVAL_NULL); return JS_TRUE; } array = elixir_return_array(cx, vp); if (!array) { eina_list_free(list); return JS_FALSE; } for (i = 0, head = list; list; list = eina_list_next(list), ++i) { Evas_Object *obj; jsval js_obj; obj = eina_list_data_get(list); evas_object_to_jsval(cx, obj, &js_obj); if (JS_SetElement(cx, array, i, &js_obj) == JS_FALSE) return JS_FALSE; } eina_list_free(head); return JS_TRUE; }
//--// callbacks static int _dnd_sorter(const void *d1, const void *d2) { Evas_Object *o1 = (Evas_Object *)d1; Evas_Object *o2 = (Evas_Object *)d2; Eina_List *o1l = NULL, *o2l = NULL, *l1, *l2, *list, *l; Evas_Object *common = NULL, *o; while (o1) { o1l = eina_list_prepend(o1l, o1); o1 = evas_object_smart_parent_get(o1); } while (o2) { o2l = eina_list_prepend(o2l, o2); o2 = evas_object_smart_parent_get(o2); } o1 = o1l->data; o2 = o2l->data; if (o1 != o2) { // different toplevels o = evas_object_bottom_get(evas_object_evas_get(o1)); while (o) { if (o1 == o) { // o1 below o2 eina_list_free(o1l); eina_list_free(o2l); return -1; } if (o2 == o) { // o2 below o1 eina_list_free(o1l); eina_list_free(o2l); return 1; } o = evas_object_above_get(o); } } for (l1 = o1l, l2 = o2l; l1 && l2; l1 = l1->next, l2 = l2->next) { o1 = l1->data; o2 = l2->data; if (o1 != o2) { // children differ, thus parent is common list = evas_object_smart_members_get(common); for (l = list; l; l = l->next) { o = l->data; if (o1 == o) { // o1 below o2 eina_list_free(list); eina_list_free(o1l); eina_list_free(o2l); return -1; } if (o2 == o) { // o2 below o1 eina_list_free(list); eina_list_free(o1l); eina_list_free(o2l); return 1; } } eina_list_free(list); break; } common = o1; } eina_list_free(o1l); eina_list_free(o2l); return 0; }