mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-21 06:53:01 +08:00
raname lv_obj_rare_attr_t to lv_obj_spec_attr_t and finialize it
This commit is contained in:
parent
7a950f1863
commit
4fbc518d6a
@ -38,20 +38,25 @@ static void place_content(lv_coord_t place, lv_coord_t max_size, lv_coord_t trac
|
||||
|
||||
void lv_obj_set_flex_cont(lv_obj_t * obj, lv_flex_dir_t flex_dir, lv_flex_place_t flex_place)
|
||||
{
|
||||
if(obj->flex_cont.dir == flex_dir && obj->flex_cont.place == flex_place) return;
|
||||
if(obj->spec_attr == NULL) lv_obj_allocate_rare_attr(obj);
|
||||
|
||||
obj->flex_cont.dir = flex_dir;
|
||||
obj->flex_cont.place = flex_place;
|
||||
if(obj->spec_attr->flex_cont.dir == flex_dir && obj->spec_attr->flex_cont.place == flex_place) return;
|
||||
|
||||
obj->spec_attr->flex_cont.dir = flex_dir & 0x3;
|
||||
obj->spec_attr->flex_cont.wrap = flex_dir & LV_FLEX_WRAP ? 1 : 0;
|
||||
obj->spec_attr->flex_cont.rev = flex_dir & LV_FLEX_REVERSE ? 1 : 0;
|
||||
obj->spec_attr->flex_cont.place = flex_place;
|
||||
|
||||
_lv_flex_refresh(obj);
|
||||
}
|
||||
|
||||
void lv_obj_set_flex_gap(lv_obj_t * obj, lv_coord_t gap)
|
||||
{
|
||||
if(obj->spec_attr == NULL) lv_obj_allocate_rare_attr(obj);
|
||||
|
||||
if(obj->flex_cont.gap == gap) return;
|
||||
if(obj->spec_attr->flex_cont.gap == gap) return;
|
||||
|
||||
obj->flex_cont.gap = gap;
|
||||
obj->spec_attr->flex_cont.gap = gap;
|
||||
|
||||
_lv_flex_refresh(obj);
|
||||
}
|
||||
@ -62,21 +67,52 @@ void lv_obj_set_flex_item(lv_obj_t * obj, lv_flex_place_t place)
|
||||
lv_obj_set_pos(obj, f, f);
|
||||
}
|
||||
|
||||
lv_flex_dir_t lv_obj_get_flex_dir(const lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->flex_cont.dir;
|
||||
else return LV_FLEX_DIR_NONE;
|
||||
}
|
||||
|
||||
lv_flex_place_t lv_obj_get_flex_place(const lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->flex_cont.place;
|
||||
else return LV_FLEX_START;
|
||||
}
|
||||
|
||||
bool lv_obj_get_flex_wrap(const lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->flex_cont.wrap;
|
||||
else return false;
|
||||
}
|
||||
|
||||
bool lv_obj_get_flex_reverse(const lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->flex_cont.rev;
|
||||
else return false;
|
||||
}
|
||||
|
||||
lv_coord_t lv_obj_get_flex_gap(const lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->flex_cont.gap;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
void _lv_flex_refresh(lv_obj_t * cont)
|
||||
{
|
||||
if(cont->flex_cont.dir == LV_FLEX_DIR_NONE) return;
|
||||
lv_flex_dir_t dir = lv_obj_get_flex_dir(cont);
|
||||
|
||||
if(dir == LV_FLEX_DIR_NONE) return;
|
||||
|
||||
lv_flex_dir_t dir = cont->flex_cont.dir & 0x3;
|
||||
bool row = dir == LV_FLEX_DIR_ROW ? true : false;
|
||||
/*Count the grow units and free space*/
|
||||
lv_coord_t max_main_size = (row ? lv_obj_get_width_fit(cont) : lv_obj_get_height_fit(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 place = lv_obj_get_flex_place(cont);
|
||||
lv_ll_t * ll = _lv_obj_get_child_ll(cont);
|
||||
lv_coord_t * cross_pos = (row ? &abs_y : &abs_x);
|
||||
|
||||
lv_coord_t place = cont->flex_cont.place;
|
||||
if((row && cont->h_set == LV_SIZE_AUTO) ||
|
||||
(!row && cont->w_set == LV_SIZE_AUTO))
|
||||
{
|
||||
@ -90,7 +126,7 @@ void _lv_flex_refresh(lv_obj_t * cont)
|
||||
lv_coord_t track_size;
|
||||
lv_obj_t * track_first_item;
|
||||
lv_obj_t * next_track_first_item;
|
||||
bool rev = cont->flex_cont.dir & LV_FLEX_REVERSE;
|
||||
bool rev = lv_obj_get_flex_reverse(cont);
|
||||
|
||||
if(place != LV_FLEX_START) {
|
||||
track_first_item = rev ? _lv_ll_get_head(ll) : _lv_ll_get_tail(ll);
|
||||
@ -117,6 +153,8 @@ void _lv_flex_refresh(lv_obj_t * cont)
|
||||
track_first_item = next_track_first_item;
|
||||
*cross_pos += track_size + gap;
|
||||
}
|
||||
LV_ASSERT_MEM_INTEGRITY();
|
||||
|
||||
}
|
||||
|
||||
/**********************
|
||||
@ -125,18 +163,18 @@ void _lv_flex_refresh(lv_obj_t * cont)
|
||||
|
||||
static lv_obj_t * find_track_end(lv_obj_t * cont, lv_obj_t * item_start, lv_coord_t max_size, lv_coord_t * grow_unit, lv_coord_t * track_cross_size)
|
||||
{
|
||||
lv_flex_dir_t dir = cont->flex_cont.dir;
|
||||
bool row = (dir & 0x3) == LV_FLEX_DIR_ROW ? true : false;
|
||||
bool wrap = lv_obj_get_flex_wrap(cont);
|
||||
bool rev = lv_obj_get_flex_reverse(cont);
|
||||
lv_coord_t gap = lv_obj_get_flex_gap(cont);
|
||||
bool row = lv_obj_get_flex_dir(cont) == LV_FLEX_DIR_ROW ? true : false;
|
||||
lv_coord_t(*get_main_size)(const lv_obj_t *) = (row ? lv_obj_get_width_margin : lv_obj_get_height_margin);
|
||||
lv_coord_t(*get_cross_size)(const lv_obj_t *) = (!row ? lv_obj_get_width_margin : lv_obj_get_height_margin);
|
||||
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;
|
||||
void * (*ll_iter)(const lv_ll_t * , const void *) = rev ? _lv_ll_get_next : _lv_ll_get_prev;
|
||||
|
||||
lv_ll_t * ll = _lv_obj_get_child_ll(cont);
|
||||
|
||||
lv_coord_t grow_sum = 0;
|
||||
lv_coord_t used_size = 0;
|
||||
lv_coord_t gap = cont->flex_cont.gap;
|
||||
uint32_t grow_item_cnt = 0;
|
||||
*track_cross_size = 0;
|
||||
*grow_unit = 0;
|
||||
@ -186,18 +224,19 @@ static lv_obj_t * find_track_end(lv_obj_t * cont, lv_obj_t * item_start, lv_coor
|
||||
|
||||
static void children_repos(lv_obj_t * cont, lv_obj_t * item_first, lv_obj_t * item_last, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t track_size, lv_coord_t grow_unit)
|
||||
{
|
||||
lv_flex_dir_t dir = cont->flex_cont.dir;
|
||||
bool row = (dir & 0x3) == LV_FLEX_DIR_ROW ? true : false;
|
||||
bool rev = lv_obj_get_flex_reverse(cont);
|
||||
lv_coord_t gap = lv_obj_get_flex_gap(cont);
|
||||
bool row = lv_obj_get_flex_dir(cont) == LV_FLEX_DIR_ROW ? true : false;
|
||||
|
||||
lv_coord_t(*obj_get_main_size)(const lv_obj_t *) = (row ? lv_obj_get_width_margin : lv_obj_get_height_margin);
|
||||
lv_coord_t(*obj_get_cross_size)(const lv_obj_t *) = (!row ? lv_obj_get_width_margin : lv_obj_get_height_margin);
|
||||
void (*area_set_main_size)(lv_area_t *, lv_coord_t) = (row ? lv_area_set_width : lv_area_set_height);
|
||||
lv_coord_t (*area_get_main_size)(const lv_area_t *) = (!row ? lv_area_get_width : lv_area_get_height);
|
||||
lv_style_int_t (*get_margin_start)(const lv_obj_t *, uint8_t part) = (row ? lv_obj_get_style_margin_left : lv_obj_get_style_margin_top);
|
||||
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 *) = rev ? _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 main_pos = 0;
|
||||
/*Reposition the children*/
|
||||
lv_obj_t * item = item_first; /*Just to use a shorter name*/
|
||||
|
@ -48,8 +48,10 @@ typedef enum {
|
||||
|
||||
typedef struct {
|
||||
lv_coord_t gap;
|
||||
uint32_t place :4;
|
||||
uint32_t dir :4;
|
||||
uint8_t dir :2;
|
||||
uint8_t wrap :1;
|
||||
uint8_t rev :1;
|
||||
uint8_t place :3;
|
||||
}lv_flex_cont_t;
|
||||
|
||||
/**********************
|
||||
@ -59,6 +61,12 @@ typedef struct {
|
||||
void lv_obj_set_flex_cont(lv_obj_t * obj, lv_flex_dir_t flex_dir, lv_flex_place_t flex_place);
|
||||
void lv_obj_set_flex_gap(lv_obj_t * obj, lv_coord_t gap);
|
||||
void lv_obj_set_flex_item(lv_obj_t * obj, lv_flex_place_t place);
|
||||
|
||||
lv_flex_dir_t lv_obj_get_flex_dir(const lv_obj_t * obj);
|
||||
lv_flex_place_t lv_obj_get_flex_place(const lv_obj_t * obj);
|
||||
bool lv_obj_get_flex_wrap(const lv_obj_t * obj);
|
||||
bool lv_obj_get_flex_reverse(const lv_obj_t * obj);
|
||||
lv_coord_t lv_obj_get_flex_gap(const lv_obj_t * obj);
|
||||
void _lv_flex_refresh(lv_obj_t * cont);
|
||||
|
||||
/**********************
|
||||
|
@ -53,7 +53,9 @@ void lv_obj_set_grid(lv_obj_t * obj, const lv_grid_t * grid)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
obj->grid = grid;
|
||||
if(obj->spec_attr == NULL) lv_obj_allocate_rare_attr(obj);
|
||||
obj->spec_attr->grid = grid;
|
||||
|
||||
_lv_grid_full_refresh(obj);
|
||||
}
|
||||
|
||||
@ -62,11 +64,12 @@ void lv_obj_set_grid(lv_obj_t * obj, const lv_grid_t * grid)
|
||||
* @param obj pointer to an object
|
||||
* @return the grid, NULL if no grid
|
||||
*/
|
||||
const lv_grid_t * lv_obj_get_grid(lv_obj_t * obj, const lv_grid_t * grid)
|
||||
const lv_grid_t * lv_obj_get_grid(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
return obj->grid;
|
||||
if(obj->spec_attr) return obj->spec_attr->grid;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -96,9 +99,10 @@ void lv_obj_report_grid_change(const lv_grid_t * grid)
|
||||
*/
|
||||
void _lv_grid_calc(struct _lv_obj_t * cont, _lv_grid_calc_t * calc_out)
|
||||
{
|
||||
if(cont->grid == NULL) return;
|
||||
if(cont->grid->col_dsc == NULL || cont->grid->row_dsc == NULL) return;
|
||||
if(cont->grid->col_dsc_len == 0 || cont->grid->row_dsc_len == 0) return;
|
||||
lv_grid_t * g = lv_obj_get_grid(cont);
|
||||
if(g == NULL) return;
|
||||
if(g->col_dsc == NULL || g->row_dsc == NULL) return;
|
||||
if(g->col_dsc_len == 0 || g->row_dsc_len == 0) return;
|
||||
|
||||
if(lv_obj_get_child(cont, NULL) == NULL) {
|
||||
_lv_memset_00(calc_out, sizeof(_lv_grid_calc_t));
|
||||
@ -111,11 +115,11 @@ void _lv_grid_calc(struct _lv_obj_t * cont, _lv_grid_calc_t * calc_out)
|
||||
|
||||
bool auto_w = cont->w_set == LV_SIZE_AUTO ? true : false;
|
||||
lv_coord_t cont_w = lv_obj_get_width_fit(cont);
|
||||
calc_out->grid_w = grid_place(cont_w, auto_w, cont->grid->col_place, cont->grid->col_gap, calc_out->col_num, calc_out->w, calc_out->x);
|
||||
calc_out->grid_w = grid_place(cont_w, auto_w, g->col_place, g->col_gap, calc_out->col_num, calc_out->w, calc_out->x);
|
||||
|
||||
bool auto_h = cont->h_set == LV_SIZE_AUTO ? true : false;
|
||||
lv_coord_t cont_h = lv_obj_get_height_fit(cont);
|
||||
calc_out->grid_h = grid_place(cont_h, auto_h, cont->grid->row_place, cont->grid->row_gap, calc_out->row_num, calc_out->h, calc_out->y);
|
||||
calc_out->grid_h = grid_place(cont_h, auto_h, g->row_place, g->row_gap, calc_out->row_num, calc_out->h, calc_out->y);
|
||||
|
||||
LV_ASSERT_MEM_INTEGRITY();
|
||||
}
|
||||
@ -139,12 +143,12 @@ void _lv_grid_calc_free(_lv_grid_calc_t * calc)
|
||||
*/
|
||||
bool _lv_grid_has_fr_col(struct _lv_obj_t * obj)
|
||||
{
|
||||
if(obj->grid == NULL) return false;
|
||||
if(obj->grid->col_dsc == NULL) return false;
|
||||
lv_grid_t * g = lv_obj_get_grid(obj);
|
||||
if(g->col_dsc == NULL) return false;
|
||||
|
||||
uint32_t i;
|
||||
for(i = 0; i < obj->grid->col_dsc_len; i++) {
|
||||
if(LV_GRID_IS_FR(obj->grid->col_dsc[i])) return true;
|
||||
for(i = 0; i < g->col_dsc_len; i++) {
|
||||
if(LV_GRID_IS_FR(g->col_dsc[i])) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -157,12 +161,13 @@ bool _lv_grid_has_fr_col(struct _lv_obj_t * obj)
|
||||
*/
|
||||
bool _lv_grid_has_fr_row(struct _lv_obj_t * obj)
|
||||
{
|
||||
if(obj->grid == NULL) return false;
|
||||
if(obj->grid->row_dsc == NULL) return false;
|
||||
lv_grid_t * g = lv_obj_get_grid(obj);
|
||||
if(g == NULL) return false;
|
||||
if(g->row_dsc == NULL) return false;
|
||||
|
||||
uint32_t i;
|
||||
for(i = 0; i < obj->grid->row_dsc_len; i++) {
|
||||
if(LV_GRID_IS_FR(obj->grid->row_dsc[i])) return true;
|
||||
for(i = 0; i < g->row_dsc_len; i++) {
|
||||
if(LV_GRID_IS_FR(g->row_dsc[i])) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -175,7 +180,7 @@ bool _lv_grid_has_fr_row(struct _lv_obj_t * obj)
|
||||
void _lv_grid_full_refresh(lv_obj_t * cont)
|
||||
{
|
||||
/*Calculate the grid*/
|
||||
if(cont->grid == NULL) return;
|
||||
if(lv_obj_get_grid(cont) == NULL) return;
|
||||
_lv_grid_calc_t calc;
|
||||
_lv_grid_calc(cont, &calc);
|
||||
|
||||
@ -213,7 +218,8 @@ void lv_grid_item_refr_pos(lv_obj_t * item)
|
||||
/*Calculate the grid*/
|
||||
lv_obj_t * cont = lv_obj_get_parent(item);
|
||||
if(cont == NULL) return;
|
||||
if(cont->grid == NULL) return;
|
||||
if(cont->spec_attr == NULL) return;
|
||||
if(cont->spec_attr->grid == NULL) return;
|
||||
_lv_grid_calc_t calc;
|
||||
_lv_grid_calc(cont, &calc);
|
||||
|
||||
@ -228,7 +234,7 @@ void lv_grid_item_refr_pos(lv_obj_t * item)
|
||||
|
||||
static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * calc)
|
||||
{
|
||||
const lv_grid_t * grid = cont->grid;
|
||||
const lv_grid_t * grid = cont->spec_attr->grid;
|
||||
uint32_t i;
|
||||
|
||||
lv_coord_t cont_w = lv_obj_get_width_fit(cont);
|
||||
@ -267,7 +273,7 @@ static void calc_cols(lv_obj_t * cont, _lv_grid_calc_t * calc)
|
||||
|
||||
static void calc_rows(lv_obj_t * cont, _lv_grid_calc_t * calc)
|
||||
{
|
||||
const lv_grid_t * grid = cont->grid;
|
||||
const lv_grid_t * grid = cont->spec_attr->grid;
|
||||
uint32_t i;
|
||||
|
||||
calc->row_num = grid->row_dsc_len;
|
||||
@ -466,7 +472,9 @@ static lv_coord_t grid_place(lv_coord_t cont_size, bool auto_size, uint8_t plac
|
||||
*/
|
||||
static void report_grid_change_core(const lv_grid_t * grid, lv_obj_t * obj)
|
||||
{
|
||||
if(obj->grid == grid || (obj->grid && grid == NULL)) _lv_grid_full_refresh(obj);
|
||||
if(obj->spec_attr) {
|
||||
if(obj->spec_attr->grid == grid || (obj->spec_attr->grid && grid == NULL)) _lv_grid_full_refresh(obj);
|
||||
}
|
||||
|
||||
lv_obj_t * child = lv_obj_get_child(obj, NULL);
|
||||
while(child) {
|
||||
|
@ -101,7 +101,7 @@ void lv_obj_set_grid(lv_obj_t * obj, const lv_grid_t * grid);
|
||||
* @param obj pointer to an object
|
||||
* @return the grid, NULL if no grid
|
||||
*/
|
||||
const lv_grid_t * lv_obj_get_grid(lv_obj_t * obj, const lv_grid_t * grid);
|
||||
const lv_grid_t * lv_obj_get_grid(lv_obj_t * obj);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -93,7 +93,7 @@ void lv_group_del(lv_group_t * group)
|
||||
/*Remove the objects from the group*/
|
||||
lv_obj_t ** obj;
|
||||
_LV_LL_READ(&group->obj_ll, obj) {
|
||||
(*obj)->group_p = NULL;
|
||||
if((*obj)->spec_attr) (*obj)->spec_attr->group_p = NULL;
|
||||
}
|
||||
|
||||
_lv_ll_clear(&(group->obj_ll));
|
||||
@ -119,15 +119,18 @@ void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj)
|
||||
}
|
||||
|
||||
/*If the object is already in a group and focused then defocus it*/
|
||||
if(obj->group_p) {
|
||||
lv_group_t * group_cur = lv_obj_get_group(obj);
|
||||
if(group_cur) {
|
||||
if(lv_obj_is_focused(obj)) {
|
||||
lv_group_refocus(obj->group_p);
|
||||
lv_group_refocus(group_cur);
|
||||
|
||||
LV_LOG_INFO("lv_group_add_obj: assign object to an other group");
|
||||
}
|
||||
}
|
||||
|
||||
obj->group_p = group;
|
||||
if(obj->spec_attr == NULL) lv_obj_allocate_rare_attr(obj);
|
||||
obj->spec_attr->group_p = group;
|
||||
|
||||
lv_obj_t ** next = _lv_ll_ins_tail(&group->obj_ll);
|
||||
LV_ASSERT_MEM(next);
|
||||
if(next == NULL) return;
|
||||
@ -146,7 +149,7 @@ void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj)
|
||||
*/
|
||||
void lv_group_remove_obj(lv_obj_t * obj)
|
||||
{
|
||||
lv_group_t * g = obj->group_p;
|
||||
lv_group_t * g = lv_obj_get_group(obj);
|
||||
if(g == NULL) return;
|
||||
if(g->obj_focus == NULL) return; /*Just to be sure (Not possible if there is at least one object in the group)*/
|
||||
|
||||
@ -177,7 +180,7 @@ void lv_group_remove_obj(lv_obj_t * obj)
|
||||
if(*i == obj) {
|
||||
_lv_ll_remove(&g->obj_ll, i);
|
||||
lv_mem_free(i);
|
||||
obj->group_p = NULL;
|
||||
if(obj->spec_attr) obj->spec_attr->group_p = NULL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -199,7 +202,7 @@ void lv_group_remove_all_objs(lv_group_t * group)
|
||||
/*Remove the objects from the group*/
|
||||
lv_obj_t ** obj;
|
||||
_LV_LL_READ(&group->obj_ll, obj) {
|
||||
(*obj)->group_p = NULL;
|
||||
if((*obj)->spec_attr) (*obj)->spec_attr->group_p = NULL;
|
||||
}
|
||||
|
||||
_lv_ll_clear(&(group->obj_ll));
|
||||
@ -212,7 +215,7 @@ void lv_group_remove_all_objs(lv_group_t * group)
|
||||
void lv_group_focus_obj(lv_obj_t * obj)
|
||||
{
|
||||
if(obj == NULL) return;
|
||||
lv_group_t * g = obj->group_p;
|
||||
lv_group_t * g = lv_obj_get_group(obj);
|
||||
if(g == NULL) return;
|
||||
|
||||
if(g->frozen != 0) return;
|
||||
|
@ -81,10 +81,11 @@ void _lv_scroll_handler(lv_indev_proc_t * proc)
|
||||
diff_y = elastic_diff(scroll_obj, proc->types.pointer.vect.y, st, sb);
|
||||
}
|
||||
|
||||
if((scroll_obj->scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0;
|
||||
if((scroll_obj->scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0;
|
||||
if((scroll_obj->scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0;
|
||||
if((scroll_obj->scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0;
|
||||
lv_dir_t scroll_dir = lv_obj_get_scroll_dir(scroll_obj);
|
||||
if((scroll_dir & LV_DIR_LEFT) == 0 && diff_x > 0) diff_x = 0;
|
||||
if((scroll_dir & LV_DIR_RIGHT) == 0 && diff_x < 0) diff_x = 0;
|
||||
if((scroll_dir & LV_DIR_TOP) == 0 && diff_y > 0) diff_y = 0;
|
||||
if((scroll_dir & LV_DIR_BOTTOM) == 0 && diff_y < 0) diff_y = 0;
|
||||
|
||||
/*Respect the scroll limit area*/
|
||||
scroll_limit_diff(proc, &diff_x, &diff_y);
|
||||
@ -115,10 +116,13 @@ void _lv_scroll_throw_handler(lv_indev_proc_t * proc)
|
||||
proc->types.pointer.scroll_throw_vect.x = 0;
|
||||
}
|
||||
|
||||
lv_scroll_snap_align_t align_x = lv_obj_get_snap_align_x(scroll_obj);
|
||||
lv_scroll_snap_align_t align_y = lv_obj_get_snap_align_y(scroll_obj);
|
||||
|
||||
if(proc->types.pointer.scroll_dir == LV_SCROLL_DIR_VER) {
|
||||
proc->types.pointer.scroll_throw_vect.x = 0;
|
||||
/*If no snapping "throw"*/
|
||||
if(scroll_obj->snap_align_y == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
if(align_y == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
proc->types.pointer.scroll_throw_vect.y =
|
||||
proc->types.pointer.scroll_throw_vect.y * (100 - scroll_throw) / 100;
|
||||
|
||||
@ -141,7 +145,7 @@ void _lv_scroll_throw_handler(lv_indev_proc_t * proc)
|
||||
else if(proc->types.pointer.scroll_dir == LV_SCROLL_DIR_HOR) {
|
||||
proc->types.pointer.scroll_throw_vect.y = 0;
|
||||
/*If no snapping "throw"*/
|
||||
if(scroll_obj->snap_align_x == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
if(align_x == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
proc->types.pointer.scroll_throw_vect.x =
|
||||
proc->types.pointer.scroll_throw_vect.x * (100 - scroll_throw) / 100;
|
||||
|
||||
@ -166,7 +170,7 @@ void _lv_scroll_throw_handler(lv_indev_proc_t * proc)
|
||||
if(proc->types.pointer.scroll_throw_vect.x == 0 && proc->types.pointer.scroll_throw_vect.y == 0) {
|
||||
/*Revert if scrolled in*/
|
||||
/*If vertically scrollable and not controlled by snap*/
|
||||
if(scroll_obj->snap_align_y == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
if(align_y == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
lv_coord_t st = lv_obj_get_scroll_top(scroll_obj);
|
||||
lv_coord_t sb = lv_obj_get_scroll_bottom(scroll_obj);
|
||||
if(st > 0 || sb > 0) {
|
||||
@ -180,7 +184,7 @@ void _lv_scroll_throw_handler(lv_indev_proc_t * proc)
|
||||
}
|
||||
|
||||
/*If horizontally scrollable and not controlled by snap*/
|
||||
if(scroll_obj->snap_align_x == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
if(align_x == LV_SCROLL_SNAP_ALIGN_NONE) {
|
||||
lv_coord_t sl = lv_obj_get_scroll_left(scroll_obj);
|
||||
lv_coord_t sr = lv_obj_get_scroll_right(scroll_obj);
|
||||
if (sl > 0 || sr > 0) {
|
||||
@ -276,7 +280,7 @@ static lv_obj_t * find_scroll_obj(lv_indev_proc_t * proc)
|
||||
bool right_en = hor_en;
|
||||
|
||||
/*The object might have disabled some directions.*/
|
||||
lv_dir_t scroll_dir = obj_act->scroll_dir;
|
||||
lv_dir_t scroll_dir = lv_obj_get_scroll_dir(obj_act);
|
||||
if((scroll_dir & LV_DIR_LEFT) == 0) left_en = false;
|
||||
if((scroll_dir & LV_DIR_RIGHT) == 0) right_en = false;
|
||||
if((scroll_dir & LV_DIR_TOP) == 0) up_en = false;
|
||||
@ -347,7 +351,7 @@ static void init_scroll_limits(lv_indev_proc_t * proc)
|
||||
}
|
||||
/*With STOP limit the scrolling to the perv and next snap point*/
|
||||
else {
|
||||
switch(obj->snap_align_y) {
|
||||
switch(lv_obj_get_snap_align_y(obj)) {
|
||||
case LV_SCROLL_SNAP_ALIGN_START:
|
||||
proc->types.pointer.scroll_area.y1 = find_snap_point_y(obj, obj->coords.y1 + 1, LV_COORD_MAX, 0);
|
||||
proc->types.pointer.scroll_area.y2 = find_snap_point_y(obj, LV_COORD_MIN, obj->coords.y1 - 1, 0);
|
||||
@ -368,7 +372,7 @@ static void init_scroll_limits(lv_indev_proc_t * proc)
|
||||
break;
|
||||
}
|
||||
|
||||
switch(obj->snap_align_x) {
|
||||
switch(lv_obj_get_snap_align_x(obj)) {
|
||||
case LV_SCROLL_SNAP_ALIGN_START:
|
||||
proc->types.pointer.scroll_area.x1 = find_snap_point_x(obj, obj->coords.x1, LV_COORD_MAX, 0);
|
||||
proc->types.pointer.scroll_area.x2 = find_snap_point_x(obj, LV_COORD_MIN, obj->coords.x1, 0);
|
||||
@ -399,7 +403,8 @@ static void init_scroll_limits(lv_indev_proc_t * proc)
|
||||
|
||||
static lv_coord_t find_snap_point_x(const lv_obj_t * obj, lv_coord_t min, lv_coord_t max, lv_coord_t ofs)
|
||||
{
|
||||
if(obj->snap_align_x == LV_SCROLL_SNAP_ALIGN_NONE) return 0;
|
||||
lv_scroll_snap_align_t align = lv_obj_get_snap_align_x(obj);
|
||||
if(align == LV_SCROLL_SNAP_ALIGN_NONE) return 0;
|
||||
|
||||
lv_coord_t dist = LV_COORD_MAX;
|
||||
|
||||
@ -408,7 +413,7 @@ static lv_coord_t find_snap_point_x(const lv_obj_t * obj, lv_coord_t min, lv_coo
|
||||
if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPABLE)) {
|
||||
lv_coord_t x_child = 0;
|
||||
lv_coord_t x_parent = 0;
|
||||
switch(obj->snap_align_x) {
|
||||
switch(align) {
|
||||
case LV_SCROLL_SNAP_ALIGN_START:
|
||||
x_child = child->coords.x1;
|
||||
x_parent = obj->coords.x1;
|
||||
@ -431,7 +436,6 @@ static lv_coord_t find_snap_point_x(const lv_obj_t * obj, lv_coord_t min, lv_coo
|
||||
|
||||
child = lv_obj_get_child_back(obj, child);
|
||||
}
|
||||
LV_ASSERT_MEM_INTEGRITY();
|
||||
|
||||
return dist == LV_COORD_MAX ? 0: -dist;
|
||||
}
|
||||
@ -447,7 +451,8 @@ static lv_coord_t find_snap_point_x(const lv_obj_t * obj, lv_coord_t min, lv_coo
|
||||
*/
|
||||
static lv_coord_t find_snap_point_y(const lv_obj_t * obj, lv_coord_t min, lv_coord_t max, lv_coord_t ofs)
|
||||
{
|
||||
if(obj->snap_align_y == LV_SCROLL_SNAP_ALIGN_NONE) return 0;
|
||||
lv_scroll_snap_align_t align = lv_obj_get_snap_align_y(obj);
|
||||
if(align == LV_SCROLL_SNAP_ALIGN_NONE) return 0;
|
||||
|
||||
lv_coord_t dist = LV_COORD_MAX;
|
||||
|
||||
@ -456,7 +461,7 @@ static lv_coord_t find_snap_point_y(const lv_obj_t * obj, lv_coord_t min, lv_coo
|
||||
if(lv_obj_has_flag(child, LV_OBJ_FLAG_SNAPABLE)) {
|
||||
lv_coord_t y_child = 0;
|
||||
lv_coord_t y_parent = 0;
|
||||
switch(obj->snap_align_y) {
|
||||
switch(align) {
|
||||
case LV_SCROLL_SNAP_ALIGN_START:
|
||||
y_child = child->coords.y1;
|
||||
y_parent = obj->coords.y1;
|
||||
@ -480,7 +485,6 @@ static lv_coord_t find_snap_point_y(const lv_obj_t * obj, lv_coord_t min, lv_coo
|
||||
child = lv_obj_get_child_back(obj, child);
|
||||
}
|
||||
|
||||
LV_ASSERT_MEM_INTEGRITY();
|
||||
return dist == LV_COORD_MAX ? 0 : -dist;
|
||||
}
|
||||
|
||||
|
@ -204,16 +204,9 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
|
||||
|
||||
_lv_memset_00(new_obj, sizeof(lv_obj_t));
|
||||
|
||||
#if LV_USE_BIDI
|
||||
new_obj->base_dir = LV_BIDI_BASE_DIR_DEF;
|
||||
#else
|
||||
new_obj->base_dir = LV_BIDI_DIR_LTR;
|
||||
#endif
|
||||
|
||||
/*Set the callbacks*/
|
||||
new_obj->signal_cb = lv_obj_signal;
|
||||
new_obj->design_cb = lv_obj_design;
|
||||
new_obj->event_cb = NULL;
|
||||
|
||||
/*Set coordinates to full screen size*/
|
||||
new_obj->coords.x1 = 0;
|
||||
@ -225,10 +218,10 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
|
||||
else {
|
||||
LV_LOG_TRACE("Object create started");
|
||||
LV_ASSERT_OBJ(parent, LV_OBJX_NAME);
|
||||
if(parent->rare_attr == NULL) {
|
||||
parent->rare_attr = lv_obj_allocate_rare_attr(parent);
|
||||
if(parent->spec_attr == NULL) {
|
||||
parent->spec_attr = lv_obj_allocate_rare_attr(parent);
|
||||
}
|
||||
new_obj = _lv_ll_ins_head(&parent->rare_attr->child_ll);
|
||||
new_obj = _lv_ll_ins_head(&parent->spec_attr->child_ll);
|
||||
LV_ASSERT_MEM(new_obj);
|
||||
if(new_obj == NULL) return NULL;
|
||||
|
||||
@ -236,16 +229,9 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
|
||||
|
||||
new_obj->parent = parent;
|
||||
|
||||
#if LV_USE_BIDI
|
||||
new_obj->base_dir = LV_BIDI_DIR_INHERIT;
|
||||
#else
|
||||
new_obj->base_dir = LV_BIDI_DIR_LTR;
|
||||
#endif
|
||||
|
||||
/*Set the callbacks (signal:cb is required in `lv_obj_get_base_dir` if `LV_USE_ASSERT_OBJ` is enabled)*/
|
||||
new_obj->signal_cb = lv_obj_signal;
|
||||
new_obj->design_cb = lv_obj_design;
|
||||
new_obj->event_cb = NULL;
|
||||
|
||||
new_obj->coords.y1 = parent->coords.y1;
|
||||
new_obj->coords.y2 = parent->coords.y1 + LV_OBJ_DEF_HEIGHT;
|
||||
@ -264,25 +250,7 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
|
||||
|
||||
new_obj->ext_draw_pad = 0;
|
||||
|
||||
#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL
|
||||
_lv_memset_00(&new_obj->ext_click_pad, sizeof(new_obj->ext_click_pad));
|
||||
#elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY
|
||||
new_obj->ext_click_pad = 0;
|
||||
#endif
|
||||
|
||||
/*Init. user date*/
|
||||
#if LV_USE_USER_DATA
|
||||
_lv_memset_00(&new_obj->user_data, sizeof(lv_obj_user_data_t));
|
||||
#endif
|
||||
|
||||
|
||||
#if LV_USE_GROUP
|
||||
new_obj->group_p = NULL;
|
||||
#endif
|
||||
|
||||
/*Set attributes*/
|
||||
new_obj->scroll_mode = LV_SCROLL_MODE_AUTO;
|
||||
new_obj->scroll_dir = LV_DIR_ALL;
|
||||
new_obj->flags = LV_OBJ_FLAG_CLICKABLE;
|
||||
new_obj->flags |= LV_OBJ_FLAG_SNAPABLE;
|
||||
new_obj->flags |= LV_OBJ_FLAG_PRESS_LOCK;
|
||||
@ -309,26 +277,12 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy)
|
||||
lv_area_copy(&new_obj->coords, ©->coords);
|
||||
new_obj->ext_draw_pad = copy->ext_draw_pad;
|
||||
|
||||
#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL
|
||||
lv_area_copy(&new_obj->ext_click_pad, ©->ext_click_pad);
|
||||
#elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY
|
||||
new_obj->ext_click_pad = copy->ext_click_pad;
|
||||
#endif
|
||||
|
||||
/*Set user data*/
|
||||
#if LV_USE_USER_DATA
|
||||
_lv_memcpy(&new_obj->user_data, ©->user_data, sizeof(lv_obj_user_data_t));
|
||||
#endif
|
||||
/*Only copy the `event_cb`. `signal_cb` and `design_cb` will be copied in the derived
|
||||
* object type (e.g. `lv_btn`)*/
|
||||
new_obj->event_cb = copy->event_cb;
|
||||
|
||||
new_obj->flags = copy->flags;
|
||||
|
||||
#if LV_USE_GROUP
|
||||
/*Add to the same group*/
|
||||
if(copy->group_p != NULL) {
|
||||
lv_group_add_obj(copy->group_p, new_obj);
|
||||
if(copy->spec_attr && copy->spec_attr->group_p) {
|
||||
lv_group_add_obj(copy->spec_attr->group_p, new_obj);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -559,8 +513,8 @@ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent)
|
||||
|
||||
lv_obj_invalidate(obj);
|
||||
|
||||
if(parent->rare_attr == NULL) {
|
||||
parent->rare_attr = lv_obj_allocate_rare_attr(parent);
|
||||
if(parent->spec_attr == NULL) {
|
||||
parent->spec_attr = lv_obj_allocate_rare_attr(parent);
|
||||
}
|
||||
|
||||
lv_obj_t * old_par = obj->parent;
|
||||
@ -667,12 +621,14 @@ void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t left, lv_coord_t right
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL
|
||||
obj->ext_click_pad.x1 = left;
|
||||
obj->ext_click_pad.x2 = right;
|
||||
obj->ext_click_pad.y1 = top;
|
||||
obj->ext_click_pad.y2 = bottom;
|
||||
if(obj->spec_attr == NULL) lv_obj_allocate_rare_attr(obj);
|
||||
objrare_attr->->ext_click_pad.x1 = left;
|
||||
objrare_attr->->ext_click_pad.x2 = right;
|
||||
objrare_attr->->ext_click_pad.y1 = top;
|
||||
objrare_attr->->ext_click_pad.y2 = bottom;
|
||||
#elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY
|
||||
obj->ext_click_pad = LV_MATH_MAX4(left, right, top, bottom);
|
||||
if(obj->spec_attr == NULL) lv_obj_allocate_rare_attr(obj);
|
||||
obj->spec_attr->ext_click_pad = LV_MATH_MAX4(left, right, top, bottom);
|
||||
#else
|
||||
LV_UNUSED(obj);
|
||||
LV_UNUSED(left);
|
||||
@ -704,7 +660,8 @@ void lv_obj_set_base_dir(lv_obj_t * obj, lv_bidi_dir_t dir)
|
||||
return;
|
||||
}
|
||||
|
||||
obj->base_dir = dir;
|
||||
lv_obj_allocate_rare_attr(obj);
|
||||
obj->spec_attr->base_dir = dir;
|
||||
lv_signal_send(obj, LV_SIGNAL_BASE_DIR_CHG, NULL);
|
||||
|
||||
/* Notify the children about the parent base dir has changed.
|
||||
@ -841,8 +798,9 @@ void lv_obj_clear_state(lv_obj_t * obj, lv_state_t state)
|
||||
void lv_obj_set_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
if(obj->spec_attr == NULL) obj->spec_attr = lv_obj_allocate_rare_attr(obj);
|
||||
|
||||
obj->event_cb = event_cb;
|
||||
obj->spec_attr->event_cb = event_cb;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -859,7 +817,7 @@ lv_res_t lv_event_send(lv_obj_t * obj, lv_event_t event, const void * data)
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
lv_res_t res;
|
||||
res = lv_event_send_func(obj->event_cb, obj, event, data);
|
||||
res = lv_event_send_func(lv_obj_get_event_cb(obj), obj, event, data);
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -1052,21 +1010,27 @@ void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size)
|
||||
* @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_obj_spec_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;
|
||||
if(obj->spec_attr == NULL) {
|
||||
static uint32_t x = 0;
|
||||
x++;
|
||||
obj->spec_attr = lv_mem_alloc(sizeof(lv_obj_spec_attr_t));
|
||||
LV_ASSERT_MEM(obj->spec_attr);
|
||||
if(obj->spec_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));
|
||||
_lv_memset_00(obj->spec_attr, sizeof(lv_obj_spec_attr_t));
|
||||
_lv_ll_init(&(obj->spec_attr->child_ll), sizeof(lv_obj_t));
|
||||
|
||||
obj->spec_attr->scroll_dir = LV_DIR_ALL;
|
||||
obj->spec_attr->base_dir = LV_BIDI_DIR_INHERIT;
|
||||
obj->spec_attr->scroll_mode = LV_SCROLL_MODE_AUTO;
|
||||
|
||||
}
|
||||
return obj->rare_attr;
|
||||
return obj->spec_attr;
|
||||
}
|
||||
|
||||
|
||||
@ -1272,7 +1236,8 @@ lv_coord_t lv_obj_get_ext_click_area(const lv_obj_t * obj, lv_dir_t dir)
|
||||
return 0;
|
||||
#elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY
|
||||
LV_UNUSED(dir);
|
||||
return obj->ext_click_pad;
|
||||
if(obj->spec_attr) return obj->spec_attr->ext_click_pad;
|
||||
else return 0;
|
||||
#else
|
||||
switch(dir) {
|
||||
case LV_DIR_LEFT:
|
||||
@ -1299,28 +1264,17 @@ lv_coord_t lv_obj_get_ext_click_area(const lv_obj_t * obj, lv_dir_t dir)
|
||||
*/
|
||||
bool _lv_obj_is_click_point_on(lv_obj_t * obj, const lv_point_t * point)
|
||||
{
|
||||
#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY
|
||||
lv_area_t ext_area;
|
||||
ext_area.x1 = obj->coords.x1 - obj->ext_click_pad;
|
||||
ext_area.x2 = obj->coords.x2 + obj->ext_click_pad;
|
||||
ext_area.y1 = obj->coords.y1 - obj->ext_click_pad;
|
||||
ext_area.y2 = obj->coords.y2 + obj->ext_click_pad;
|
||||
|
||||
if(!_lv_area_is_point_on(&ext_area, point, 0)) {
|
||||
#elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL
|
||||
lv_area_t ext_area;
|
||||
ext_area.x1 = obj->coords.x1 - obj->ext_click_pad.x1;
|
||||
ext_area.x2 = obj->coords.x2 + obj->ext_click_pad.x2;
|
||||
ext_area.y1 = obj->coords.y1 - obj->ext_click_pad.y1;
|
||||
ext_area.y2 = obj->coords.y2 + obj->ext_click_pad.y2;
|
||||
|
||||
if(!_lv_area_is_point_on(&ext_area, point, 0)) {
|
||||
#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_OFF
|
||||
return _lv_area_is_point_on(&obj->coords, point, 0);
|
||||
#else
|
||||
if(!_lv_area_is_point_on(&obj->coords, point, 0)) {
|
||||
lv_area_t ext_area;
|
||||
ext_area.x1 = obj->coords.x1 - lv_obj_get_ext_click_area(obj, LV_DIR_LEFT);
|
||||
ext_area.x2 = obj->coords.x2 + lv_obj_get_ext_click_area(obj, LV_DIR_RIGHT);
|
||||
ext_area.y1 = obj->coords.y1 - lv_obj_get_ext_click_area(obj, LV_DIR_TOP);
|
||||
ext_area.y2 = obj->coords.y2 + lv_obj_get_ext_click_area(obj, LV_DIR_BOTTOM);
|
||||
|
||||
return _lv_area_is_point_on(&ext_area, point, 0);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1362,11 +1316,15 @@ lv_bidi_dir_t lv_obj_get_base_dir(const lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
if(obj->spec_attr == NULL) return LV_BIDI_DIR_LTR;
|
||||
#if LV_USE_BIDI
|
||||
const lv_obj_t * parent = obj;
|
||||
|
||||
while(parent) {
|
||||
if(parent->base_dir != LV_BIDI_DIR_INHERIT) return parent->base_dir;
|
||||
/*If the base dir set use it. If not set assume INHERIT so got the next parent*/
|
||||
if(parent->spec_attr) {
|
||||
if(parent->spec_attr->base_dir != LV_BIDI_DIR_INHERIT) return parent->spec_attr->base_dir;
|
||||
}
|
||||
|
||||
parent = lv_obj_get_parent(parent);
|
||||
}
|
||||
@ -1418,7 +1376,8 @@ lv_event_cb_t lv_obj_get_event_cb(const lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
return obj->event_cb;
|
||||
if(obj->spec_attr) return obj->spec_attr->event_cb;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
/*------------------
|
||||
@ -1477,9 +1436,10 @@ void lv_obj_get_type(const lv_obj_t * obj, lv_obj_type_t * buf)
|
||||
*/
|
||||
lv_obj_user_data_t lv_obj_get_user_data(const lv_obj_t * obj)
|
||||
{
|
||||
static lv_obj_user_data_t empty = {0};
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
return obj->user_data;
|
||||
if(obj->spec_attr) return obj->spec_attr->user_data;
|
||||
else return empty;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1491,7 +1451,8 @@ lv_obj_user_data_t * lv_obj_get_user_data_ptr(const lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
return (lv_obj_user_data_t *)&obj->user_data;
|
||||
if(obj->spec_attr) return obj->spec_attr->user_data;
|
||||
return &obj->spec_attr->user_data;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1503,7 +1464,8 @@ void lv_obj_set_user_data(lv_obj_t * obj, lv_obj_user_data_t data)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
_lv_memcpy(&obj->user_data, &data, sizeof(lv_obj_user_data_t));
|
||||
if(obj->spec_attr == NULL) lv_obj_allocate_rare_attr(obj);
|
||||
_lv_memcpy(&obj->spec_attr->user_data, &data, sizeof(lv_obj_user_data_t));
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1517,7 +1479,8 @@ void * lv_obj_get_group(const lv_obj_t * obj)
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
#if LV_USE_GROUP
|
||||
return obj->group_p;
|
||||
if(obj->spec_attr) return obj->spec_attr->group_p;
|
||||
else return NULL;
|
||||
#else
|
||||
LV_UNUSED(obj);
|
||||
return NULL;
|
||||
@ -1534,8 +1497,9 @@ bool lv_obj_is_focused(const lv_obj_t * obj)
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
#if LV_USE_GROUP
|
||||
if(obj->group_p) {
|
||||
if(lv_group_get_focused(obj->group_p) == obj) return true;
|
||||
lv_group_t * g = lv_obj_get_group(obj);
|
||||
if(g) {
|
||||
if(lv_group_get_focused(g) == obj) return true;
|
||||
}
|
||||
return false;
|
||||
#else
|
||||
@ -1565,7 +1529,7 @@ 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)
|
||||
{
|
||||
if(obj->rare_attr) return &obj->rare_attr->child_ll;
|
||||
if(obj->spec_attr) return &obj->spec_attr->child_ll;
|
||||
else return NULL;
|
||||
}
|
||||
|
||||
@ -1840,7 +1804,7 @@ static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area
|
||||
|
||||
#if GRID_DEBUG
|
||||
/*Draw the grid cells*/
|
||||
if(obj->grid) {
|
||||
if(lv_obj_get_grid(obj)) {
|
||||
_lv_grid_calc_t calc;
|
||||
_lv_grid_calc(obj, &calc);
|
||||
|
||||
@ -1887,7 +1851,7 @@ static void base_dir_refr_children(lv_obj_t * obj)
|
||||
{
|
||||
lv_obj_t * child;
|
||||
_LV_LL_READ(_lv_obj_get_child_ll(obj), child) {
|
||||
if(child->base_dir == LV_BIDI_DIR_INHERIT) {
|
||||
if(lv_obj_get_base_dir(child) == LV_BIDI_DIR_INHERIT) {
|
||||
lv_signal_send(child, LV_SIGNAL_BASE_DIR_CHG, NULL);
|
||||
base_dir_refr_children(child);
|
||||
}
|
||||
@ -2006,8 +1970,8 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
|
||||
lv_obj_set_size(child, child->w_set, child->h_set);
|
||||
}
|
||||
}
|
||||
if(obj->grid) _lv_grid_full_refresh(obj);
|
||||
if(obj->flex_cont.dir) _lv_flex_refresh(obj);
|
||||
if(lv_obj_get_grid(obj)) _lv_grid_full_refresh(obj);
|
||||
if(lv_obj_get_flex_dir(obj) != LV_FLEX_DIR_NONE) _lv_flex_refresh(obj);
|
||||
}
|
||||
}
|
||||
else if(sign == LV_SIGNAL_CHILD_CHG) {
|
||||
@ -2020,7 +1984,7 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
|
||||
}
|
||||
|
||||
/*If the changed children was a grid item refresh this objects grid*/
|
||||
if(obj->grid) {
|
||||
if(lv_obj_get_grid(obj)) {
|
||||
lv_obj_t * child = param;
|
||||
if(child) {
|
||||
if(_lv_obj_is_grid_item(child)) _lv_grid_full_refresh(obj);
|
||||
@ -2046,7 +2010,7 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param)
|
||||
else if(sign == LV_SIGNAL_STYLE_CHG) {
|
||||
if(_lv_obj_is_grid_item(obj)) _lv_grid_full_refresh(obj);
|
||||
|
||||
if(obj->grid) _lv_grid_full_refresh(obj);
|
||||
if(lv_obj_get_grid(obj)) _lv_grid_full_refresh(obj);
|
||||
|
||||
/*Reposition non grid objects on by one*/
|
||||
lv_obj_t * child;
|
||||
|
@ -169,20 +169,6 @@ enum {
|
||||
|
||||
typedef uint8_t lv_state_t;
|
||||
|
||||
enum {
|
||||
LV_DIR_NONE = 0x00,
|
||||
LV_DIR_LEFT = (1 << 0),
|
||||
LV_DIR_RIGHT = (1 << 1),
|
||||
LV_DIR_TOP = (1 << 2),
|
||||
LV_DIR_BOTTOM = (1 << 3),
|
||||
LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT,
|
||||
LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM,
|
||||
LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER,
|
||||
};
|
||||
|
||||
typedef uint8_t lv_dir_t;
|
||||
|
||||
|
||||
enum {
|
||||
LV_OBJ_FLAG_HIDDEN = (1 << 0),
|
||||
LV_OBJ_FLAG_CLICKABLE = (1 << 1),
|
||||
@ -210,22 +196,21 @@ typedef uint16_t lv_obj_flag_t;
|
||||
|
||||
typedef struct {
|
||||
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;
|
||||
|
||||
#if LV_USE_GROUP != 0
|
||||
void * group_p;
|
||||
#endif
|
||||
|
||||
struct _lv_obj_t {
|
||||
lv_obj_rare_attr_t * rare_attr;
|
||||
struct _lv_obj_t * parent; /**< Pointer to the parent object*/
|
||||
#if LV_USE_USER_DATA
|
||||
lv_obj_user_data_t user_data; /**< Custom user data for object. */
|
||||
#endif
|
||||
|
||||
lv_area_t coords; /**< Coordinates of the object (x1, y1, x2, y2)*/
|
||||
const lv_grid_t * grid;
|
||||
|
||||
lv_event_cb_t event_cb; /**< Event callback function */
|
||||
lv_signal_cb_t signal_cb; /**< Object type specific signal function*/
|
||||
lv_design_cb_t design_cb; /**< Object type specific design function*/
|
||||
|
||||
void * ext_attr; /**< Object type specific extended data*/
|
||||
lv_style_list_t style_list;
|
||||
lv_flex_cont_t flex_cont;
|
||||
lv_point_t scroll; /**< The current X/Y scroll offset*/
|
||||
|
||||
#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY
|
||||
uint8_t ext_click_pad; /**< Extra click padding in all direction */
|
||||
@ -233,15 +218,28 @@ struct _lv_obj_t {
|
||||
lv_area_t ext_click_pad; /**< Extra click padding area. */
|
||||
#endif
|
||||
|
||||
lv_coord_t ext_draw_pad; /**< EXTend the size in every direction for drawing. */
|
||||
|
||||
/*Attributes and states*/
|
||||
lv_obj_flag_t flags;
|
||||
lv_scroll_mode_t scroll_mode :2; /**< How to display scrollbars*/
|
||||
lv_scroll_snap_align_t snap_align_x : 2;
|
||||
lv_scroll_snap_align_t snap_align_y : 2;
|
||||
lv_scroll_dir_t scroll_dir :4;
|
||||
lv_bidi_dir_t base_dir : 2; /**< Base direction of texts related to this object */
|
||||
}lv_obj_spec_attr_t;
|
||||
|
||||
|
||||
struct _lv_obj_t {
|
||||
lv_obj_spec_attr_t * spec_attr;
|
||||
struct _lv_obj_t * parent; /**< Pointer to the parent object*/
|
||||
|
||||
lv_area_t coords; /**< Coordinates of the object (x1, y1, x2, y2)*/
|
||||
|
||||
lv_signal_cb_t signal_cb; /**< Object type specific signal function*/
|
||||
lv_design_cb_t design_cb; /**< Object type specific design function*/
|
||||
|
||||
void * ext_attr; /**< Object type specific extended data*/
|
||||
lv_style_list_t style_list;
|
||||
|
||||
/*Attributes and states*/
|
||||
lv_obj_flag_t flags;
|
||||
|
||||
lv_state_t state;
|
||||
|
||||
@ -250,18 +248,7 @@ struct _lv_obj_t {
|
||||
lv_coord_t w_set;
|
||||
lv_coord_t h_set;
|
||||
|
||||
#if LV_USE_GROUP != 0
|
||||
void * group_p;
|
||||
#endif
|
||||
|
||||
|
||||
#if LV_USE_USER_DATA
|
||||
lv_obj_user_data_t user_data; /**< Custom user data for object. */
|
||||
#endif
|
||||
|
||||
const lv_grid_t * grid;
|
||||
|
||||
lv_flex_cont_t flex_cont;
|
||||
lv_coord_t ext_draw_pad; /**< EXTend the size in every direction for drawing. */
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -553,7 +540,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);
|
||||
|
||||
lv_obj_rare_attr_t * lv_obj_allocate_rare_attr(lv_obj_t * obj);
|
||||
lv_obj_spec_attr_t * lv_obj_allocate_rare_attr(lv_obj_t * obj);
|
||||
/*=======================
|
||||
* Getter functions
|
||||
*======================*/
|
||||
|
@ -437,8 +437,10 @@ void _lv_obj_draw_scrollbar(lv_obj_t * obj, const lv_area_t * clip_area)
|
||||
lv_coord_t obj_h = lv_obj_get_height(obj);
|
||||
lv_coord_t obj_w = lv_obj_get_width(obj);
|
||||
|
||||
lv_scroll_dir_t dir = lv_obj_get_scroll_dir(obj);
|
||||
|
||||
bool ver_draw = false;
|
||||
if((obj->scroll_dir & LV_DIR_VER) &&
|
||||
if((dir & LV_DIR_VER) &&
|
||||
((sm == LV_SCROLL_MODE_ON) ||
|
||||
(sm == LV_SCROLL_MODE_AUTO && (st > 0 || sb > 0)) ||
|
||||
(sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_VER))) {
|
||||
@ -447,7 +449,7 @@ void _lv_obj_draw_scrollbar(lv_obj_t * obj, const lv_area_t * clip_area)
|
||||
|
||||
|
||||
bool hor_draw = false;
|
||||
if((obj->scroll_dir & LV_DIR_HOR) &&
|
||||
if((dir & LV_DIR_HOR) &&
|
||||
((sm == LV_SCROLL_MODE_ON) ||
|
||||
(sm == LV_SCROLL_MODE_AUTO && (sl > 0 || sr > 0)) ||
|
||||
(sm == LV_SCROLL_MODE_ACTIVE && lv_indev_get_scroll_dir(indev) == LV_SCROLL_DIR_HOR))) {
|
||||
|
@ -593,7 +593,7 @@ void _lv_obj_calc_auto_size(lv_obj_t * obj, lv_coord_t * w_out, lv_coord_t * h_o
|
||||
/*Get the grid size of the object has a defined grid*/
|
||||
lv_coord_t grid_w = 0;
|
||||
lv_coord_t grid_h = 0;
|
||||
if(obj->grid) {
|
||||
if(lv_obj_get_grid(obj)) {
|
||||
_lv_grid_calc_t calc;
|
||||
_lv_grid_calc(obj, &calc);
|
||||
grid_w = calc.grid_w + lv_obj_get_style_pad_left(obj, LV_OBJ_PART_MAIN) + lv_obj_get_style_pad_right(obj, LV_OBJ_PART_MAIN);
|
||||
@ -714,11 +714,12 @@ bool _lv_obj_is_grid_item(lv_obj_t * obj)
|
||||
{
|
||||
lv_obj_t * cont = lv_obj_get_parent(obj);
|
||||
if(cont == NULL) return false;
|
||||
if(cont->grid == NULL) return false;
|
||||
if(cont->grid->col_dsc == NULL) return false;
|
||||
if(cont->grid->row_dsc == NULL) return false;
|
||||
if(cont->grid->row_dsc_len == 0) return false;
|
||||
if(cont->grid->col_dsc_len == 0) return false;
|
||||
const lv_grid_t * g = lv_obj_get_grid(obj);
|
||||
if(g == NULL) return false;
|
||||
if(g->col_dsc == NULL) return false;
|
||||
if(g->row_dsc == NULL) return false;
|
||||
if(g->row_dsc_len == 0) return false;
|
||||
if(g->col_dsc_len == 0) return false;
|
||||
if(LV_COORD_IS_GRID(obj->x_set) == false || LV_COORD_IS_GRID(obj->y_set) == false) return false;
|
||||
return true;
|
||||
}
|
||||
@ -733,7 +734,7 @@ bool _lv_obj_is_flex_item(struct _lv_obj_t * obj)
|
||||
{
|
||||
lv_obj_t * cont = lv_obj_get_parent(obj);
|
||||
if(cont == NULL) return false;
|
||||
if(cont->flex_cont.dir == LV_FLEX_DIR_NONE) return false;
|
||||
if(lv_obj_get_flex_dir(cont) == LV_FLEX_DIR_NONE) return false;
|
||||
if(LV_COORD_IS_FLEX(obj->x_set) == false || LV_COORD_IS_FLEX(obj->y_set) == false) return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -47,23 +47,13 @@ void lv_obj_set_scroll_mode(lv_obj_t * obj, lv_scroll_mode_t mode)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
if(obj->scroll_mode == mode) return;
|
||||
obj->scroll_mode = mode;
|
||||
lv_obj_allocate_rare_attr(obj);
|
||||
|
||||
if(obj->spec_attr->scroll_mode == mode) return;
|
||||
obj->spec_attr->scroll_mode = mode;
|
||||
lv_obj_invalidate(obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get how the scrollbars should behave.
|
||||
* @param obj pointer to an object
|
||||
* @return mode: LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE
|
||||
*/
|
||||
lv_scroll_mode_t lv_obj_get_scroll_mode(lv_obj_t * obj)
|
||||
{
|
||||
LV_ASSERT_OBJ(obj, LV_OBJX_NAME);
|
||||
|
||||
return obj->scroll_mode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves all children with horizontally or vertically.
|
||||
* It doesn't take into account any limits so any values are possible
|
||||
@ -75,11 +65,11 @@ void _lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
|
||||
{
|
||||
if(x == 0 && y == 0) return;
|
||||
|
||||
if(obj->rare_attr == NULL) {
|
||||
obj->rare_attr = lv_obj_allocate_rare_attr(obj);
|
||||
if(obj->spec_attr == NULL) {
|
||||
obj->spec_attr = lv_obj_allocate_rare_attr(obj);
|
||||
}
|
||||
obj->rare_attr->scroll.x += x;
|
||||
obj->rare_attr->scroll.y += y;
|
||||
obj->spec_attr->scroll.x += x;
|
||||
obj->spec_attr->scroll.y += y;
|
||||
|
||||
_lv_obj_move_children_by(obj, x, y);
|
||||
lv_res_t res = lv_signal_send(obj, LV_SIGNAL_SCROLL, NULL);
|
||||
@ -177,8 +167,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)
|
||||
{
|
||||
if(obj->rare_attr == NULL) return 0;
|
||||
return -obj->rare_attr->scroll.y;
|
||||
if(obj->spec_attr == NULL) return 0;
|
||||
return -obj->spec_attr->scroll.y;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -226,8 +216,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)
|
||||
{
|
||||
if(obj->rare_attr == NULL) return 0;
|
||||
return -obj->rare_attr->scroll.x;
|
||||
if(obj->spec_attr == NULL) return 0;
|
||||
return -obj->spec_attr->scroll.x;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -281,6 +271,52 @@ void lv_obj_get_scroll_end(struct _lv_obj_t * obj, lv_point_t * end)
|
||||
end->y = a ? -a->end : lv_obj_get_scroll_top(obj);
|
||||
}
|
||||
|
||||
lv_dir_t lv_obj_get_scroll_dir(const struct _lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->scroll_dir;
|
||||
else return LV_DIR_ALL;
|
||||
}
|
||||
|
||||
void lv_obj_set_scroll_dir(struct _lv_obj_t * obj, lv_dir_t dir)
|
||||
{
|
||||
lv_obj_allocate_rare_attr(obj);
|
||||
|
||||
if(dir != obj->spec_attr->scroll_dir) {
|
||||
obj->spec_attr->scroll_dir = dir;
|
||||
lv_obj_invalidate(obj);
|
||||
}
|
||||
}
|
||||
|
||||
lv_scroll_mode_t lv_obj_get_scroll_mode(const struct _lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->scroll_mode;
|
||||
else return LV_SCROLL_MODE_AUTO;
|
||||
}
|
||||
|
||||
lv_scroll_snap_align_t lv_obj_get_snap_align_x(const struct _lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->snap_align_x;
|
||||
else return LV_SCROLL_SNAP_ALIGN_NONE;
|
||||
}
|
||||
void lv_obj_set_snap_align_x(struct _lv_obj_t * obj, lv_scroll_snap_align_t align)
|
||||
{
|
||||
lv_obj_allocate_rare_attr(obj);
|
||||
obj->spec_attr->snap_align_x = align;
|
||||
}
|
||||
|
||||
lv_scroll_snap_align_t lv_obj_get_snap_align_y(const struct _lv_obj_t * obj)
|
||||
{
|
||||
if(obj->spec_attr) return obj->spec_attr->snap_align_y;
|
||||
else return LV_SCROLL_SNAP_ALIGN_NONE;
|
||||
}
|
||||
|
||||
void lv_obj_set_snap_align_y(struct _lv_obj_t * obj, lv_scroll_snap_align_t align)
|
||||
{
|
||||
lv_obj_allocate_rare_attr(obj);
|
||||
obj->spec_attr->snap_align_y = align;
|
||||
}
|
||||
|
||||
|
||||
/**********************
|
||||
* STATIC FUNCTIONS
|
||||
**********************/
|
||||
|
@ -55,12 +55,6 @@ typedef uint8_t lv_scroll_snap_align_t;
|
||||
*/
|
||||
void lv_obj_set_scroll_mode(struct _lv_obj_t * obj, lv_scroll_mode_t mode);
|
||||
|
||||
/**
|
||||
* Get how the scrollbars should behave.
|
||||
* @param obj pointer to an object
|
||||
* @return mode: LV_SCROLL_MODE_ON/OFF/AUTO/ACTIVE
|
||||
*/
|
||||
lv_scroll_mode_t lv_obj_get_scroll_mode(struct _lv_obj_t * obj);
|
||||
|
||||
/**
|
||||
* Moves all children with horizontally or vertically.
|
||||
@ -148,6 +142,16 @@ lv_coord_t lv_obj_get_scroll_right(struct _lv_obj_t * obj);
|
||||
*/
|
||||
void lv_obj_get_scroll_end(struct _lv_obj_t * obj, lv_point_t * end);
|
||||
|
||||
|
||||
lv_dir_t lv_obj_get_scroll_dir(const struct _lv_obj_t * obj);
|
||||
void lv_obj_set_scroll_dir(struct _lv_obj_t * obj, lv_dir_t dir);
|
||||
lv_scroll_mode_t lv_obj_get_scroll_mode(const struct _lv_obj_t * obj);
|
||||
lv_scroll_snap_align_t lv_obj_get_snap_align_x(const struct _lv_obj_t * obj);
|
||||
void lv_obj_set_snap_align_x(struct _lv_obj_t * obj, lv_scroll_snap_align_t align);
|
||||
lv_scroll_snap_align_t lv_obj_get_snap_align_y(const struct _lv_obj_t * obj);
|
||||
void lv_obj_set_snap_align_y(struct _lv_obj_t * obj, lv_scroll_snap_align_t align);
|
||||
|
||||
|
||||
/**********************
|
||||
* MACROS
|
||||
**********************/
|
||||
|
@ -78,6 +78,19 @@ enum {
|
||||
};
|
||||
typedef uint8_t lv_align_t;
|
||||
|
||||
enum {
|
||||
LV_DIR_NONE = 0x00,
|
||||
LV_DIR_LEFT = (1 << 0),
|
||||
LV_DIR_RIGHT = (1 << 1),
|
||||
LV_DIR_TOP = (1 << 2),
|
||||
LV_DIR_BOTTOM = (1 << 3),
|
||||
LV_DIR_HOR = LV_DIR_LEFT | LV_DIR_RIGHT,
|
||||
LV_DIR_VER = LV_DIR_TOP | LV_DIR_BOTTOM,
|
||||
LV_DIR_ALL = LV_DIR_HOR | LV_DIR_VER,
|
||||
};
|
||||
|
||||
typedef uint8_t lv_dir_t;
|
||||
|
||||
|
||||
/**********************
|
||||
* GLOBAL PROTOTYPES
|
||||
|
@ -161,6 +161,11 @@ void * lv_mem_alloc(size_t size)
|
||||
return &zero_mem;
|
||||
}
|
||||
|
||||
// last_ent = NULL;
|
||||
static uint32_t c = 0;
|
||||
c++;
|
||||
// if(c%10 == 0) printf("alloc:%d\n", c);
|
||||
|
||||
#ifdef LV_ARCH_64
|
||||
/*Round the size up to 8*/
|
||||
size = (size + 7) & (~0x7);
|
||||
@ -171,27 +176,10 @@ void * lv_mem_alloc(size_t size)
|
||||
void * alloc = NULL;
|
||||
|
||||
#if LV_MEM_CUSTOM == 0
|
||||
static uint32_t defr = 0;
|
||||
defr++;
|
||||
if(defr > LV_MEM_FULL_DEFRAG_CNT) {
|
||||
defr = 0;
|
||||
lv_mem_defrag();
|
||||
}
|
||||
alloc = alloc_core(size);
|
||||
if(alloc == NULL) {
|
||||
LV_LOG_WARN("Perform defrag");
|
||||
lv_mem_monitor_t mon;
|
||||
|
||||
lv_mem_monitor(&mon);
|
||||
printf("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d\n",
|
||||
(int)mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct,
|
||||
(int)mon.free_biggest_size);
|
||||
LV_LOG_TRACE("No more memory, try to defrag");
|
||||
lv_mem_defrag();
|
||||
|
||||
lv_mem_monitor(&mon);
|
||||
printf("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d\n",
|
||||
(int)mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct,
|
||||
(int)mon.free_biggest_size);
|
||||
alloc = alloc_core(size);
|
||||
}
|
||||
|
||||
@ -216,7 +204,12 @@ void * lv_mem_alloc(size_t size)
|
||||
#endif
|
||||
|
||||
if(alloc == NULL) {
|
||||
LV_LOG_WARN("Couldn't allocate memory");
|
||||
LV_LOG_WARN("Couldn't allocate memory (%d bytes)", size);
|
||||
lv_mem_monitor_t mon;
|
||||
lv_mem_monitor(&mon);
|
||||
LV_LOG_WARN("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d\n",
|
||||
(int)mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct,
|
||||
(int)mon.free_biggest_size);
|
||||
}
|
||||
else {
|
||||
#if LV_MEM_CUSTOM == 0
|
||||
@ -241,19 +234,23 @@ void lv_mem_free(const void * data)
|
||||
if(data == &zero_mem) return;
|
||||
if(data == NULL) return;
|
||||
|
||||
#if LV_MEM_ADD_JUNK
|
||||
_lv_memset((void *)data, 0xbb, _lv_mem_get_size(data));
|
||||
#endif
|
||||
|
||||
|
||||
#if LV_ENABLE_GC == 0
|
||||
/*e points to the header*/
|
||||
lv_mem_ent_t * e = (lv_mem_ent_t *)((uint8_t *)data - sizeof(lv_mem_header_t));
|
||||
# if LV_MEM_ADD_JUNK
|
||||
_lv_memset((void *)data, 0xbb, _lv_mem_get_size(data));
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*Use custom, user defined free function*/
|
||||
#if LV_MEM_CUSTOM == 0
|
||||
e->header.s.used = 0;
|
||||
|
||||
static uint32_t defr = 0;
|
||||
defr++;
|
||||
if(defr > LV_MEM_FULL_DEFRAG_CNT) {
|
||||
defr = 0;
|
||||
lv_mem_defrag();
|
||||
}
|
||||
#else
|
||||
#if LV_ENABLE_GC == 0
|
||||
/*e points to the header*/
|
||||
|
@ -407,6 +407,7 @@ static bool lv_task_exec(lv_task_t * task)
|
||||
task_deleted = false;
|
||||
task_created = false;
|
||||
if(task->task_cb) task->task_cb(task);
|
||||
LV_ASSERT_MEM_INTEGRITY();
|
||||
|
||||
/*Delete if it was a one shot lv_task*/
|
||||
if(task_deleted == false) { /*The task might be deleted by itself as well*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user