diff options
Diffstat (limited to 'apps/menu.c')
-rw-r--r-- | apps/menu.c | 71 |
1 files changed, 49 insertions, 22 deletions
diff --git a/apps/menu.c b/apps/menu.c index 9c5afbe94a..ae2797ed09 100644 --- a/apps/menu.c +++ b/apps/menu.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include "misc.h" | 43 | #include "misc.h" |
44 | #include "action.h" | 44 | #include "action.h" |
45 | #include "menus/exported_menus.h" | 45 | #include "menus/exported_menus.h" |
46 | #include "string.h" | ||
46 | 47 | ||
47 | #ifdef HAVE_LCD_BITMAP | 48 | #ifdef HAVE_LCD_BITMAP |
48 | #include "icons.h" | 49 | #include "icons.h" |
@@ -370,11 +371,12 @@ static int current_subitems[MAX_MENU_SUBITEMS]; | |||
370 | static int current_subitems_count = 0; | 371 | static int current_subitems_count = 0; |
371 | 372 | ||
372 | void get_menu_callback(const struct menu_item_ex *m, | 373 | void get_menu_callback(const struct menu_item_ex *m, |
373 | menu_callback_type menu_callback) | 374 | menu_callback_type *menu_callback) |
374 | { | 375 | { |
375 | if (m->flags&MENU_HAS_DESC) | 376 | if (m->flags&MENU_HAS_DESC) |
376 | menu_callback= m->callback_and_desc->menu_callback; | 377 | *menu_callback= m->callback_and_desc->menu_callback; |
377 | else menu_callback = m->menu_callback; | 378 | else |
379 | *menu_callback = m->menu_callback; | ||
378 | } | 380 | } |
379 | 381 | ||
380 | static int get_menu_selection(int selected_item, const struct menu_item_ex *menu) | 382 | static int get_menu_selection(int selected_item, const struct menu_item_ex *menu) |
@@ -403,7 +405,7 @@ static char * get_menu_item_name(int selected_item,void * data, char *buffer) | |||
403 | if (type == MT_SETTING) | 405 | if (type == MT_SETTING) |
404 | { | 406 | { |
405 | const struct settings_list *v | 407 | const struct settings_list *v |
406 | = find_setting(menu->variable); | 408 | = find_setting(menu->variable, NULL); |
407 | if (v) | 409 | if (v) |
408 | return str(v->lang_id); | 410 | return str(v->lang_id); |
409 | else return "Not Done yet!"; | 411 | else return "Not Done yet!"; |
@@ -419,7 +421,7 @@ static void init_menu_lists(const struct menu_item_ex *menu, | |||
419 | current_subitems_count = 0; | 421 | current_subitems_count = 0; |
420 | for (i=0; i<count; i++) | 422 | for (i=0; i<count; i++) |
421 | { | 423 | { |
422 | get_menu_callback(menu->submenus[i],menu_callback); | 424 | get_menu_callback(menu->submenus[i],&menu_callback); |
423 | if (menu_callback) | 425 | if (menu_callback) |
424 | { | 426 | { |
425 | if (menu_callback(ACTION_REQUEST_MENUITEM,menu->submenus[i]) | 427 | if (menu_callback(ACTION_REQUEST_MENUITEM,menu->submenus[i]) |
@@ -443,7 +445,7 @@ static void init_menu_lists(const struct menu_item_ex *menu, | |||
443 | gui_synclist_limit_scroll(lists,true); | 445 | gui_synclist_limit_scroll(lists,true); |
444 | gui_synclist_select_item(lists, selected); | 446 | gui_synclist_select_item(lists, selected); |
445 | 447 | ||
446 | get_menu_callback(menu,menu_callback); | 448 | get_menu_callback(menu,&menu_callback); |
447 | if (callback && menu_callback) | 449 | if (callback && menu_callback) |
448 | menu_callback(ACTION_ENTER_MENUITEM,menu); | 450 | menu_callback(ACTION_ENTER_MENUITEM,menu); |
449 | } | 451 | } |
@@ -505,7 +507,7 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
505 | continue; | 507 | continue; |
506 | } | 508 | } |
507 | 509 | ||
508 | get_menu_callback(menu,menu_callback); | 510 | get_menu_callback(menu,&menu_callback); |
509 | if (menu_callback) | 511 | if (menu_callback) |
510 | { | 512 | { |
511 | action = menu_callback(action,menu); | 513 | action = menu_callback(action,menu); |
@@ -526,7 +528,7 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
526 | in_stringlist = false; | 528 | in_stringlist = false; |
527 | if (stack_top > 0) | 529 | if (stack_top > 0) |
528 | { | 530 | { |
529 | get_menu_callback(menu,menu_callback); | 531 | get_menu_callback(menu,&menu_callback); |
530 | if (menu_callback) | 532 | if (menu_callback) |
531 | { | 533 | { |
532 | if (menu_callback(action,menu) == | 534 | if (menu_callback(action,menu) == |
@@ -551,8 +553,9 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
551 | temp = menu->submenus[selected]; | 553 | temp = menu->submenus[selected]; |
552 | if (in_stringlist) | 554 | if (in_stringlist) |
553 | type = (menu->flags&MENU_TYPE_MASK); | 555 | type = (menu->flags&MENU_TYPE_MASK); |
554 | else type = (temp->flags&MENU_TYPE_MASK); | 556 | else |
555 | get_menu_callback(temp,menu_callback); | 557 | type = (temp->flags&MENU_TYPE_MASK); |
558 | get_menu_callback(temp, &menu_callback); | ||
556 | if (menu_callback) | 559 | if (menu_callback) |
557 | { | 560 | { |
558 | action = menu_callback(ACTION_ENTER_MENUITEM,temp); | 561 | action = menu_callback(ACTION_ENTER_MENUITEM,temp); |
@@ -584,8 +587,10 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
584 | break; | 587 | break; |
585 | case MT_SETTING: | 588 | case MT_SETTING: |
586 | { | 589 | { |
590 | int setting_id; | ||
587 | const struct settings_list *setting = find_setting( | 591 | const struct settings_list *setting = find_setting( |
588 | temp->variable); | 592 | temp->variable, |
593 | &setting_id); | ||
589 | if (setting) | 594 | if (setting) |
590 | { | 595 | { |
591 | if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING) | 596 | if ((setting->flags&F_BOOL_SETTING) == F_BOOL_SETTING) |
@@ -624,11 +629,10 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
624 | { | 629 | { |
625 | var = (int*)setting->setting; | 630 | var = (int*)setting->setting; |
626 | } | 631 | } |
627 | DEBUGF("%x\n",setting->flags); | ||
628 | if (setting->flags&F_INT_SETTING) | 632 | if (setting->flags&F_INT_SETTING) |
629 | {DEBUGF("boo"); | 633 | { |
630 | set_int(str(setting->lang_id), | 634 | set_int(str(setting->lang_id), |
631 | str(setting->int_setting->unit), | 635 | NULL, |
632 | setting->int_setting->unit,var, | 636 | setting->int_setting->unit,var, |
633 | setting->int_setting->option_callback, | 637 | setting->int_setting->option_callback, |
634 | setting->int_setting->step, | 638 | setting->int_setting->step, |
@@ -639,18 +643,41 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
639 | else if (setting->flags&F_CHOICE_SETTING) | 643 | else if (setting->flags&F_CHOICE_SETTING) |
640 | { | 644 | { |
641 | static struct opt_items options[MAX_OPTIONS]; | 645 | static struct opt_items options[MAX_OPTIONS]; |
646 | static char buffer[1024]; | ||
647 | char *buf_start = buffer; | ||
648 | int buf_free = 1024; | ||
642 | int i,j, count = setting->choice_setting->count; | 649 | int i,j, count = setting->choice_setting->count; |
643 | for (i=0, j=0; i<count && i<MAX_OPTIONS; i++) | 650 | for (i=0, j=0; i<count && i<MAX_OPTIONS; i++) |
644 | { | 651 | { |
645 | options[j].string = | 652 | if (setting->flags&F_CHOICETALKS) |
646 | P2STR(setting->choice_setting->desc[i]); | 653 | { |
647 | options[j].voice_id = | 654 | if (cfg_int_to_string(setting_id, i, |
648 | P2ID(setting->choice_setting->desc[i]); | 655 | buf_start, buf_free)) |
649 | j++; | 656 | { |
657 | int len = strlen(buf_start) +1; | ||
658 | options[j].string = buf_start; | ||
659 | buf_start += len; | ||
660 | buf_free -= len; | ||
661 | options[j].voice_id = | ||
662 | setting->choice_setting->talks[i]; | ||
663 | j++; | ||
664 | } | ||
665 | } | ||
666 | else | ||
667 | { | ||
668 | options[j].string = | ||
669 | P2STR(setting-> | ||
670 | choice_setting->desc[i]); | ||
671 | options[j].voice_id = | ||
672 | P2ID(setting-> | ||
673 | choice_setting->desc[i]); | ||
674 | j++; | ||
675 | } | ||
650 | } | 676 | } |
651 | set_option(str(setting->lang_id), var, INT, | 677 | set_option(str(setting->lang_id), var, INT, |
652 | options,count, | 678 | options,j, |
653 | setting->choice_setting->option_callback); | 679 | setting-> |
680 | choice_setting->option_callback); | ||
654 | } | 681 | } |
655 | if (setting->flags&F_TEMPVAR) | 682 | if (setting->flags&F_TEMPVAR) |
656 | *(int*)setting->setting = temp_var; | 683 | *(int*)setting->setting = temp_var; |
@@ -675,7 +702,7 @@ int do_menu(const struct menu_item_ex *start_menu) | |||
675 | } | 702 | } |
676 | break; | 703 | break; |
677 | } | 704 | } |
678 | get_menu_callback(temp,menu_callback); | 705 | get_menu_callback(temp,&menu_callback); |
679 | if (type != MT_MENU && menu_callback) | 706 | if (type != MT_MENU && menu_callback) |
680 | menu_callback(ACTION_EXIT_MENUITEM,temp); | 707 | menu_callback(ACTION_EXIT_MENUITEM,temp); |
681 | } | 708 | } |