1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-21 06:53:01 +08:00

introduce lv_obj_rare_attr_t

This commit is contained in:
Gabor Kiss-Vamosi 2020-10-29 14:51:36 +01:00
parent e6738a2617
commit 7a950f1863
20 changed files with 185 additions and 91 deletions

View File

@ -73,6 +73,7 @@ void _lv_flex_refresh(lv_obj_t * cont)
lv_coord_t abs_x = cont->coords.x1 + lv_obj_get_style_pad_left(cont, LV_OBJ_PART_MAIN) - lv_obj_get_scroll_left(cont); lv_coord_t abs_x = cont->coords.x1 + lv_obj_get_style_pad_left(cont, LV_OBJ_PART_MAIN) - lv_obj_get_scroll_left(cont);
lv_coord_t abs_y = cont->coords.y1 + lv_obj_get_style_pad_top(cont, LV_OBJ_PART_MAIN) - lv_obj_get_scroll_top(cont); lv_coord_t abs_y = cont->coords.y1 + lv_obj_get_style_pad_top(cont, LV_OBJ_PART_MAIN) - lv_obj_get_scroll_top(cont);
lv_ll_t * ll = _lv_obj_get_child_ll(cont);
lv_coord_t * cross_pos = (row ? &abs_y : &abs_x); lv_coord_t * cross_pos = (row ? &abs_y : &abs_x);
lv_coord_t place = cont->flex_cont.place; lv_coord_t place = cont->flex_cont.place;
@ -92,7 +93,7 @@ void _lv_flex_refresh(lv_obj_t * cont)
bool rev = cont->flex_cont.dir & LV_FLEX_REVERSE; bool rev = cont->flex_cont.dir & LV_FLEX_REVERSE;
if(place != LV_FLEX_START) { if(place != LV_FLEX_START) {
track_first_item = rev ? _lv_ll_get_head(&cont->child_ll) : _lv_ll_get_tail(&cont->child_ll); track_first_item = rev ? _lv_ll_get_head(ll) : _lv_ll_get_tail(ll);
while(track_first_item) { while(track_first_item) {
/*Search the first item of the next row */ /*Search the first item of the next row */
@ -106,7 +107,7 @@ void _lv_flex_refresh(lv_obj_t * cont)
place_content(place, max_cross_size, all_track_size,row_cnt, cross_pos, &gap); place_content(place, max_cross_size, all_track_size,row_cnt, cross_pos, &gap);
} }
track_first_item = rev ? _lv_ll_get_head(&cont->child_ll) : _lv_ll_get_tail(&cont->child_ll); track_first_item = rev ? _lv_ll_get_head(ll) : _lv_ll_get_tail(ll);
while(track_first_item) { while(track_first_item) {
/*Search the first item of the next row */ /*Search the first item of the next row */
next_track_first_item = find_track_end(cont, track_first_item, max_main_size, &grow_unit, &track_size); next_track_first_item = find_track_end(cont, track_first_item, max_main_size, &grow_unit, &track_size);
@ -131,6 +132,8 @@ static lv_obj_t * find_track_end(lv_obj_t * cont, lv_obj_t * item_start, lv_coor
void * (*ll_iter)(const lv_ll_t * , const void *) = dir & LV_FLEX_REVERSE ? _lv_ll_get_next : _lv_ll_get_prev; void * (*ll_iter)(const lv_ll_t * , const void *) = dir & LV_FLEX_REVERSE ? _lv_ll_get_next : _lv_ll_get_prev;
bool wrap = dir & LV_FLEX_WRAP ? true : false; bool wrap = dir & LV_FLEX_WRAP ? true : false;
lv_ll_t * ll = _lv_obj_get_child_ll(cont);
lv_coord_t grow_sum = 0; lv_coord_t grow_sum = 0;
lv_coord_t used_size = 0; lv_coord_t used_size = 0;
lv_coord_t gap = cont->flex_cont.gap; lv_coord_t gap = cont->flex_cont.gap;
@ -143,7 +146,7 @@ static lv_obj_t * find_track_end(lv_obj_t * cont, lv_obj_t * item_start, lv_coor
/*Ignore non-flex items*/ /*Ignore non-flex items*/
lv_coord_t main_set = (row ? item->x_set : item->y_set); lv_coord_t main_set = (row ? item->x_set : item->y_set);
if(LV_COORD_IS_FLEX(main_set) == false) { if(LV_COORD_IS_FLEX(main_set) == false) {
item = ll_iter(&cont->child_ll, item); item = ll_iter(ll, item);
continue; continue;
} }
@ -158,7 +161,7 @@ static lv_obj_t * find_track_end(lv_obj_t * cont, lv_obj_t * item_start, lv_coor
} }
*track_cross_size = LV_MATH_MAX(get_cross_size(item), *track_cross_size); *track_cross_size = LV_MATH_MAX(get_cross_size(item), *track_cross_size);
item = ll_iter(&cont->child_ll, item); item = ll_iter(ll, item);
} }
if(used_size > 0) used_size -= gap; /*There is no gap after the last item*/ if(used_size > 0) used_size -= gap; /*There is no gap after the last item*/
@ -173,7 +176,7 @@ static lv_obj_t * find_track_end(lv_obj_t * cont, lv_obj_t * item_start, lv_coor
/*Have at least one item in a row*/ /*Have at least one item in a row*/
if(item && item == item_start) { if(item && item == item_start) {
item = ll_iter(&cont->child_ll, item); item = ll_iter(ll, item);
if(item) *track_cross_size = get_cross_size(item); if(item) *track_cross_size = get_cross_size(item);
} }
@ -193,6 +196,7 @@ static void children_repos(lv_obj_t * cont, lv_obj_t * item_first, lv_obj_t * it
lv_style_int_t (*get_margin_end)(const lv_obj_t *, uint8_t part) = (row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom); lv_style_int_t (*get_margin_end)(const lv_obj_t *, uint8_t part) = (row ? lv_obj_get_style_margin_right : lv_obj_get_style_margin_bottom);
void * (*ll_iter)(const lv_ll_t * , const void *) = dir & LV_FLEX_REVERSE ? _lv_ll_get_next : _lv_ll_get_prev; void * (*ll_iter)(const lv_ll_t * , const void *) = dir & LV_FLEX_REVERSE ? _lv_ll_get_next : _lv_ll_get_prev;
lv_ll_t * ll = _lv_obj_get_child_ll(cont);
lv_coord_t gap = cont->flex_cont.gap; lv_coord_t gap = cont->flex_cont.gap;
lv_coord_t main_pos = 0; lv_coord_t main_pos = 0;
/*Reposition the children*/ /*Reposition the children*/
@ -202,7 +206,7 @@ static void children_repos(lv_obj_t * cont, lv_obj_t * item_first, lv_obj_t * it
/*Ignore non-flex items*/ /*Ignore non-flex items*/
lv_coord_t main_set = (row ? item->x_set : item->y_set); lv_coord_t main_set = (row ? item->x_set : item->y_set);
if(LV_COORD_IS_FLEX(main_set) == false) { if(LV_COORD_IS_FLEX(main_set) == false) {
item = ll_iter(&cont->child_ll, item); item = ll_iter(ll, item);
continue; continue;
} }
@ -253,7 +257,7 @@ static void children_repos(lv_obj_t * cont, lv_obj_t * item_first, lv_obj_t * it
_lv_obj_move_children_by(item, diff_x, diff_y); _lv_obj_move_children_by(item, diff_x, diff_y);
} }
main_pos += obj_get_main_size(item) + gap; main_pos += obj_get_main_size(item) + gap;
item = ll_iter(&cont->child_ll, item); item = ll_iter(ll, item);
} }
} }

View File

@ -81,7 +81,7 @@ void lv_obj_report_grid_change(const lv_grid_t * grid)
while(d) { while(d) {
lv_obj_t * i; lv_obj_t * i;
_LV_LL_READ(d->scr_ll, i) { _LV_LL_READ(&d->scr_ll, i) {
report_grid_change_core(grid, i); report_grid_change_core(grid, i);
} }
d = lv_disp_get_next(d); d = lv_disp_get_next(d);

View File

@ -92,7 +92,7 @@ void lv_group_del(lv_group_t * group)
/*Remove the objects from the group*/ /*Remove the objects from the group*/
lv_obj_t ** obj; lv_obj_t ** obj;
_LV_LL_READ(group->obj_ll, obj) { _LV_LL_READ(&group->obj_ll, obj) {
(*obj)->group_p = NULL; (*obj)->group_p = NULL;
} }
@ -111,7 +111,7 @@ void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj)
if(group == NULL) return; if(group == NULL) return;
/*Do not add the object twice*/ /*Do not add the object twice*/
lv_obj_t ** obj_i; lv_obj_t ** obj_i;
_LV_LL_READ(group->obj_ll, obj_i) { _LV_LL_READ(&group->obj_ll, obj_i) {
if((*obj_i) == obj) { if((*obj_i) == obj) {
LV_LOG_INFO("lv_group_add_obj: the object is already added to this group"); LV_LOG_INFO("lv_group_add_obj: the object is already added to this group");
return; return;
@ -173,7 +173,7 @@ void lv_group_remove_obj(lv_obj_t * obj)
/*Search the object and remove it from its group */ /*Search the object and remove it from its group */
lv_obj_t ** i; lv_obj_t ** i;
_LV_LL_READ(g->obj_ll, i) { _LV_LL_READ(&g->obj_ll, i) {
if(*i == obj) { if(*i == obj) {
_lv_ll_remove(&g->obj_ll, i); _lv_ll_remove(&g->obj_ll, i);
lv_mem_free(i); lv_mem_free(i);
@ -198,7 +198,7 @@ void lv_group_remove_all_objs(lv_group_t * group)
/*Remove the objects from the group*/ /*Remove the objects from the group*/
lv_obj_t ** obj; lv_obj_t ** obj;
_LV_LL_READ(group->obj_ll, obj) { _LV_LL_READ(&group->obj_ll, obj) {
(*obj)->group_p = NULL; (*obj)->group_p = NULL;
} }
@ -223,7 +223,7 @@ void lv_group_focus_obj(lv_obj_t * obj)
lv_group_set_editing(g, false); lv_group_set_editing(g, false);
lv_obj_t ** i; lv_obj_t ** i;
_LV_LL_READ(g->obj_ll, i) { _LV_LL_READ(&g->obj_ll, i) {
if(*i == obj) { if(*i == obj) {
if(g->obj_focus != NULL) { if(g->obj_focus != NULL) {
(*g->obj_focus)->signal_cb(*g->obj_focus, LV_SIGNAL_DEFOCUS, NULL); (*g->obj_focus)->signal_cb(*g->obj_focus, LV_SIGNAL_DEFOCUS, NULL);

View File

@ -1048,7 +1048,8 @@ lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point)
if(lv_obj_hit_test(obj, point)) { if(lv_obj_hit_test(obj, point)) {
lv_obj_t * i; lv_obj_t * i;
_LV_LL_READ(obj->child_ll, i) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ(ll, i) {
found_p = lv_indev_search_obj(i, point); found_p = lv_indev_search_obj(i, point);
/*If a child was found then break*/ /*If a child was found then break*/

View File

@ -225,8 +225,10 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
else { else {
LV_LOG_TRACE("Object create started"); LV_LOG_TRACE("Object create started");
LV_ASSERT_OBJ(parent, LV_OBJX_NAME); LV_ASSERT_OBJ(parent, LV_OBJX_NAME);
if(parent->rare_attr == NULL) {
new_obj = _lv_ll_ins_head(&parent->child_ll); parent->rare_attr = lv_obj_allocate_rare_attr(parent);
}
new_obj = _lv_ll_ins_head(&parent->rare_attr->child_ll);
LV_ASSERT_MEM(new_obj); LV_ASSERT_MEM(new_obj);
if(new_obj == NULL) return NULL; if(new_obj == NULL) return NULL;
@ -260,9 +262,6 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
} }
_lv_ll_init(&(new_obj->child_ll), sizeof(lv_obj_t));
new_obj->ext_draw_pad = 0; new_obj->ext_draw_pad = 0;
#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL
@ -293,8 +292,6 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
new_obj->flags |= LV_OBJ_FLAG_SCROLL_MOMENTUM; new_obj->flags |= LV_OBJ_FLAG_SCROLL_MOMENTUM;
if(parent) new_obj->flags |= LV_OBJ_FLAG_GESTURE_BUBBLE; if(parent) new_obj->flags |= LV_OBJ_FLAG_GESTURE_BUBBLE;
new_obj->state = LV_STATE_DEFAULT; new_obj->state = LV_STATE_DEFAULT;
new_obj->scroll.x = 0;
new_obj->scroll.y = 0;
new_obj->ext_attr = NULL; new_obj->ext_attr = NULL;
@ -562,6 +559,10 @@ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent)
lv_obj_invalidate(obj); lv_obj_invalidate(obj);
if(parent->rare_attr == NULL) {
parent->rare_attr = lv_obj_allocate_rare_attr(parent);
}
lv_obj_t * old_par = obj->parent; lv_obj_t * old_par = obj->parent;
lv_point_t old_pos; lv_point_t old_pos;
old_pos.y = lv_obj_get_y(obj); old_pos.y = lv_obj_get_y(obj);
@ -575,7 +576,7 @@ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent)
old_pos.x = old_par->coords.x2 - obj->coords.x2; old_pos.x = old_par->coords.x2 - obj->coords.x2;
} }
_lv_ll_chg_list(&obj->parent->child_ll, &parent->child_ll, obj, true); _lv_ll_chg_list(_lv_obj_get_child_ll(obj->parent), _lv_obj_get_child_ll(parent), obj, true);
obj->parent = parent; obj->parent = parent;
@ -606,13 +607,14 @@ void lv_obj_move_foreground(lv_obj_t * obj)
LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
lv_obj_t * parent = lv_obj_get_parent(obj); lv_obj_t * parent = lv_obj_get_parent(obj);
lv_ll_t * ll = _lv_obj_get_child_ll(parent);
/*Do nothing of already in the foreground*/ /*Do nothing of already in the foreground*/
if(_lv_ll_get_head(&parent->child_ll) == obj) return; if(_lv_ll_get_head(ll) == obj) return;
lv_obj_invalidate(parent); lv_obj_invalidate(parent);
_lv_ll_chg_list(&parent->child_ll, &parent->child_ll, obj, true); _lv_ll_chg_list(ll, ll, obj, true);
/*Notify the new parent about the child*/ /*Notify the new parent about the child*/
parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, obj); parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, obj);
@ -629,13 +631,14 @@ void lv_obj_move_background(lv_obj_t * obj)
LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
lv_obj_t * parent = lv_obj_get_parent(obj); lv_obj_t * parent = lv_obj_get_parent(obj);
lv_ll_t * ll = _lv_obj_get_child_ll(parent);
/*Do nothing of already in the background*/ /*Do nothing of already in the background*/
if(_lv_ll_get_tail(&parent->child_ll) == obj) return; if(_lv_ll_get_tail(ll) == obj) return;
lv_obj_invalidate(parent); lv_obj_invalidate(parent);
_lv_ll_chg_list(&parent->child_ll, &parent->child_ll, obj, false); _lv_ll_chg_list(ll, ll, obj, false);
/*Notify the new parent about the child*/ /*Notify the new parent about the child*/
parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, obj); parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, obj);
@ -897,7 +900,8 @@ void lv_event_send_refresh_recursive(lv_obj_t * obj)
if(res != LV_RES_OK) return; /*If invalid returned do not check the children*/ if(res != LV_RES_OK) return; /*If invalid returned do not check the children*/
lv_obj_t * child; lv_obj_t * child;
_LV_LL_READ(obj->child_ll, child) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ(ll, child) {
lv_event_send_refresh_recursive(child); lv_event_send_refresh_recursive(child);
} }
} }
@ -1034,12 +1038,38 @@ void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size)
LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
void * new_ext = lv_mem_realloc(obj->ext_attr, ext_size); void * new_ext = lv_mem_realloc(obj->ext_attr, ext_size);
LV_ASSERT_MEM(new_ext);
if(new_ext == NULL) return NULL; if(new_ext == NULL) return NULL;
obj->ext_attr = new_ext; obj->ext_attr = new_ext;
return (void *)obj->ext_attr; return (void *)obj->ext_attr;
} }
/**
* Allocate a new ext. data for an object
* @param obj pointer to an object
* @param ext_size the size of the new ext. data
* @return pointer to the allocated ext.
* If out of memory NULL is returned and the original ext is preserved
*/
lv_obj_rare_attr_t * lv_obj_allocate_rare_attr(lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
if(obj->rare_attr == NULL) {
obj->rare_attr = lv_mem_realloc(obj->ext_attr, sizeof(lv_obj_rare_attr_t));
LV_ASSERT_MEM(obj->rare_attr);
if(obj->rare_attr == NULL) return NULL;
_lv_memset_00(obj->rare_attr, sizeof(lv_obj_rare_attr_t));
_lv_ll_init(&(obj->rare_attr->child_ll), sizeof(lv_obj_t));
}
return obj->rare_attr;
}
/*======================= /*=======================
* Getter functions * Getter functions
@ -1082,9 +1112,9 @@ lv_disp_t * lv_obj_get_disp(const lv_obj_t * obj)
scr = lv_obj_get_screen(obj); /*get the screen of `obj`*/ scr = lv_obj_get_screen(obj); /*get the screen of `obj`*/
lv_disp_t * d; lv_disp_t * d;
_LV_LL_READ(LV_GC_ROOT(_lv_disp_ll), d) { _LV_LL_READ(&LV_GC_ROOT(_lv_disp_ll), d) {
lv_obj_t * s; lv_obj_t * s;
_LV_LL_READ(d->scr_ll, s) { _LV_LL_READ(&d->scr_ll, s) {
if(s == scr) return d; if(s == scr) return d;
} }
} }
@ -1120,7 +1150,9 @@ lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, const lv_obj_t * child)
{ {
LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
return child ? _lv_ll_get_next(&obj->child_ll, child) : _lv_ll_get_head(&obj->child_ll); lv_ll_t * ll = _lv_obj_get_child_ll(obj);
if (child) return _lv_ll_get_next(ll, child);
else return _lv_ll_get_head(ll);
} }
/** /**
@ -1134,7 +1166,9 @@ lv_obj_t * lv_obj_get_child_back(const lv_obj_t * obj, const lv_obj_t * child)
{ {
LV_ASSERT_OBJ(obj, LV_OBJX_NAME); LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
return child ? _lv_ll_get_prev(&obj->child_ll, child) : _lv_ll_get_tail(&obj->child_ll); lv_ll_t * ll = _lv_obj_get_child_ll(obj);
if(child) return _lv_ll_get_prev(ll, child);
else return _lv_ll_get_tail(ll);
} }
/** /**
@ -1173,7 +1207,8 @@ uint32_t lv_obj_get_child_id(const lv_obj_t * obj)
uint32_t id = 0; uint32_t id = 0;
lv_obj_t * child; lv_obj_t * child;
_LV_LL_READ_BACK(obj->child_ll, child) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ_BACK(ll, child) {
if(child == obj) return id; if(child == obj) return id;
id++; id++;
} }
@ -1192,7 +1227,8 @@ uint32_t lv_obj_count_children(const lv_obj_t * obj)
lv_obj_t * i; lv_obj_t * i;
uint16_t cnt = 0; uint16_t cnt = 0;
_LV_LL_READ(obj->child_ll, i) cnt++; lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ(ll, i) cnt++;
return cnt; return cnt;
} }
@ -1208,7 +1244,8 @@ uint32_t lv_obj_count_children_recursive(const lv_obj_t * obj)
lv_obj_t * i; lv_obj_t * i;
uint16_t cnt = 0; uint16_t cnt = 0;
_LV_LL_READ(obj->child_ll, i) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ(ll, i) {
cnt++; /*Count the child*/ cnt++; /*Count the child*/
cnt += lv_obj_count_children_recursive(i); /*recursively count children's children*/ cnt += lv_obj_count_children_recursive(i); /*recursively count children's children*/
} }
@ -1526,6 +1563,12 @@ bool lv_obj_is_instance_of(lv_obj_t * obj, const char * type_str)
return false; return false;
} }
lv_ll_t * _lv_obj_get_child_ll(const lv_obj_t * obj)
{
if(obj->rare_attr) return &obj->rare_attr->child_ll;
else return NULL;
}
/*------------------- /*-------------------
* OTHER FUNCTIONS * OTHER FUNCTIONS
*------------------*/ *------------------*/
@ -1599,7 +1642,7 @@ bool _lv_debug_check_obj_valid(const lv_obj_t * obj)
lv_disp_t * disp = lv_disp_get_next(NULL); lv_disp_t * disp = lv_disp_get_next(NULL);
while(disp) { while(disp) {
lv_obj_t * scr; lv_obj_t * scr;
_LV_LL_READ(disp->scr_ll, scr) { _LV_LL_READ(&disp->scr_ll, scr) {
if(scr == obj) return true; if(scr == obj) return true;
bool found = obj_valid_child(scr, obj); bool found = obj_valid_child(scr, obj);
@ -1649,14 +1692,15 @@ static void obj_del_core(lv_obj_t * obj)
#endif #endif
/*Recursively delete the children*/ /*Recursively delete the children*/
lv_ll_t * ll = _lv_obj_get_child_ll(obj);
lv_obj_t * i; lv_obj_t * i;
i = _lv_ll_get_head(&(obj->child_ll)); i = _lv_ll_get_head(ll);
while(i != NULL) { while(i != NULL) {
/*Call the recursive delete to the child too*/ /*Call the recursive delete to the child too*/
obj_del_core(i); obj_del_core(i);
/*Set i to the new head node*/ /*Set i to the new head node*/
i = _lv_ll_get_head(&(obj->child_ll)); i = _lv_ll_get_head(ll);
} }
lv_event_mark_deleted(obj); lv_event_mark_deleted(obj);
@ -1690,7 +1734,7 @@ static void obj_del_core(lv_obj_t * obj)
_lv_ll_remove(&d->scr_ll, obj); _lv_ll_remove(&d->scr_ll, obj);
} }
else { else {
_lv_ll_remove(&(par->child_ll), obj); _lv_ll_remove(_lv_obj_get_child_ll(par), obj);
} }
/*Delete the base objects*/ /*Delete the base objects*/
@ -1842,7 +1886,7 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area
static void base_dir_refr_children(lv_obj_t * obj) static void base_dir_refr_children(lv_obj_t * obj)
{ {
lv_obj_t * child; lv_obj_t * child;
_LV_LL_READ(obj->child_ll, child) { _LV_LL_READ(_lv_obj_get_child_ll(obj), child) {
if(child->base_dir == LV_BIDI_DIR_INHERIT) { if(child->base_dir == LV_BIDI_DIR_INHERIT) {
lv_signal_send(child, LV_SIGNAL_BASE_DIR_CHG, NULL); lv_signal_send(child, LV_SIGNAL_BASE_DIR_CHG, NULL);
base_dir_refr_children(child); base_dir_refr_children(child);
@ -1953,8 +1997,9 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
} }
if(w_new || h_new) { if(w_new || h_new) {
lv_ll_t * ll = _lv_obj_get_child_ll(obj);
lv_obj_t * child; lv_obj_t * child;
_LV_LL_READ(obj->child_ll, child) { _LV_LL_READ(ll, child) {
if((LV_COORD_IS_PCT(child->w_set) && w_new) || if((LV_COORD_IS_PCT(child->w_set) && w_new) ||
(LV_COORD_IS_PCT(child->h_set) && h_new)) (LV_COORD_IS_PCT(child->h_set) && h_new))
{ {
@ -2006,8 +2051,9 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
/*Reposition non grid objects on by one*/ /*Reposition non grid objects on by one*/
lv_obj_t * child; lv_obj_t * child;
_LV_LL_READ(obj->child_ll, child) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
if(!LV_COORD_IS_GRID(child->x_set) || !LV_COORD_IS_GRID(child->y_set)) { _LV_LL_READ(ll, child) {
if(LV_COORD_IS_PX(child->x_set) || LV_COORD_IS_PX(child->y_set)) {
lv_obj_set_pos(child, child->x_set, child->y_set); lv_obj_set_pos(child, child->x_set, child->y_set);
} }
} }
@ -2039,7 +2085,8 @@ static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_fin
{ {
/*Check all children of `parent`*/ /*Check all children of `parent`*/
lv_obj_t * child; lv_obj_t * child;
_LV_LL_READ(parent->child_ll, child) { lv_ll_t * ll = _lv_obj_get_child_ll(parent);
_LV_LL_READ(ll, child) {
if(child == obj_to_find) return true; if(child == obj_to_find) return true;
/*Check the children*/ /*Check the children*/

View File

@ -208,12 +208,17 @@ typedef uint16_t lv_obj_flag_t;
#include "lv_obj_draw.h" #include "lv_obj_draw.h"
struct _lv_obj_t { typedef struct {
struct _lv_obj_t * parent; /**< Pointer to the parent object*/
lv_ll_t child_ll; /**< Linked list to store the children objects*/ lv_ll_t child_ll; /**< Linked list to store the children objects*/
lv_point_t scroll; /**< The current X/Y scroll offset*/
}lv_obj_rare_attr_t;
struct _lv_obj_t {
lv_obj_rare_attr_t * rare_attr;
struct _lv_obj_t * parent; /**< Pointer to the parent object*/
lv_area_t coords; /**< Coordinates of the object (x1, y1, x2, y2)*/ lv_area_t coords; /**< Coordinates of the object (x1, y1, x2, y2)*/
lv_point_t scroll; /**< The current X/Y scroll offset*/
lv_event_cb_t event_cb; /**< Event callback function */ lv_event_cb_t event_cb; /**< Event callback function */
lv_signal_cb_t signal_cb; /**< Object type specific signal function*/ lv_signal_cb_t signal_cb; /**< Object type specific signal function*/
@ -548,6 +553,7 @@ void lv_obj_set_design_cb(lv_obj_t * obj, lv_design_cb_t design_cb);
*/ */
void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size); void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size);
lv_obj_rare_attr_t * lv_obj_allocate_rare_attr(lv_obj_t * obj);
/*======================= /*=======================
* Getter functions * Getter functions
*======================*/ *======================*/
@ -760,6 +766,8 @@ bool lv_obj_is_focused(const lv_obj_t * obj);
*/ */
bool lv_obj_is_instance_of(lv_obj_t * obj, const char * type_str); bool lv_obj_is_instance_of(lv_obj_t * obj, const char * type_str);
lv_ll_t * _lv_obj_get_child_ll(const lv_obj_t * obj) ;
/** /**
* Get the really focused object by taking `focus_parent` into account. * Get the really focused object by taking `focus_parent` into account.
* @param obj the start object * @param obj the start object

View File

@ -438,19 +438,23 @@ void _lv_obj_draw_scrollbar(lv_obj_t * obj, const lv_area_t * clip_area)
lv_coord_t obj_w = lv_obj_get_width(obj); lv_coord_t obj_w = lv_obj_get_width(obj);
bool ver_draw = false; bool ver_draw = false;
if((sm == LV_SCROLL_MODE_ON) || if((obj->scroll_dir & LV_DIR_VER) &&
(sm == LV_SCROLL_MODE_AUTO && (st > 0 || sb > 0)) || ((sm == LV_SCROLL_MODE_ON) ||
(sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_VER)) { (sm == LV_SCROLL_MODE_AUTO && (st > 0 || sb > 0)) ||
(sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_VER))) {
ver_draw = true; ver_draw = true;
} }
bool hor_draw = false; bool hor_draw = false;
if((sm == LV_SCROLL_MODE_ON) || if((obj->scroll_dir & LV_DIR_HOR) &&
(sm == LV_SCROLL_MODE_AUTO && (sl > 0 || sr > 0)) || ((sm == LV_SCROLL_MODE_ON) ||
(sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_HOR)) { (sm == LV_SCROLL_MODE_AUTO && (sl > 0 || sr > 0)) ||
(sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_HOR))) {
hor_draw = true; hor_draw = true;
} }
lv_coord_t ver_reg_space = ver_draw ? tickness + side_space : 0; lv_coord_t ver_reg_space = ver_draw ? tickness + side_space : 0;
lv_coord_t hor_req_space = hor_draw ? tickness + side_space : 0; lv_coord_t hor_req_space = hor_draw ? tickness + side_space : 0;
lv_coord_t rem; lv_coord_t rem;

View File

@ -694,7 +694,8 @@ void _lv_obj_move_to(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, bool notify_par
void _lv_obj_move_children_by(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff) void _lv_obj_move_children_by(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff)
{ {
lv_obj_t * i; lv_obj_t * i;
_LV_LL_READ(obj->child_ll, i) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ(ll, i) {
i->coords.x1 += x_diff; i->coords.x1 += x_diff;
i->coords.y1 += y_diff; i->coords.y1 += y_diff;
i->coords.x2 += x_diff; i->coords.x2 += x_diff;

View File

@ -73,8 +73,13 @@ lv_scroll_mode_t lv_obj_get_scroll_mode(lv_obj_t * obj)
*/ */
void _lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) void _lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
{ {
obj->scroll.x += x; if(x == 0 && y == 0) return;
obj->scroll.y += y;
if(obj->rare_attr == NULL) {
obj->rare_attr = lv_obj_allocate_rare_attr(obj);
}
obj->rare_attr->scroll.x += x;
obj->rare_attr->scroll.y += y;
_lv_obj_move_children_by(obj, x, y); _lv_obj_move_children_by(obj, x, y);
lv_res_t res = lv_signal_send(obj, LV_SIGNAL_SCROLL, NULL); lv_res_t res = lv_signal_send(obj, LV_SIGNAL_SCROLL, NULL);
@ -107,7 +112,8 @@ void lv_obj_scroll_by(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable
if(t < SCROLL_ANIM_TIME_MIN) t = SCROLL_ANIM_TIME_MIN; if(t < SCROLL_ANIM_TIME_MIN) t = SCROLL_ANIM_TIME_MIN;
if(t > SCROLL_ANIM_TIME_MAX) t = SCROLL_ANIM_TIME_MAX; if(t > SCROLL_ANIM_TIME_MAX) t = SCROLL_ANIM_TIME_MAX;
lv_anim_set_time(&a, t); lv_anim_set_time(&a, t);
lv_anim_set_values(&a, obj->scroll.x, obj->scroll.x + x); lv_coord_t sl = lv_obj_get_scroll_left(obj);
lv_anim_set_values(&a, -sl, -sl + x);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) scroll_anim_x_cb); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) scroll_anim_x_cb);
lv_anim_set_path(&a, &path); lv_anim_set_path(&a, &path);
lv_anim_start(&a); lv_anim_start(&a);
@ -118,7 +124,8 @@ void lv_obj_scroll_by(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable
if(t < SCROLL_ANIM_TIME_MIN) t = SCROLL_ANIM_TIME_MIN; if(t < SCROLL_ANIM_TIME_MIN) t = SCROLL_ANIM_TIME_MIN;
if(t > SCROLL_ANIM_TIME_MAX) t = SCROLL_ANIM_TIME_MAX; if(t > SCROLL_ANIM_TIME_MAX) t = SCROLL_ANIM_TIME_MAX;
lv_anim_set_time(&a, t); lv_anim_set_time(&a, t);
lv_anim_set_values(&a, obj->scroll.y, obj->scroll.y + y); lv_coord_t st = lv_obj_get_scroll_top(obj);
lv_anim_set_values(&a, -st, -st + y);
lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) scroll_anim_y_cb); lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t) scroll_anim_y_cb);
lv_anim_set_path(&a, &path); lv_anim_set_path(&a, &path);
lv_anim_start(&a); lv_anim_start(&a);
@ -147,7 +154,7 @@ void lv_obj_scroll_to(lv_obj_t * obj, lv_coord_t x, lv_coord_t y, lv_anim_enable
*/ */
void lv_obj_scroll_to_x(lv_obj_t * obj, lv_coord_t x, lv_anim_enable_t anim_en) void lv_obj_scroll_to_x(lv_obj_t * obj, lv_coord_t x, lv_anim_enable_t anim_en)
{ {
lv_obj_scroll_by(obj, -x - obj->scroll.x, 0, anim_en); lv_obj_scroll_by(obj, -x + lv_obj_get_scroll_left(obj), 0, anim_en);
} }
/** /**
@ -157,7 +164,7 @@ void lv_obj_scroll_to_x(lv_obj_t * obj, lv_coord_t x, lv_anim_enable_t anim_en)
*/ */
void lv_obj_scroll_to_y(lv_obj_t * obj, lv_coord_t y, lv_anim_enable_t anim_en) void lv_obj_scroll_to_y(lv_obj_t * obj, lv_coord_t y, lv_anim_enable_t anim_en)
{ {
lv_obj_scroll_by(obj, 0, -y - obj->scroll.y, anim_en); lv_obj_scroll_by(obj, 0, -y + lv_obj_get_scroll_top(obj), anim_en);
} }
@ -170,7 +177,8 @@ void lv_obj_scroll_to_y(lv_obj_t * obj, lv_coord_t y, lv_anim_enable_t anim_en)
*/ */
lv_coord_t lv_obj_get_scroll_top(const lv_obj_t * obj) lv_coord_t lv_obj_get_scroll_top(const lv_obj_t * obj)
{ {
return -obj->scroll.y; if(obj->rare_attr == NULL) return 0;
return -obj->rare_attr->scroll.y;
} }
/** /**
@ -205,7 +213,7 @@ lv_coord_t lv_obj_get_scroll_bottom(lv_obj_t * obj)
lv_coord_t self_h = _lv_obj_get_self_height(obj); lv_coord_t self_h = _lv_obj_get_self_height(obj);
self_h = self_h - (lv_obj_get_height(obj) - pad_top - pad_bottom); self_h = self_h - (lv_obj_get_height(obj) - pad_top - pad_bottom);
self_h += obj->scroll.y; self_h -= lv_obj_get_scroll_top(obj);
return LV_MATH_MAX(child_res, self_h); return LV_MATH_MAX(child_res, self_h);
} }
@ -218,7 +226,8 @@ lv_coord_t lv_obj_get_scroll_bottom(lv_obj_t * obj)
*/ */
lv_coord_t lv_obj_get_scroll_left(const lv_obj_t * obj) lv_coord_t lv_obj_get_scroll_left(const lv_obj_t * obj)
{ {
return -obj->scroll.x; if(obj->rare_attr == NULL) return 0;
return -obj->rare_attr->scroll.x;
} }
/** /**
@ -251,7 +260,7 @@ lv_coord_t lv_obj_get_scroll_right(lv_obj_t * obj)
lv_coord_t self_w = _lv_obj_get_self_width(obj); lv_coord_t self_w = _lv_obj_get_self_width(obj);
self_w = self_w - (lv_obj_get_width(obj) - pad_right - pad_left); self_w = self_w - (lv_obj_get_width(obj) - pad_right - pad_left);
self_w += obj->scroll.x; self_w -= lv_obj_get_scroll_left(obj);
return LV_MATH_MAX(child_res, self_w); return LV_MATH_MAX(child_res, self_w);
} }
@ -278,10 +287,10 @@ void lv_obj_get_scroll_end(struct _lv_obj_t * obj, lv_point_t * end)
static void scroll_anim_x_cb(lv_obj_t * obj, lv_anim_value_t v) static void scroll_anim_x_cb(lv_obj_t * obj, lv_anim_value_t v)
{ {
_lv_obj_scroll_by_raw(obj, v - obj->scroll.x, 0); _lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_left(obj), 0);
} }
static void scroll_anim_y_cb(lv_obj_t * obj, lv_anim_value_t v) static void scroll_anim_y_cb(lv_obj_t * obj, lv_anim_value_t v)
{ {
_lv_obj_scroll_by_raw(obj, 0, v - obj->scroll.y); _lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_top(obj));
} }

View File

@ -191,7 +191,7 @@ void lv_obj_report_style_change(lv_style_t * style)
while(d) { while(d) {
lv_obj_t * i; lv_obj_t * i;
_LV_LL_READ(d->scr_ll, i) { _LV_LL_READ(&d->scr_ll, i) {
report_style_change_core(style, i); report_style_change_core(style, i);
} }
d = lv_disp_get_next(d); d = lv_disp_get_next(d);
@ -1247,7 +1247,7 @@ static void trans_anim_ready_cb(lv_anim_t * a)
* It allows changing it by normal styles*/ * It allows changing it by normal styles*/
bool running = false; bool running = false;
lv_style_trans_t * tr_i; lv_style_trans_t * tr_i;
_LV_LL_READ(LV_GC_ROOT(_lv_obj_style_trans_ll), tr_i) { _LV_LL_READ(&LV_GC_ROOT(_lv_obj_style_trans_ll), tr_i) {
if(tr_i != tr && tr_i->obj == tr->obj && tr_i->part == tr->part && tr_i->prop == tr->prop) { if(tr_i != tr && tr_i->obj == tr->obj && tr_i->part == tr->part && tr_i->prop == tr->prop) {
running = true; running = true;
} }

View File

@ -582,7 +582,8 @@ static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj)
#endif #endif
lv_obj_t * i; lv_obj_t * i;
_LV_LL_READ(obj->child_ll, i) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ(ll, i) {
found_p = lv_refr_get_top_obj(area_p, i); found_p = lv_refr_get_top_obj(area_p, i);
/*If a children is ok then break*/ /*If a children is ok then break*/
@ -626,13 +627,14 @@ static void lv_refr_obj_and_children(lv_obj_t * top_p, const lv_area_t * mask_p)
/*Do until not reach the screen*/ /*Do until not reach the screen*/
while(par != NULL) { while(par != NULL) {
lv_ll_t * ll = _lv_obj_get_child_ll(par);
/*object before border_p has to be redrawn*/ /*object before border_p has to be redrawn*/
lv_obj_t * i = _lv_ll_get_prev(&(par->child_ll), border_p); lv_obj_t * i = _lv_ll_get_prev(ll, border_p);
while(i != NULL) { while(i != NULL) {
/*Refresh the objects*/ /*Refresh the objects*/
lv_refr_obj(i, mask_p); lv_refr_obj(i, mask_p);
i = _lv_ll_get_prev(&(par->child_ll), i); i = _lv_ll_get_prev(ll, i);
} }
/*Call the post draw design function of the parents of the to object*/ /*Call the post draw design function of the parents of the to object*/
@ -700,7 +702,8 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p)
lv_area_t mask_child; /*Mask from obj and its child*/ lv_area_t mask_child; /*Mask from obj and its child*/
lv_obj_t * child_p; lv_obj_t * child_p;
lv_area_t child_area; lv_area_t child_area;
_LV_LL_READ_BACK(obj->child_ll, child_p) { lv_ll_t * ll = _lv_obj_get_child_ll(obj);
_LV_LL_READ_BACK(ll, child_p) {
lv_obj_get_coords(child_p, &child_area); lv_obj_get_coords(child_p, &child_area);
ext_size = child_p->ext_draw_pad; ext_size = child_p->ext_draw_pad;
child_area.x1 -= ext_size; child_area.x1 -= ext_size;

View File

@ -95,7 +95,7 @@ lv_res_t lv_img_decoder_get_info(const char * src, lv_img_header_t * header)
lv_res_t res = LV_RES_INV; lv_res_t res = LV_RES_INV;
lv_img_decoder_t * d; lv_img_decoder_t * d;
_LV_LL_READ(LV_GC_ROOT(_lv_img_defoder_ll), d) { _LV_LL_READ(&LV_GC_ROOT(_lv_img_defoder_ll), d) {
res = LV_RES_INV; res = LV_RES_INV;
if(d->info_cb) { if(d->info_cb) {
res = d->info_cb(d, src, header); res = d->info_cb(d, src, header);
@ -136,7 +136,7 @@ lv_res_t lv_img_decoder_open(lv_img_decoder_dsc_t * dsc, const void * src, lv_co
lv_res_t res = LV_RES_INV; lv_res_t res = LV_RES_INV;
lv_img_decoder_t * d; lv_img_decoder_t * d;
_LV_LL_READ(LV_GC_ROOT(_lv_img_defoder_ll), d) { _LV_LL_READ(&LV_GC_ROOT(_lv_img_defoder_ll), d) {
/*Info an Open callbacks are required*/ /*Info an Open callbacks are required*/
if(d->info_cb == NULL || d->open_cb == NULL) continue; if(d->info_cb == NULL || d->open_cb == NULL) continue;

View File

@ -188,7 +188,7 @@ void lv_disp_drv_update(lv_disp_t * disp, lv_disp_drv_t * new_drv)
memcpy(&disp->driver, new_drv, sizeof(lv_disp_drv_t)); memcpy(&disp->driver, new_drv, sizeof(lv_disp_drv_t));
lv_obj_t * scr; lv_obj_t * scr;
_LV_LL_READ(disp->scr_ll, scr) { _LV_LL_READ(&disp->scr_ll, scr) {
lv_obj_set_size(scr, lv_disp_get_hor_res(disp), lv_disp_get_ver_res(disp)); lv_obj_set_size(scr, lv_disp_get_hor_res(disp), lv_disp_get_ver_res(disp));
} }
} }

View File

@ -162,7 +162,7 @@ bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb)
lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb) lv_anim_t * lv_anim_get(void * var, lv_anim_exec_xcb_t exec_cb)
{ {
lv_anim_t * a; lv_anim_t * a;
_LV_LL_READ(LV_GC_ROOT(_lv_anim_ll), a) { _LV_LL_READ(&LV_GC_ROOT(_lv_anim_ll), a) {
if(a->var == var && a->exec_cb == exec_cb) { if(a->var == var && a->exec_cb == exec_cb) {
return a; return a;
} }
@ -179,7 +179,7 @@ uint16_t lv_anim_count_running(void)
{ {
uint16_t cnt = 0; uint16_t cnt = 0;
lv_anim_t * a; lv_anim_t * a;
_LV_LL_READ(LV_GC_ROOT(_lv_anim_ll), a) cnt++; _LV_LL_READ(&LV_GC_ROOT(_lv_anim_ll), a) cnt++;
return cnt; return cnt;
} }
@ -444,7 +444,7 @@ static void anim_task(lv_task_t * param)
(void)param; (void)param;
lv_anim_t * a; lv_anim_t * a;
_LV_LL_READ(LV_GC_ROOT(_lv_anim_ll), a) { _LV_LL_READ(&LV_GC_ROOT(_lv_anim_ll), a) {
a->has_run = 0; a->has_run = 0;
} }

View File

@ -503,7 +503,7 @@ lv_fs_drv_t * lv_fs_get_drv(char letter)
{ {
lv_fs_drv_t * drv; lv_fs_drv_t * drv;
_LV_LL_READ(LV_GC_ROOT(_lv_drv_ll), drv) { _LV_LL_READ(&LV_GC_ROOT(_lv_drv_ll), drv) {
if(drv->letter == letter) { if(drv->letter == letter) {
return drv; return drv;
} }
@ -521,7 +521,7 @@ char * lv_fs_get_letters(char * buf)
lv_fs_drv_t * drv; lv_fs_drv_t * drv;
uint8_t i = 0; uint8_t i = 0;
_LV_LL_READ(LV_GC_ROOT(_lv_drv_ll), drv) { _LV_LL_READ(&LV_GC_ROOT(_lv_drv_ll), drv) {
buf[i] = drv->letter; buf[i] = drv->letter;
i++; i++;
} }

View File

@ -156,6 +156,8 @@ void * _lv_ll_ins_tail(lv_ll_t * ll_p)
*/ */
void _lv_ll_remove(lv_ll_t * ll_p, void * node_p) void _lv_ll_remove(lv_ll_t * ll_p, void * node_p)
{ {
if(ll_p == NULL) return;
if(_lv_ll_get_head(ll_p) == node_p) { if(_lv_ll_get_head(ll_p) == node_p) {
/*The new head will be the node after 'n_act'*/ /*The new head will be the node after 'n_act'*/
ll_p->head = _lv_ll_get_next(ll_p, node_p); ll_p->head = _lv_ll_get_next(ll_p, node_p);
@ -249,7 +251,27 @@ void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool h
} }
} }
/**
* Return with head node of the linked list
* @param ll_p pointer to linked list
* @return pointer to the head of 'll_p'
*/
void * _lv_ll_get_head(const lv_ll_t * ll_p)
{
if(ll_p == NULL) return NULL;
return ll_p->head;
}
/**
* Return with tail node of the linked list
* @param ll_p pointer to linked list
* @return pointer to the head of 'll_p'
*/
void * _lv_ll_get_tail(const lv_ll_t * ll_p)
{
if(ll_p == NULL) return NULL;
return ll_p->tail;
}
/** /**
* Return with the pointer of the next node after 'n_act' * Return with the pointer of the next node after 'n_act'
* @param ll_p pointer to linked list * @param ll_p pointer to linked list

View File

@ -98,20 +98,14 @@ void _lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool h
* @param ll_p pointer to linked list * @param ll_p pointer to linked list
* @return pointer to the head of 'll_p' * @return pointer to the head of 'll_p'
*/ */
static inline void * _lv_ll_get_head(const lv_ll_t * ll_p) void * _lv_ll_get_head(const lv_ll_t * ll_p);
{
return ll_p->head;
}
/** /**
* Return with tail node of the linked list * Return with tail node of the linked list
* @param ll_p pointer to linked list * @param ll_p pointer to linked list
* @return pointer to the head of 'll_p' * @return pointer to the head of 'll_p'
*/ */
static inline void * _lv_ll_get_tail(const lv_ll_t * ll_p) void * _lv_ll_get_tail(const lv_ll_t * ll_p);
{
return ll_p->tail;
}
/** /**
* Return with the pointer of the next node after 'n_act' * Return with the pointer of the next node after 'n_act'
@ -163,9 +157,9 @@ bool _lv_ll_is_empty(lv_ll_t * ll_p);
* MACROS * MACROS
**********************/ **********************/
#define _LV_LL_READ(list, i) for(i = _lv_ll_get_head(&list); i != NULL; i = _lv_ll_get_next(&list, i)) #define _LV_LL_READ(list, i) for((i) = _lv_ll_get_head(list); i != NULL; (i) = _lv_ll_get_next(list, i))
#define _LV_LL_READ_BACK(list, i) for(i = _lv_ll_get_tail(&list); i != NULL; i = _lv_ll_get_prev(&list, i)) #define _LV_LL_READ_BACK(list, i) for(i = _lv_ll_get_tail(list); i != NULL; i = _lv_ll_get_prev(list, i))
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View File

@ -29,7 +29,7 @@
#endif #endif
#ifndef LV_MEM_FULL_DEFRAG_CNT #ifndef LV_MEM_FULL_DEFRAG_CNT
#define LV_MEM_FULL_DEFRAG_CNT 32 #define LV_MEM_FULL_DEFRAG_CNT 64
#endif #endif
#ifdef LV_ARCH_64 #ifdef LV_ARCH_64

View File

@ -305,7 +305,7 @@ void lv_task_set_prio(lv_task_t * task, lv_task_prio_t prio)
/*Find the tasks with new priority*/ /*Find the tasks with new priority*/
lv_task_t * i; lv_task_t * i;
_LV_LL_READ(LV_GC_ROOT(_lv_task_ll), i) { _LV_LL_READ(&LV_GC_ROOT(_lv_task_ll), i) {
if(i->prio <= prio) { if(i->prio <= prio) {
if(i != task) _lv_ll_move_before(&LV_GC_ROOT(_lv_task_ll), task, i); if(i != task) _lv_ll_move_before(&LV_GC_ROOT(_lv_task_ll), task, i);
break; break;

View File

@ -203,6 +203,7 @@ static bool inited;
static void basic_init(void) static void basic_init(void)
{ {
style_init_reset(&styles->sb);
lv_style_set_scrollbar_bg_opa(&styles->sb, LV_STATE_DEFAULT, LV_OPA_COVER); lv_style_set_scrollbar_bg_opa(&styles->sb, LV_STATE_DEFAULT, LV_OPA_COVER);
lv_style_set_scrollbar_bg_color(&styles->sb, LV_STATE_DEFAULT, (IS_LIGHT ? lv_color_hex(0xcccfd1) : lv_color_hex(0x777f85))); lv_style_set_scrollbar_bg_color(&styles->sb, LV_STATE_DEFAULT, (IS_LIGHT ? lv_color_hex(0xcccfd1) : lv_color_hex(0x777f85)));
lv_style_set_scrollbar_radius(&styles->sb, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); lv_style_set_scrollbar_radius(&styles->sb, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);