summaryrefslogtreecommitdiff
path: root/apps/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/menu.c')
-rw-r--r--apps/menu.c27
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
190static void init_menu_lists(const struct menu_item_ex *menu, 190static 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
270static int talk_menu_item(int selected_item, void *data) 273static 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 {