diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 57525e830d..a0490d662a 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9480,8 +9480,6 @@ Change of this parameter will affect the layout of buttons in notification toast Boolean Value 0 - Backup - 0 QAModeEventHostPort @@ -19669,6 +19667,30 @@ Change of this parameter will affect the layout of buttons in notification toast Value + + RestoreGlobalSettings + + Comment + Defines if the global settings should be restored when doing a settings restore. + Persist + 0 + Type + Boolean + Value + 1 + + + RestorePerAccountSettings + + Comment + Defines if the per account settings should be restored when doing a settings restore. + Persist + 0 + Type + Boolean + Value + 1 + diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 3c3015b7f3..cf58c64079 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -127,6 +127,7 @@ // Backup Settings #include "llline.h" +#include "llscrolllistctrl.h" #include "llspellcheck.h" #include "lltoolbarview.h" #include "llwaterparammanager.h" @@ -493,6 +494,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.SetBackupSettingsPath", boost::bind(&LLFloaterPreference::onClickSetBackupSettingsPath, this)); mCommitCallbackRegistrar.add("Pref.BackupSettings", boost::bind(&LLFloaterPreference::onClickBackupSettings, this)); mCommitCallbackRegistrar.add("Pref.RestoreSettings", boost::bind(&LLFloaterPreference::onClickRestoreSettings, this)); + mCommitCallbackRegistrar.add("Pref.BackupSelectAll", boost::bind(&LLFloaterPreference::onClickSelectAll, this)); + mCommitCallbackRegistrar.add("Pref.BackupDeselectAll", boost::bind(&LLFloaterPreference::onClickDeselectAll, this)); // gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); @@ -505,34 +508,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) gSavedSettings.getControl("FSPublishRadarTag")->getCommitSignal()->connect(boost::bind(&handlePublishRadarTagOptionChanged, _2)); LLAvatarPropertiesProcessor::getInstance()->addObserver( gAgent.getID(), this ); - - // Backup Settings - // make a list of global files to copy - mGlobalFiles.push_back("bin_conf.dat"); // login credentials and accounts - mGlobalFiles.push_back("colors.xml"); - mGlobalFiles.push_back("ignorable_dialogs.xml"); - mGlobalFiles.push_back("grids.user.xml"); - mGlobalFiles.push_back("autoreplace.xml"); - - // make a list of per account files to copy - mPerAccountFiles.push_back("asset_blacklist.xml"); - mPerAccountFiles.push_back("filters.xml"); - mPerAccountFiles.push_back("landmarks_sorting.xml"); - mPerAccountFiles.push_back("medialist.xml"); - mPerAccountFiles.push_back("muted_groups.xml"); - mPerAccountFiles.push_back("toolbars.xml"); - mPerAccountFiles.push_back("volume_settings.xml"); // voice chat volumes - mPerAccountFiles.push_back("teleport_history.txt"); - - // make a list of folders to copy (flat file, non recursive) - mGlobalFolders.push_back("beams"); // custom selection beams - mGlobalFolders.push_back("beamsColors"); // custom selection beam colors - mGlobalFolders.push_back("dictionaries"); // user defined words/ignores - mGlobalFolders.push_back("windlight"); // base windlight settings folder - mGlobalFolders.push_back("windlight/days"); // windlight day cycles - mGlobalFolders.push_back("windlight/skies"); // windlight sky presets - mGlobalFolders.push_back("windlight/water"); // windlight water presets - // } void LLFloaterPreference::processProperties( void* pData, EAvatarProcessorType type ) @@ -2994,28 +2969,36 @@ void LLPanelPreferenceSkins::refreshSkinThemeList() // Backup Settings // copied from llxfer_file.cpp - Hopefully this will be part of LLFile some day -Zi +// added a safeguard so the destination file is only created when the source file exists -Zi S32 copy_prefs_file(const std::string& from, const std::string& to) { llwarns << "copying " << from << " to " << to << llendl; S32 rv = 0; LLFILE* in = LLFile::fopen(from, "rb"); /*Flawfinder: ignore*/ + if(!in) + { + llwarns << "couldn't open source file " << from << " - copy aborted." << llendl; + return -1; + } + LLFILE* out = LLFile::fopen(to, "wb"); /*Flawfinder: ignore*/ - if(in && out) + if(!out) { - S32 read = 0; - const S32 COPY_BUFFER_SIZE = 16384; - U8 buffer[COPY_BUFFER_SIZE]; - while(((read = fread(buffer, 1, sizeof(buffer), in)) > 0) - && (fwrite(buffer, 1, read, out) == (U32)read)); /* Flawfinder : ignore */ - if(ferror(in) || ferror(out)) rv = -2; - } - else - { - llwarns << "copy failed. in: " << in << " out: " << out << llendl; - rv = -1; + fclose(in); + llwarns << "couldn't open destination file " << to << " - copy aborted." << llendl; + return -1; } + + S32 read = 0; + const S32 COPY_BUFFER_SIZE = 16384; + U8 buffer[COPY_BUFFER_SIZE]; + while(((read = fread(buffer, 1, sizeof(buffer), in)) > 0) + && (fwrite(buffer, 1, read, out) == (U32)read)); /* Flawfinder : ignore */ + if(ferror(in) || ferror(out)) rv = -2; + if(in) fclose(in); if(out) fclose(out); + return rv; } @@ -3068,17 +3051,6 @@ void LLFloaterPreference::onClickBackupSettings() return; } - // get path and file names to the relevant settings files - std::string userlower=gDirUtilp->getBaseFileName(gDirUtilp->getLindenUserDir(),false); - std::string backup_per_account_folder=dir_name+gDirUtilp->getDirDelimiter()+userlower; - - std::string backup_global_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name, - LLAppViewer::instance()->getSettingsFilename("Default","Global")); - std::string backup_per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,backup_per_account_folder, - LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); - std::string per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, - LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); - // define a couple of control groups to store the settings to back up LLControlGroup backup_global_controls("BackupGlobal"); LLControlGroup backup_per_account_controls("BackupPerAccount"); @@ -3125,21 +3097,41 @@ void LLFloaterPreference::onClickBackupSettings() // set it to save defaults, too (FALSE), because our declaration automatically // makes the value default + std::string backup_global_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name, + LLAppViewer::instance()->getSettingsFilename("Default","Global")); llwarns << "saving backup global settings" << llendl; backup_global_controls.saveToFile(backup_global_name,FALSE); - for(S32 index=0;index("restore_global_files_list"); + // Pull out all data + std::vector globalFileList=globalScrollList->getAllData(); + // Go over each entry + for(S32 index=0;indexgetColumn(2)->getValue().asString(); + llwarns << "copying global file " << file << llendl; copy_prefs_file( - gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,mGlobalFiles[index]), - gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name,mGlobalFiles[index])); + gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,file), + gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name,file)); } // Only back up per-account settings when the path is available, meaning, the user // has logged in + std::string per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, + LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); if(!per_account_name.empty()) { + // get path and file names to the relevant settings files + std::string userlower=gDirUtilp->getBaseFileName(gDirUtilp->getLindenUserDir(),false); + std::string backup_per_account_folder=dir_name+gDirUtilp->getDirDelimiter()+userlower; + std::string backup_per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,backup_per_account_folder, + LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); + llwarns << "copying per account settings" << llendl; // create per-user folder if it doesn't exist yet LLFile::mkdir(backup_per_account_folder.c_str()); @@ -3154,29 +3146,50 @@ void LLFloaterPreference::onClickBackupSettings() llwarns << "saving backup per account settings" << llendl; backup_per_account_controls.saveToFile(backup_per_account_name,FALSE); - for(S32 index=0;index("restore_per_account_files_list"); + // Pull out all data + std::vector perAccountFileList=perAccountScrollList->getAllData(); + // Go over each entry + for(S32 index=0;indexgetColumn(2)->getValue().asString(); + llwarns << "copying per account file " << file << llendl; copy_prefs_file( - gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,mPerAccountFiles[index]), - gDirUtilp->getExpandedFilename(LL_PATH_NONE,backup_per_account_folder,mPerAccountFiles[index])); + gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,file), + gDirUtilp->getExpandedFilename(LL_PATH_NONE,backup_per_account_folder,file)); } } else llwarns << backup_per_account_folder << " is not a folder. Per account settings save aborted." << llendl; } - // copy global folders and their contents - for(S32 index=0;index("restore_global_folders_list"); + // Pull out all data + std::vector globalFoldersList=globalFoldersScrollList->getAllData(); + // Go over each entry + for(S32 index=0;indexgetExpandedFilename(LL_PATH_USER_SETTINGS,mGlobalFolders[index])+gDirUtilp->getDirDelimiter(); - std::string backup_folder_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name,mGlobalFolders[index])+gDirUtilp->getDirDelimiter(); + // Get the next item in the list + LLScrollListItem* item=globalFoldersList[index]; + // Don't bother with the checkbox and get the path, since we back up all folders + // and only restore selectively + std::string folder=item->getColumn(2)->getValue().asString(); - llwarns << "backing up folder: " << folder_name << llendl; + std::string folder_name=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,folder)+gDirUtilp->getDirDelimiter(); + std::string backup_folder_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name,folder)+gDirUtilp->getDirDelimiter(); + + llwarns << "backing up global folder: " << folder_name << llendl; // create folder if it's not there already LLFile::mkdir(backup_folder_name.c_str()); + + std::string file_name; while(gDirUtilp->getNextFileInDir(folder_name,"*",file_name)) { llwarns << "found entry: " << folder_name+file_name << llendl; @@ -3185,8 +3198,10 @@ void LLFloaterPreference::onClickBackupSettings() { copy_prefs_file(folder_name+file_name,backup_folder_name+file_name); } + llwarns << "skipping subfolder " << folder_name+file_name << llendl; } } + LLNotificationsUtil::add("BackupFinished"); } @@ -3219,7 +3234,7 @@ void LLFloaterPreference:: doRestoreSettings(const LLSD& notification,const LLSD onClickSetBackupSettingsPath(); } - // Remember the backup path for next time + // Remember the backup path dir_name=gSavedSettings.getString("SettingsBackupPath"); // If the backup path is still empty, complain to the user and do nothing else @@ -3241,50 +3256,92 @@ void LLFloaterPreference:: doRestoreSettings(const LLSD& notification,const LLSD // Close the window so the restored settings can't be destroyed by the user onBtnOK(); - // get path and file names to the relevant settings files - std::string userlower=gDirUtilp->getBaseFileName(gDirUtilp->getLindenUserDir(),false); - std::string backup_per_account_folder=dir_name+gDirUtilp->getDirDelimiter()+userlower; - - std::string global_name=gSavedSettings.getString("ClientSettingsFile"); - std::string backup_global_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name, - LLAppViewer::instance()->getSettingsFilename("Default","Global")); - std::string per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, - LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); - std::string backup_per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,backup_per_account_folder, - LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); - - // start clean - llwarns << "clearing global settings" << llendl; - gSavedSettings.resetToDefaults(); - - // run restore on global controls - llwarns << "restoring global settings from backup" << llendl; - gSavedSettings.loadFromFile(backup_global_name); - llwarns << "saving global settings" << llendl; - gSavedSettings.saveToFile(global_name,TRUE); - - for(S32 index=0;indexgetExpandedFilename(LL_PATH_NONE,dir_name,mGlobalFiles[index]), - gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,mGlobalFiles[index])); + // Get path and file names to backup and restore settings path + std::string global_name=gSavedSettings.getString("ClientSettingsFile"); + std::string backup_global_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name, + LLAppViewer::instance()->getSettingsFilename("Default","Global")); + + // start clean + llwarns << "clearing global settings" << llendl; + gSavedSettings.resetToDefaults(); + + // run restore on global controls + llwarns << "restoring global settings from backup" << llendl; + gSavedSettings.loadFromFile(backup_global_name); + llwarns << "saving global settings" << llendl; + gSavedSettings.saveToFile(global_name,TRUE); + } + + // Get scroll list control that holds the list of global files + LLScrollListCtrl* globalScrollList=getChild("restore_global_files_list"); + // Pull out all data + std::vectorglobalFileList=globalScrollList->getAllData(); + // Go over each entry + for(S32 index=0;index(item->getColumn(0)); + if(!checkbox) + continue; + // Only restore if this item is checked on + if (checkbox->getCheckBox()->getValue().asBoolean()) + { + // Get the path to restore for this item + std::string file=item->getColumn(2)->getValue().asString(); + llwarns << "copying global file " << file << llendl; + copy_prefs_file( + gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name,file), + gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,file)); + } } // Only restore per-account settings when the path is available + std::string per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, + LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); if(!per_account_name.empty()) { - llwarns << "copying per account settings" << llendl; - // run restore on per-account controls - gSavedPerAccountSettings.loadFromFile(backup_per_account_name); - gSavedPerAccountSettings.saveToFile(per_account_name,TRUE); + // Get path and file names to the relevant settings files + std::string userlower=gDirUtilp->getBaseFileName(gDirUtilp->getLindenUserDir(),false); + std::string backup_per_account_folder=dir_name+gDirUtilp->getDirDelimiter()+userlower; + std::string backup_per_account_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,backup_per_account_folder, + LLAppViewer::instance()->getSettingsFilename("Default","PerAccount")); - for(S32 index=0;indexgetExpandedFilename(LL_PATH_NONE,backup_per_account_folder,mPerAccountFiles[index]), - gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,mPerAccountFiles[index])); + // run restore on per-account controls + llwarns << "restoring per account settings" << llendl; + gSavedPerAccountSettings.loadFromFile(backup_per_account_name); + llwarns << "saving per account settings" << llendl; + gSavedPerAccountSettings.saveToFile(per_account_name,TRUE); + } + + // Get scroll list control that holds the list of per account files + LLScrollListCtrl* perAccountScrollList=getChild("restore_per_account_files_list"); + // Pull out all data + std::vector perAccountFileList=perAccountScrollList->getAllData(); + // Go over each entry + for(S32 index=0;index(item->getColumn(0)); + if(!checkbox) + continue; + // Only restore if this item is checked on + if (checkbox->getCheckBox()->getValue().asBoolean()) + { + // Get the path to restore for this item + std::string file=item->getColumn(2)->getValue().asString(); + llwarns << "copying per account file " << file << llendl; + copy_prefs_file( + gDirUtilp->getExpandedFilename(LL_PATH_NONE,backup_per_account_folder,file), + gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,file)); + } } // toolbars get overwritten when LLToolbarView is destroyed, so make sure @@ -3295,35 +3352,104 @@ void LLFloaterPreference:: doRestoreSettings(const LLSD& notification,const LLSD gToolBarView->loadToolbars(FALSE); } - // restore global folders and their contents - for(S32 index=0;index("restore_global_folders_list"); + // Pull out all data + std::vector globalFoldersList=globalFoldersScrollList->getAllData(); + // Go over each entry + for(S32 index=0;indexgetExpandedFilename(LL_PATH_USER_SETTINGS,mGlobalFolders[index])+gDirUtilp->getDirDelimiter(); - std::string backup_folder_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name,mGlobalFolders[index])+gDirUtilp->getDirDelimiter(); - - llwarns << "restoring global folder " << folder_name << llendl; - - // create folder if it's not there already - LLFile::mkdir(folder_name.c_str()); - while(gDirUtilp->getNextFileInDir(folder_name,"*",file_name)) + // Get the next item in the list + LLScrollListItem* item=globalFoldersList[index]; + // Look at the first column and make sure it's a checkbox control + LLScrollListCheck* checkbox=dynamic_cast(item->getColumn(0)); + if(!checkbox) + continue; + // Only restore if this item is checked on + if (checkbox->getCheckBox()->getValue().asBoolean()) { - llwarns << "found entry: " << backup_folder_name+file_name << llendl; - // only restore files, not subfolders - if(LLFile::isfile(backup_folder_name+file_name.c_str())) + // Get the path to restore for this item + std::string folder=item->getColumn(2)->getValue().asString(); + + std::string folder_name=gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,folder)+gDirUtilp->getDirDelimiter(); + std::string backup_folder_name=gDirUtilp->getExpandedFilename(LL_PATH_NONE,dir_name,folder)+gDirUtilp->getDirDelimiter(); + + llwarns << "restoring global folder: " << folder_name << llendl; + + // create folder if it's not there already + LLFile::mkdir(folder_name.c_str()); + + std::string file_name; + while(gDirUtilp->getNextFileInDir(backup_folder_name,"*",file_name)) { - copy_prefs_file(backup_folder_name+file_name,folder_name+file_name); + llwarns << "found entry: " << backup_folder_name+file_name << llendl; + // only restore files, not subfolders + if(LLFile::isfile(backup_folder_name+file_name.c_str())) + { + copy_prefs_file(backup_folder_name+file_name,folder_name+file_name); + } + else + llwarns << "skipping subfolder " << backup_folder_name+file_name << llendl; } } } + // Tell the user we have finished restoring settings and the viewer must shut down + LLNotificationsUtil::add("RestoreFinished",LLSD(),LLSD(),boost::bind(&LLFloaterPreference::onQuitConfirmed,this,_1,_2)); +} +// User confirmed the shutdown and we proceed +void LLFloaterPreference::onQuitConfirmed(const LLSD& notification,const LLSD& response) +{ // Make sure the viewer will not save any settings on exit, so our copied files will survive LLAppViewer::instance()->setSaveSettingsOnExit(FALSE); - + // Quit the viewer so all gets saved immediately llwarns << "setting to quit" << llendl; - // And quit the viewer so all gets saved immediately LLApp::instance()->setQuitting(); } + +void LLFloaterPreference::onClickSelectAll() +{ + doSelect(TRUE); +} + +void LLFloaterPreference::onClickDeselectAll() +{ + doSelect(FALSE); +} + +void LLFloaterPreference::doSelect(BOOL all) +{ + // Get scroll list control that holds the list of global files + LLScrollListCtrl* globalScrollList=getChild("restore_global_files_list"); + // Get scroll list control that holds the list of per account files + LLScrollListCtrl* perAccountScrollList=getChild("restore_per_account_files_list"); + // Get scroll list control that holds the list of global folders + LLScrollListCtrl* globalFoldersScrollList=getChild("restore_global_folders_list"); + + applySelection(globalScrollList,all); + applySelection(perAccountScrollList,all); + applySelection(globalFoldersScrollList,all); +} + +void LLFloaterPreference::applySelection(LLScrollListCtrl* control,BOOL all) +{ + // Pull out all data + std::vector itemList=control->getAllData(); + // Go over each entry + for(S32 index=0;indexgetEnabled()) + { + // Look at the first column and make sure it's a checkbox control + LLScrollListCheck* checkbox=dynamic_cast(item->getColumn(0)); + if(checkbox) + checkbox->getCheckBox()->setValue(all); + } + } +} // #ifdef HAS_OPENSIM_SUPPORT// diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index f3ea3be145..42b6ce7b83 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -200,10 +200,16 @@ public: // Backup settings void onClickSetBackupSettingsPath(); + void onClickSelectAll(); + void onClickDeselectAll(); void onClickBackupSettings(); void onClickRestoreSettings(); + + void doSelect(BOOL all); // calls applySelection for each list + void applySelection(LLScrollListCtrl* control,BOOL all); // selects or deselects all items in a scroll list void doRestoreSettings(const LLSD& notification,const LLSD& response); // callback for restore dialog - // + void onQuitConfirmed(const LLSD& notification,const LLSD& response); // callback for finished restore dialog +// private: static std::string sSkin; bool mClickActionDirty; ///< Set to true when the click/double-click options get changed by user. @@ -216,13 +222,6 @@ private: std::string mDirectoryVisibility; LLAvatarData mAvatarProperties; - -// Backup settings -protected: - std::vector mGlobalFiles; // list of global settings files to copy - std::vector mGlobalFolders; // list of global folders to copy - std::vector mPerAccountFiles; // list of per account settings files to copy -// }; class LLPanelPreference : public LLPanel diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index cf77ee7281..2450b1c9a0 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -9434,7 +9434,17 @@ Settings restore requires a viewer restart. Do you want to restore your settings + yestext="Restore and Quit"/> + + + +Restore complete! Please restart your viewer now. + diff --git a/indra/newview/skins/default/xui/en/panel_preferences_backup.xml b/indra/newview/skins/default/xui/en/panel_preferences_backup.xml index c0343ae80d..2607b566a1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_backup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_backup.xml @@ -14,7 +14,7 @@ name="backup_path_label" layout="topleft" follows="left|top" - top="20" + top="10" left="30" width="80" height="20"> @@ -44,8 +44,8 @@ Backup Path: + +Settings groups to be restored (backup will always save all): + + + + + + + + + + + + + Login Credentials + bin_conf.dat + + + + Colors + colors.xml + + + + Ignorable Dialogs + ignorable_dialogs.xml + + + + User-Defined Grids + grids.user.xml + + + + Autoreplace + autoreplace.xml + + + + + + + + + + + + + + Asset Blacklist + asset_blacklist.xml + + + + Contact Sets + settings_friends_groups.xml + + + + Inventory Filters + filters.xml + + + + Favorites Sort Order + landmarks_sorting.xml + + + + Media Black/Whitelist + medialist.xml + + + + Muted Group Chats + muted_groups.xml + + + + Toolbars + toolbars.xml + + + + Voice Chat Volumes + volume_settings.xml + + + + Teleport History + teleport_history.xml + + + + + + + + +Folders: + + + + + + + + + Selection Beams + beams + + + + Selection Beam Colors + beamsColors + + + + Custom Spell Check + dictionaries + + + + + Windlight (Mandatory) + windlight + + + + Windlight Day Cycles + windlight/days + + + + Windlight Skies + windlight/skies + + + + Windlight Waters + windlight/water + + + + + + + + + + + + + +