diff --git a/apps/SOURCES b/apps/SOURCES index 83f41cda3a..04199cd1fb 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -29,6 +29,7 @@ playlist.c playlist_catalog.c playlist_viewer.c plugin.c +root_menu.c screens.c settings.c settings_list.c diff --git a/apps/action.h b/apps/action.h index a1d54b22d8..c1026d8885 100644 --- a/apps/action.h +++ b/apps/action.h @@ -160,6 +160,7 @@ enum { once the subitem returns */ ACTION_ENTER_MENUITEM, ACTION_MENU_WPS, + ACTION_MENU_STOP, /* id3db */ diff --git a/apps/gui/gwps.c b/apps/gui/gwps.c index 00290a8871..a5e1e26e0c 100644 --- a/apps/gui/gwps.c +++ b/apps/gui/gwps.c @@ -59,6 +59,7 @@ #include "backdrop.h" #endif #include "ata_idle_notify.h" +#include "root_menu.h" #define WPS_DEFAULTCFG WPS_DIR "/rockbox_default.wps" #define RWPS_DEFAULTCFG WPS_DIR "/rockbox_default.rwps" @@ -238,7 +239,9 @@ long gui_wps_show(void) show_main_backdrop(); #endif action_signalscreenchange(); - onplay(wps_state.id3->path, TREE_ATTR_MPA, CONTEXT_WPS); + if (onplay(wps_state.id3->path, TREE_ATTR_MPA, CONTEXT_WPS) + == ONPLAY_MAINMENU) + return GO_TO_ROOT; #if LCD_DEPTH > 1 show_wps_backdrop(); #endif @@ -258,13 +261,8 @@ long gui_wps_show(void) #endif FOR_NB_SCREENS(i) gui_wps[i].display->stop_scroll(); - - /* set dir browser to current playing song */ - if (global_settings.browse_current && - wps_state.current_track_path[0] != '\0') - set_current_file(wps_state.current_track_path); action_signalscreenchange(); - return 0; + return GO_TO_PREVIOUS_BROWSER; break; /* play/pause */ @@ -497,23 +495,7 @@ long gui_wps_show(void) case ACTION_WPS_MENU: FOR_NB_SCREENS(i) gui_wps[i].display->stop_scroll(); - -#if LCD_DEPTH > 1 - show_main_backdrop(); -#endif - action_signalscreenchange(); - if (main_menu()) - return true; -#if LCD_DEPTH > 1 - show_wps_backdrop(); -#endif -#ifdef HAVE_LCD_BITMAP - FOR_NB_SCREENS(i) - { - gui_wps_set_margin(&gui_wps[i]); - } -#endif - restore = true; + return GO_TO_ROOT; break; @@ -639,12 +621,7 @@ long gui_wps_show(void) } if (update_failed) { - /* set dir browser to current playing song */ - if (global_settings.browse_current && - wps_state.current_track_path[0] != '\0') - set_current_file(wps_state.current_track_path); - - return 0; + return GO_TO_ROOT; } update_track = false; } @@ -666,12 +643,7 @@ long gui_wps_show(void) ab_reset_markers(); #endif - /* set dir browser to current playing song */ - if (global_settings.browse_current && - wps_state.current_track_path[0] != '\0') - set_current_file(wps_state.current_track_path); - - return 0; + return GO_TO_PREVIOUS; } if ( button ) @@ -685,12 +657,7 @@ long gui_wps_show(void) restoretimer = 0; if (gui_wps_display()) { - /* set dir browser to current playing song */ - if (global_settings.browse_current && - wps_state.current_track_path[0] != '\0') - set_current_file(wps_state.current_track_path); - - return 0; + return GO_TO_ROOT; } if (wps_state.id3){ @@ -699,7 +666,7 @@ long gui_wps_show(void) } } } - return 0; /* unreachable - just to reduce compiler warnings */ + return GO_TO_ROOT; /* unreachable - just to reduce compiler warnings */ } /* needs checking if needed end*/ diff --git a/apps/keymaps/keymap-e200.c b/apps/keymaps/keymap-e200.c index a990e9cd1b..932613d5f2 100644 --- a/apps/keymaps/keymap-e200.c +++ b/apps/keymaps/keymap-e200.c @@ -48,6 +48,12 @@ static const struct button_mapping button_context_standard[] = { LAST_ITEM_IN_LIST }; /* button_context_standard */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_UP, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_menu */ + static const struct button_mapping button_context_wps[] = { { ACTION_WPS_PLAY, BUTTON_UP|BUTTON_REL, BUTTON_UP }, { ACTION_WPS_STOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_UP }, @@ -228,8 +234,9 @@ const struct button_mapping* get_context_mapping(int context) switch (context) { case CONTEXT_STD: - case CONTEXT_MAINMENU: return button_context_standard; + case CONTEXT_MAINMENU: + return button_context_menu; case CONTEXT_WPS: return button_context_wps; diff --git a/apps/keymaps/keymap-gigabeat.c b/apps/keymaps/keymap-gigabeat.c index 3f4f8b6ac9..1917714b1e 100644 --- a/apps/keymaps/keymap-gigabeat.c +++ b/apps/keymaps/keymap-gigabeat.c @@ -116,6 +116,15 @@ static const struct button_mapping button_context_tree[] = { LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) }; /* button_context_tree */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_POWER|BUTTON_REL, BUTTON_POWER }, + { ACTION_MENU_STOP, BUTTON_A, BUTTON_NONE }, + { ACTION_MENU_STOP, BUTTON_A|BUTTON_REL, BUTTON_A }, + { ACTION_MENU_STOP, BUTTON_A|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_tree */ + static const struct button_mapping button_context_listtree_scroll_with_combo[] = { { ACTION_NONE, BUTTON_POWER, BUTTON_NONE }, { ACTION_TREE_PGLEFT, BUTTON_POWER|BUTTON_LEFT, BUTTON_POWER }, @@ -259,8 +268,9 @@ const struct button_mapping* get_context_mapping(int context) switch (context) { case CONTEXT_STD: - case CONTEXT_MAINMENU: return button_context_standard; + case CONTEXT_MAINMENU: + return button_context_menu; case CONTEXT_WPS: return button_context_wps; diff --git a/apps/keymaps/keymap-h10.c b/apps/keymaps/keymap-h10.c index 904b8c0bbe..c0e5614fcd 100644 --- a/apps/keymaps/keymap-h10.c +++ b/apps/keymaps/keymap-h10.c @@ -62,6 +62,12 @@ static const struct button_mapping remote_button_context_standard[] = { LAST_ITEM_IN_LIST }; /* remote_button_context_standard */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_PLAY, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_menu */ + static const struct button_mapping button_context_wps[] = { { ACTION_WPS_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, { ACTION_WPS_STOP, BUTTON_PLAY|BUTTON_REPEAT,BUTTON_PLAY }, @@ -351,8 +357,9 @@ const struct button_mapping* get_context_mapping(int context) switch (context) { case CONTEXT_STD: - case CONTEXT_MAINMENU: return button_context_standard; + case CONTEXT_MAINMENU: + return button_context_menu; case CONTEXT_WPS: return button_context_wps; diff --git a/apps/keymaps/keymap-h1x0_h3x0.c b/apps/keymaps/keymap-h1x0_h3x0.c index b379081efe..7997270a3b 100644 --- a/apps/keymaps/keymap-h1x0_h3x0.c +++ b/apps/keymaps/keymap-h1x0_h3x0.c @@ -65,6 +65,12 @@ static const struct button_mapping button_context_standard[] = { LAST_ITEM_IN_LIST }; /* button_context_standard */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_ON, BUTTON_NONE }, + { ACTION_MENU_STOP, BUTTON_OFF, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_menu */ static const struct button_mapping button_context_wps[] = { { ACTION_WPS_PLAY, BUTTON_ON|BUTTON_REL, BUTTON_ON }, @@ -715,10 +721,18 @@ static const struct button_mapping button_context_radio_h300lcdremote[] = { LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) }; +static const struct button_mapping button_context_menu_remote[] = { + { ACTION_MENU_STOP, BUTTON_RC_STOP, BUTTON_NONE }, + { ACTION_MENU_WPS, BUTTON_RC_ON, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; + /* the actual used tables */ static const struct button_mapping *remote_btn_ctxt_std = 0, *remote_btn_ctxt_wps = 0, + *remote_btn_ctxt_menu = button_context_menu_remote, *remote_btn_ctxt_list = 0, *remote_btn_ctxt_tree = 0, *remote_btn_ctxt_listtree_scroll_w_cmb = 0, @@ -866,8 +880,9 @@ static const struct button_mapping* get_context_mapping_remote(int context) switch (context) { case CONTEXT_STD: - case CONTEXT_MAINMENU: return remote_btn_ctxt_std; + case CONTEXT_MAINMENU: + return remote_btn_ctxt_menu; case CONTEXT_WPS: /* common for all remotes */ return button_context_wps_remotescommon; @@ -914,8 +929,9 @@ const struct button_mapping* get_context_mapping(int context) switch (context) { case CONTEXT_STD: - case CONTEXT_MAINMENU: return button_context_standard; + case CONTEXT_MAINMENU: + return button_context_menu; case CONTEXT_WPS: return button_context_wps; diff --git a/apps/keymaps/keymap-ipod.c b/apps/keymaps/keymap-ipod.c index 94dd94333d..8b08f0cbd4 100644 --- a/apps/keymaps/keymap-ipod.c +++ b/apps/keymaps/keymap-ipod.c @@ -60,6 +60,12 @@ static const struct button_mapping button_context_tree[] = { LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_tree */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY }, + { ACTION_MENU_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_PLAY }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_menu */ static const struct button_mapping button_context_tree_scroll_lr[] = { { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, @@ -191,8 +197,9 @@ const struct button_mapping* get_context_mapping(int context) return button_context_tree; case CONTEXT_LIST: - case CONTEXT_MAINMENU: return button_context_standard; + case CONTEXT_MAINMENU: + return button_context_menu; case CONTEXT_SETTINGS_EQ: case CONTEXT_SETTINGS_COLOURCHOOSER: diff --git a/apps/keymaps/keymap-ondio.c b/apps/keymaps/keymap-ondio.c index 401742b363..17b7fe4aba 100644 --- a/apps/keymaps/keymap-ondio.c +++ b/apps/keymaps/keymap-ondio.c @@ -83,10 +83,17 @@ static const struct button_mapping button_context_settings[] = { static const struct button_mapping button_context_tree[] = { { ACTION_TREE_WPS, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, { ACTION_TREE_STOP, BUTTON_OFF, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_listtree */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_menu */ + static const struct button_mapping button_context_tree_scroll_lr[] = { { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, @@ -211,8 +218,9 @@ const struct button_mapping* get_context_mapping( int context ) case CONTEXT_FM: return button_context_radio; #endif - case CONTEXT_LIST: case CONTEXT_MAINMENU: + return button_context_menu; + case CONTEXT_LIST: default: return button_context_standard; } diff --git a/apps/keymaps/keymap-player.c b/apps/keymaps/keymap-player.c index 82508b5c48..80cdedfc3c 100644 --- a/apps/keymaps/keymap-player.c +++ b/apps/keymaps/keymap-player.c @@ -78,6 +78,12 @@ static const struct button_mapping button_context_tree[] = { LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_listtree */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_ON, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_menu */ + static const struct button_mapping button_context_yesno[] = { { ACTION_YESNO_ACCEPT, BUTTON_PLAY, BUTTON_NONE }, @@ -153,9 +159,10 @@ const struct button_mapping* get_context_mapping( int context ) return button_context_tree; case CONTEXT_BOOKMARKSCREEN: return button_context_bmark; + case CONTEXT_MAINMENU: + return button_context_menu; case CONTEXT_STD: case CONTEXT_LIST: - case CONTEXT_MAINMENU: default: return button_context_standard; } diff --git a/apps/keymaps/keymap-recorder.c b/apps/keymaps/keymap-recorder.c index 0296a87ce9..fc781afa46 100644 --- a/apps/keymaps/keymap-recorder.c +++ b/apps/keymaps/keymap-recorder.c @@ -112,6 +112,13 @@ static const struct button_mapping button_context_tree[] = { LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_listtree */ +static const struct button_mapping button_context_menu[] = { + { ACTION_MENU_WPS, BUTTON_ON|BUTTON_REL, BUTTON_ON }, + { ACTION_MENU_STOP, BUTTON_OFF, BUTTON_NONE }, + { ACTION_NONE, BUTTON_ON, BUTTON_NONE }, + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_listtree */ + static const struct button_mapping button_context_tree_scroll_lr[] = { { ACTION_NONE, BUTTON_LEFT, BUTTON_NONE }, { ACTION_STD_CANCEL, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, @@ -299,9 +306,10 @@ const struct button_mapping* get_context_mapping( int context ) case CONTEXT_FM: return button_context_radio; + case CONTEXT_MAINMENU: + return button_context_menu; case CONTEXT_STD: case CONTEXT_LIST: - case CONTEXT_MAINMENU: default: return button_context_standard; } diff --git a/apps/keymaps/keymap-x5.c b/apps/keymaps/keymap-x5.c index 82cfd27c5d..06e6b252d0 100644 --- a/apps/keymaps/keymap-x5.c +++ b/apps/keymaps/keymap-x5.c @@ -117,7 +117,7 @@ static const struct button_mapping button_context_keyboard[] = { /* Main Menu Context Menu **/ static const struct button_mapping button_context_mainmenu[] = { { ACTION_NONE, BUTTON_POWER, BUTTON_NONE }, - + { ACTION_MENU_WPS, BUTTON_PLAY, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_mainmenu */ diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 08f06ba56b..40d0737ce1 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -314,13 +314,13 @@ desc: in the main menu user: - *: "Playlist Options" + *: "Playlist" - *: "Playlist Options" + *: "Playlist" - *: "Playlist Options" + *: "Playlist" @@ -328,13 +328,13 @@ desc: in the main menu user: - *: "Browse Plugins" + *: "Plugins" - *: "Browse Plugins" + *: "Plugins" - *: "Browse Plugins" + *: "Plugins" @@ -342,13 +342,13 @@ desc: in the main menu user: - *: "Info" + *: "System" - *: "Info" + *: "System" - *: "Info" + *: "System" @@ -1008,13 +1008,13 @@ desc: in the recording sub menu user: - *: "Recording Screen" + *: "Recording" - *: "Recording Screen" + *: "Recording" - *: "Recording Screen" + *: "Recording" @@ -10563,3 +10563,115 @@ *: "FM Radio Menu" + + id: LANG_DIR_BROWSER + desc: in root menu + user: + + *: "Files" + + + *: "Files" + + + *: "Files" + + + + id: LANG_SETTINGS_MENU + desc: in root menu + user: + + *: "Settings" + + + *: "Settings" + + + *: "Settings" + + + + id: LANG_NOW_PLAYING + desc: in root menu + user: + + *: "Now Playing" + + + *: "Now Playing" + + + *: "Now Playing" + + + + id: LANG_RESUME_PLAYBACK + desc: in root menu + user: + + *: "Resume Playback" + + + *: "Resume Playback" + + + *: "Resume Playback" + + + + id: LANG_START_SCREEN + desc: in root menu setting + user: + + *: "Start Screen" + + + *: "Start Screen" + + + *: "Start Screen" + + + + id: LANG_ROCKBOX_TITLE + desc: in root menu + user: + + *: "Rockbox" + + + *: "Rockbox" + + + *: "Rockbox" + + + + id: LANG_MAIN_MENU + desc: in root menu setting + user: + + *: "Main Menu" + + + *: "Main Menu" + + + *: "Main Menu" + + + + id: LANG_PREVIOUS_SCREEN + desc: in root menu setting + user: + + *: "Previous Screen" + + + *: "Previous Screen" + + + *: "Previous Screen" + + diff --git a/apps/main_menu.c b/apps/main_menu.c index e3cc88fdda..ec139466cb 100644 --- a/apps/main_menu.c +++ b/apps/main_menu.c @@ -128,9 +128,6 @@ bool main_menu(void) if(inside_menu) return false; inside_menu = true; - items[i].desc = ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS); - items[i++].function = bookmark_mrb_load; - items[i].desc = ID2P(LANG_SOUND_SETTINGS); items[i++].function = sound_menu; diff --git a/apps/main_menu.h b/apps/main_menu.h index d1c36b3663..c70640fd77 100644 --- a/apps/main_menu.h +++ b/apps/main_menu.h @@ -21,7 +21,7 @@ #include "menu.h" -extern bool main_menu(void); +extern int main_menu(void); extern bool rec_menu(void); #endif diff --git a/apps/menu.c b/apps/menu.c index 0081d4964d..8656c903c7 100644 --- a/apps/menu.c +++ b/apps/menu.c @@ -23,6 +23,7 @@ */ #include #include +#include "config.h" #include "hwcompat.h" #include "lcd.h" @@ -44,6 +45,10 @@ #include "action.h" #include "menus/exported_menus.h" #include "string.h" +#include "root_menu.h" +#include "bookmark.h" +#include "gwps-common.h" /* for fade() */ +#include "audio.h" #ifdef HAVE_LCD_BITMAP #include "icons.h" @@ -303,7 +308,14 @@ static int get_menu_selection(int selected_item, const struct menu_item_ex *menu return current_subitems[selected_item]; return selected_item; } - +static int find_menu_selection(int selected) +{ + int i; + for (i=0; i< current_subitems_count; i++) + if (current_subitems[i] == selected) + return i; + return 0; +} static char * get_menu_item_name(int selected_item,void * data, char *buffer) { const struct menu_item_ex *menu = (const struct menu_item_ex *)data; @@ -363,6 +375,7 @@ static void menu_get_icon(int selected_item, void * data, ICON * icon) break; case MT_FUNCTION_CALL: case MT_FUNCTION_WITH_PARAM: + case MT_RETURN_VALUE: if (menu_icon == NOICON) *icon = bitmap_icons_6x8[Icon_Menu_functioncall]; else @@ -418,7 +431,7 @@ static void init_menu_lists(const struct menu_item_ex *menu, gui_synclist_set_icon_callback(lists, NULL); gui_synclist_set_nb_items(lists,current_subitems_count); gui_synclist_limit_scroll(lists,true); - gui_synclist_select_item(lists, selected); + gui_synclist_select_item(lists, find_menu_selection(selected)); get_menu_callback(menu,&menu_callback); if (callback && menu_callback) @@ -434,14 +447,14 @@ static void talk_menu_item(const struct menu_item_ex *menu, int sel = get_menu_selection(gui_synclist_get_sel_pos(lists),menu); if ((menu->flags&MENU_TYPE_MASK) == MT_MENU) { - if ((menu->submenus[sel]->flags&MENU_TYPE_MASK) == MT_SETTING) - talk_setting(menu->submenus[sel]->variable); - else - { - id = P2ID(menu->submenus[sel]->callback_and_desc->desc); - if (id != -1) + if ((menu->submenus[sel]->flags&MENU_TYPE_MASK) == MT_SETTING) + talk_setting(menu->submenus[sel]->variable); + else + { + id = P2ID(menu->submenus[sel]->callback_and_desc->desc); + if (id != -1) talk_id(id,false); - } + } } } } @@ -564,10 +577,10 @@ bool do_setting_from_menu(const struct menu_item_ex *temp) return ret_val; } -int do_menu(const struct menu_item_ex *start_menu) +int do_menu(const struct menu_item_ex *start_menu, int *start_selected) { + int selected = start_selected? *start_selected : 0; int action; - int selected = 0; struct gui_synclist lists; const struct menu_item_ex *temp, *menu; int ret = 0; @@ -630,10 +643,24 @@ int do_menu(const struct menu_item_ex *start_menu) } else if (action == ACTION_MENU_WPS) { - ret = MENU_RETURN_TO_WPS; + ret = GO_TO_PREVIOUS_MUSIC; } - else if ((action == ACTION_STD_CANCEL) || - (action == ACTION_STD_MENU)) + else if (action == ACTION_MENU_STOP) + { + if (audio_status() && !global_settings.party_mode) + { + if (global_settings.fade_on_stop) + fade(0); + bookmark_autobookmark(); + audio_stop(); + } + } + else if (action == ACTION_STD_MENU) + { + if (menu != &root_menu_) + ret = GO_TO_ROOT; + } + else if (action == ACTION_STD_CANCEL) { in_stringlist = false; if (menu_callback) @@ -649,8 +676,11 @@ int do_menu(const struct menu_item_ex *start_menu) /* new menu, so reload the callback */ get_menu_callback(menu, &menu_callback); } - else + else if (menu != &root_menu_) + { + ret = GO_TO_PREVIOUS; break; + } } else if (action == ACTION_STD_OK) { @@ -678,8 +708,7 @@ int do_menu(const struct menu_item_ex *start_menu) if (stack_top < MAX_MENUS) { menu_stack[stack_top] = menu; - menu_stack_selected_item[stack_top] - = gui_synclist_get_sel_pos(&lists); + menu_stack_selected_item[stack_top] = selected; stack_top++; init_menu_lists(temp, &lists, 0, true); menu = temp; @@ -717,6 +746,10 @@ int do_menu(const struct menu_item_ex *start_menu) in_stringlist = true; } break; + case MT_RETURN_VALUE: + if (start_selected) + *start_selected = selected; + return temp->value; } if (type != MT_MENU && menu_callback) menu_callback(ACTION_EXIT_MENUITEM,temp); @@ -733,10 +766,12 @@ int do_menu(const struct menu_item_ex *start_menu) gui_synclist_draw(&lists); } action_signalscreenchange(); + if (start_selected) + *start_selected = selected; return ret; } int main_menu(void) { - return do_menu(NULL); + return do_menu(NULL, 0); } diff --git a/apps/menu.h b/apps/menu.h index 655c9112c4..4cb7446ae1 100644 --- a/apps/menu.h +++ b/apps/menu.h @@ -63,6 +63,7 @@ enum menu_item_type { MT_FUNCTION_CALL, /* used when the standard code wont work */ MT_FUNCTION_WITH_PARAM, MT_RETURN_ID, /* returns the position of the selected item (starting at 0)*/ + MT_RETURN_VALUE, /* returns a value associated with an item */ }; typedef int (*menu_function)(void); @@ -89,6 +90,7 @@ struct menu_item_ex { const struct menu_func_with_param *func_with_param; /* MT_FUNCTION_WITH_PARAM */ const char **strings; /* used with MT_RETURN_ID */ + int value; /* MT_RETURN_VALUE */ }; union { /* For settings */ @@ -117,7 +119,7 @@ struct menu_item_ex { typedef int (*menu_callback_type)(int action, const struct menu_item_ex *this_item); -int do_menu(const struct menu_item_ex *menu); +int do_menu(const struct menu_item_ex *menu, int *start_selected); bool do_setting_from_menu(const struct menu_item_ex *temp); #define MENU_ITEM_COUNT(c) (c<dir, info->show_options); } @@ -384,26 +377,6 @@ MAKE_MENU(info_menu, ID2P(LANG_INFO), 0, bitmap_icons_6x8[Icon_Questionmark], MENUITEM_FUNCTION_WPARAM(browse_themes, ID2P(LANG_CUSTOM_THEME), browse_folder, (void*)&theme, NULL, bitmap_icons_6x8[Icon_Folder]); -MENUITEM_FUNCTION_WPARAM(browse_plugins, ID2P(LANG_PLUGINS), - browse_folder, (void*)&rocks, NULL, bitmap_icons_6x8[Icon_Plugin]); - -#if CONFIG_TUNER -MENUITEM_FUNCTION(load_radio_screen, ID2P(LANG_FM_RADIO), - (menu_function)radio_screen, dynamicitem_callback, - bitmap_icons_6x8[Icon_Radio_screen]); -#endif - -MENUITEM_FUNCTION(mrb_bookmarks, ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS), - (menu_function)bookmark_mrb_load, NULL, bitmap_icons_6x8[Icon_Bookmark]); - -#ifdef HAVE_LCD_CHARCELLS -static int do_shutdown(void) -{ - sys_poweroff(); - return 0; -} -MENUITEM_FUNCTION(do_shutdown_item, ID2P(LANG_SHUTDOWN), do_shutdown, NULL, NOICON); -#endif #ifdef HAVE_LCD_CHARCELLS int mainmenu_callback(int action,const struct menu_item_ex *this_item) @@ -423,42 +396,14 @@ int mainmenu_callback(int action,const struct menu_item_ex *this_item) #else #define mainmenu_callback NULL #endif -/* NOTE: This title will be translatable once we decide what to call this menu - when the root menu comes in... hopefully in the next few days */ -MAKE_MENU(main_menu_, "Rockbox Main Menu", mainmenu_callback, +MAKE_MENU(main_menu_, ID2P(LANG_SETTINGS_MENU), mainmenu_callback, bitmap_icons_6x8[Icon_Submenu_Entered], - &mrb_bookmarks, &sound_settings, + &sound_settings, &settings_menu_item, &manage_settings, &browse_themes, -#if CONFIG_TUNER - &load_radio_screen, -#endif #ifdef HAVE_RECORDING - &recording_settings_menu, -#endif - &playlist_menu_item, &browse_plugins, &info_menu -#ifdef HAVE_LCD_CHARCELLS - ,&do_shutdown_item + &recording_settings, #endif ); /* MAIN MENU */ /***********************************/ -/* lazy coders can use this function if the needed - callback is just to say if the item is shown or not */ -int dynamicitem_callback(int action,const struct menu_item_ex *this_item) -{ - if (action != ACTION_REQUEST_MENUITEM) - return action; - -#if CONFIG_TUNER - if (this_item == &load_radio_screen) - { - if (radio_hardware_present() == 0) - return ACTION_EXIT_MENUITEM; - } -#else - (void)this_item; -#endif - - return action; -} diff --git a/apps/menus/playback_menu.c b/apps/menus/playback_menu.c index 6345b67ace..ae735609a8 100644 --- a/apps/menus/playback_menu.c +++ b/apps/menus/playback_menu.c @@ -57,7 +57,6 @@ int playback_callback(int action,const struct menu_item_ex *this_item); MENUITEM_SETTING(shuffle_item, &global_settings.playlist_shuffle, playback_callback); MENUITEM_SETTING(repeat_mode, &global_settings.repeat_mode, playback_callback); MENUITEM_SETTING(play_selected, &global_settings.play_selected, NULL); -MENUITEM_SETTING(resume, &global_settings.resume, NULL); MENUITEM_SETTING(ff_rewind_accel, &global_settings.ff_rewind_accel, NULL); MENUITEM_SETTING(ff_rewind_min_step, &global_settings.ff_rewind_min_step, NULL); @@ -108,7 +107,7 @@ int replaygain_callback(int action,const struct menu_item_ex *this_item) (void)this_item; switch (action) { - case ACTION_EXIT_MENUITEM: /* on exit */ + case ACTION_EXIT_MENUITEM: /* on exit */ dsp_set_replaygain(); break; } @@ -172,7 +171,7 @@ MAKE_MENU(unplug_menu, ID2P(LANG_UNPLUG), 0, NOICON, MAKE_MENU(playback_menu_item,ID2P(LANG_PLAYBACK),0, bitmap_icons_6x8[Icon_Playback_menu], - &shuffle_item, &repeat_mode, &play_selected, &resume, + &shuffle_item, &repeat_mode, &play_selected, &ff_rewind_settings_menu, &buffer_margin, &fade_on_stop, &party_mode, diff --git a/apps/menus/playlist_menu.c b/apps/menus/playlist_menu.c index f179265279..d0d491f74e 100644 --- a/apps/menus/playlist_menu.c +++ b/apps/menus/playlist_menu.c @@ -73,12 +73,14 @@ MENUITEM_FUNCTION(catalog, ID2P(LANG_CATALOG), MENUITEM_SETTING(recursive_dir_insert, &global_settings.recursive_dir_insert, NULL); MENUITEM_SETTING(warn_on_erase, &global_settings.warnon_erase_dynplaylist, NULL); -MAKE_MENU(playlist_menu_item, ID2P(LANG_PLAYLIST_MENU), NULL, +MAKE_MENU(playlist_settings, ID2P(LANG_PLAYLIST_MENU), NULL, bitmap_icons_6x8[Icon_Playlist], - &create_playlist_item, &view_playlist, &save_playlist, &catalog, &recursive_dir_insert, &warn_on_erase); +MAKE_MENU(playlist_options, ID2P(LANG_PLAYLIST_MENU), NULL, + bitmap_icons_6x8[Icon_Playlist], + &create_playlist_item, &view_playlist, &save_playlist, &catalog); bool playlist_menu(void) { - return do_menu(&playlist_menu_item); + return do_menu(&playlist_options, NULL); } diff --git a/apps/menus/recording_menu.c b/apps/menus/recording_menu.c index 0b4ba52715..028b57bb99 100644 --- a/apps/menus/recording_menu.c +++ b/apps/menus/recording_menu.c @@ -29,14 +29,8 @@ #include "recording.h" #ifdef HAVE_RECORDING -MENUITEM_FUNCTION(rec_menu_recording_screen_item, ID2P(LANG_RECORDING_MENU), - (menu_function)recording_screen, NULL, NOICON); /* TEMP */ bool recording_menu(bool no_source); /* from apps/sound_menu.h */ MENUITEM_FUNCTION_WPARAM(recording_settings, ID2P(LANG_RECORDING_SETTINGS), (int (*)(void*))recording_menu,0, NULL, NOICON); - -MAKE_MENU(recording_settings_menu,ID2P(LANG_RECORDING), - 0, bitmap_icons_6x8[Icon_Recording], - &rec_menu_recording_screen_item, &recording_settings); #endif diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 92c169e43a..35b7e2bf2f 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c @@ -281,9 +281,11 @@ MENUITEM_SETTING(line_in, &global_settings.line_in, linein_callback); #if CONFIG_CHARGING MENUITEM_SETTING(car_adapter_mode, &global_settings.car_adapter_mode, NULL); #endif +MENUITEM_SETTING(start_screen, &global_settings.start_in_screen, NULL); MAKE_MENU(system_menu, ID2P(LANG_SYSTEM), 0, bitmap_icons_6x8[Icon_System_menu], + &start_screen, #ifndef SIMULATOR &battery_menu, #endif @@ -385,7 +387,8 @@ MENUITEM_FUNCTION(browse_langs, ID2P(LANG_LANGUAGE), language_browse, MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0, bitmap_icons_6x8[Icon_General_settings_menu], - &playback_menu_item, &file_menu, &display_menu, &system_menu, + &playback_menu_item, &playlist_settings, &file_menu, + &display_menu, &system_menu, &bookmark_settings_menu, &browse_langs, &voice_settings_menu ); /* SETTINGS MENU */ /***********************************/ diff --git a/apps/menus/sound_menu.c b/apps/menus/sound_menu.c index 287b3ec904..1fa8ec6d02 100644 --- a/apps/menus/sound_menu.c +++ b/apps/menus/sound_menu.c @@ -113,5 +113,5 @@ MAKE_MENU(sound_settings, ID2P(LANG_SOUND_SETTINGS), NULL, bitmap_icons_6x8[Icon bool sound_menu(void) { - return do_menu(&sound_settings); + return do_menu(&sound_settings, 0); } diff --git a/apps/onplay.c b/apps/onplay.c index 8f19c18d42..a0da3ac2d9 100644 --- a/apps/onplay.c +++ b/apps/onplay.c @@ -1043,7 +1043,7 @@ int onplay(char* file, int attr, int from) menu_exit(m); if (exit_to_main) - result = main_menu(); + onplay_result = ONPLAY_MAINMENU; #ifdef HAVE_LCD_BITMAP if (global_settings.statusbar) diff --git a/apps/onplay.h b/apps/onplay.h index 08737becca..f842764eb5 100644 --- a/apps/onplay.h +++ b/apps/onplay.h @@ -22,7 +22,8 @@ int onplay(char* file, int attr, int from_screen); enum { - ONPLAY_OK, + ONPLAY_MAINMENU = -1, + ONPLAY_OK = 0, ONPLAY_RELOAD_DIR, ONPLAY_START_PLAY }; diff --git a/apps/recorder/icons.c b/apps/recorder/icons.c index d3a4f97763..ccb42d5919 100644 --- a/apps/recorder/icons.c +++ b/apps/recorder/icons.c @@ -79,6 +79,7 @@ const unsigned char bitmap_icons_6x8[][6] = #endif { 0x1f, 0x11, 0x7d, 0x46, 0x44, 0x78 }, /* File View Menu */ { 0x06, 0x7f, 0x06, 0x18, 0x7f, 0x18 }, /* EQ menu */ + { 0x20, 0x70, 0x70, 0x3f, 0x0a, 0x0a }, /* "rockbox" musical note */ }; const unsigned char bitmap_icons_7x8[][7] = diff --git a/apps/recorder/icons.h b/apps/recorder/icons.h index 605341593a..3503e73f6d 100644 --- a/apps/recorder/icons.h +++ b/apps/recorder/icons.h @@ -83,6 +83,7 @@ enum icons_6x8 { #endif Icon_file_view_menu, Icon_EQ, + Icon_Rockbox, Icon6x8Last, }; diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c index d264589e38..f15a10f329 100644 --- a/apps/recorder/radio.c +++ b/apps/recorder/radio.c @@ -62,6 +62,7 @@ #include "action.h" #include "list.h" #include "menus/exported_menus.h" +#include "root_menu.h" #if CONFIG_TUNER @@ -365,11 +366,12 @@ static void next_preset(int direction) } -bool radio_screen(void) +int radio_screen(void) { char buf[MAX_PATH]; bool done = false; int button, lastbutton = BUTTON_NONE; + int ret_val = GO_TO_ROOT; #ifdef FM_RECORD_DBLPRE unsigned long rec_lastclick = 0; #endif @@ -582,7 +584,7 @@ bool radio_screen(void) #endif keep_playing = true; done = true; - + ret_val = GO_TO_ROOT; if(presets_changed) { if(yesno_pop(str(LANG_FM_SAVE_CHANGES))) @@ -596,7 +598,7 @@ bool radio_screen(void) /* Clear the preset list on exit. */ clear_preset_list(); - + break; case ACTION_STD_PREV: @@ -1277,7 +1279,7 @@ static int handle_radio_presets(void) case ACTION_F3: case ACTION_STD_CONTEXT: selected_preset = gui_synclist_get_sel_pos(&lists); - do_menu(&handle_radio_preset_menu); + do_menu(&handle_radio_preset_menu, NULL); break; default: if(default_event_handler(action) == SYS_USB_CONNECTED) @@ -1501,7 +1503,7 @@ MAKE_MENU(radio_menu_items, ID2P(LANG_FM_MENU), NULL, /* main menu of the radio screen */ static bool radio_menu(void) { - return (bool)do_menu(&radio_menu_items); + return (bool)do_menu(&radio_menu_items, NULL); } #endif diff --git a/apps/recorder/radio.h b/apps/recorder/radio.h index 4647ae2756..add3989061 100644 --- a/apps/recorder/radio.h +++ b/apps/recorder/radio.h @@ -26,7 +26,7 @@ #if CONFIG_TUNER void radio_load_presets(char *filename); void radio_init(void); -bool radio_screen(void); +int radio_screen(void); void radio_start(void); void radio_pause(void); void radio_stop(void); diff --git a/apps/root_menu.c b/apps/root_menu.c new file mode 100644 index 0000000000..0f2153b03b --- /dev/null +++ b/apps/root_menu.c @@ -0,0 +1,361 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: main.c 12101 2007-01-24 02:19:22Z jdgordon $ + * + * Copyright (C) 2007 Jonathan Gordon + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include +#include +#include +#include +#include "config.h" +#include "menu.h" +#include "root_menu.h" +#include "lang.h" +#include "settings.h" +#include "kernel.h" +#include "debug.h" +#include "misc.h" +#include "rolo.h" +#include "backdrop.h" +#include "talk.h" +#include "audio.h" + +/* gui api */ +#include "list.h" +#include "statusbar.h" +#include "splash.h" +#include "buttonbar.h" +#include "textarea.h" +#include "action.h" +#include "yesno.h" + +#include "main_menu.h" +#include "tree.h" +#include "radio.h" +#ifdef HAVE_RECORDING +#include "recording.h" +#endif +#include "gwps-common.h" +#include "bookmark.h" +#include "tagtree.h" +#include "menus/exported_menus.h" + +struct root_items { + int (*function)(void* param); + void* param; +}; +static int last_screen = GO_TO_ROOT; /* unfortunatly needed so we can resume + or goto current track based on previous + screen */ +static int browser(void* param) +{ + int ret_val; + struct tree_context* tc = tree_get_context(); + int filter = SHOW_SUPPORTED; + char folder[MAX_PATH] = "/"; + /* stuff needed to remember position in file browser */ + static char last_folder[MAX_PATH] = "/"; + /* and stuff for the database browser */ + static int last_db_dirlevel = 0; + + switch ((int)param) + { + case GO_TO_FILEBROWSER: + filter = global_settings.dirfilter; + if (global_settings.browse_current && + last_screen == GO_TO_WPS && audio_status() && + wps_state.current_track_path[0] != '\0') + { + snprintf(folder, MAX_PATH, "%s", wps_state.current_track_path); + } + else + snprintf(folder, MAX_PATH, "%s/", last_folder); + break; + case GO_TO_DBBROWSER: + if (!tagcache_is_usable()) + { + gui_syncsplash(HZ, true, str(LANG_TAGCACHE_BUSY)); + return GO_TO_PREVIOUS; + } + filter = SHOW_ID3DB; + tc->dirlevel = last_db_dirlevel; + break; + case GO_TO_BROWSEPLUGINS: + filter = SHOW_PLUGINS; + snprintf(folder, MAX_PATH, "%s/", PLUGIN_DIR); + break; + } + ret_val = rockbox_browse(folder, filter); + switch ((int)param) + { + case GO_TO_FILEBROWSER: + strcpy(last_folder, tc->currdir); + break; + case GO_TO_DBBROWSER: + last_db_dirlevel = tc->dirlevel; + break; + } + return ret_val; +} + +static int menu(void* param) +{ + (void)param; + return main_menu(); + +} +#ifdef HAVE_RECORDING +static int recscrn(void* param) +{ + (void)param; + recording_screen(false); + return GO_TO_ROOT; +} +#endif +static int wpsscrn(void* param) +{ + int ret_val = GO_TO_PREVIOUS; + (void)param; + if (audio_status()) + { + ret_val = gui_wps_show(); + } + else if ( global_status.resume_index != -1 ) + { + DEBUGF("Resume index %X offset %X\n", + global_status.resume_index, + global_status.resume_offset); + +#ifdef HAVE_ALARM_MOD + if ( rtc_check_alarm_started(true) ) { + rtc_enable_alarm(false); + } +#endif + + if (playlist_resume() != -1) + { + playlist_start(global_status.resume_index, + global_status.resume_offset); + ret_val = gui_wps_show(); + } + } + else + { + gui_syncsplash(HZ*2, true, str(LANG_NOTHING_TO_RESUME)); + } +#if LCD_DEPTH > 1 + show_main_backdrop(); +#endif + return ret_val; +} +#if CONFIG_TUNER +static int radio(void* param) +{ + (void)param; + radio_screen(); + return GO_TO_ROOT; +} +#endif + +static int load_bmarks(void* param) +{ + (void)param; + bookmark_mrb_load(); + return GO_TO_PREVIOUS; +} + +static const struct root_items items[] = { + [GO_TO_FILEBROWSER] = { browser, (void*)GO_TO_FILEBROWSER }, + [GO_TO_DBBROWSER] = { browser, (void*)GO_TO_DBBROWSER }, + [GO_TO_WPS] = { wpsscrn, NULL }, + [GO_TO_MAINMENU] = { menu, NULL }, + +#ifdef HAVE_RECORDING + [GO_TO_RECSCREEN] = { recscrn, NULL }, +#endif + +#if CONFIG_TUNER + [GO_TO_FM] = { radio, NULL }, +#endif + + [GO_TO_RECENTBMARKS] = { load_bmarks, NULL }, + [GO_TO_BROWSEPLUGINS] = { browser, (void*)GO_TO_BROWSEPLUGINS }, + +}; +static const int nb_items = sizeof(items)/sizeof(*items); + +#ifdef BOOTFILE +extern bool boot_changed; /* from tree.c */ +static void check_boot(void) +{ + if (boot_changed) { + char *lines[]={str(LANG_BOOT_CHANGED), str(LANG_REBOOT_NOW)}; + struct text_message message={lines, 2}; + if(gui_syncyesno_run(&message, NULL, NULL)==YESNO_YES) + rolo_load("/" BOOTFILE); + boot_changed = false; + } +} +#else +# define check_boot() +#endif +int item_callback(int action, const struct menu_item_ex *this_item) ; + +MENUITEM_RETURNVALUE(file_browser, ID2P(LANG_DIR_BROWSER), GO_TO_FILEBROWSER, + NULL, bitmap_icons_6x8[Icon_file_view_menu]); +MENUITEM_RETURNVALUE(db_browser, ID2P(LANG_TAGCACHE), GO_TO_DBBROWSER, + NULL, bitmap_icons_6x8[Icon_Audio]); +MENUITEM_RETURNVALUE(rocks_browser, ID2P(LANG_PLUGINS), GO_TO_BROWSEPLUGINS, + NULL, bitmap_icons_6x8[Icon_Plugin]); +char *get_wps_item_name(int selected_item, void * data, char *buffer) +{ + (void)selected_item; (void)data; (void)buffer; + if (audio_status()) + return str(LANG_NOW_PLAYING); + return str(LANG_RESUME_PLAYBACK); +} +MENUITEM_RETURNVALUE_DYNTEXT(wps_item, GO_TO_WPS, NULL, get_wps_item_name, + NULL, bitmap_icons_6x8[Icon_Playback_menu]); +#ifdef HAVE_RECORDING +MENUITEM_RETURNVALUE(rec, ID2P(LANG_RECORDING_MENU), GO_TO_RECSCREEN, + NULL, bitmap_icons_6x8[Icon_Recording]); +#endif +#if CONFIG_TUNER +MENUITEM_RETURNVALUE(fm, ID2P(LANG_FM_RADIO), GO_TO_FM, + item_callback, bitmap_icons_6x8[Icon_Radio_screen]); +#endif +MENUITEM_RETURNVALUE(menu_, ID2P(LANG_SETTINGS_MENU), GO_TO_MAINMENU, + NULL, bitmap_icons_6x8[Icon_Submenu_Entered]); +MENUITEM_RETURNVALUE(bookmarks, ID2P(LANG_BOOKMARK_MENU_RECENT_BOOKMARKS), + GO_TO_RECENTBMARKS, item_callback, + bitmap_icons_6x8[Icon_Bookmark]); +#ifdef HAVE_LCD_CHARCELLS +static int do_shutdown(void) +{ + sys_poweroff(); + return 0; +} +MENUITEM_FUNCTION(do_shutdown_item, ID2P(LANG_SHUTDOWN), do_shutdown, NULL, NOICON); +#endif +MAKE_MENU(root_menu_, ID2P(LANG_ROCKBOX_TITLE), + NULL, bitmap_icons_6x8[Icon_Rockbox], + &bookmarks, &file_browser, &db_browser, + &wps_item, &menu_, +#ifdef HAVE_RECORDING + &rec, +#endif +#if CONFIG_TUNER + &fm, +#endif + &playlist_options, &rocks_browser, &info_menu + +#ifdef HAVE_LCD_CHARCELLS + ,&do_shutdown_item +#endif + ); + +int item_callback(int action, const struct menu_item_ex *this_item) +{ + switch (action) + { + case ACTION_REQUEST_MENUITEM: +#if CONFIG_TUNER + if (this_item == &fm) + { + if (radio_hardware_present() == 0) + return ACTION_EXIT_MENUITEM; + } + else +#endif + if (this_item == &bookmarks) + { + if (global_settings.usemrb == 0) + return ACTION_EXIT_MENUITEM; + } + break; + } + return action; +} + +void root_menu(void) +{ + int previous_browser = GO_TO_FILEBROWSER; + int previous_music = GO_TO_WPS; + int ret_val = GO_TO_ROOT; + int this_screen = GO_TO_ROOT; + int selected = 0; + + if (global_settings.start_in_screen == 0) + ret_val = (int)global_status.last_screen; + else ret_val = global_settings.start_in_screen - 2; + + while (true) + { + switch (ret_val) + { + case GO_TO_ROOT: + ret_val = do_menu(&root_menu_, &selected); + /* As long as MENU_ATTACHED_USB == GO_TO_ROOT this works */ + if (ret_val == MENU_ATTACHED_USB) + { + check_boot(); + continue; + } + + if (ret_val == GO_TO_PREVIOUS_MUSIC) + ret_val = previous_music; + last_screen = GO_TO_ROOT; + break; + case GO_TO_PREVIOUS: + ret_val = last_screen; + if (last_screen == GO_TO_ROOT) + continue; + break; + case GO_TO_PREVIOUS_BROWSER: + if ((previous_browser == GO_TO_DBBROWSER) && + !tagcache_is_usable()) + ret_val = GO_TO_FILEBROWSER; + else + ret_val = previous_browser; + break; + case GO_TO_PREVIOUS_MUSIC: + ret_val = previous_music; + break; + } + this_screen = ret_val; + + if (this_screen == GO_TO_FILEBROWSER) + previous_browser = GO_TO_FILEBROWSER; + else if (this_screen == GO_TO_DBBROWSER) + previous_browser = GO_TO_DBBROWSER; + else if (this_screen == GO_TO_WPS) + previous_music = GO_TO_WPS; +#if CONFIG_TUNER + else if (this_screen == GO_TO_FM) + previous_music = GO_TO_FM; +#endif + + /* set the global_status.last_screen before entering, + if we dont we will always return to the wrong screen on boot */ + global_status.last_screen = (char)this_screen; + status_save(); + action_signalscreenchange(); + ret_val = items[this_screen].function(items[this_screen].param); + if (ret_val != GO_TO_PREVIOUS) + last_screen = this_screen; + } + return; +} diff --git a/apps/root_menu.h b/apps/root_menu.h new file mode 100644 index 0000000000..9b07e58044 --- /dev/null +++ b/apps/root_menu.h @@ -0,0 +1,44 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id: main.c 12101 2007-01-24 02:19:22Z jdgordon $ +* +* Copyright (C) 2007 Jonathan Gordon +* +* All files in this archive are subject to the GNU General Public License. +* See the file COPYING in the source tree root for full license agreement. +* +* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +****************************************************************************/ +#include "config.h" +void root_menu(void); + +enum { + GO_TO_PREVIOUS_MUSIC = -4, + GO_TO_PREVIOUS_BROWSER = -3, + GO_TO_PREVIOUS = -2, + GO_TO_ROOT = -1, + GO_TO_FILEBROWSER = 0, + GO_TO_DBBROWSER, + GO_TO_WPS, + GO_TO_MAINMENU, +#ifdef HAVE_RECORDING + GO_TO_RECSCREEN, +#endif +#ifdef CONFIG_TUNER + GO_TO_FM, +#endif + GO_TO_RECENTBMARKS, + GO_TO_BROWSEPLUGINS, + /* Do Not add any items above here unless you want it to be able to + be the "start screen" after a boot up. The setting in settings_list.c + will need editing if this is the case. */ +}; + +extern const struct menu_item_ex root_menu_; diff --git a/apps/screens.c b/apps/screens.c index 54904ea144..9835d28d8f 100644 --- a/apps/screens.c +++ b/apps/screens.c @@ -654,9 +654,6 @@ bool quick_screen_quick(int button_enter) [SHOW_SUPPORTED]={ STR(LANG_SYSFONT_FILTER_SUPPORTED) }, [SHOW_MUSIC]={ STR(LANG_SYSFONT_FILTER_MUSIC) }, [SHOW_PLAYLIST]={ STR(LANG_SYSFONT_FILTER_PLAYLIST) }, -#ifdef HAVE_TAGCACHE - [SHOW_ID3DB]={ STR(LANG_SYSFONT_FILTER_ID3DB) } -#endif }; static const struct opt_items right_items[] = { [REPEAT_OFF]={ STR(LANG_SYSFONT_OFF) }, diff --git a/apps/settings.h b/apps/settings.h index f306f4b0de..b83b120a37 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -277,6 +277,7 @@ struct system_status int last_frequency; /* Last frequency for resuming, in FREQ_STEP units, relative to MIN_FREQ */ #endif + char last_screen; }; struct user_settings @@ -684,6 +685,7 @@ struct user_settings /* Encoder Settings End */ #endif /* CONFIG_CODEC == SWCODEC */ bool cuesheet; + int start_in_screen; }; /** global variables **/ diff --git a/apps/settings_list.c b/apps/settings_list.c index b1c78dec68..a7e588d48d 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -617,15 +617,8 @@ const struct settings_list settings[] = { #endif /* HAVE_MMC */ /* browser */ CHOICE_SETTING(0, dirfilter, LANG_FILTER, SHOW_SUPPORTED, "show files", -#ifndef HAVE_TAGCACHE "all,supported,music,playlists", NULL, 4, ID2P(LANG_FILTER_ALL), - ID2P(LANG_FILTER_SUPPORTED), ID2P(LANG_FILTER_MUSIC), ID2P(LANG_FILTER_PLAYLIST) -#else - "all,supported,music,playlists,id3 database", NULL, 5, ID2P(LANG_FILTER_ALL), - ID2P(LANG_FILTER_SUPPORTED), ID2P(LANG_FILTER_MUSIC), - ID2P(LANG_FILTER_PLAYLIST), ID2P(LANG_FILTER_ID3DB) -#endif - ), + ID2P(LANG_FILTER_SUPPORTED), ID2P(LANG_FILTER_MUSIC), ID2P(LANG_FILTER_PLAYLIST)), OFFON_SETTING(0,sort_case,LANG_SORT_CASE,false,"sort case",NULL), OFFON_SETTING(0,browse_current,LANG_FOLLOW,false,"follow playlist",NULL), OFFON_SETTING(0,playlist_viewer_icons,LANG_SHOW_ICONS,true, @@ -1089,6 +1082,34 @@ const struct settings_list settings[] = { #endif #endif OFFON_SETTING(0,cuesheet,LANG_CUESHEET_ENABLE,false,"cuesheet support", NULL), + CHOICE_SETTING(0, start_in_screen, LANG_START_SCREEN, 1, + "start in screen", "previous,root,files,db,wps,menu," +#ifdef HAVE_RECORDING + ",recording" +#endif +#if CONFIG_TUNER + ",radio" +#endif + ,NULL, +#if defined(HAVE_RECORDING) && CONFIG_TUNER + 8, +#elif defined(HAVE_RECORDING) || CONFIG_TUNER /* only one of them */ + 7, +#else + 6, +#endif + ID2P(LANG_PREVIOUS_SCREEN), ID2P(LANG_MAIN_MENU), + ID2P(LANG_DIR_BROWSER), ID2P(LANG_TAGCACHE), + ID2P(LANG_RESUME_PLAYBACK), ID2P(LANG_SETTINGS_MENU) +#ifdef HAVE_RECORDING + ,ID2P(LANG_RECORDING) +#endif +#if CONFIG_TUNER + ,ID2P(LANG_FM_RADIO) +#endif + + ), + SYSTEM_SETTING(NVRAM(1),last_screen,-1), }; const int nb_settings = sizeof(settings)/sizeof(*settings); diff --git a/apps/sound_menu.c b/apps/sound_menu.c index dc6da57a1f..d7b7b80d6e 100644 --- a/apps/sound_menu.c +++ b/apps/sound_menu.c @@ -424,12 +424,6 @@ static bool recdirectory(void) names, 2, NULL ); } -static bool reconstartup(void) -{ - return set_bool(str(LANG_RECORD_STARTUP), - &global_settings.rec_startup); -} - #if CONFIG_BACKLIGHT static bool cliplight(void) { @@ -940,7 +934,6 @@ bool recording_menu(bool no_source) { ID2P(LANG_RECORD_TIMESPLIT), filesplitoptionsmenu }, { ID2P(LANG_RECORD_PRERECORD_TIME), recprerecord }, { ID2P(LANG_RECORD_DIRECTORY), recdirectory }, - { ID2P(LANG_RECORD_STARTUP), reconstartup }, #if CONFIG_BACKLIGHT { ID2P(LANG_CLIP_LIGHT), cliplight }, #endif diff --git a/apps/tagcache.c b/apps/tagcache.c index 1d87f29b50..a0c6d66541 100644 --- a/apps/tagcache.c +++ b/apps/tagcache.c @@ -3953,7 +3953,10 @@ bool tagcache_is_initialized(void) { return tc_stat.initialized; } - +bool tagcache_is_usable(void) +{ + return tc_stat.initialized && tc_stat.ready; +} int tagcache_get_commit_step(void) { return tc_stat.commit_step; diff --git a/apps/tagcache.h b/apps/tagcache.h index ea8b06f4fa..7e9a42dfa7 100644 --- a/apps/tagcache.h +++ b/apps/tagcache.h @@ -182,6 +182,7 @@ void tagcache_unload_ramcache(void); #endif void tagcache_init(void); bool tagcache_is_initialized(void); +bool tagcache_is_usable(void); void tagcache_start_scan(void); void tagcache_stop_scan(void); bool tagcache_update(void); diff --git a/apps/tree.c b/apps/tree.c index 78fb1db76d..f830e3eb26 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -79,6 +79,7 @@ #include "textarea.h" #include "action.h" +#include "root_menu.h" #if LCD_DEPTH > 1 #include "backdrop.h" @@ -160,9 +161,10 @@ static int max_files = 0; static bool reload_dir = false; static bool start_wps = false; -static bool dirbrowse(void); static int curr_context = false;/* id3db or tree*/ +int dirbrowse(void); + /* * removes the extension of filename (if it doesn't start with a .) * puts the result in buffer @@ -272,13 +274,8 @@ void browse_root(void) gui_synclist_init(&tree_lists, &tree_get_filename, &tc, false, 1); gui_synclist_set_icon_callback(&tree_lists, global_settings.show_icons?&tree_get_fileicon:NULL); -#ifndef SIMULATOR - dirbrowse(); -#else - if (!dirbrowse()) { - DEBUGF("No filesystem found. Have you forgotten to create it?\n"); - } -#endif + /* not the best place for this call... but... */ + root_menu(); } void tree_get_filetypes(const struct filetype** types, int* count) @@ -478,54 +475,6 @@ void reload_directory(void) reload_dir = true; } -static void start_resume(bool just_powered_on) -{ - bool do_resume = false; - if ( global_status.resume_index != -1 ) { - DEBUGF("Resume index %X offset %X\n", - global_status.resume_index, - global_status.resume_offset); - -#ifdef HAVE_RTC_ALARM - if ( rtc_check_alarm_started(true) ) { - rtc_enable_alarm(false); - do_resume = true; - } -#endif - - /* always resume? */ - if ( global_settings.resume || ! just_powered_on) -#ifdef HAVE_HEADPHONE_DETECTION - { - if ( just_powered_on ) - { - if ( !global_settings.unplug_autoresume - || headphones_inserted() ) - do_resume = true; - } - else - do_resume = true; - } -#else - do_resume = true; -#endif - - if (! do_resume) return; - - if (playlist_resume() != -1) - { - playlist_start(global_status.resume_index, - global_status.resume_offset); - - start_wps = true; - } - else return; - } - else if (! just_powered_on) { - gui_syncsplash(HZ*2, true, str(LANG_NOTHING_TO_RESUME)); - } -} - /* Selects a file and update tree context properly */ void set_current_file(char *path) { @@ -568,10 +517,7 @@ void set_current_file(char *path) tc.selected_item_history[tc.dirlevel] = -1; /* use '/' to calculate dirlevel */ - /* FIXME : strlen(path) : crazy oO better to store it at - the beginning */ - int path_len = strlen(path) + 1; - for (i = 1; i < path_len; i++) + for (i = 1; path[i] != '\0'; i++) { if (path[i] == '/') { @@ -580,9 +526,13 @@ void set_current_file(char *path) } } } + if (ft_load(&tc, NULL) >= 0) + { + tc.selected_item = tree_get_file_position(lastfile); + } } -#ifdef HAVE_TAGCACHE +#if defined(HAVE_TAGCACHE) && defined(HAVE_QUICKSCREEN) static bool check_changed_id3mode(bool currmode) { if (currmode != (global_settings.dirfilter == SHOW_ID3DB)) { @@ -605,7 +555,7 @@ static bool check_changed_id3mode(bool currmode) #endif /* main loop, handles key events */ -static bool dirbrowse(void) +int dirbrowse() { int numentries=0; char buf[MAX_PATH]; @@ -627,8 +577,8 @@ static bool dirbrowse(void) else #endif curr_context=CONTEXT_TREE; - tc.selected_item = 0; - tc.dirlevel=0; + if (tc.selected_item < 0) + tc.selected_item = 0; #ifdef HAVE_TAGCACHE tc.firstpos=0; lasttable = -1; @@ -636,43 +586,22 @@ static bool dirbrowse(void) lastfirstpos = 0; #endif - if (*tc.dirfilter < NUM_FILTER_MODES) { -#ifdef HAVE_RECORDING -#ifndef SIMULATOR - if (global_settings.rec_startup) { - /* We fake being in the menu structure by calling - the appropriate parent when we drop out of each screen */ -#if CONFIG_CODEC == SWCODEC - /* Put in a 1 sec pause to slow bootup or the recording codecs - won't initialize */ - sleep(HZ); -#endif - recording_screen(false); - rec_menu(); - main_menu(); - } - else -#endif -#endif - start_resume(true); + start_wps = false; + numentries = update_dir(); + if (numentries == -1) + return false; /* currdir is not a directory */ + if (*tc.dirfilter > NUM_FILTER_MODES && numentries==0) + { + gui_syncsplash(HZ*2, true, str(LANG_NO_FILES)); + return false; /* No files found for rockbox_browser() */ } - /* If we don't need to show the wps, draw the dir */ - if (!start_wps) { - numentries = update_dir(); - if (numentries == -1) - return false; /* currdir is not a directory */ - - if (*tc.dirfilter > NUM_FILTER_MODES && numentries==0) - { - gui_syncsplash(HZ*2, true, str(LANG_NO_FILES)); - return false; /* No files found for rockbox_browser() */ - } - } - + while(1) { struct entry *dircache = tc.dircache; bool restore = false; + if (tc.dirlevel < 0) + tc.dirlevel = 0; /* shouldnt be needed.. this code needs work! */ #ifdef BOOTFILE if (boot_changed) { char *lines[]={str(LANG_BOOT_CHANGED), str(LANG_REBOOT_NOW)}; @@ -715,10 +644,12 @@ static bool dirbrowse(void) exit_func = true; break; } - /* if we are in /, nothing to do */ - if (tc.dirlevel == 0 && !strcmp(currdir,"/")) - break; - + if ((*tc.dirfilter == SHOW_ID3DB && tc.dirlevel == 0) || + ((*tc.dirfilter != SHOW_ID3DB && !strcmp(currdir,"/")))) + { + break; /* do nothing */ + } + #ifdef HAVE_TAGCACHE if (id3db) tagtree_exit(&tc); @@ -772,37 +703,17 @@ static bool dirbrowse(void) /* don't enter menu from plugin browser */ if (*tc.dirfilter < NUM_FILTER_MODES) { - int i; - FOR_NB_SCREENS(i) - screens[i].stop_scroll(); - action_signalscreenchange(); - if (main_menu()) - reload_dir = true; - restore = true; - -#ifdef HAVE_TAGCACHE - id3db = check_changed_id3mode(id3db); - if(id3db) - reload_dir = true; -#endif + return GO_TO_ROOT; } else /* use it as a quick exit instead */ - exit_func = true; + return GO_TO_PREVIOUS; break; case ACTION_TREE_WPS: /* don't enter wps from plugin browser etc */ if (*tc.dirfilter < NUM_FILTER_MODES) { - if (audio_status() & AUDIO_STATUS_PLAY) - { - start_wps=true; - } - else - { - start_resume(false); - restore = true; - } + return GO_TO_PREVIOUS_MUSIC; } break; #ifdef HAVE_QUICKSCREEN @@ -869,6 +780,9 @@ static bool dirbrowse(void) } switch (onplay_result) { + case ONPLAY_MAINMENU: + return GO_TO_ROOT; + case ONPLAY_OK: restore = true; break; @@ -878,7 +792,7 @@ static bool dirbrowse(void) break; case ONPLAY_START_PLAY: - start_wps = true; + return GO_TO_WPS; break; } break; @@ -952,37 +866,13 @@ static bool dirbrowse(void) } break; } - + if (start_wps) + return GO_TO_WPS; if ( button ) { ata_spin(); } - if (start_wps && audio_status() ) - { - int i; - - FOR_NB_SCREENS(i) - screens[i].stop_scroll(); - - if (gui_wps_show() == SYS_USB_CONNECTED) - reload_dir = true; -#ifdef HAVE_HOTSWAP - else -#ifdef HAVE_TAGCACHE - if (!id3db) /* Try reload to catch 'no longer valid' case. */ -#endif - reload_dir = true; -#endif -#if LCD_DEPTH > 1 - show_main_backdrop(); -#endif -#ifdef HAVE_TAGCACHE - id3db = check_changed_id3mode(id3db); -#endif - restore = true; - start_wps=false; - } check_rescan: /* do we need to rescan dir? */ @@ -1016,7 +906,7 @@ static bool dirbrowse(void) } if (exit_func) - break; + return GO_TO_PREVIOUS; if (restore || reload_dir) { /* restore display */ @@ -1252,24 +1142,39 @@ bool create_playlist(void) return true; } -bool rockbox_browse(const char *root, int dirfilter) +int rockbox_browse(const char *root, int dirfilter) { - static struct tree_context backup; - int last_context; - - backup = tc; - reload_dir = true; - memcpy(tc.currdir, root, sizeof(tc.currdir)); - start_wps = false; + int ret_val = 0; + int *last_filter = tc.dirfilter; tc.dirfilter = &dirfilter; - last_context = curr_context; - dirbrowse(); - - tc = backup; - curr_context = last_context; - - return false; + reload_dir = true; + if (dirfilter >= NUM_FILTER_MODES) + { + static struct tree_context backup; + int last_context; + + backup = tc; + tc.dirlevel = 0; + memcpy(tc.currdir, root, sizeof(tc.currdir)); + start_wps = false; + last_context = curr_context; + + ret_val = dirbrowse(); + tc = backup; + curr_context = last_context; + } + else + { + static char buf[MAX_PATH]; + if (dirfilter != SHOW_ID3DB) + tc.dirfilter = &global_settings.dirfilter; + strcpy(buf,root); + set_current_file(buf); + ret_val = dirbrowse(); + } + tc.dirfilter = last_filter; + return ret_val; } void tree_init(void) diff --git a/apps/tree.h b/apps/tree.h index 110fc09f0c..7b202e0fbc 100644 --- a/apps/tree.h +++ b/apps/tree.h @@ -101,7 +101,7 @@ void tree_get_filetypes(const struct filetype**, int*); void tree_init(void); void browse_root(void); void set_current_file(char *path); -bool rockbox_browse(const char *root, int dirfilter); +int rockbox_browse(const char *root, int dirfilter); bool create_playlist(void); void resume_directory(const char *dir); char *getcwd(char *buf, int size);