mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-14 06:42:58 +08:00
fix(tree): fix crash caused by clean parent in del cb (#4900)
Signed-off-by: yushuailong1 <yushuailong1@xiaomi.com> Co-authored-by: yushuailong1 <yushuailong1@xiaomi.com>
This commit is contained in:
parent
f3bc98474c
commit
2dadaaebad
@ -36,6 +36,7 @@ static void lv_obj_delete_async_cb(void * obj);
|
||||
static void obj_delete_core(lv_obj_t * obj);
|
||||
static lv_obj_tree_walk_res_t walk_core(lv_obj_t * obj, lv_obj_tree_walk_cb_t cb, void * user_data);
|
||||
static lv_obj_tree_walk_res_t dump_tree_core(lv_obj_t * obj, int32_t depth);
|
||||
static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj);
|
||||
|
||||
/**********************
|
||||
* STATIC VARIABLES
|
||||
@ -99,10 +100,10 @@ void lv_obj_clean(lv_obj_t * obj)
|
||||
|
||||
lv_obj_invalidate(obj);
|
||||
|
||||
lv_obj_t * child = lv_obj_get_child(obj, 0);
|
||||
lv_obj_t * child = lv_obj_get_first_not_deleting_child(obj);
|
||||
while(child) {
|
||||
obj_delete_core(child);
|
||||
child = lv_obj_get_child(obj, 0);
|
||||
child = lv_obj_get_first_not_deleting_child(obj);
|
||||
}
|
||||
/*Just to remove scroll animations if any*/
|
||||
lv_obj_scroll_to(obj, 0, 0, LV_ANIM_OFF);
|
||||
@ -616,3 +617,20 @@ static lv_obj_tree_walk_res_t dump_tree_core(lv_obj_t * obj, int32_t depth)
|
||||
return LV_OBJ_TREE_WALK_END;
|
||||
}
|
||||
}
|
||||
|
||||
static lv_obj_t * lv_obj_get_first_not_deleting_child(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, MY_CLASS);
|
||||
|
||||
if(obj->spec_attr == NULL) return NULL;
|
||||
|
||||
int32_t i;
|
||||
int32_t cnt = (int32_t)obj->spec_attr->child_cnt;
|
||||
for(i = 0; i < cnt; i++) {
|
||||
if(!obj->spec_attr->children[i]->is_deleting) {
|
||||
return obj->spec_attr->children[i];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user