State of image button is not refreshed after upgrading LVGL from 7.4.0 to 7.10.1

Description

I have an APP developed based on LVGL v7.4.0, multiple image buttons are used on a screen, when one image button is pressed, the others are set to released state. When I upgrade to LVGL v7.10.1, the same code doesn’t work anymore.

What MCU/Processor/Board and compiler are you using?

Simulator

What LVGL version are you using?

LVGL 7.10.1

What do you want to achieve?

When one image button is pressed, the state of other image buttons are set to released.

What have you tried so far?

Run the APP with LVGL v7.4.0, it works as expectation, run the same APP with LVGL v7.10.1, the state of other image buttons are not refreshed.

Code to reproduce

typedef struct
{
	lv_obj_t *Scr1;
	lv_obj_t *Scr1_Bckgnd;
	lv_obj_t *Scr1_broilBtn;
	lv_obj_t *Scr1_broilBtn_label;
	lv_obj_t *Scr1_warmBtn;
	lv_obj_t *Scr1_warmBtn_label;
}lv_ui;

lv_ui appui;

void setup_scr_Scr1(lv_ui *ui){
	ui->Scr1 = lv_obj_create(NULL, NULL);

	ui->Scr1_Bckgnd = lv_img_create(ui->Scr1, NULL);
	lv_obj_set_pos(ui->Scr1_Bckgnd, 0, 0);
	lv_obj_set_size(ui->Scr1_Bckgnd, 480, 272);
	lv_img_set_src(ui->Scr1_Bckgnd,&_Oven01_alpha_480x272);

	ui->Scr1_broilBtn = lv_imgbtn_create(ui->Scr1, NULL);
	lv_obj_set_pos(ui->Scr1_broilBtn, 10, 60);
	lv_obj_set_size(ui->Scr1_broilBtn, 30, 30);
	lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_RELEASED,&_Broil_alpha_30x30);
	lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_PRESSED,&_Broil_selected_alpha_30x30);
	lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_CHECKED_RELEASED,&_Broil_selected_alpha_30x30);
	lv_imgbtn_set_src(ui->Scr1_broilBtn,LV_BTN_STATE_CHECKED_PRESSED,&_Broil_alpha_30x30);
	lv_imgbtn_set_checkable(ui->Scr1_broilBtn, true);

	ui->Scr1_warmBtn = lv_imgbtn_create(ui->Scr1, NULL);
	lv_obj_set_pos(ui->Scr1_warmBtn, 10, 95);
	lv_obj_set_size(ui->Scr1_warmBtn, 30, 30);
	lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_RELEASED,&_Warm_alpha_30x30);
	lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_PRESSED,&_Warm_selected_alpha_30x30);
	lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_CHECKED_RELEASED,&_Warm_selected_alpha_30x30);
	lv_imgbtn_set_src(ui->Scr1_warmBtn,LV_BTN_STATE_CHECKED_PRESSED,&_Warm_alpha_30x30);
	lv_imgbtn_set_checkable(ui->Scr1_warmBtn, true);
}

void btnSelection_cb(lv_obj_t * btn, lv_event_t event)
{
    uint32_t btnState;

    if(event == LV_EVENT_RELEASED) {
    	if(btn == appui.Scr1_broilBtn) {
            btnState = lv_btn_get_state(appui.Scr1_broilBtn);

            if (btnState == 0x3) {
                 lv_btn_set_state(appui.Scr1_warmBtn, LV_BTN_STATE_RELEASED);
             }
        }
        else if(btn == appui.Scr1_warmBtn) {
            btnState = lv_btn_get_state(appui.Scr1_warmBtn);

            if (btnState == 0x3) {
                 lv_btn_set_state(appui.Scr1_broilBtn, LV_BTN_STATE_RELEASED);
             }
        }
    }
}

static void btnEvent_handler(lv_obj_t * obj, lv_event_t event)
{
	switch (event)
	{
		case LV_EVENT_RELEASED:
		{
			btnSelection_cb(obj, event);
		}
		break;
	default:
		break;
	}
}

void events_init_Scr1(lv_ui *ui)
{
	lv_obj_set_event_cb(ui->Scr1_broilBtn, btnEvent_handler);
	lv_obj_set_event_cb(ui->Scr1_warmBtn, btnEvent_handler);
}

void setup_ui(lv_ui *ui){
	LV_THEME_DEFAULT_INIT(LV_THEME_DEFAULT_COLOR_PRIMARY, LV_THEME_DEFAULT_COLOR_SECONDARY,
		LV_THEME_MATERIAL_FLAG_LIGHT, LV_THEME_DEFAULT_FONT_SMALL,  LV_THEME_DEFAULT_FONT_NORMAL,
		LV_THEME_DEFAULT_FONT_SUBTITLE, LV_THEME_DEFAULT_FONT_TITLE);
	setup_scr_Scr1(ui);
	lv_scr_load(ui->Scr1);
	events_init_Scr1(ui);
}

Screenshot and/or video

Press image button1

Expected result after pressing image button2 with LVGL v7.4.0

Incorrect result after pressing image button2 with LVGL v7.10.1

I think in v7 you should be using lv_imgbtn_set_state.

Thanks, it works after changing to lv_imgbtn_set_state.