diff options
Diffstat (limited to 'apps/menu.c')
-rw-r--r-- | apps/menu.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/apps/menu.c b/apps/menu.c index 830bc67a11..802a16bbb8 100644 --- a/apps/menu.c +++ b/apps/menu.c | |||
@@ -187,17 +187,18 @@ static enum themable_icons menu_get_icon(int selected_item, void * data) | |||
187 | return menu_icon; | 187 | return menu_icon; |
188 | } | 188 | } |
189 | 189 | ||
190 | static void init_menu_lists(const struct menu_item_ex *menu, | 190 | static int init_menu_lists(const struct menu_item_ex *menu, |
191 | struct gui_synclist *lists, int selected, bool callback, | 191 | struct gui_synclist *lists, int selected, bool callback, |
192 | struct viewport parent[NB_SCREENS]) | 192 | struct viewport parent[NB_SCREENS]) |
193 | { | 193 | { |
194 | if (!menu || !lists) | 194 | if (!menu || !lists) |
195 | { | 195 | { |
196 | panicf("init_menu_lists, NULL pointer"); | 196 | panicf("init_menu_lists, NULL pointer"); |
197 | return; | 197 | return 0; |
198 | } | 198 | } |
199 | 199 | ||
200 | int i; | 200 | int i; |
201 | int start_action = ACTION_ENTER_MENUITEM; | ||
201 | int count = MIN(MENU_GET_COUNT(menu->flags), MAX_MENU_SUBITEMS); | 202 | int count = MIN(MENU_GET_COUNT(menu->flags), MAX_MENU_SUBITEMS); |
202 | int type = (menu->flags&MENU_TYPE_MASK); | 203 | int type = (menu->flags&MENU_TYPE_MASK); |
203 | menu_callback_type menu_callback = NULL; | 204 | menu_callback_type menu_callback = NULL; |
@@ -264,7 +265,9 @@ static void init_menu_lists(const struct menu_item_ex *menu, | |||
264 | 265 | ||
265 | get_menu_callback(menu,&menu_callback); | 266 | get_menu_callback(menu,&menu_callback); |
266 | if (callback && menu_callback) | 267 | if (callback && menu_callback) |
267 | menu_callback(ACTION_ENTER_MENUITEM, menu, lists); | 268 | start_action = menu_callback(start_action, menu, lists); |
269 | |||
270 | return start_action; | ||
268 | } | 271 | } |
269 | 272 | ||
270 | static int talk_menu_item(int selected_item, void *data) | 273 | static int talk_menu_item(int selected_item, void *data) |
@@ -381,6 +384,7 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
381 | int selected = start_selected? *start_selected : 0; | 384 | int selected = start_selected? *start_selected : 0; |
382 | int ret = 0; | 385 | int ret = 0; |
383 | int action; | 386 | int action; |
387 | int start_action; | ||
384 | struct gui_synclist lists; | 388 | struct gui_synclist lists; |
385 | const struct menu_item_ex *temp = NULL; | 389 | const struct menu_item_ex *temp = NULL; |
386 | const struct menu_item_ex *menu = start_menu; | 390 | const struct menu_item_ex *menu = start_menu; |
@@ -407,8 +411,10 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
407 | menu_callback_type menu_callback = NULL; | 411 | menu_callback_type menu_callback = NULL; |
408 | 412 | ||
409 | /* if hide_theme is true, assume parent has been fixed before passed into | 413 | /* if hide_theme is true, assume parent has been fixed before passed into |
410 | * this function, e.g. with viewport_set_defaults(parent, screen) */ | 414 | * this function, e.g. with viewport_set_defaults(parent, screen) |
411 | init_menu_lists(menu, &lists, selected, true, parent); | 415 | * start_action allows an action to be processed |
416 | * by menu logic by bypassing get_action on the initial run */ | ||
417 | start_action = init_menu_lists(menu, &lists, selected, true, parent); | ||
412 | vps = *(lists.parent); | 418 | vps = *(lists.parent); |
413 | in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID); | 419 | in_stringlist = ((menu->flags&MENU_TYPE_MASK) == MT_RETURN_ID); |
414 | /* load the callback, and only reload it if menu changes */ | 420 | /* load the callback, and only reload it if menu changes */ |
@@ -421,7 +427,13 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
421 | { | 427 | { |
422 | keyclick_set_callback(gui_synclist_keyclick_callback, &lists); | 428 | keyclick_set_callback(gui_synclist_keyclick_callback, &lists); |
423 | 429 | ||
424 | action = get_action(CONTEXT_MAINMENU|ALLOW_SOFTLOCK, | 430 | if (UNLIKELY(start_action != ACTION_ENTER_MENUITEM)) |
431 | { | ||
432 | action = start_action; | ||
433 | start_action = ACTION_ENTER_MENUITEM; | ||
434 | } | ||
435 | else | ||
436 | action = get_action(CONTEXT_MAINMENU|ALLOW_SOFTLOCK, | ||
425 | list_do_action_timeout(&lists, HZ)); | 437 | list_do_action_timeout(&lists, HZ)); |
426 | /* HZ so the status bar redraws corectly */ | 438 | /* HZ so the status bar redraws corectly */ |
427 | 439 | ||
@@ -639,7 +651,8 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected, | |||
639 | if (!(menu->flags&MENU_EXITAFTERTHISMENU) || | 651 | if (!(menu->flags&MENU_EXITAFTERTHISMENU) || |
640 | (temp->flags&MENU_EXITAFTERTHISMENU)) | 652 | (temp->flags&MENU_EXITAFTERTHISMENU)) |
641 | { | 653 | { |
642 | init_menu_lists(menu, &lists, selected, true, vps); | 654 | /* Reload menu but don't run the calback again FS#8117 */ |
655 | init_menu_lists(menu, &lists, selected, false, vps); | ||
643 | } | 656 | } |
644 | if (temp->flags&MENU_FUNC_CHECK_RETVAL) | 657 | if (temp->flags&MENU_FUNC_CHECK_RETVAL) |
645 | { | 658 | { |