diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index eaf6f0e05..c34741e29 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -34,6 +34,12 @@ /********************** * TYPEDEFS **********************/ +typedef struct _lv_event_temp_data +{ + lv_obj_t * obj; + bool deleted; + struct _lv_event_temp_data * prev; +}lv_event_temp_data_t; /********************** * STATIC PROTOTYPES @@ -42,6 +48,7 @@ static void refresh_children_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coor static void report_style_mod_core(void * style_p, lv_obj_t * obj); static void refresh_children_style(lv_obj_t * obj); static void delete_children(lv_obj_t * obj); +static void lv_event_mark_deleted(lv_obj_t * obj); static bool lv_obj_design(lv_obj_t * obj, const lv_area_t * mask_p, lv_design_mode_t mode); static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param); @@ -49,9 +56,8 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param); * STATIC VARIABLES **********************/ static bool lv_initialized = false; -static lv_obj_t * event_act_obj; /*Stores the which event is currently being executed*/ -static bool event_act_obj_deleted; /*Shows that the object was deleted in the event function*/ -static const void * event_act_data; /*Stores the data passed to the event*/ +static lv_event_temp_data_t * event_temp_data_head; + /********************** * MACROS **********************/ @@ -377,8 +383,6 @@ lv_res_t lv_obj_del(lv_obj_t * obj) { lv_obj_invalidate(obj); - if(event_act_obj == obj && event_act_obj_deleted == false) event_act_obj_deleted = true; - /*Delete from the group*/ #if LV_USE_GROUP bool was_focused = false; @@ -410,9 +414,11 @@ lv_res_t lv_obj_del(lv_obj_t * obj) i = i_next; } - /*Let the suer free the resources used in `LV_EVENT_DELETE`*/ + /*Let the user free the resources used in `LV_EVENT_DELETE`*/ lv_event_send(obj, LV_EVENT_DELETE, NULL); + lv_event_mark_deleted(obj); + /*Remove the object from parent's children list*/ lv_obj_t * par = lv_obj_get_parent(obj); if(par == NULL) { /*It is a screen*/ @@ -1277,25 +1283,26 @@ lv_res_t lv_event_send(lv_obj_t * obj, lv_event_t event, const void * data) { if(obj == NULL) return LV_RES_OK; - /*If the event was send from an other event save the current states to restore it at the end*/ - lv_obj_t * prev_obj_act = event_act_obj; - bool prev_obj_act_deleted = event_act_obj_deleted; - const void * prev_data = event_act_data; + lv_event_temp_data_t event_temp_data; + event_temp_data.obj = obj; + event_temp_data.deleted = false; + event_temp_data.prev = NULL; - event_act_obj = obj; - event_act_obj_deleted = false; - event_act_data = data; + if(event_temp_data_head == NULL) { + event_temp_data_head = &event_temp_data; + } else { + event_temp_data.prev = event_temp_data_head; + event_temp_data_head = &event_temp_data; + } + + event_temp_data_head = &event_temp_data; if(obj->event_cb) obj->event_cb(obj, event); - bool deleted = event_act_obj_deleted; + /*Remove this element from the list*/ + event_temp_data_head = event_temp_data_head->prev; - /*Restore the previous states*/ - event_act_obj = prev_obj_act; - event_act_obj_deleted = prev_obj_act_deleted; - event_act_data = prev_data; - - if(deleted) { + if(event_temp_data.deleted) { return LV_RES_INV; } @@ -1313,7 +1320,7 @@ lv_res_t lv_event_send(lv_obj_t * obj, lv_event_t event, const void * data) */ const void * lv_event_get_data(void) { - return event_act_data; + return NULL; //event_act_data; } /** @@ -2176,9 +2183,6 @@ static void refresh_children_style(lv_obj_t * obj) */ static void delete_children(lv_obj_t * obj) { - - if(event_act_obj == obj && event_act_obj_deleted == false) event_act_obj_deleted = true; - lv_obj_t * i; lv_obj_t * i_next; i = lv_ll_get_head(&(obj->child_ll)); @@ -2210,6 +2214,8 @@ static void delete_children(lv_obj_t * obj) /*Let the suer free the resources used in `LV_EVENT_DELETE`*/ lv_event_send(obj, LV_EVENT_DELETE, NULL); + lv_event_mark_deleted(obj); + /*Remove the animations from this object*/ #if LV_USE_ANIMATION lv_anim_del(obj, NULL); @@ -2241,3 +2247,13 @@ static void delete_children(lv_obj_t * obj) if(obj->ext_attr != NULL) lv_mem_free(obj->ext_attr); lv_mem_free(obj); /*Free the object itself*/ } + +static void lv_event_mark_deleted(lv_obj_t * obj) +{ + lv_event_temp_data_t * t = event_temp_data_head; + + while(t) { + if(t->obj == obj) t->deleted = true; + t = t->prev; + } +} diff --git a/src/lv_hal/lv_hal_disp.c b/src/lv_hal/lv_hal_disp.c index 25fada1d8..8add208ce 100644 --- a/src/lv_hal/lv_hal_disp.c +++ b/src/lv_hal/lv_hal_disp.c @@ -137,8 +137,7 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) disp_def = disp_def_tmp; /*Revert the default display*/ /*Create a refresh task*/ - disp->refr_task = - lv_task_create(lv_disp_refr_task, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, disp); + disp->refr_task = lv_task_create(lv_disp_refr_task, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, disp); lv_mem_assert(disp->refr_task); if(disp->refr_task == NULL) return NULL; diff --git a/src/lv_misc/lv_task.c b/src/lv_misc/lv_task.c index e2ece2abf..0824222ee 100644 --- a/src/lv_misc/lv_task.c +++ b/src/lv_misc/lv_task.c @@ -168,7 +168,7 @@ LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void) * @param user_data custom parameter * @return pointer to the new task */ -lv_task_t * lv_task_create(void (*task)(void *), uint32_t period, lv_task_prio_t prio, void * user_data) +lv_task_t * lv_task_create(void (*task)(lv_task_t *), uint32_t period, lv_task_prio_t prio, void * user_data) { lv_task_t * new_lv_task = NULL; lv_task_t * tmp; diff --git a/src/lv_misc/lv_task.h b/src/lv_misc/lv_task.h index e3959a98d..b0e37b54d 100644 --- a/src/lv_misc/lv_task.h +++ b/src/lv_misc/lv_task.h @@ -51,11 +51,11 @@ typedef uint8_t lv_task_prio_t; /** * Descriptor of a lv_task */ -typedef struct +typedef struct _lv_task_t { uint32_t period; uint32_t last_run; - void (*task_cb)(void *); + void (*task_cb)(struct _lv_task_t *); #if LV_USE_USER_DATA_SINGLE void * user_data; @@ -91,7 +91,7 @@ LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void); * @param user_data custom parameter * @return pointer to the new task_cb */ -lv_task_t * lv_task_create(void (*task)(void *), uint32_t period, lv_task_prio_t prio, void * user_data); +lv_task_t * lv_task_create(void (*task)(lv_task_t *), uint32_t period, lv_task_prio_t prio, void * user_data); /** * Delete a lv_task diff --git a/src/lv_objx/lv_btnm.c b/src/lv_objx/lv_btnm.c index e91d7434e..6f284e92a 100644 --- a/src/lv_objx/lv_btnm.c +++ b/src/lv_objx/lv_btnm.c @@ -721,7 +721,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) button_is_inactive(ext->ctrl_bits[ext->btn_id_act]) == false && button_is_hidden(ext->ctrl_bits[ext->btn_id_act]) == false) { uint32_t b = ext->btn_id_act; - lv_event_send(btnm, LV_EVENT_SELECTED, &b); + res = lv_event_send(btnm, LV_EVENT_SELECTED, &b); } } } else if(sign == LV_SIGNAL_PRESSING) { @@ -737,8 +737,10 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) } if(btn_pr != LV_BTNM_BTN_NONE) { uint32_t b = ext->btn_id_act; - lv_event_send(btnm, LV_EVENT_SELECTED, &b); - invalidate_button_area(btnm, btn_pr); + res = lv_event_send(btnm, LV_EVENT_SELECTED, &b); + if(res == LV_RES_OK) { + invalidate_button_area(btnm, btn_pr); + } } } @@ -773,7 +775,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) button_is_inactive(ext->ctrl_bits[ext->btn_id_act]) == false && button_is_hidden(ext->ctrl_bits[ext->btn_id_act]) == false) { uint32_t b = ext->btn_id_act; - lv_event_send(btnm, LV_EVENT_SELECTED, &b); + res = lv_event_send(btnm, LV_EVENT_SELECTED, &b); } } } else if(sign == LV_SIGNAL_LONG_PRESS_REP) { @@ -782,7 +784,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) button_is_inactive(ext->ctrl_bits[ext->btn_id_act]) == false && button_is_hidden(ext->ctrl_bits[ext->btn_id_act]) == false) { uint32_t b = ext->btn_id_act; - lv_event_send(btnm, LV_EVENT_SELECTED, &b); + res = lv_event_send(btnm, LV_EVENT_SELECTED, &b); } } } else if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_DEFOCUS) { diff --git a/src/lv_objx/lv_kb.c b/src/lv_objx/lv_kb.c index a5dd73f84..c1135fb2d 100644 --- a/src/lv_objx/lv_kb.c +++ b/src/lv_objx/lv_kb.c @@ -41,7 +41,7 @@ static const lv_btnm_ctrl_t kb_ctrl_lc_map[] = { LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 6, 2, 2}; + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; static const char * kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "Bksp", "\n", "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Enter", "\n", @@ -52,7 +52,7 @@ static const lv_btnm_ctrl_t kb_ctrl_uc_map[] = { LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 2, 2, 6, 2, 2}; + LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; static const char * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", "Bksp", "\n", "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", @@ -122,7 +122,7 @@ lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy) * Don't use `par` directly because if the window is created on a page it is moved to the * scrollable so the parent has changed */ lv_obj_set_size(new_kb, lv_obj_get_width_fit(lv_obj_get_parent(new_kb)), - lv_obj_get_height_fit(lv_obj_get_parent(new_kb))); + lv_obj_get_height_fit(lv_obj_get_parent(new_kb)) / 2); lv_obj_align(new_kb, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_set_event_cb(new_kb, lv_kb_def_event_cb); diff --git a/src/lv_objx/lv_ta.c b/src/lv_objx/lv_ta.c index e78da1456..66151328c 100644 --- a/src/lv_objx/lv_ta.c +++ b/src/lv_objx/lv_ta.c @@ -108,6 +108,7 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) ext->cursor.type = LV_CURSOR_LINE; ext->cursor.valid_x = 0; ext->one_line = 0; + ext->text_sel_en = 0; ext->label = NULL; ext->placeholder = NULL;