summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2008-11-05 09:30:20 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2008-11-05 09:30:20 +0000
commita22749b5c6dcfa61c589e0735871b5f372fb8c6b (patch)
tree30b294d13242b9deac4217cab8aca44fe2576259
parent0eb6ae938ea11e3db28b98be0dd524aee31a8dd3 (diff)
downloadrockbox-a22749b5c6dcfa61c589e0735871b5f372fb8c6b.tar.gz
rockbox-a22749b5c6dcfa61c589e0735871b5f372fb8c6b.zip
FS#9525 - The list for the quickscreen items chooser turned out to not really be usable so try this instead.
Settings in the menus will now have a context menu where you can reset the setting and if its OK to put it on the quickscreen there will be options there to put it on it. Also, ban last.fm and cuesheet support settings from the QS git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19013 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/gui/option_select.c4
-rw-r--r--apps/gui/quickscreen.c116
-rw-r--r--apps/gui/quickscreen.h4
-rw-r--r--apps/lang/english.lang95
-rw-r--r--apps/menu.c64
-rw-r--r--apps/menus/settings_menu.c22
-rw-r--r--apps/settings_list.c10
7 files changed, 163 insertions, 152 deletions
diff --git a/apps/gui/option_select.c b/apps/gui/option_select.c
index be29a9ad5e..570a41a78d 100644
--- a/apps/gui/option_select.c
+++ b/apps/gui/option_select.c
@@ -34,6 +34,8 @@
34#include "statusbar.h" 34#include "statusbar.h"
35#include "misc.h" 35#include "misc.h"
36#include "splash.h" 36#include "splash.h"
37#include "menu.h"
38#include "quickscreen.h"
37 39
38#if defined (HAVE_SCROLLWHEEL) || \ 40#if defined (HAVE_SCROLLWHEEL) || \
39 (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 41 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
@@ -540,7 +542,7 @@ bool option_screen(const struct settings_list *setting,
540 if (var_type == F_T_BOOL && !use_temp_var) 542 if (var_type == F_T_BOOL && !use_temp_var)
541 *(bool*)setting->setting = (*variable==1); 543 *(bool*)setting->setting = (*variable==1);
542 val_to_selection(setting, *variable, &nb_items, 544 val_to_selection(setting, *variable, &nb_items,
543 &selected, &function); 545 &selected, &function);
544 gui_synclist_select_item(&lists, selected); 546 gui_synclist_select_item(&lists, selected);
545 gui_synclist_draw(&lists); 547 gui_synclist_draw(&lists);
546 gui_synclist_speak_item(&lists); 548 gui_synclist_speak_item(&lists);
diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c
index 4c0cddf7ac..3880940ae3 100644
--- a/apps/gui/quickscreen.c
+++ b/apps/gui/quickscreen.c
@@ -322,7 +322,7 @@ bool gui_syncquickscreen_run(struct gui_quickscreen * qs, int button_enter)
322 cond_talk_ids_fq(VOICE_OK); 322 cond_talk_ids_fq(VOICE_OK);
323 return changed; 323 return changed;
324} 324}
325static bool is_setting_quickscreenable(const struct settings_list *setting); 325
326static inline const struct settings_list *get_setting(int gs_value, 326static inline const struct settings_list *get_setting(int gs_value,
327 const struct settings_list *defaultval) 327 const struct settings_list *defaultval)
328{ 328{
@@ -394,7 +394,7 @@ bool quick_screen_f3(int button_enter)
394#endif /* BUTTON_F3 */ 394#endif /* BUTTON_F3 */
395 395
396/* stuff to make the quickscreen configurable */ 396/* stuff to make the quickscreen configurable */
397static bool is_setting_quickscreenable(const struct settings_list *setting) 397bool is_setting_quickscreenable(const struct settings_list *setting)
398{ 398{
399 /* to keep things simple, only settings which have a lang_id set are ok */ 399 /* to keep things simple, only settings which have a lang_id set are ok */
400 if (setting->lang_id < 0 || (setting->flags&F_BANFROMQS)) 400 if (setting->lang_id < 0 || (setting->flags&F_BANFROMQS))
@@ -411,118 +411,28 @@ static bool is_setting_quickscreenable(const struct settings_list *setting)
411 } 411 }
412} 412}
413 413
414static const struct settings_list *find_setting_from_index(int index) 414void set_as_qs_item(const struct settings_list *setting,
415 enum QUICKSCREEN_ITEM item)
415{ 416{
416 int count = -1, i; 417 int i;
417 const struct settings_list *setting = &settings[0];
418 for(i=0;i<nb_settings;i++) 418 for(i=0;i<nb_settings;i++)
419 { 419 {
420 setting = &settings[i]; 420 if (&settings[i] == setting)
421 if (is_setting_quickscreenable(setting)) 421 break;
422 count++;
423 if (count == index)
424 return setting;
425 }
426 return NULL;
427}
428static char* quickscreen_setter_getname(int selected_item, void *data,
429 char *buffer, size_t buffer_len)
430{
431 (void)data;
432 const struct settings_list *setting = find_setting_from_index(selected_item);
433 snprintf(buffer, buffer_len, "%s (%s)",
434 str(setting->lang_id), setting->cfg_name);
435 return buffer;
436}
437static int quickscreen_setter_speak_item(int selected_item, void * data)
438{
439 (void)data;
440 talk_id(find_setting_from_index(selected_item)->lang_id, true);
441 return 0;
442}
443static int quickscreen_setter_action_callback(int action,
444 struct gui_synclist *lists)
445{
446 const struct settings_list *temp = lists->data;
447 switch (action)
448 {
449 case ACTION_STD_OK:
450 /* ok, quit */
451 return ACTION_STD_CANCEL;
452 case ACTION_STD_CONTEXT: /* real settings use this to reset to default */
453 {
454 int i=0, count=0;
455 reset_setting(temp, temp->setting);
456 for(i=0;i<nb_settings;i++)
457 {
458 if (is_setting_quickscreenable(&settings[i]))
459 count++;
460 if (*(int*)temp->setting == i)
461 {
462 gui_synclist_select_item(lists, count-1);
463 break;
464 }
465 }
466 return ACTION_REDRAW;
467 }
468 } 422 }
469 return action; 423 switch (item)
470}
471int quickscreen_set_option(void *data)
472{
473 int valid_settings_count = 0;
474 int i, newval = 0, oldval, *setting = NULL;
475 struct simplelist_info info;
476 switch ((intptr_t)data)
477 { 424 {
478 case QUICKSCREEN_LEFT: 425 case QUICKSCREEN_LEFT:
479 setting = &global_settings.qs_item_left; 426 global_settings.qs_item_left = i;
480 break; 427 break;
481 case QUICKSCREEN_RIGHT: 428 case QUICKSCREEN_RIGHT:
482 setting = &global_settings.qs_item_right; 429 global_settings.qs_item_right = i;
483 break; 430 break;
484 case QUICKSCREEN_BOTTOM: 431 case QUICKSCREEN_BOTTOM:
485 setting = &global_settings.qs_item_bottom; 432 global_settings.qs_item_bottom = i;
433 break;
434 default: /* shut the copiler up */
486 break; 435 break;
487 } 436 }
488 oldval = *setting;
489 for(i=0;i<nb_settings;i++)
490 {
491 if (is_setting_quickscreenable(&settings[i]))
492 valid_settings_count++;
493 if (oldval == i)
494 newval = valid_settings_count - 1;
495 }
496
497 simplelist_info_init(&info, str(LANG_QS_ITEMS),
498 valid_settings_count,
499 (void*)find_setting(setting, NULL)); /* find the qs item being changed */
500 info.get_name = quickscreen_setter_getname;
501 if(global_settings.talk_menu)
502 info.get_talk = quickscreen_setter_speak_item;
503 info.action_callback = quickscreen_setter_action_callback;
504 info.selection = newval;
505 simplelist_show_list(&info);
506 if (info.selection != oldval)
507 {
508 if (info.selection != -1)
509 {
510 const struct settings_list *temp = find_setting_from_index(info.selection);
511 int i = 0;
512 for(i=0;i<nb_settings;i++)
513 {
514 if (&settings[i] == temp)
515 break;
516 }
517 *setting = i;
518 settings_save();
519 }
520 /* probably should splash LANG_CANCEL here but right now
521 we cant find out the selection when the cancel button was
522 pressed, (without hacks)so we cant know if the
523 selection was changed, or just viewed */
524 }
525 return 0;
526} 437}
527 438
528
diff --git a/apps/gui/quickscreen.h b/apps/gui/quickscreen.h
index f084d83b61..cf7f577429 100644
--- a/apps/gui/quickscreen.h
+++ b/apps/gui/quickscreen.h
@@ -51,6 +51,8 @@ extern bool quick_screen_f3(int button_enter);
51#endif 51#endif
52extern bool quick_screen_quick(int button_enter); 52extern bool quick_screen_quick(int button_enter);
53int quickscreen_set_option(void *data); 53int quickscreen_set_option(void *data);
54 54bool is_setting_quickscreenable(const struct settings_list *setting);
55void set_as_qs_item(const struct settings_list *setting,
56 enum QUICKSCREEN_ITEM item);
55#endif /*_GUI_QUICK_SCREEN_H_*/ 57#endif /*_GUI_QUICK_SCREEN_H_*/
56#endif /* HAVE_QUICKSCREEN */ 58#endif /* HAVE_QUICKSCREEN */
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 7e638f3a5c..66e15cc784 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -12111,69 +12111,134 @@
12111</phrase> 12111</phrase>
12112<phrase> 12112<phrase>
12113 id: LANG_QS_ITEMS 12113 id: LANG_QS_ITEMS
12114 desc: used for the submenu name for the quickscreen items 12114 desc: DEPRECATED
12115 user: 12115 user:
12116 <source> 12116 <source>
12117 *: none 12117 *: none
12118 quickscreen: "Quickscreen Items" 12118 quickscreen: ""
12119 </source> 12119 </source>
12120 <dest> 12120 <dest>
12121 *: none 12121 *: none
12122 quickscreen: "Quickscreen Items" 12122 quickscreen: ""
12123 </dest> 12123 </dest>
12124 <voice> 12124 <voice>
12125 *: none 12125 *: none
12126 quickscreen: "Quickscreen Items" 12126 quickscreen: ""
12127 </voice> 12127 </voice>
12128</phrase> 12128</phrase>
12129<phrase> 12129<phrase>
12130 id: LANG_LEFT 12130 id: LANG_LEFT
12131 desc: used for the submenu name for the quickscreen items 12131 desc: DEPRECATED
12132 user: 12132 user:
12133 <source> 12133 <source>
12134 *: none 12134 *: none
12135 quickscreen: "Left" 12135 quickscreen: ""
12136 </source> 12136 </source>
12137 <dest> 12137 <dest>
12138 *: none 12138 *: none
12139 quickscreen: "Left" 12139 quickscreen: ""
12140 </dest> 12140 </dest>
12141 <voice> 12141 <voice>
12142 *: none 12142 *: none
12143 quickscreen: "Left" 12143 quickscreen: ""
12144 </voice> 12144 </voice>
12145</phrase> 12145</phrase>
12146<phrase> 12146<phrase>
12147 id: LANG_RIGHT 12147 id: LANG_RIGHT
12148 desc: used for the submenu name for the quickscreen items 12148 desc: DEPRECATED
12149 user: 12149 user:
12150 <source> 12150 <source>
12151 *: none 12151 *: none
12152 quickscreen: "Right" 12152 quickscreen: ""
12153 </source> 12153 </source>
12154 <dest> 12154 <dest>
12155 *: none 12155 *: none
12156 quickscreen: "Right" 12156 quickscreen: ""
12157 </dest> 12157 </dest>
12158 <voice> 12158 <voice>
12159 *: none 12159 *: none
12160 quickscreen: "Right" 12160 quickscreen: ""
12161 </voice> 12161 </voice>
12162</phrase> 12162</phrase>
12163<phrase> 12163<phrase>
12164 id: LANG_BOTTOM 12164 id: LANG_BOTTOM
12165 desc: DEPRECATED
12166 user:
12167 <source>
12168 *: none
12169 quickscreen: ""
12170 </source>
12171 <dest>
12172 *: none
12173 quickscreen: ""
12174 </dest>
12175 <voice>
12176 *: none
12177 quickscreen: ""
12178 </voice>
12179</phrase>
12180<phrase>
12181 id: LANG_RESET_SETTING
12182 desc: used in the settings context menu
12183 user:
12184 <source>
12185 *: "Reset Setting"
12186 </source>
12187 <dest>
12188 *: "Reset Setting"
12189 </dest>
12190 <voice>
12191 *: "Reset Setting"
12192 </voice>
12193</phrase>
12194<phrase>
12195 id: LANG_LEFT_QS_ITEM
12196 desc: used for the submenu name for the quickscreen items
12197 user:
12198 <source>
12199 *: none
12200 quickscreen: "Set as Left Quickscreen Item"
12201 </source>
12202 <dest>
12203 *: none
12204 quickscreen: "Set as Left Quickscreen Item"
12205 </dest>
12206 <voice>
12207 *: none
12208 quickscreen: "Set as Left Quickscreen Item"
12209 </voice>
12210</phrase>
12211<phrase>
12212 id: LANG_RIGHT_QS_ITEM
12213 desc: used for the submenu name for the quickscreen items
12214 user:
12215 <source>
12216 *: none
12217 quickscreen: "Set as Right Quickscreen Item"
12218 </source>
12219 <dest>
12220 *: none
12221 quickscreen: "Set as Right Quickscreen Item"
12222 </dest>
12223 <voice>
12224 *: none
12225 quickscreen: "Set as Right Quickscreen Item"
12226 </voice>
12227</phrase>
12228<phrase>
12229 id: LANG_BOTTOM_QS_ITEM
12165 desc: used for the submenu name for the quickscreen items 12230 desc: used for the submenu name for the quickscreen items
12166 user: 12231 user:
12167 <source> 12232 <source>
12168 *: none 12233 *: none
12169 quickscreen: "Bottom" 12234 quickscreen: "Set as Bottom Quickscreen Item"
12170 </source> 12235 </source>
12171 <dest> 12236 <dest>
12172 *: none 12237 *: none
12173 quickscreen: "Bottom" 12238 quickscreen: "Set as Bottom Quickscreen Item"
12174 </dest> 12239 </dest>
12175 <voice> 12240 <voice>
12176 *: none 12241 *: none
12177 quickscreen: "Bottom" 12242 quickscreen: "Set as Bottom Quickscreen Item"
12178 </voice> 12243 </voice>
12179</phrase> 12244</phrase>
diff --git a/apps/menu.c b/apps/menu.c
index d01cbc64be..8edec58587 100644
--- a/apps/menu.c
+++ b/apps/menu.c
@@ -483,12 +483,66 @@ int do_menu(const struct menu_item_ex *start_menu, int *start_selected,
483 { 483 {
484 redraw_lists = list_stop_handler(); 484 redraw_lists = list_stop_handler();
485 } 485 }
486 else if (action == ACTION_STD_CONTEXT && 486 else if (action == ACTION_STD_CONTEXT)
487 menu == &root_menu_)
488 { 487 {
489 ret = GO_TO_ROOTITEM_CONTEXT; 488 if (menu == &root_menu_)
490 done = true; 489 {
491 } 490 ret = GO_TO_ROOTITEM_CONTEXT;
491 done = true;
492 }
493 else if (!in_stringlist)
494 {
495 int type;
496 selected = get_menu_selection(gui_synclist_get_sel_pos(&lists), menu);
497 temp = menu->submenus[selected];
498 type = (temp->flags&MENU_TYPE_MASK);
499 if ((type == MT_SETTING_W_TEXT || type == MT_SETTING))
500 {
501#ifdef HAVE_QUICKSCREEN
502 MENUITEM_STRINGLIST(quickscreen_able_option,
503 ID2P(LANG_ONPLAY_MENU_TITLE), NULL,
504 ID2P(LANG_RESET_SETTING),
505 ID2P(LANG_LEFT_QS_ITEM),
506 ID2P(LANG_BOTTOM_QS_ITEM),
507 ID2P(LANG_RIGHT_QS_ITEM));
508#endif
509 MENUITEM_STRINGLIST(notquickscreen_able_option,
510 ID2P(LANG_ONPLAY_MENU_TITLE), NULL,
511 ID2P(LANG_RESET_SETTING));
512 const struct menu_item_ex *menu;
513 int menu_selection = 0;
514 const struct settings_list *setting =
515 find_setting(temp->variable, NULL);
516#ifdef HAVE_QUICKSCREEN
517 if (is_setting_quickscreenable(setting))
518 menu = &quickscreen_able_option;
519 else
520#endif
521 menu = &notquickscreen_able_option;
522 switch (do_menu(menu, &menu_selection, NULL, false))
523 {
524 case GO_TO_PREVIOUS:
525 break;
526 case 0: /* reset setting */
527 reset_setting(setting, setting->setting);
528 break;
529#ifdef HAVE_QUICKSCREEN
530 break;
531 case 1: /* set as left QS item */
532 set_as_qs_item(setting, QUICKSCREEN_LEFT);
533 break;
534 case 2: /* set as bottom QS item */
535 set_as_qs_item(setting, QUICKSCREEN_BOTTOM);
536 break;
537 case 3: /* set as right QS item */
538 set_as_qs_item(setting, QUICKSCREEN_RIGHT);
539 break;
540#endif
541 } /* swicth(do_menu()) */
542 redraw_lists = true;
543 }
544 } /* else if (!in_stringlist) */
545 }
492 else if (action == ACTION_STD_MENU) 546 else if (action == ACTION_STD_MENU)
493 { 547 {
494 if (menu != &root_menu_) 548 if (menu != &root_menu_)
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index 1610cfbef1..ebba295570 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -487,25 +487,6 @@ MAKE_MENU(voice_settings_menu, ID2P(LANG_VOICE), 0, Icon_Voice,
487/* VOICE MENU */ 487/* VOICE MENU */
488/***********************************/ 488/***********************************/
489 489
490#ifdef HAVE_QUICKSCREEN
491/***********************************/
492/* CUSTOMISABLE QUICKSCREEN CODE */
493
494MENUITEM_FUNCTION(qs_left_item, MENU_FUNC_USEPARAM, ID2P(LANG_LEFT),
495 (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_LEFT, NULL,
496 Icon_Menu_setting);
497MENUITEM_FUNCTION(qs_right_item, MENU_FUNC_USEPARAM, ID2P(LANG_RIGHT),
498 (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_RIGHT, NULL,
499 Icon_Menu_setting);
500MENUITEM_FUNCTION(qs_bottom_item, MENU_FUNC_USEPARAM, ID2P(LANG_BOTTOM),
501 (menu_function)quickscreen_set_option, (intptr_t*)QUICKSCREEN_BOTTOM, NULL,
502 Icon_Menu_setting);
503
504MAKE_MENU(quickscreen_settings, ID2P(LANG_QS_ITEMS), NULL, Icon_Config,
505 &qs_left_item, &qs_right_item, &qs_bottom_item);
506/* CUSTOMISABLE QUICKSCREEN CODE */
507/***********************************/
508#endif
509 490
510/***********************************/ 491/***********************************/
511/* SETTINGS MENU */ 492/* SETTINGS MENU */
@@ -519,9 +500,6 @@ MENUITEM_FUNCTION(browse_langs, 0, ID2P(LANG_LANGUAGE), language_browse,
519MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0, 500MAKE_MENU(settings_menu_item, ID2P(LANG_GENERAL_SETTINGS), 0,
520 Icon_General_settings_menu, 501 Icon_General_settings_menu,
521 &playlist_settings, &file_menu, 502 &playlist_settings, &file_menu,
522#ifdef HAVE_QUICKSCREEN
523 &quickscreen_settings,
524#endif
525#ifdef HAVE_TAGCACHE 503#ifdef HAVE_TAGCACHE
526 &tagcache_menu, 504 &tagcache_menu,
527#endif 505#endif
diff --git a/apps/settings_list.c b/apps/settings_list.c
index eafad01096..6a7fcc3aec 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1280,7 +1280,7 @@ const struct settings_list settings[] = {
1280 ID2P(LANG_FM_JAPAN), ID2P(LANG_FM_KOREA)), 1280 ID2P(LANG_FM_JAPAN), ID2P(LANG_FM_KOREA)),
1281#endif 1281#endif
1282 1282
1283 OFFON_SETTING(0, audioscrobbler, LANG_AUDIOSCROBBLER, false, 1283 OFFON_SETTING(F_BANFROMQS, audioscrobbler, LANG_AUDIOSCROBBLER, false,
1284 "Last.fm Logging", NULL), 1284 "Last.fm Logging", NULL),
1285#if CONFIG_TUNER 1285#if CONFIG_TUNER
1286 TEXT_SETTING(0, fmr_file, "fmr", "", 1286 TEXT_SETTING(0, fmr_file, "fmr", "",
@@ -1309,7 +1309,7 @@ const struct settings_list settings[] = {
1309 OFFON_SETTING(0,usb_charging,LANG_USB_CHARGING,false,"usb charging",NULL), 1309 OFFON_SETTING(0,usb_charging,LANG_USB_CHARGING,false,"usb charging",NULL),
1310#endif 1310#endif
1311#endif 1311#endif
1312 OFFON_SETTING(0,cuesheet,LANG_CUESHEET_ENABLE,false,"cuesheet support", 1312 OFFON_SETTING(F_BANFROMQS,cuesheet,LANG_CUESHEET_ENABLE,false,"cuesheet support",
1313 NULL), 1313 NULL),
1314 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, skip_length, 1314 TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, skip_length,
1315 LANG_SKIP_LENGTH, 0, "skip length", 1315 LANG_SKIP_LENGTH, 0, "skip length",
@@ -1412,15 +1412,15 @@ const struct settings_list settings[] = {
1412 ID2P(LANG_NORMAL), ID2P(LANG_HIGH)), 1412 ID2P(LANG_NORMAL), ID2P(LANG_HIGH)),
1413#endif 1413#endif
1414#ifdef HAVE_QUICKSCREEN 1414#ifdef HAVE_QUICKSCREEN
1415 CUSTOM_SETTING(0, qs_item_left, LANG_LEFT, 1415 CUSTOM_SETTING(0, qs_item_left, LANG_LEFT_QS_ITEM,
1416 &global_settings.playlist_shuffle, "qs left", 1416 &global_settings.playlist_shuffle, "qs left",
1417 qs_load_from_cfg, qs_write_to_cfg, 1417 qs_load_from_cfg, qs_write_to_cfg,
1418 qs_is_changed, qs_set_default), 1418 qs_is_changed, qs_set_default),
1419 CUSTOM_SETTING(0, qs_item_right, LANG_RIGHT, 1419 CUSTOM_SETTING(0, qs_item_right, LANG_RIGHT_QS_ITEM,
1420 &global_settings.repeat_mode, "qs right", 1420 &global_settings.repeat_mode, "qs right",
1421 qs_load_from_cfg, qs_write_to_cfg, 1421 qs_load_from_cfg, qs_write_to_cfg,
1422 qs_is_changed, qs_set_default), 1422 qs_is_changed, qs_set_default),
1423 CUSTOM_SETTING(0, qs_item_bottom, LANG_BOTTOM, 1423 CUSTOM_SETTING(0, qs_item_bottom, LANG_BOTTOM_QS_ITEM,
1424 &global_settings.dirfilter, "qs bottom", 1424 &global_settings.dirfilter, "qs bottom",
1425 qs_load_from_cfg, qs_write_to_cfg, 1425 qs_load_from_cfg, qs_write_to_cfg,
1426 qs_is_changed, qs_set_default), 1426 qs_is_changed, qs_set_default),