Make sd_present() and mmc_present() look only at the actual presence of a card, not...
[kugel-rb.git] / apps / menus / display_menu.c
blob05b5bd268de26be24cedb2f107eb9a51c2160f94
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2007 Jonathan Gordon
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.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
22 #include <stdbool.h>
23 #include <stddef.h>
24 #include <limits.h>
25 #include "config.h"
26 #include "appevents.h"
27 #include "lang.h"
28 #include "action.h"
29 #include "settings.h"
30 #include "menu.h"
31 #include "tree.h"
32 #include "list.h"
33 #ifdef HAVE_LCD_BITMAP
34 #include "peakmeter.h"
35 #endif
36 #include "talk.h"
37 #include "lcd.h"
38 #include "lcd-remote.h"
39 #ifdef HAVE_TOUCHSCREEN
40 #include "screens.h"
41 #endif
43 #ifdef HAVE_BACKLIGHT
44 static int filterfirstkeypress_callback(int action,const struct menu_item_ex *this_item)
46 (void)this_item;
47 switch (action)
49 case ACTION_EXIT_MENUITEM:
50 set_backlight_filter_keypress(global_settings.bl_filter_first_keypress);
51 #ifdef HAVE_REMOTE_LCD
52 set_remote_backlight_filter_keypress(
53 global_settings.remote_bl_filter_first_keypress);
54 #endif
56 break;
58 return action;
60 #endif
61 #ifdef HAVE_LCD_FLIP
62 static int flipdisplay_callback(int action,const struct menu_item_ex *this_item)
64 (void)this_item;
65 switch (action)
67 case ACTION_EXIT_MENUITEM:
68 button_set_flip(global_settings.flip_display);
69 lcd_set_flip(global_settings.flip_display);
70 lcd_update();
71 #ifdef HAVE_REMOTE_LCD
72 lcd_remote_set_flip(global_settings.remote_flip_display);
73 lcd_remote_update();
74 #endif
75 break;
77 return action;
79 #endif
81 /***********************************/
82 /* LCD MENU */
83 #ifdef HAVE_BACKLIGHT
84 MENUITEM_SETTING(backlight_timeout, &global_settings.backlight_timeout, NULL);
85 #if CONFIG_CHARGING
86 MENUITEM_SETTING(backlight_timeout_plugged,
87 &global_settings.backlight_timeout_plugged, NULL);
88 #endif
89 #ifdef HAS_BUTTON_HOLD
90 MENUITEM_SETTING(backlight_on_button_hold,
91 &global_settings.backlight_on_button_hold, NULL);
92 #endif
93 MENUITEM_SETTING(caption_backlight, &global_settings.caption_backlight, NULL);
94 #if defined(HAVE_BACKLIGHT_FADING_INT_SETTING) \
95 || defined(HAVE_BACKLIGHT_FADING_BOOL_SETTING)
96 MENUITEM_SETTING(backlight_fade_in, &global_settings.backlight_fade_in, NULL);
97 MENUITEM_SETTING(backlight_fade_out, &global_settings.backlight_fade_out, NULL);
98 #endif
99 MENUITEM_SETTING(bl_filter_first_keypress,
100 &global_settings.bl_filter_first_keypress,
101 filterfirstkeypress_callback);
102 #ifdef HAVE_LCD_SLEEP_SETTING
103 MENUITEM_SETTING(lcd_sleep_after_backlight_off,
104 &global_settings.lcd_sleep_after_backlight_off, NULL);
105 #endif
106 #ifdef HAVE_BACKLIGHT_BRIGHTNESS
107 MENUITEM_SETTING(brightness_item, &global_settings.brightness, NULL);
108 #endif
109 #endif /* HAVE_BACKLIGHT */
110 #ifdef HAVE_LCD_CONTRAST
111 MENUITEM_SETTING(contrast, &global_settings.contrast, NULL);
112 #endif
113 #ifdef HAVE_LCD_BITMAP
114 #ifdef HAVE_LCD_INVERT
115 MENUITEM_SETTING(invert, &global_settings.invert, NULL);
116 #endif
117 #ifdef HAVE_LCD_FLIP
118 MENUITEM_SETTING(flip_display, &global_settings.flip_display, flipdisplay_callback);
119 #endif
120 #endif /* HAVE_LCD_BITMAP */
122 /* now the actual menu */
123 MAKE_MENU(lcd_settings,ID2P(LANG_LCD_MENU),
124 NULL, Icon_Display_menu
125 #ifdef HAVE_BACKLIGHT
126 ,&backlight_timeout
127 # if CONFIG_CHARGING
128 ,&backlight_timeout_plugged
129 # endif
130 # ifdef HAS_BUTTON_HOLD
131 ,&backlight_on_button_hold
132 # endif
133 ,&caption_backlight
134 #if defined(HAVE_BACKLIGHT_FADING_INT_SETTING) \
135 || defined(HAVE_BACKLIGHT_FADING_BOOL_SETTING)
136 ,&backlight_fade_in, &backlight_fade_out
137 #endif
138 ,&bl_filter_first_keypress
139 # ifdef HAVE_LCD_SLEEP_SETTING
140 ,&lcd_sleep_after_backlight_off
141 # endif
142 # ifdef HAVE_BACKLIGHT_BRIGHTNESS
143 ,&brightness_item
144 # endif
145 #endif /* HAVE_BACKLIGHT */
146 #ifdef HAVE_LCD_CONTRAST
147 ,&contrast
148 #endif
149 #ifdef HAVE_LCD_BITMAP
150 # ifdef HAVE_LCD_INVERT
151 ,&invert
152 # endif
153 # ifdef HAVE_LCD_FLIP
154 ,&flip_display
155 # endif
156 #endif /* HAVE_LCD_BITMAP */
158 /* LCD MENU */
159 /***********************************/
162 /********************************/
163 /* Remote LCD settings menu */
164 #ifdef HAVE_REMOTE_LCD
165 MENUITEM_SETTING(remote_backlight_timeout,
166 &global_settings.remote_backlight_timeout, NULL);
168 #if CONFIG_CHARGING
169 MENUITEM_SETTING(remote_backlight_timeout_plugged,
170 &global_settings.remote_backlight_timeout_plugged, NULL);
171 #endif
173 #ifdef HAS_REMOTE_BUTTON_HOLD
174 MENUITEM_SETTING(remote_backlight_on_button_hold,
175 &global_settings.remote_backlight_on_button_hold, NULL);
176 #endif
178 MENUITEM_SETTING(remote_caption_backlight,
179 &global_settings.remote_caption_backlight, NULL);
180 MENUITEM_SETTING(remote_bl_filter_first_keypress,
181 &global_settings.remote_bl_filter_first_keypress,
182 filterfirstkeypress_callback);
183 MENUITEM_SETTING(remote_contrast,
184 &global_settings.remote_contrast, NULL);
185 MENUITEM_SETTING(remote_invert,
186 &global_settings.remote_invert, NULL);
188 #ifdef HAVE_LCD_FLIP
189 MENUITEM_SETTING(remote_flip_display,
190 &global_settings.remote_flip_display, flipdisplay_callback);
191 #endif
193 #ifdef HAVE_REMOTE_LCD_TICKING
194 static int ticking_callback(int action,const struct menu_item_ex *this_item)
196 (void)this_item;
197 switch (action)
199 case ACTION_EXIT_MENUITEM:
200 lcd_remote_emireduce(global_settings.remote_reduce_ticking);
201 break;
203 return action;
205 MENUITEM_SETTING(remote_reduce_ticking,
206 &global_settings.remote_reduce_ticking, ticking_callback);
207 #endif
209 MAKE_MENU(lcd_remote_settings, ID2P(LANG_LCD_REMOTE_MENU),
210 NULL, Icon_Remote_Display_menu,
211 &remote_backlight_timeout,
212 #if CONFIG_CHARGING
213 &remote_backlight_timeout_plugged,
214 #endif
215 #ifdef HAS_REMOTE_BUTTON_HOLD
216 &remote_backlight_on_button_hold,
217 #endif
218 &remote_caption_backlight, &remote_bl_filter_first_keypress,
219 &remote_contrast, &remote_invert
221 #ifdef HAVE_LCD_FLIP
222 ,&remote_flip_display
223 #endif
224 #ifdef HAVE_REMOTE_LCD_TICKING
225 ,&remote_reduce_ticking
226 #endif
229 #endif /* HAVE_REMOTE_LCD */
230 /* Remote LCD settings menu */
231 /********************************/
233 /***********************************/
234 /* SCROLL MENU */
235 MENUITEM_SETTING_W_TEXT(scroll_speed, &global_settings.scroll_speed,
236 ID2P(LANG_SCROLL), NULL);
237 MENUITEM_SETTING(scroll_delay, &global_settings.scroll_delay, NULL);
238 #ifdef HAVE_LCD_BITMAP
239 MENUITEM_SETTING_W_TEXT(scroll_step, &global_settings.scroll_step,
240 ID2P(LANG_SCROLL_STEP_EXAMPLE), NULL);
241 #endif
242 MENUITEM_SETTING(bidir_limit, &global_settings.bidir_limit, NULL);
243 #ifdef HAVE_REMOTE_LCD
244 MENUITEM_SETTING_W_TEXT(remote_scroll_speed, &global_settings.remote_scroll_speed,
245 ID2P(LANG_SCROLL), NULL);
246 MENUITEM_SETTING(remote_scroll_delay, &global_settings.remote_scroll_delay, NULL);
247 MENUITEM_SETTING_W_TEXT(remote_scroll_step, &global_settings.remote_scroll_step,
248 ID2P(LANG_SCROLL_STEP_EXAMPLE), NULL);
249 MENUITEM_SETTING(remote_bidir_limit, &global_settings.remote_bidir_limit, NULL);
251 MAKE_MENU(remote_scroll_sets, ID2P(LANG_REMOTE_SCROLL_SETS), 0, Icon_NOICON,
252 &remote_scroll_speed, &remote_scroll_delay,
253 &remote_scroll_step, &remote_bidir_limit);
254 #endif /* HAVE_REMOTE_LCD */
255 #ifdef HAVE_LCD_CHARCELLS
256 MENUITEM_SETTING(jump_scroll, &global_settings.jump_scroll, NULL);
257 MENUITEM_SETTING(jump_scroll_delay, &global_settings.jump_scroll_delay, NULL);
258 #endif
259 /* list acceleration */
260 #ifndef HAVE_WHEEL_ACCELERATION
261 MENUITEM_SETTING(list_accel_start_delay,
262 &global_settings.list_accel_start_delay, NULL);
263 MENUITEM_SETTING(list_accel_wait, &global_settings.list_accel_wait, NULL);
264 #endif /* HAVE_WHEEL_ACCELERATION */
265 #ifdef HAVE_LCD_BITMAP
266 static int screenscroll_callback(int action,const struct menu_item_ex *this_item)
268 (void)this_item;
269 switch (action)
271 case ACTION_EXIT_MENUITEM:
272 gui_list_screen_scroll_out_of_view(global_settings.offset_out_of_view);
273 break;
275 return action;
277 MENUITEM_SETTING(offset_out_of_view, &global_settings.offset_out_of_view,
278 screenscroll_callback);
279 MENUITEM_SETTING(screen_scroll_step, &global_settings.screen_scroll_step, NULL);
280 #endif
281 MENUITEM_SETTING(scroll_paginated, &global_settings.scroll_paginated, NULL);
283 MAKE_MENU(scroll_settings_menu, ID2P(LANG_SCROLL_MENU), 0, Icon_NOICON,
284 &scroll_speed, &scroll_delay,
285 #ifdef HAVE_LCD_BITMAP
286 &scroll_step,
287 #endif
288 &bidir_limit,
289 #ifdef HAVE_REMOTE_LCD
290 &remote_scroll_sets,
291 #endif
292 #ifdef HAVE_LCD_CHARCELLS
293 &jump_scroll, &jump_scroll_delay,
294 #endif
295 #ifdef HAVE_LCD_BITMAP
296 &offset_out_of_view, &screen_scroll_step,
297 #endif
298 &scroll_paginated,
299 #ifndef HAVE_WHEEL_ACCELERATION
300 &list_accel_start_delay, &list_accel_wait
301 #endif
303 /* SCROLL MENU */
304 /***********************************/
306 /***********************************/
307 /* BARS MENU */
308 #ifdef HAVE_LCD_BITMAP
309 static int statusbar_callback(int action,const struct menu_item_ex *this_item)
311 (void)this_item;
312 switch (action)
314 case ACTION_EXIT_MENUITEM:
315 send_event(GUI_EVENT_STATUSBAR_TOGGLE, NULL);
316 /* this should be changed so only the viewports are reloaded */
317 settings_apply(false);
318 break;
320 return action;
322 MENUITEM_SETTING(scrollbar_item, &global_settings.scrollbar, NULL);
323 MENUITEM_SETTING(statusbar, &global_settings.statusbar, statusbar_callback);
324 #ifdef HAVE_REMOTE_LCD
325 MENUITEM_SETTING(remote_statusbar, &global_settings.remote_statusbar, statusbar_callback);
326 #endif
327 #if CONFIG_KEYPAD == RECORDER_PAD
328 MENUITEM_SETTING(buttonbar, &global_settings.buttonbar, NULL);
329 #endif
330 MENUITEM_SETTING(volume_type, &global_settings.volume_type, NULL);
331 MENUITEM_SETTING(battery_display, &global_settings.battery_display, NULL);
332 MAKE_MENU(bars_menu, ID2P(LANG_BARS_MENU), 0, Icon_NOICON,
333 &scrollbar_item, &statusbar,
334 #ifdef HAVE_REMOTE_LCD
335 &remote_statusbar,
336 #endif
337 #if CONFIG_KEYPAD == RECORDER_PAD
338 &buttonbar,
339 #endif
340 &volume_type, &battery_display);
341 #endif /* HAVE_LCD_BITMAP */
342 /* BARS MENU */
343 /***********************************/
346 /***********************************/
347 /* PEAK METER MENU */
349 #ifdef HAVE_LCD_BITMAP
350 static int peakmeter_callback(int action,const struct menu_item_ex *this_item)
352 (void)this_item;
353 switch (action)
355 case ACTION_EXIT_MENUITEM:
356 peak_meter_init_times(global_settings.peak_meter_release,
357 global_settings.peak_meter_hold,
358 global_settings.peak_meter_clip_hold);
359 break;
361 return action;
363 MENUITEM_SETTING(peak_meter_hold,
364 &global_settings.peak_meter_hold, peakmeter_callback);
365 MENUITEM_SETTING(peak_meter_clip_hold,
366 &global_settings.peak_meter_clip_hold, peakmeter_callback);
367 #ifdef HAVE_RECORDING
368 MENUITEM_SETTING(peak_meter_clipcounter,
369 &global_settings.peak_meter_clipcounter, NULL);
370 #endif
371 MENUITEM_SETTING(peak_meter_release,
372 &global_settings.peak_meter_release, peakmeter_callback);
374 * Menu to select wether the scale of the meter
375 * displays dBfs of linear values.
377 static int peak_meter_scale(void) {
378 bool retval = false;
379 bool use_dbfs = global_settings.peak_meter_dbfs;
380 retval = set_bool_options(str(LANG_PM_SCALE),
381 &use_dbfs,
382 STR(LANG_PM_DBFS), STR(LANG_PM_LINEAR),
383 NULL);
385 /* has the user really changed the scale? */
386 if (use_dbfs != global_settings.peak_meter_dbfs) {
388 /* store the change */
389 global_settings.peak_meter_dbfs = use_dbfs;
390 peak_meter_set_use_dbfs(use_dbfs);
392 /* If the user changed the scale mode the meaning of
393 peak_meter_min (peak_meter_max) has changed. Thus we have
394 to convert the values stored in global_settings. */
395 if (use_dbfs) {
397 /* we only store -dBfs */
398 global_settings.peak_meter_min = -peak_meter_get_min() / 100;
399 global_settings.peak_meter_max = -peak_meter_get_max() / 100;
401 /* limit the returned value to the allowed range */
402 if(global_settings.peak_meter_min > 89)
403 global_settings.peak_meter_min = 89;
404 } else {
405 int max;
407 /* linear percent */
408 global_settings.peak_meter_min = peak_meter_get_min();
410 /* converting dBfs -> percent results in a precision loss.
411 I assume that the user doesn't bother that conversion
412 dBfs <-> percent isn't symmetrical for odd values but that
413 he wants 0 dBfs == 100%. Thus I 'correct' the percent value
414 resulting from dBfs -> percent manually here */
415 max = peak_meter_get_max();
416 global_settings.peak_meter_max = max < 99 ? max : 100;
418 settings_apply_pm_range();
420 return retval;
424 * Adjust the min value of the value range that
425 * the peak meter shall visualize.
427 static int peak_meter_min(void) {
428 bool retval = false;
429 if (global_settings.peak_meter_dbfs) {
431 /* for dBfs scale */
432 int range_max = -global_settings.peak_meter_max;
433 int min = -global_settings.peak_meter_min;
435 retval = set_int(str(LANG_PM_MIN), str(LANG_PM_DBFS), UNIT_DB,
436 &min, NULL, 1, -89, range_max, NULL);
438 global_settings.peak_meter_min = - min;
441 /* for linear scale */
442 else {
443 int min = global_settings.peak_meter_min;
445 retval = set_int(str(LANG_PM_MIN), "%", UNIT_PERCENT,
446 &min, NULL,
447 1, 0, global_settings.peak_meter_max - 1, NULL);
449 global_settings.peak_meter_min = (unsigned char)min;
452 settings_apply_pm_range();
453 return retval;
458 * Adjust the max value of the value range that
459 * the peak meter shall visualize.
461 static int peak_meter_max(void) {
462 bool retval = false;
463 if (global_settings.peak_meter_dbfs) {
465 /* for dBfs scale */
466 int range_min = -global_settings.peak_meter_min;
467 int max = -global_settings.peak_meter_max;
469 retval = set_int(str(LANG_PM_MAX), str(LANG_PM_DBFS), UNIT_DB,
470 &max, NULL, 1, range_min, 0, NULL);
472 global_settings.peak_meter_max = - max;
476 /* for linear scale */
477 else {
478 int max = global_settings.peak_meter_max;
480 retval = set_int(str(LANG_PM_MAX), "%", UNIT_PERCENT,
481 &max, NULL,
482 1, global_settings.peak_meter_min + 1, 100, NULL);
484 global_settings.peak_meter_max = (unsigned char)max;
487 settings_apply_pm_range();
488 return retval;
490 MENUITEM_FUNCTION(peak_meter_scale_item, 0, ID2P(LANG_PM_SCALE),
491 peak_meter_scale, NULL, NULL, Icon_NOICON);
492 MENUITEM_FUNCTION(peak_meter_min_item, 0, ID2P(LANG_PM_MIN),
493 peak_meter_min, NULL, NULL, Icon_NOICON);
494 MENUITEM_FUNCTION(peak_meter_max_item, 0, ID2P(LANG_PM_MAX),
495 peak_meter_max, NULL, NULL, Icon_NOICON);
496 MAKE_MENU(peak_meter_menu, ID2P(LANG_PM_MENU), NULL, Icon_NOICON,
497 &peak_meter_release, &peak_meter_hold,
498 &peak_meter_clip_hold,
499 #ifdef HAVE_RECORDING
500 &peak_meter_clipcounter,
501 #endif
502 &peak_meter_scale_item, &peak_meter_min_item, &peak_meter_max_item);
503 #endif /* HAVE_LCD_BITMAP */
504 /* PEAK METER MENU */
505 /***********************************/
508 #ifdef HAVE_TOUCHSCREEN
509 static int touch_mode_callback(int action,const struct menu_item_ex *this_item)
511 (void)this_item;
512 switch (action)
514 case ACTION_EXIT_MENUITEM: /* on exit */
515 touchscreen_set_mode(global_settings.touch_mode);
516 break;
518 return action;
520 MENUITEM_SETTING(touch_mode, &global_settings.touch_mode, touch_mode_callback);
522 MENUITEM_FUNCTION(touchscreen_menu_calibrate, 0, ID2P(LANG_TOUCHSCREEN_CALIBRATE), calibrate,
523 NULL, NULL, Icon_NOICON);
524 MENUITEM_FUNCTION(touchscreen_menu_reset_calibration, 0, ID2P(LANG_TOUCHSCREEN_RESET_CALIBRATION), reset_mapping,
525 NULL, NULL, Icon_NOICON);
527 MAKE_MENU(touchscreen_menu, ID2P(LANG_TOUCHSCREEN_SETTINGS), NULL, Icon_NOICON, &touch_mode,
528 &touchscreen_menu_calibrate, &touchscreen_menu_reset_calibration);
529 #endif
532 MENUITEM_SETTING(codepage_setting, &global_settings.default_codepage, NULL);
535 MAKE_MENU(display_menu, ID2P(LANG_DISPLAY),
536 NULL, Icon_Display_menu,
537 &lcd_settings,
538 #ifdef HAVE_REMOTE_LCD
539 &lcd_remote_settings,
540 #endif
541 &scroll_settings_menu,
542 #ifdef HAVE_LCD_BITMAP
543 &bars_menu, &peak_meter_menu,
544 #endif
545 &codepage_setting,
546 #ifdef HAVE_TOUCHSCREEN
547 &touchscreen_menu,
548 #endif