From 07bce7466d471a15ba241a9db3239f7a116b0b46 Mon Sep 17 00:00:00 2001 From: pete-pjb Date: Fri, 16 Jun 2023 17:51:49 +0100 Subject: [PATCH] fix:(BtnMatrix) Backport https://github.com/lvgl/lvgl/pull/4185 Stop disabled/hidden button matrix keys from getting stuck in a loop --- src/widgets/lv_btnmatrix.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/widgets/lv_btnmatrix.c b/src/widgets/lv_btnmatrix.c index 8902d8b93..00fb36f65 100644 --- a/src/widgets/lv_btnmatrix.c +++ b/src/widgets/lv_btnmatrix.c @@ -563,9 +563,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) else btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_LEFT) { @@ -574,9 +580,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; else btnm->btn_id_sel = btnm->btn_cnt - 1; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_DOWN) { @@ -586,7 +598,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else { @@ -614,7 +629,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else {