Hi,
I use lv_obj_add_event_cb
to register event callbacks and get lv_event_dsc_t
s back. I suppose the lv_event_dsc_t
returned is valid before I remove the callback, and the object is allocated by lvgl that will last after my calling function exits.
However, in my particular code below, I observed that at some time after I get lv_event_dsc_t
, the content in it is mutated. I don’t know who is mutating it. I’ll show you the complete code.
#include <lvgl.h>
#include <LilyGoLib.h>
// copied from lv_event.c
typedef struct _lv_event_dsc_t {
lv_event_cb_t cb;
void * user_data;
lv_event_code_t filter : 8;
} lv_event_dsc_t;
void d(lv_event_dsc_t *dsc);
void input_number() {
auto number = lv_obj_create(lv_layer_top());
lv_event_dsc_t *dsc = lv_obj_add_event_cb(number, [](lv_event_t *e) {}, LV_EVENT_READY, nullptr);
d(dsc); // get `dsc 1070544804 { 31, 0 }`
// the following line is necessary for the issue to happen
lv_event_dsc_t *dsc_cancel = lv_obj_add_event_cb(number, [](lv_event_t *e) {}, LV_EVENT_CANCEL, nullptr);
d(dsc); // get `dsc 1070544804 { 31, 0 }` also
lv_timer_create([](_lv_timer_t *t){
d((lv_event_dsc_t*)t->user_data); // get `dsc 1070544804 { 0, 208 }`
}, 1000, dsc);
}
void d(lv_event_dsc_t *dsc) {
Serial.printf("dsc %d { %d, %d }\n", dsc, dsc->filter, dsc->user_data);
}
The main code calls input_number
, let the object show, and I do nothing with the screen. I expect each line in the output to be the same, but actually it changes after 1 second.
I can’t figure out why. An interesting point is that the line I remarked in code above is necessary for the issue to happen. If I remove it, all lines becomes the same.
Can anyone help?