summaryrefslogtreecommitdiff
path: root/apps/menu.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/menu.c')
-rw-r--r--apps/menu.c71
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];
370static int current_subitems_count = 0; 371static int current_subitems_count = 0;
371 372
372void get_menu_callback(const struct menu_item_ex *m, 373void 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
380static int get_menu_selection(int selected_item, const struct menu_item_ex *menu) 382static 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 }