A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
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);