fix(btnmatrix): fix setting the same map with modified pointers
fix #1889
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
## v7.7.2 (Planned to 28.11.2020)
|
## v7.7.2 (Planned to 28.11.2020)
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
- fix(draw_triangle): fix polygon/triangle drawing when the order of points is counter-clockwise
|
- fix(draw_triangle): fix polygon/triangle drawing when the order of points is counter-clockwise
|
||||||
|
- fix(btnmatrix): fix setting the same map with modified pointers
|
||||||
|
|
||||||
## v7.7.1 (04.11.2020)
|
## v7.7.1 (04.11.2020)
|
||||||
### Bugfixes
|
### Bugfixes
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ static bool button_get_tgl_state(lv_btnmatrix_ctrl_t ctrl_bits);
|
|||||||
static uint16_t get_button_from_point(lv_obj_t * btnm, lv_point_t * p);
|
static uint16_t get_button_from_point(lv_obj_t * btnm, lv_point_t * p);
|
||||||
static void allocate_btn_areas_and_controls(const lv_obj_t * btnm, const char ** map);
|
static void allocate_btn_areas_and_controls(const lv_obj_t * btnm, const char ** map);
|
||||||
static void invalidate_button_area(const lv_obj_t * btnm, uint16_t btn_idx);
|
static void invalidate_button_area(const lv_obj_t * btnm, uint16_t btn_idx);
|
||||||
static bool maps_are_identical(const char ** map1, const char ** map2);
|
|
||||||
static void make_one_button_toggled(lv_obj_t * btnm, uint16_t btn_idx);
|
static void make_one_button_toggled(lv_obj_t * btnm, uint16_t btn_idx);
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
@@ -152,11 +151,9 @@ void lv_btnmatrix_set_map(lv_obj_t * btnm, const char * map[])
|
|||||||
* set/allocation when map hasn't changed.
|
* set/allocation when map hasn't changed.
|
||||||
*/
|
*/
|
||||||
lv_btnmatrix_ext_t * ext = lv_obj_get_ext_attr(btnm);
|
lv_btnmatrix_ext_t * ext = lv_obj_get_ext_attr(btnm);
|
||||||
if(!maps_are_identical(ext->map_p, map)) {
|
|
||||||
|
|
||||||
/*Analyze the map and create the required number of buttons*/
|
/*Analyze the map and create the required number of buttons*/
|
||||||
allocate_btn_areas_and_controls(btnm, map);
|
allocate_btn_areas_and_controls(btnm, map);
|
||||||
}
|
|
||||||
ext->map_p = map;
|
ext->map_p = map;
|
||||||
|
|
||||||
/*Set size and positions of the buttons*/
|
/*Set size and positions of the buttons*/
|
||||||
@@ -1132,6 +1129,10 @@ static void allocate_btn_areas_and_controls(const lv_obj_t * btnm, const char **
|
|||||||
|
|
||||||
lv_btnmatrix_ext_t * ext = lv_obj_get_ext_attr(btnm);
|
lv_btnmatrix_ext_t * ext = lv_obj_get_ext_attr(btnm);
|
||||||
|
|
||||||
|
/*Do not allocate memory for the same amount of buttons*/
|
||||||
|
if(btn_cnt == ext->btn_cnt) return;
|
||||||
|
|
||||||
|
|
||||||
if(ext->button_areas != NULL) {
|
if(ext->button_areas != NULL) {
|
||||||
lv_mem_free(ext->button_areas);
|
lv_mem_free(ext->button_areas);
|
||||||
ext->button_areas = NULL;
|
ext->button_areas = NULL;
|
||||||
@@ -1269,25 +1270,6 @@ static void invalidate_button_area(const lv_obj_t * btnm, uint16_t btn_idx)
|
|||||||
lv_obj_invalidate_area(btnm, &btn_area);
|
lv_obj_invalidate_area(btnm, &btn_area);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Compares two button matrix maps for equality
|
|
||||||
* @param map1 map to compare
|
|
||||||
* @param map2 map to compare
|
|
||||||
* @return true if maps are identical in length and content
|
|
||||||
*/
|
|
||||||
static bool maps_are_identical(const char ** map1, const char ** map2)
|
|
||||||
{
|
|
||||||
if(map1 == map2) return true;
|
|
||||||
if(map1 == NULL || map2 == NULL) return map1 == map2;
|
|
||||||
|
|
||||||
uint16_t i = 0;
|
|
||||||
while(map1[i][0] != '\0' && map2[i][0] != '\0') {
|
|
||||||
if(strcmp(map1[i], map2[i]) != 0) return false;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return map1[i][0] == '\0' && map2[i][0] == '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enforces a single button being toggled on the button matrix.
|
* Enforces a single button being toggled on the button matrix.
|
||||||
* It simply clears the toggle flag on other buttons.
|
* It simply clears the toggle flag on other buttons.
|
||||||
|
|||||||
Reference in New Issue
Block a user