From 1441601e3e594a60b9458ccf4507680070c23ca2 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Sat, 21 Dec 2019 20:25:30 +0100 Subject: [PATCH 1/4] list layout fixes --- src/lv_objx/lv_list.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/lv_objx/lv_list.c b/src/lv_objx/lv_list.c index cf18e73fa..54fe16a26 100644 --- a/src/lv_objx/lv_list.c +++ b/src/lv_objx/lv_list.c @@ -179,6 +179,13 @@ lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * img_src, const char * t { LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_obj_t * last_btn = lv_list_get_prev_btn(list, NULL); + + /*The coordinates may changed due to autofit so revert them at the end*/ + lv_coord_t pos_x_ori = lv_obj_get_x(list); + lv_coord_t pos_y_ori = lv_obj_get_y(list); + + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); ext->size++; /*Create a list element with the image an the text*/ @@ -197,7 +204,22 @@ lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * img_src, const char * t lv_page_glue_obj(liste, true); lv_btn_set_layout(liste, LV_LAYOUT_ROW_M); - lv_btn_set_fit2(liste, LV_FIT_FLOOD, LV_FIT_TIGHT); + + lv_layout_t list_layout = lv_list_get_layout(list); + bool layout_ver = false; + if(list_layout == LV_LAYOUT_COL_M || list_layout == LV_LAYOUT_COL_L || list_layout == LV_LAYOUT_COL_R) { + layout_ver = true; + } + + if(layout_ver) { + lv_btn_set_fit2(liste, LV_FIT_FLOOD, LV_FIT_TIGHT); + } else { + lv_coord_t w = last_btn ? lv_obj_get_width(last_btn) : (LV_DPI * 3) / 2; + lv_btn_set_fit2(liste, LV_FIT_NONE, LV_FIT_TIGHT); + lv_obj_set_width(liste, w); + } + + lv_obj_set_protect(liste, LV_PROTECT_PRESS_LOST); lv_obj_set_signal_cb(liste, lv_list_btn_signal); @@ -233,6 +255,8 @@ lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * img_src, const char * t } #endif + lv_obj_set_pos(list, pos_x_ori, pos_y_ori); + return liste; } @@ -399,16 +423,23 @@ void lv_list_set_style(lv_obj_t * list, lv_list_style_t type, const lv_style_t * while(btn != NULL) { /*If a column layout set the buttons' width to list width*/ if(layout == LV_LAYOUT_COL_M || layout == LV_LAYOUT_COL_L || layout == LV_LAYOUT_COL_R) { - lv_btn_set_fit2(list, LV_FIT_FLOOD, LV_FIT_TIGHT); + lv_btn_set_fit2(btn, LV_FIT_FLOOD, LV_FIT_TIGHT); } /*If a row layout set the buttons' width according to the content*/ else if (layout == LV_LAYOUT_ROW_M || layout == LV_LAYOUT_ROW_T || layout == LV_LAYOUT_ROW_B) { - lv_btn_set_fit(list, LV_FIT_TIGHT); + lv_btn_set_fit(btn, LV_FIT_TIGHT); } btn = lv_list_get_prev_btn(list, btn); } + if(layout == LV_LAYOUT_COL_M || layout == LV_LAYOUT_COL_L || layout == LV_LAYOUT_COL_R) { + lv_page_set_scrl_fit2(list, LV_FIT_FLOOD, LV_FIT_TIGHT); + } else if (layout == LV_LAYOUT_ROW_M || layout == LV_LAYOUT_ROW_T || layout == LV_LAYOUT_ROW_B) { + lv_page_set_scrl_fit2(list, LV_FIT_TIGHT, LV_FIT_TIGHT); + lv_cont_set_fit2(list, LV_FIT_NONE, LV_FIT_TIGHT); + } + lv_page_set_scrl_layout(list, layout); } From 7175231aabcbe19e58681a1f2d7df1f816c3ddec Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Sat, 21 Dec 2019 20:27:01 +0100 Subject: [PATCH 2/4] tileview: call drag_end_handler only if it was dragging --- src/lv_objx/lv_tileview.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lv_objx/lv_tileview.c b/src/lv_objx/lv_tileview.c index 184bcbd58..cd2f83d0c 100644 --- a/src/lv_objx/lv_tileview.c +++ b/src/lv_objx/lv_tileview.c @@ -486,9 +486,9 @@ static void tileview_scrl_event_cb(lv_obj_t * scrl, lv_event_t event) lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); if(lv_indev_is_dragging(indev) && (ext->drag_hor || ext->drag_ver)) { indev->proc.types.pointer.drag_in_prog = 0; + drag_end_handler(tileview); } - drag_end_handler(tileview); } } From a010412fde0ec1e2ed755ce3ab2d9579eb5bce8d Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Sat, 21 Dec 2019 21:50:41 +0100 Subject: [PATCH 3/4] roller: fix misalignment if the new options has the same width as the previous --- src/lv_objx/lv_roller.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lv_objx/lv_roller.c b/src/lv_objx/lv_roller.c index e556beed5..4d21bbad6 100644 --- a/src/lv_objx/lv_roller.c +++ b/src/lv_objx/lv_roller.c @@ -149,8 +149,9 @@ void lv_roller_set_options(lv_obj_t * roller, const char * options, lv_roller_mo /* Make sure the roller's height and the scrollable's height is refreshed. * They are refreshed in `LV_SIGNAL_COORD_CHG` but if the new options has the same width - * that signal won't be called. (It called because LV_FIT_TIGHT hor fit)*/ + * that signal won't be called. (It's called because of LV_FIT_TIGHT hor fit)*/ refr_height(roller); + refr_position(roller, LV_ANIM_OFF); } else { ext->mode = LV_ROLLER_MODE_INIFINITE; From 248868fef1f4925fada1aa7591b19e3bc837db51 Mon Sep 17 00:00:00 2001 From: Amir Gonnen Date: Sun, 22 Dec 2019 01:35:00 +0200 Subject: [PATCH 4/4] Add lv_deinit function (#1319) --- src/lv_core/lv_obj.c | 12 ++++++++++++ src/lv_core/lv_obj.h | 9 +++++++++ src/lv_misc/lv_gc.c | 11 +++++++++++ src/lv_misc/lv_gc.h | 33 ++++++++++++++++++--------------- src/lv_misc/lv_mem.c | 15 +++++++++++++++ src/lv_misc/lv_mem.h | 6 ++++++ 6 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 089c5e341..fd0c91892 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -121,6 +121,18 @@ void lv_init(void) LV_LOG_INFO("lv_init ready"); } +#if LV_ENABLE_GC || !LV_MEM_CUSTOM +void lv_deinit(void) +{ + lv_gc_clear_roots(); + lv_log_register_print_cb(NULL); + lv_disp_set_default(NULL); + lv_mem_deinit(); + lv_initialized = false; + LV_LOG_INFO("lv_deinit done"); +} +#endif + /*-------------------- * Create and delete *-------------------*/ diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index 869871890..3bc8270e4 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -269,6 +269,15 @@ typedef struct */ void lv_init(void); + +/** + * Deinit the 'lv' library + * Currently only implemented when not using custorm allocators, or GC is enabled. + */ +#if LV_ENABLE_GC || !LV_MEM_CUSTOM +void lv_deinit(void); +#endif + /*-------------------- * Create and delete *-------------------*/ diff --git a/src/lv_misc/lv_gc.c b/src/lv_misc/lv_gc.c index 70dfc9a84..94bf532ac 100644 --- a/src/lv_misc/lv_gc.c +++ b/src/lv_misc/lv_gc.c @@ -8,6 +8,11 @@ *********************/ #include "lv_gc.h" +#include "string.h" + +#if defined(LV_GC_INCLUDE) +#include LV_GC_INCLUDE +#endif /* LV_ENABLE_GC */ /********************* * DEFINES @@ -35,6 +40,12 @@ LV_ROOTS * GLOBAL FUNCTIONS **********************/ +void lv_gc_clear_roots(void) +{ +#define LV_CLEAR_ROOT(root_type, root_name) memset(&LV_GC_ROOT(root_name), 0, sizeof(LV_GC_ROOT(root_name))); + LV_ITERATE_ROOTS(LV_CLEAR_ROOT) +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/lv_misc/lv_gc.h b/src/lv_misc/lv_gc.h index 0db9f5cb9..afd4d600a 100644 --- a/src/lv_misc/lv_gc.h +++ b/src/lv_misc/lv_gc.h @@ -30,21 +30,21 @@ extern "C" { * DEFINES *********************/ -#define LV_GC_ROOTS(prefix) \ - prefix lv_ll_t _lv_task_ll; /*Linked list to store the lv_tasks*/ \ - prefix lv_ll_t _lv_disp_ll; /*Linked list of screens*/ \ - prefix lv_ll_t _lv_indev_ll; /*Linked list of screens*/ \ - prefix lv_ll_t _lv_drv_ll; \ - prefix lv_ll_t _lv_file_ll; \ - prefix lv_ll_t _lv_anim_ll; \ - prefix lv_ll_t _lv_group_ll; \ - prefix lv_ll_t _lv_img_defoder_ll; \ - prefix lv_img_cache_entry_t * _lv_img_cache_array; \ - prefix void * _lv_task_act; \ - prefix void * _lv_draw_buf; +#define LV_ITERATE_ROOTS(f) \ + f(lv_ll_t, _lv_task_ll) /*Linked list to store the lv_tasks*/ \ + f(lv_ll_t, _lv_disp_ll) /*Linked list of screens*/ \ + f(lv_ll_t, _lv_indev_ll) /*Linked list of screens*/ \ + f(lv_ll_t, _lv_drv_ll) \ + f(lv_ll_t, _lv_file_ll) \ + f(lv_ll_t, _lv_anim_ll) \ + f(lv_ll_t, _lv_group_ll) \ + f(lv_ll_t, _lv_img_defoder_ll) \ + f(lv_img_cache_entry_t*, _lv_img_cache_array) \ + f(void*, _lv_task_act) \ + f(void*, _lv_draw_buf) -#define LV_NO_PREFIX -#define LV_ROOTS LV_GC_ROOTS(LV_NO_PREFIX) +#define LV_DEFINE_ROOT(root_type, root_name) root_type root_name; +#define LV_ROOTS LV_ITERATE_ROOTS(LV_DEFINE_ROOT) #if LV_ENABLE_GC == 1 #if LV_MEM_CUSTOM != 1 @@ -52,7 +52,8 @@ extern "C" { #endif /* LV_MEM_CUSTOM */ #else /* LV_ENABLE_GC */ #define LV_GC_ROOT(x) x -LV_GC_ROOTS(extern) +#define LV_EXTERN_ROOT(root_type, root_name) extern root_type root_name; +LV_ITERATE_ROOTS(LV_EXTERN_ROOT) #endif /* LV_ENABLE_GC */ /********************** @@ -63,6 +64,8 @@ LV_GC_ROOTS(extern) * GLOBAL PROTOTYPES **********************/ +void lv_gc_clear_roots(void); + /********************** * MACROS **********************/ diff --git a/src/lv_misc/lv_mem.c b/src/lv_misc/lv_mem.c index da38554e4..9b7345ab3 100644 --- a/src/lv_misc/lv_mem.c +++ b/src/lv_misc/lv_mem.c @@ -102,6 +102,21 @@ void lv_mem_init(void) #endif } +/** + * Clean up the memory buffer which frees all the allocated memories. + * @note It work only if `LV_MEM_CUSTOM == 0` + */ +void lv_mem_deinit(void) +{ +#if LV_MEM_CUSTOM == 0 + memset(work_mem, 0x00, (LV_MEM_SIZE / sizeof(MEM_UNIT)) * sizeof(MEM_UNIT)); + lv_mem_ent_t * full = (lv_mem_ent_t *)work_mem; + full->header.s.used = 0; + /*The total mem size id reduced by the first header and the close patterns */ + full->header.s.d_size = LV_MEM_SIZE - sizeof(lv_mem_header_t); +#endif +} + /** * Allocate a memory dynamically * @param size size of the memory to allocate in bytes diff --git a/src/lv_misc/lv_mem.h b/src/lv_misc/lv_mem.h index 34ca3e9e9..f72407421 100644 --- a/src/lv_misc/lv_mem.h +++ b/src/lv_misc/lv_mem.h @@ -55,6 +55,12 @@ typedef struct */ void lv_mem_init(void); +/** + * Clean up the memory buffer which frees all the allocated memories. + * @note It work only if `LV_MEM_CUSTOM == 0` + */ +void lv_mem_deinit(void); + /** * Allocate a memory dynamically * @param size size of the memory to allocate in bytes