Index: apps/settings.c
===================================================================
--- apps/settings.c (revision 18933)
+++ apps/settings.c (working copy)
@@ -281,6 +281,9 @@
{
switch (settings[i].flags&F_T_MASK)
{
+ case F_T_CUSTOM:
+ settings[i].custom_setting->load_from_cfg(settings[i].setting, value);
+ break;
case F_T_INT:
case F_T_UINT:
#ifdef HAVE_LCD_COLOR
@@ -418,6 +421,9 @@
const struct settings_list *setting = &settings[setting_id];
switch (setting->flags&F_T_MASK)
{
+ case F_T_CUSTOM:
+ return setting->custom_setting->is_changed(setting->setting, setting->default_val.custom);
+ break;
case F_T_INT:
case F_T_UINT:
if (setting->flags&F_DEF_ISFUNC)
@@ -497,6 +503,10 @@
}
switch (settings[i].flags&F_T_MASK)
{
+ case F_T_CUSTOM:
+ settings[i].custom_setting->write_to_cfg(settings[i].setting,
+ value, MAX_PATH);
+ break;
case F_T_INT:
case F_T_UINT:
#ifdef HAVE_LCD_COLOR
@@ -951,6 +961,9 @@
{
switch (setting->flags&F_T_MASK)
{
+ case F_T_CUSTOM:
+ setting->custom_setting->set_default(setting->setting, setting->default_val.custom);
+ break;
case F_T_INT:
case F_T_UINT:
if (setting->flags&F_DEF_ISFUNC)
Index: apps/lang/english.lang
===================================================================
--- apps/lang/english.lang (revision 18933)
+++ apps/lang/english.lang (working copy)
@@ -12109,3 +12109,71 @@
*: "Search Results"
+
+ id: LANG_QS_ITEMS
+ desc: used for the submenu name for the quickscreen items
+ user:
+
+ *: none
+ quickscreen: "Quickscreen Items"
+
+
+ *: none
+ quickscreen: "Quickscreen Items"
+
+
+ *: none
+ quickscreen: "Quickscreen Items"
+
+
+
+ id: LANG_LEFT
+ desc: used for the submenu name for the quickscreen items
+ user:
+
+ *: none
+ quickscreen: "Left"
+
+
+ *: none
+ quickscreen: "Left"
+
+
+ *: none
+ quickscreen: "Left"
+
+
+
+ id: LANG_RIGHT
+ desc: used for the submenu name for the quickscreen items
+ user:
+
+ *: none
+ quickscreen: "Right"
+
+
+ *: none
+ quickscreen: "Right"
+
+
+ *: none
+ quickscreen: "Right"
+
+
+
+ id: LANG_BOTTOM
+ desc: used for the submenu name for the quickscreen items
+ user:
+
+ *: none
+ quickscreen: "Bottom"
+
+
+ *: none
+ quickscreen: "Bottom"
+
+
+ *: none
+ quickscreen: "Bottom"
+
+
Index: apps/gui/quickscreen.c
===================================================================
--- apps/gui/quickscreen.c (revision 18933)
+++ apps/gui/quickscreen.c (working copy)
@@ -37,6 +37,7 @@
#include "audio.h"
#include "quickscreen.h"
#include "talk.h"
+#include "list.h"
static struct viewport vps[NB_SCREENS][QUICKSCREEN_ITEM_COUNT];
static struct viewport vp_icons[NB_SCREENS];
@@ -111,7 +112,7 @@
{
/* scrolling needed */
int center = (parent->width - CENTER_ICONAREA_WIDTH)/2;
- int width = MIN(center, MIN(left_width, right_width));
+ int width = MAX(center, MIN(left_width, right_width));
vps[screen][QUICKSCREEN_LEFT].width = width;
vps[screen][QUICKSCREEN_RIGHT].width = width;
vps[screen][QUICKSCREEN_RIGHT].x = parent->x+parent->width - width;
@@ -331,23 +332,42 @@
cond_talk_ids_fq(VOICE_OK);
return changed;
}
-
+static bool is_setting_quickscreenable(const struct settings_list *setting);
bool quick_screen_quick(int button_enter)
{
struct gui_quickscreen qs;
bool oldshuffle = global_settings.playlist_shuffle;
int oldrepeat = global_settings.repeat_mode;
- qs.items[QUICKSCREEN_LEFT] =
+
+ if (global_settings.qs_item_left != -1 &&
+ global_settings.qs_item_left < nb_settings &&
+ is_setting_quickscreenable(&settings[global_settings.qs_item_left]))
+ qs.items[QUICKSCREEN_LEFT] = &settings[global_settings.qs_item_left];
+ else
+ qs.items[QUICKSCREEN_LEFT] =
find_setting(&global_settings.playlist_shuffle, NULL);
- qs.items[QUICKSCREEN_RIGHT] =
+
+ if (global_settings.qs_item_right != -1 &&
+ global_settings.qs_item_right < nb_settings &&
+ is_setting_quickscreenable(&settings[global_settings.qs_item_right]))
+ qs.items[QUICKSCREEN_RIGHT] = &settings[global_settings.qs_item_right];
+ else
+ qs.items[QUICKSCREEN_RIGHT] =
find_setting(&global_settings.repeat_mode, NULL);
- qs.items[QUICKSCREEN_BOTTOM] =
+
+ if (global_settings.qs_item_bottom != -1 &&
+ global_settings.qs_item_bottom < nb_settings &&
+ is_setting_quickscreenable(&settings[global_settings.qs_item_bottom]))
+ qs.items[QUICKSCREEN_BOTTOM] = &settings[global_settings.qs_item_bottom];
+ else
+ qs.items[QUICKSCREEN_BOTTOM] =
find_setting(&global_settings.dirfilter, NULL);
qs.callback = NULL;
if (gui_syncquickscreen_run(&qs, button_enter))
{
settings_save();
settings_apply(false);
+ /* this all shuold be changed to using the settings callbacks */
/* make sure repeat/shuffle/any other nasty ones get updated */
if ( oldrepeat != global_settings.repeat_mode &&
(audio_status() & AUDIO_STATUS_PLAY) )
@@ -389,3 +409,111 @@
}
#endif /* BUTTON_F3 */
+/* stuff to make the quickscreen configurable */
+static bool is_setting_quickscreenable(const struct settings_list *setting)
+{
+ /* to keep things simple, only settings which have a lang_id set are ok */
+ if (setting->lang_id < 0 || (setting->flags&F_BANFROMQS))
+ return false;
+ switch (setting->flags&F_T_MASK)
+ {
+ case F_T_BOOL:
+ return true;
+ case F_T_INT:
+ case F_T_UINT:
+ return (setting->RESERVED != NULL);
+ default:
+ return false;
+ }
+}
+
+const struct settings_list *find_setting_from_index(int index)
+{
+ int count = -1, i;
+ const struct settings_list *setting = &settings[0];
+ for(i=0;ilang_id), setting->cfg_name);
+ return buffer;
+}
+static int quickscreen_setter_speak_item(int selected_item, void * data)
+{
+ (void)data;
+ return find_setting_from_index(selected_item)->lang_id;
+}
+static int quickscreen_setter_action_callback(int action,
+ struct gui_synclist *lists)
+{
+ (void)lists;
+ switch (action)
+ {
+ case ACTION_STD_OK:
+ /* ok, quit */
+ return ACTION_STD_CANCEL;
+ }
+ return action;
+}
+int quickscreen_set_option(void *data)
+{
+ int valid_settings_count = 0;
+ int i, newval = 0, oldval, *setting = NULL;
+ struct simplelist_info info;
+ switch ((intptr_t)data)
+ {
+ case QUICKSCREEN_LEFT:
+ setting = &global_settings.qs_item_left;
+ break;
+ case QUICKSCREEN_RIGHT:
+ setting = &global_settings.qs_item_right;
+ break;
+ case QUICKSCREEN_BOTTOM:
+ setting = &global_settings.qs_item_bottom;
+ break;
+ }
+ oldval = *setting;
+ for(i=0;icfg_name && !strcmp(setting->cfg_name, name))
+ {
+ return i;
+ }
+ i++;
+ }
+ return -1;
+}
+void qs_load_from_cfg(void* var, char*value)
+{
+ *(int*)var = find_setting_by_name(value);
+}
+char* qs_write_to_cfg(void* setting, char*buf, int buf_len)
+{
+ const struct settings_list *var = &settings[*(int*)setting];
+ strncpy(buf, var->cfg_name, buf_len);
+ return buf;
+}
+bool qs_is_changed(void* setting, void* defaultval)
+{
+ int i = *(int*)setting;
+ if (i < 0 || i >= nb_settings)
+ return false;
+ const struct settings_list *var = &settings[i];
+ return var != find_setting(defaultval, NULL);
+}
+void qs_set_default(void* setting, void* defaultval)
+{
+ find_setting(defaultval, (int*)setting);
+}
+#endif
const struct settings_list settings[] = {
/* sound settings */
SOUND_SETTING(F_NO_WRAP,volume, LANG_VOLUME, "volume", SOUND_VOLUME),
@@ -1364,6 +1411,20 @@
"touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2,
ID2P(LANG_NORMAL), ID2P(LANG_HIGH)),
#endif
+#ifdef HAVE_QUICKSCREEN
+ CUSTOM_SETTING(0, qs_item_left, LANG_LEFT,
+ &global_settings.playlist_shuffle, "qs left",
+ qs_load_from_cfg, qs_write_to_cfg,
+ qs_is_changed, qs_set_default),
+ CUSTOM_SETTING(0, qs_item_right, LANG_RIGHT,
+ &global_settings.repeat_mode, "qs right",
+ qs_load_from_cfg, qs_write_to_cfg,
+ qs_is_changed, qs_set_default),
+ CUSTOM_SETTING(0, qs_item_bottom, LANG_BOTTOM,
+ &global_settings.dirfilter, "qs bottom",
+ qs_load_from_cfg, qs_write_to_cfg,
+ qs_is_changed, qs_set_default),
+#endif
};
const int nb_settings = sizeof(settings)/sizeof(*settings);
Index: apps/settings_list.h
===================================================================
--- apps/settings_list.h (revision 18933)
+++ apps/settings_list.h (working copy)
@@ -35,6 +35,7 @@
char *charptr;
unsigned char *ucharptr;
_isfunc_type func;
+ void* custom;
};
/* the variable type for the setting */
#define F_T_INT 1
@@ -42,6 +43,7 @@
#define F_T_BOOL 3
#define F_T_CHARPTR 4
#define F_T_UCHARPTR 5
+#define F_T_CUSTOM 6 /* MUST use struct custom_setting below */
#define F_T_MASK 0x7
struct sound_setting {
@@ -104,6 +106,14 @@
#define F_MAX_ISFUNC 0x200000 /* max(above) is function pointer to above type */
#define F_DEF_ISFUNC 0x400000 /* default_val is function pointer to above type */
+#define F_CUSTOM_SETTING 0x8000
+struct custom_setting {
+ void (*load_from_cfg)(void* setting, char*value);
+ char* (*write_to_cfg)(void* setting, char*buf, int buf_len);
+ bool (*is_changed)(void* setting, void* defaultval);
+ void (*set_default)(void* setting, void* defaultval);
+};
+
#define F_THEMESETTING 0x0800000
#define F_RECSETTING 0x1000000
#define F_EQSETTING 0x2000000
@@ -121,8 +131,9 @@
#define F_PADTITLE 0x800 /* pad the title with spaces to force it to scroll */
#define F_NO_WRAP 0x1000 /* used if the list should not wrap */
+#define F_BANFROMQS 0x80000000 /* ban the setting from the quickscreen items */
struct settings_list {
- uint32_t flags; /* ____ _SER TFFF NNN_ _ATW PTVC IFRB STTT */
+ uint32_t flags; /* B___ _SER TFFF NNN_ CATW PTVC IFRB STTT */
void *setting;
int lang_id; /* -1 for none */
union storage_type default_val;
@@ -137,6 +148,7 @@
const struct int_setting *int_setting; /* use F_INT_SETTING */
const struct choice_setting *choice_setting; /* F_CHOICE_SETTING */
const struct table_setting *table_setting; /* F_TABLE_SETTING */
+ const struct custom_setting *custom_setting;
};
};
const struct settings_list* get_settings_list(int*count);