diff --git a/src/main/cms/cms.c b/src/main/cms/cms.c index 5ee3cf05fa..980022008e 100644 --- a/src/main/cms/cms.c +++ b/src/main/cms/cms.c @@ -675,7 +675,16 @@ STATIC_UNIT_TESTED uint16_t cmsHandleKey(displayPort_t *pDisplay, uint8_t key) } break; - case OME_Funcall: + case OME_Funcall:; + long retval; + if (p->func && key == KEY_RIGHT) { + retval = p->func(pDisplay, p->data); + if (retval == MENU_CHAIN_BACK) + cmsMenuBack(pDisplay); + res = BUTTON_PAUSE; + } + break; + case OME_OSD_Exit: if (p->func && key == KEY_RIGHT) { p->func(pDisplay, p->data); diff --git a/src/main/cms/cms_types.h b/src/main/cms/cms_types.h index 5650ca97ac..4bea82e62a 100644 --- a/src/main/cms/cms_types.h +++ b/src/main/cms/cms_types.h @@ -78,9 +78,11 @@ typedef struct #define IS_DYNAMIC(p) ((p)->flags & DYNAMIC) - typedef long (*CMSMenuFuncPtr)(void); +// Special return value(s) for function chaining by CMSMenuFuncPtr +#define MENU_CHAIN_BACK (-1) // Causes automatic cmsMenuBack + /* onExit function is called with self: (1) Pointer to an OSD_Entry when cmsMenuBack() was called.