A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 419 lines 14 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2007 Jonathan Gordon 11 * 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License 14 * as published by the Free Software Foundation; either version 2 15 * of the License, or (at your option) any later version. 16 * 17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 * KIND, either express or implied. 19 * 20 ****************************************************************************/ 21 22#include <stdio.h> 23#include <stdbool.h> 24#include <stddef.h> 25#include <limits.h> 26#include "config.h" 27#include "lang.h" 28#include "action.h" 29#include "settings.h" 30#include "rbpaths.h" 31#include "menu.h" 32#include "dir.h" 33#include "tree.h" 34#include "list.h" 35#include "color_picker.h" 36#include "lcd.h" 37#ifdef HAVE_REMOTE_LCD 38#include "lcd-remote.h" 39#endif 40#include "backdrop.h" 41#include "exported_menus.h" 42#include "appevents.h" 43#include "viewport.h" 44#include "statusbar-skinned.h" 45#include "skin_engine/skin_engine.h" 46#include "splash.h" 47#include "icons.h" 48#ifdef HAVE_LCD_COLOR 49#include "filetypes.h" 50#endif 51 52#ifdef HAVE_BACKDROP_IMAGE 53/** 54* Menu to clear the backdrop image 55 */ 56static int clear_main_backdrop(void) 57{ 58 global_settings.backdrop_file[0] = '-'; 59 global_settings.backdrop_file[1] = '\0'; 60 skin_backdrop_load_setting(); 61 viewportmanager_theme_enable(SCREEN_MAIN, false, NULL); 62 viewportmanager_theme_undo(SCREEN_MAIN, true); 63 settings_save(); 64 return 0; 65} 66MENUITEM_FUNCTION(clear_main_bd, 0, ID2P(LANG_CLEAR_BACKDROP), 67 clear_main_backdrop, NULL, Icon_NOICON); 68#endif 69#ifdef HAVE_LCD_COLOR 70 71enum Colors { 72 COLOR_FG = 0, 73 COLOR_BG, 74 COLOR_LSS, 75 COLOR_LSE, 76 COLOR_LST, 77 COLOR_SEP, 78 COLOR_COUNT 79}; 80static struct colour_info 81{ 82 int *setting; 83 int lang_id; 84} colors[COLOR_COUNT] = { 85 [COLOR_FG] = {&global_settings.fg_color, LANG_FOREGROUND_COLOR}, 86 [COLOR_BG] = {&global_settings.bg_color, LANG_BACKGROUND_COLOR}, 87 [COLOR_LSS] = {&global_settings.lss_color, LANG_SELECTOR_START_COLOR}, 88 [COLOR_LSE] = {&global_settings.lse_color, LANG_SELECTOR_END_COLOR}, 89 [COLOR_LST] = {&global_settings.lst_color, LANG_SELECTOR_TEXT_COLOR}, 90 [COLOR_SEP] = {&global_settings.list_separator_color, LANG_LIST_SEPARATOR_COLOR}, 91}; 92 93/** 94 * Menu for fore/back/selection colors 95 */ 96static int set_color_func(void* color) 97{ 98 int res, c = (intptr_t)color, banned_color=-1, old_color; 99 /* Don't let foreground be set the same as background and vice-versa */ 100 if (c == COLOR_BG) 101 banned_color = *colors[COLOR_FG].setting; 102 else if (c == COLOR_FG || c == COLOR_SEP) 103 banned_color = *colors[COLOR_BG].setting; 104 105 old_color = *colors[c].setting; 106 res = (int)set_color(&screens[SCREEN_MAIN],str(colors[c].lang_id), 107 colors[c].setting, banned_color); 108 if (old_color != *colors[c].setting) 109 { 110 settings_save(); 111 settings_apply(false); 112 settings_apply_skins(); 113 } 114 return res; 115} 116 117static int reset_color(void) 118{ 119 global_settings.fg_color = LCD_DEFAULT_FG; 120 global_settings.bg_color = LCD_DEFAULT_BG; 121 global_settings.lss_color = LCD_DEFAULT_LS; 122 global_settings.lse_color = LCD_DEFAULT_BG; 123 global_settings.lst_color = LCD_DEFAULT_FG; 124 global_settings.list_separator_color = LCD_DARKGRAY; 125 global_settings.colors_file[0] = '-'; 126 global_settings.colors_file[1] = '\0'; 127 128 read_color_theme_file(); 129 settings_save(); 130 settings_apply(false); 131 settings_apply_skins(); 132 return 0; 133} 134MENUITEM_FUNCTION_W_PARAM(set_bg_col, 0, ID2P(LANG_BACKGROUND_COLOR), 135 set_color_func, (void*)COLOR_BG, NULL, Icon_NOICON); 136MENUITEM_FUNCTION_W_PARAM(set_fg_col, 0, ID2P(LANG_FOREGROUND_COLOR), 137 set_color_func, (void*)COLOR_FG, NULL, Icon_NOICON); 138MENUITEM_FUNCTION_W_PARAM(set_lss_col, 0, ID2P(LANG_SELECTOR_START_COLOR), 139 set_color_func, (void*)COLOR_LSS, NULL, Icon_NOICON); 140MENUITEM_FUNCTION_W_PARAM(set_lse_col, 0, ID2P(LANG_SELECTOR_END_COLOR), 141 set_color_func, (void*)COLOR_LSE, NULL, Icon_NOICON); 142MENUITEM_FUNCTION_W_PARAM(set_lst_col, 0, ID2P(LANG_SELECTOR_TEXT_COLOR), 143 set_color_func, (void*)COLOR_LST, NULL, Icon_NOICON); 144MENUITEM_FUNCTION_W_PARAM(set_sep_col, 0, ID2P(LANG_LIST_SEPARATOR_COLOR), 145 set_color_func, (void*)COLOR_SEP, NULL, Icon_NOICON); 146MENUITEM_FUNCTION(reset_colors, 0, ID2P(LANG_RESET_COLORS), 147 reset_color, NULL, Icon_NOICON); 148 149MAKE_MENU(lss_settings, ID2P(LANG_SELECTOR_COLOR_MENU), 150 NULL, Icon_NOICON, 151 &set_lss_col, &set_lse_col, &set_lst_col 152 ); 153 154/* now the actual menu */ 155MAKE_MENU(colors_settings, ID2P(LANG_COLORS_MENU), 156 NULL, Icon_Display_menu, 157 &lss_settings, &set_sep_col, 158 &set_bg_col, &set_fg_col, &reset_colors 159 ); 160 161#endif /* HAVE_LCD_COLOR */ 162/* LCD MENU */ 163/***********************************/ 164 165 166/************************************/ 167/* BARS MENU */ 168/* */ 169 170static int statusbar_callback_ex(int action,const struct menu_item_ex *this_item, 171 enum screen_type screen) 172{ 173 (void)this_item; 174 /* we save the old statusbar value here, so the old statusbars can get 175 * removed and cleared from the display properly on exiting 176 * (in gui_statusbar_changed() ) */ 177 static enum statusbar_values old_bar[NB_SCREENS]; 178 switch (action) 179 { 180 case ACTION_ENTER_MENUITEM: 181 old_bar[screen] = statusbar_position(screen); 182 break; 183 case ACTION_EXIT_MENUITEM: 184 if (old_bar[screen] != statusbar_position(screen)) 185 settings_apply_skins(); 186 break; 187 } 188 return ACTION_REDRAW; 189} 190 191#ifdef HAVE_REMOTE_LCD 192static int statusbar_callback_remote(int action, 193 const struct menu_item_ex *this_item, 194 struct gui_synclist *this_list) 195{ 196 (void)this_list; 197 return statusbar_callback_ex(action, this_item, SCREEN_REMOTE); 198} 199#endif 200static int statusbar_callback(int action, 201 const struct menu_item_ex *this_item, 202 struct gui_synclist *this_list) 203{ 204 (void)this_list; 205 return statusbar_callback_ex(action, this_item, SCREEN_MAIN); 206} 207 208MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL); 209MENUITEM_SETTING(scrollbar_width, &global_settings.scrollbar_width, NULL); 210MENUITEM_SETTING(statusbar, &global_settings.statusbar, statusbar_callback); 211#ifdef HAVE_REMOTE_LCD 212MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar, 213 statusbar_callback_remote); 214#endif 215MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL); 216#if (CONFIG_BATTERY_MEASURE != 0) 217MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL); 218#endif 219MAKE_MENU(bars_menu, ID2P(LANG_BARS_MENU), 0, Icon_NOICON, 220 &scrollbar_item, &scrollbar_width, &statusbar, 221#ifdef HAVE_REMOTE_LCD 222 &remote_statusbar, 223#endif 224 &volume_type 225#if (CONFIG_BATTERY_MEASURE != 0) 226 , &battery_display 227#endif 228 ); 229 230/* */ 231/* BARS MENU */ 232/************************************/ 233 234static struct browse_folder_info fonts = {FONT_DIR, SHOW_FONT}; 235static struct browse_folder_info sbs = {SBS_DIR, SHOW_SBS}; 236#if CONFIG_TUNER 237static struct browse_folder_info fms = {WPS_DIR, SHOW_FMS}; 238#endif 239static struct browse_folder_info wps = {WPS_DIR, SHOW_WPS}; 240#ifdef HAVE_REMOTE_LCD 241static struct browse_folder_info rwps = {WPS_DIR, SHOW_RWPS}; 242static struct browse_folder_info rsbs = {SBS_DIR, SHOW_RSBS}; 243#if CONFIG_TUNER 244static struct browse_folder_info rfms = {WPS_DIR, SHOW_RFMS}; 245#endif 246#endif 247static struct browse_folder_info themes = {THEME_DIR, SHOW_CFG}; 248 249int browse_folder(void *param) 250{ 251 const char *ext, *setting; 252 int lang_id = -1; 253 char selected[MAX_FILENAME+10]; 254 const struct browse_folder_info *info = 255 (const struct browse_folder_info*)param; 256 257 struct browse_context browse = { 258 .dirfilter = info->show_options, 259 .icon = Icon_NOICON, 260 .root = info->dir, 261 }; 262 263 if (!dir_exists(info->dir)) { 264 splash(HZ, ID2P(LANG_PLAYLIST_DIRECTORY_ACCESS_ERROR)); 265 return GO_TO_PREVIOUS; 266 } 267 268 /* if we are in a special settings folder, center the current setting */ 269 switch(info->show_options) 270 { 271 case SHOW_LNG: 272 ext = "lng"; 273 if (global_settings.lang_file[0]) 274 setting = global_settings.lang_file; 275 else 276 setting = "english"; 277 lang_id = LANG_LANGUAGE; 278 break; 279 case SHOW_WPS: 280 ext = "wps"; 281 setting = global_settings.wps_file; 282 lang_id = LANG_WHILE_PLAYING; 283 break; 284 case SHOW_FONT: 285 ext = "fnt"; 286 setting = global_settings.font_file; 287 lang_id = LANG_CUSTOM_FONT; 288 break; 289 case SHOW_SBS: 290 ext = "sbs"; 291 setting = global_settings.sbs_file; 292 lang_id = LANG_BASE_SKIN; 293 break; 294#if CONFIG_TUNER 295 case SHOW_FMS: 296 ext = "fms"; 297 setting = global_settings.fms_file; 298 lang_id = LANG_RADIOSCREEN; 299 break; 300#endif /* CONFIG_TUNER */ 301#ifdef HAVE_REMOTE_LCD 302 case SHOW_RWPS: 303 ext = "rwps"; 304 setting = global_settings.rwps_file; 305 lang_id = LANG_REMOTE_WHILE_PLAYING; 306 break; 307 case SHOW_RSBS: 308 ext = "rsbs"; 309 setting = global_settings.rsbs_file; 310 lang_id = LANG_REMOTE_BASE_SKIN; 311 break; 312#if CONFIG_TUNER 313 case SHOW_RFMS: 314 ext = "rfms"; 315 setting = global_settings.rfms_file; 316 lang_id = LANG_REMOTE_RADIOSCREEN; 317 break; 318#endif /* CONFIG_TUNER */ 319#endif 320 default: 321 ext = setting = NULL; 322 break; 323 } 324 325 /* If we've found a file to center on, do it */ 326 if (setting) 327 { 328 /* if setting != NULL, ext is initialized */ 329 snprintf(selected, sizeof(selected), "%s.%s", setting, ext); 330 browse.selected = selected; 331 browse.icon = Icon_Questionmark; 332 browse.title = str(lang_id); 333 } 334 335 tree_get_context()->browse = NULL; /*bugfix - force root dir reload */ 336 return rockbox_browse(&browse); 337} 338 339MENUITEM_FUNCTION_W_PARAM(browse_fonts, 0, ID2P(LANG_CUSTOM_FONT), 340 browse_folder, (void*)&fonts, NULL, Icon_Font); 341 342MENUITEM_FUNCTION_W_PARAM(browse_sbs, 0, ID2P(LANG_BASE_SKIN), 343 browse_folder, (void*)&sbs, NULL, Icon_Wps); 344#if CONFIG_TUNER 345MENUITEM_FUNCTION_W_PARAM(browse_fms, 0, ID2P(LANG_RADIOSCREEN), 346 browse_folder, (void*)&fms, NULL, Icon_Wps); 347#endif 348MENUITEM_FUNCTION_W_PARAM(browse_wps, 0, ID2P(LANG_WHILE_PLAYING), 349 browse_folder, (void*)&wps, NULL, Icon_Wps); 350#ifdef HAVE_REMOTE_LCD 351MENUITEM_FUNCTION_W_PARAM(browse_rwps, 0, ID2P(LANG_REMOTE_WHILE_PLAYING), 352 browse_folder, (void*)&rwps, NULL, Icon_Wps); 353MENUITEM_FUNCTION_W_PARAM(browse_rsbs, 0, ID2P(LANG_REMOTE_BASE_SKIN), 354 browse_folder, (void*)&rsbs, NULL, Icon_Wps); 355#if CONFIG_TUNER 356MENUITEM_FUNCTION_W_PARAM(browse_rfms, 0, ID2P(LANG_REMOTE_RADIOSCREEN), 357 browse_folder, (void*)&rfms, NULL, Icon_Wps); 358#endif 359#endif 360 361static int showicons_callback(int action, 362 const struct menu_item_ex *this_item, 363 struct gui_synclist *this_list) 364{ 365 (void)this_item; 366 (void)this_list; 367 static bool old_icons; 368 switch (action) 369 { 370 case ACTION_ENTER_MENUITEM: 371 old_icons = global_settings.show_icons; 372 break; 373 case ACTION_EXIT_MENUITEM: 374 if (old_icons != global_settings.show_icons) 375 icons_init(); 376 break; 377 } 378 return ACTION_REDRAW; 379} 380 381MENUITEM_SETTING(show_icons, &global_settings.show_icons, showicons_callback); 382MENUITEM_FUNCTION_W_PARAM(browse_themes, 0, ID2P(LANG_CUSTOM_THEME), 383 browse_folder, (void*)&themes, NULL, Icon_Config); 384MENUITEM_SETTING(cursor_style, &global_settings.cursor_style, NULL); 385#if LCD_DEPTH > 1 386MENUITEM_SETTING(sep_menu, &global_settings.list_separator_height, NULL); 387#endif 388 389MAKE_MENU(theme_menu, ID2P(LANG_THEME_MENU), 390 NULL, Icon_Wps, 391 &browse_themes, 392 &browse_fonts, 393 &browse_wps, 394#ifdef HAVE_REMOTE_LCD 395 &browse_rwps, 396#endif 397#if CONFIG_TUNER 398 &browse_fms, 399#ifdef HAVE_REMOTE_LCD 400 &browse_rfms, 401#endif 402#endif 403 &browse_sbs, 404#ifdef HAVE_REMOTE_LCD 405 &browse_rsbs, 406#endif 407 &show_icons, 408#ifdef HAVE_BACKDROP_IMAGE 409 &clear_main_bd, 410#endif 411 &bars_menu, 412 &cursor_style, 413#if LCD_DEPTH > 1 414 &sep_menu, 415#endif 416#ifdef HAVE_LCD_COLOR 417 &colors_settings, 418#endif 419);