Merge pull request #12988 from akien-mga/xdg-home-paths
Add support for XDG Base Directory spec
This commit is contained in:
commit
ecf80fbbba
49 changed files with 498 additions and 262 deletions
|
|
@ -640,10 +640,14 @@ void EditorSettings::create() {
|
|||
return; //pointless
|
||||
|
||||
DirAccess *dir = NULL;
|
||||
Variant meta;
|
||||
|
||||
String data_path;
|
||||
String data_dir;
|
||||
String config_path;
|
||||
String config_dir;
|
||||
String cache_path;
|
||||
String cache_dir;
|
||||
|
||||
Ref<ConfigFile> extra_config = memnew(ConfigFile);
|
||||
|
||||
String exe_path = OS::get_singleton()->get_executable_path().get_base_dir();
|
||||
|
|
@ -660,28 +664,80 @@ void EditorSettings::create() {
|
|||
memdelete(d);
|
||||
|
||||
if (self_contained) {
|
||||
// editor is self contained
|
||||
|
||||
// editor is self contained, all in same folder
|
||||
data_path = exe_path;
|
||||
data_dir = data_path.plus_file("editor_data");
|
||||
config_path = exe_path;
|
||||
config_dir = "editor_data";
|
||||
config_dir = data_dir;
|
||||
cache_path = exe_path;
|
||||
cache_dir = data_dir.plus_file("cache");
|
||||
} else {
|
||||
|
||||
if (OS::get_singleton()->has_environment("APPDATA")) {
|
||||
// Most likely under windows, save here
|
||||
config_path = OS::get_singleton()->get_environment("APPDATA");
|
||||
config_dir = String(_MKSTR(VERSION_SHORT_NAME)).capitalize();
|
||||
} else if (OS::get_singleton()->has_environment("HOME")) {
|
||||
|
||||
config_path = OS::get_singleton()->get_environment("HOME");
|
||||
config_dir = "." + String(_MKSTR(VERSION_SHORT_NAME)).to_lower();
|
||||
// Typically XDG_DATA_HOME or %APPDATA%
|
||||
data_path = OS::get_singleton()->get_data_path();
|
||||
data_dir = data_path.plus_file(OS::get_singleton()->get_godot_dir_name());
|
||||
// Can be different from data_path e.g. on Linux or macOS
|
||||
config_path = OS::get_singleton()->get_config_path();
|
||||
config_dir = config_path.plus_file(OS::get_singleton()->get_godot_dir_name());
|
||||
// Can be different from above paths, otherwise a subfolder of data_dir
|
||||
cache_path = OS::get_singleton()->get_cache_path();
|
||||
if (cache_path == data_path) {
|
||||
cache_dir = data_dir.plus_file("cache");
|
||||
} else {
|
||||
cache_dir = cache_path.plus_file(OS::get_singleton()->get_godot_dir_name());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
ClassDB::register_class<EditorSettings>(); //otherwise it can't be unserialized
|
||||
|
||||
String config_file_path;
|
||||
|
||||
if (config_path != "") {
|
||||
if (data_path != "" && config_path != "" && cache_path != "") {
|
||||
|
||||
// Validate/create data dir and subdirectories
|
||||
|
||||
dir = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
|
||||
if (dir->change_dir(data_path) != OK) {
|
||||
ERR_PRINT("Cannot find path for data directory!");
|
||||
memdelete(dir);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (dir->change_dir(data_dir) != OK) {
|
||||
dir->make_dir(data_dir);
|
||||
if (dir->change_dir(data_dir) != OK) {
|
||||
ERR_PRINT("Cannot create data directory!");
|
||||
memdelete(dir);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
if (dir->change_dir("templates") != OK) {
|
||||
dir->make_dir("templates");
|
||||
} else {
|
||||
dir->change_dir("..");
|
||||
}
|
||||
|
||||
// Validate/create cache dir
|
||||
|
||||
if (dir->change_dir(cache_path) != OK) {
|
||||
ERR_PRINT("Cannot find path for cache directory!");
|
||||
memdelete(dir);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (dir->change_dir(cache_dir) != OK) {
|
||||
dir->make_dir(cache_dir);
|
||||
if (dir->change_dir(cache_dir) != OK) {
|
||||
ERR_PRINT("Cannot create cache directory!");
|
||||
memdelete(dir);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate/create config dir and subdirectories
|
||||
|
||||
if (dir->change_dir(config_path) != OK) {
|
||||
ERR_PRINT("Cannot find path for config directory!");
|
||||
memdelete(dir);
|
||||
|
|
@ -697,13 +753,6 @@ void EditorSettings::create() {
|
|||
}
|
||||
}
|
||||
|
||||
if (dir->change_dir("templates") != OK) {
|
||||
dir->make_dir("templates");
|
||||
} else {
|
||||
|
||||
dir->change_dir("..");
|
||||
}
|
||||
|
||||
if (dir->change_dir("text_editor_themes") != OK) {
|
||||
dir->make_dir("text_editor_themes");
|
||||
} else {
|
||||
|
|
@ -715,52 +764,40 @@ void EditorSettings::create() {
|
|||
} else {
|
||||
dir->change_dir("..");
|
||||
}
|
||||
_create_script_templates(dir->get_current_dir() + "/script_templates");
|
||||
_create_script_templates(dir->get_current_dir().plus_file("script_templates"));
|
||||
|
||||
if (dir->change_dir("tmp") != OK) {
|
||||
dir->make_dir("tmp");
|
||||
} else {
|
||||
|
||||
dir->change_dir("..");
|
||||
}
|
||||
|
||||
if (dir->change_dir("config") != OK) {
|
||||
dir->make_dir("config");
|
||||
} else {
|
||||
|
||||
dir->change_dir("..");
|
||||
}
|
||||
|
||||
dir->change_dir("config");
|
||||
|
||||
String pcp = ProjectSettings::get_singleton()->get_resource_path();
|
||||
if (pcp.ends_with("/"))
|
||||
pcp = config_path.substr(0, pcp.size() - 1);
|
||||
pcp = pcp.get_file() + "-" + pcp.md5_text();
|
||||
|
||||
if (dir->change_dir(pcp)) {
|
||||
dir->make_dir(pcp);
|
||||
if (dir->change_dir("projects") != OK) {
|
||||
dir->make_dir("projects");
|
||||
} else {
|
||||
dir->change_dir("..");
|
||||
}
|
||||
|
||||
// Validate/create project-specific config dir
|
||||
|
||||
dir->change_dir("projects");
|
||||
String project_config_dir = ProjectSettings::get_singleton()->get_resource_path();
|
||||
if (project_config_dir.ends_with("/"))
|
||||
project_config_dir = config_path.substr(0, project_config_dir.size() - 1);
|
||||
project_config_dir = project_config_dir.get_file() + "-" + project_config_dir.md5_text();
|
||||
|
||||
if (dir->change_dir(project_config_dir) != OK) {
|
||||
dir->make_dir(project_config_dir);
|
||||
} else {
|
||||
dir->change_dir("..");
|
||||
}
|
||||
dir->change_dir("..");
|
||||
|
||||
// path at least is validated, so validate config file
|
||||
|
||||
String config_file_name = "editor_settings-" + String(_MKSTR(VERSION_MAJOR)) + ".tres";
|
||||
config_file_path = config_path + "/" + config_dir + "/" + config_file_name;
|
||||
|
||||
String open_path = config_file_path;
|
||||
// Validate editor config file
|
||||
|
||||
String config_file_name = "editor_settings.tres";
|
||||
config_file_path = config_dir.plus_file(config_file_name);
|
||||
if (!dir->file_exists(config_file_name)) {
|
||||
|
||||
goto fail;
|
||||
}
|
||||
|
||||
memdelete(dir);
|
||||
|
||||
singleton = ResourceLoader::load(open_path, "EditorSettings");
|
||||
singleton = ResourceLoader::load(config_file_path, "EditorSettings");
|
||||
|
||||
if (singleton.is_null()) {
|
||||
WARN_PRINT("Could not open config file.");
|
||||
|
|
@ -769,8 +806,10 @@ void EditorSettings::create() {
|
|||
|
||||
singleton->save_changed_setting = true;
|
||||
singleton->config_file_path = config_file_path;
|
||||
singleton->project_config_path = pcp;
|
||||
singleton->settings_path = config_path + "/" + config_dir;
|
||||
singleton->project_config_dir = project_config_dir;
|
||||
singleton->settings_dir = config_dir;
|
||||
singleton->data_dir = data_dir;
|
||||
singleton->cache_dir = cache_dir;
|
||||
|
||||
if (OS::get_singleton()->is_stdout_verbose()) {
|
||||
|
||||
|
|
@ -800,7 +839,9 @@ fail:
|
|||
singleton = Ref<EditorSettings>(memnew(EditorSettings));
|
||||
singleton->save_changed_setting = true;
|
||||
singleton->config_file_path = config_file_path;
|
||||
singleton->settings_path = config_path + "/" + config_dir;
|
||||
singleton->settings_dir = config_dir;
|
||||
singleton->data_dir = data_dir;
|
||||
singleton->cache_dir = cache_dir;
|
||||
singleton->_load_defaults(extra_config);
|
||||
singleton->setup_language();
|
||||
singleton->setup_network();
|
||||
|
|
@ -971,21 +1012,52 @@ void EditorSettings::add_property_hint(const PropertyInfo &p_hint) {
|
|||
hints[p_hint.name] = p_hint;
|
||||
}
|
||||
|
||||
// Settings paths and saved metadata
|
||||
// Data directories
|
||||
|
||||
String EditorSettings::get_settings_path() const {
|
||||
String EditorSettings::get_data_dir() const {
|
||||
|
||||
return settings_path;
|
||||
return data_dir;
|
||||
}
|
||||
|
||||
String EditorSettings::get_project_settings_path() const {
|
||||
String EditorSettings::get_templates_dir() const {
|
||||
|
||||
return get_settings_path().plus_file("config").plus_file(project_config_path);
|
||||
return get_data_dir().plus_file("templates");
|
||||
}
|
||||
|
||||
// Config directories
|
||||
|
||||
String EditorSettings::get_settings_dir() const {
|
||||
|
||||
return settings_dir;
|
||||
}
|
||||
|
||||
String EditorSettings::get_project_settings_dir() const {
|
||||
|
||||
return get_settings_dir().plus_file("projects").plus_file(project_config_dir);
|
||||
}
|
||||
|
||||
String EditorSettings::get_text_editor_themes_dir() const {
|
||||
|
||||
return get_settings_dir().plus_file("text_editor_themes");
|
||||
}
|
||||
|
||||
String EditorSettings::get_script_templates_dir() const {
|
||||
|
||||
return get_settings_dir().plus_file("script_templates");
|
||||
}
|
||||
|
||||
// Cache directory
|
||||
|
||||
String EditorSettings::get_cache_dir() const {
|
||||
|
||||
return cache_dir;
|
||||
}
|
||||
|
||||
// Metadata
|
||||
|
||||
void EditorSettings::set_project_metadata(const String &p_section, const String &p_key, Variant p_data) {
|
||||
Ref<ConfigFile> cf = memnew(ConfigFile);
|
||||
String path = get_project_settings_path().plus_file("project_metadata.cfg");
|
||||
String path = get_project_settings_dir().plus_file("project_metadata.cfg");
|
||||
cf->load(path);
|
||||
cf->set_value(p_section, p_key, p_data);
|
||||
cf->save(path);
|
||||
|
|
@ -993,7 +1065,7 @@ void EditorSettings::set_project_metadata(const String &p_section, const String
|
|||
|
||||
Variant EditorSettings::get_project_metadata(const String &p_section, const String &p_key, Variant p_default) {
|
||||
Ref<ConfigFile> cf = memnew(ConfigFile);
|
||||
String path = get_project_settings_path().plus_file("project_metadata.cfg");
|
||||
String path = get_project_settings_dir().plus_file("project_metadata.cfg");
|
||||
Error err = cf->load(path);
|
||||
if (err != OK) {
|
||||
return p_default;
|
||||
|
|
@ -1004,7 +1076,7 @@ Variant EditorSettings::get_project_metadata(const String &p_section, const Stri
|
|||
void EditorSettings::set_favorite_dirs(const Vector<String> &p_favorites_dirs) {
|
||||
|
||||
favorite_dirs = p_favorites_dirs;
|
||||
FileAccess *f = FileAccess::open(get_project_settings_path().plus_file("favorite_dirs"), FileAccess::WRITE);
|
||||
FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("favorite_dirs"), FileAccess::WRITE);
|
||||
if (f) {
|
||||
for (int i = 0; i < favorite_dirs.size(); i++)
|
||||
f->store_line(favorite_dirs[i]);
|
||||
|
|
@ -1020,7 +1092,7 @@ Vector<String> EditorSettings::get_favorite_dirs() const {
|
|||
void EditorSettings::set_recent_dirs(const Vector<String> &p_recent_dirs) {
|
||||
|
||||
recent_dirs = p_recent_dirs;
|
||||
FileAccess *f = FileAccess::open(get_project_settings_path().plus_file("recent_dirs"), FileAccess::WRITE);
|
||||
FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("recent_dirs"), FileAccess::WRITE);
|
||||
if (f) {
|
||||
for (int i = 0; i < recent_dirs.size(); i++)
|
||||
f->store_line(recent_dirs[i]);
|
||||
|
|
@ -1035,7 +1107,7 @@ Vector<String> EditorSettings::get_recent_dirs() const {
|
|||
|
||||
void EditorSettings::load_favorites() {
|
||||
|
||||
FileAccess *f = FileAccess::open(get_project_settings_path().plus_file("favorite_dirs"), FileAccess::READ);
|
||||
FileAccess *f = FileAccess::open(get_project_settings_dir().plus_file("favorite_dirs"), FileAccess::READ);
|
||||
if (f) {
|
||||
String line = f->get_line().strip_edges();
|
||||
while (line != "") {
|
||||
|
|
@ -1045,7 +1117,7 @@ void EditorSettings::load_favorites() {
|
|||
memdelete(f);
|
||||
}
|
||||
|
||||
f = FileAccess::open(get_project_settings_path().plus_file("recent_dirs"), FileAccess::READ);
|
||||
f = FileAccess::open(get_project_settings_dir().plus_file("recent_dirs"), FileAccess::READ);
|
||||
if (f) {
|
||||
String line = f->get_line().strip_edges();
|
||||
while (line != "") {
|
||||
|
|
@ -1058,7 +1130,7 @@ void EditorSettings::load_favorites() {
|
|||
|
||||
void EditorSettings::list_text_editor_themes() {
|
||||
String themes = "Adaptive,Default";
|
||||
DirAccess *d = DirAccess::open(get_settings_path().plus_file("text_editor_themes"));
|
||||
DirAccess *d = DirAccess::open(get_text_editor_themes_dir());
|
||||
if (d) {
|
||||
d->list_dir_begin();
|
||||
String file = d->get_next();
|
||||
|
|
@ -1080,7 +1152,7 @@ void EditorSettings::load_text_editor_theme() {
|
|||
return;
|
||||
}
|
||||
|
||||
String theme_path = get_settings_path().plus_file("text_editor_themes").plus_file((String)get("text_editor/theme/color_theme") + ".tet");
|
||||
String theme_path = get_text_editor_themes_dir().plus_file((String)get("text_editor/theme/color_theme") + ".tet");
|
||||
|
||||
Ref<ConfigFile> cf = memnew(ConfigFile);
|
||||
Error err = cf->load(theme_path);
|
||||
|
|
@ -1118,9 +1190,9 @@ bool EditorSettings::import_text_editor_theme(String p_file) {
|
|||
return false;
|
||||
}
|
||||
|
||||
DirAccess *d = DirAccess::open(get_settings_path().plus_file("text_editor_themes"));
|
||||
DirAccess *d = DirAccess::open(get_text_editor_themes_dir());
|
||||
if (d) {
|
||||
d->copy(p_file, get_settings_path().plus_file("text_editor_themes").plus_file(p_file.get_file()));
|
||||
d->copy(p_file, get_text_editor_themes_dir().plus_file(p_file.get_file()));
|
||||
memdelete(d);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1135,7 +1207,7 @@ bool EditorSettings::save_text_editor_theme() {
|
|||
if (p_file.get_file().to_lower() == "default" || p_file.get_file().to_lower() == "adaptive") {
|
||||
return false;
|
||||
}
|
||||
String theme_path = get_settings_path().plus_file("text_editor_themes").plus_file(p_file + ".tet");
|
||||
String theme_path = get_text_editor_themes_dir().plus_file(p_file + ".tet");
|
||||
return _save_text_editor_theme(theme_path);
|
||||
}
|
||||
|
||||
|
|
@ -1153,7 +1225,7 @@ bool EditorSettings::save_text_editor_theme_as(String p_file) {
|
|||
list_text_editor_themes();
|
||||
String theme_name = p_file.substr(0, p_file.length() - 4).get_file();
|
||||
|
||||
if (p_file.get_base_dir() == get_settings_path().plus_file("text_editor_themes")) {
|
||||
if (p_file.get_base_dir() == get_text_editor_themes_dir()) {
|
||||
_initial_set("text_editor/theme/color_theme", theme_name);
|
||||
load_text_editor_theme();
|
||||
}
|
||||
|
|
@ -1165,7 +1237,7 @@ bool EditorSettings::save_text_editor_theme_as(String p_file) {
|
|||
Vector<String> EditorSettings::get_script_templates(const String &p_extension) {
|
||||
|
||||
Vector<String> templates;
|
||||
DirAccess *d = DirAccess::open(get_settings_path().plus_file("script_templates"));
|
||||
DirAccess *d = DirAccess::open(get_script_templates_dir());
|
||||
if (d) {
|
||||
d->list_dir_begin();
|
||||
String file = d->get_next();
|
||||
|
|
@ -1181,6 +1253,11 @@ Vector<String> EditorSettings::get_script_templates(const String &p_extension) {
|
|||
return templates;
|
||||
}
|
||||
|
||||
String EditorSettings::get_editor_layouts_config() const {
|
||||
|
||||
return get_settings_dir().plus_file("editor_layouts.cfg");
|
||||
}
|
||||
|
||||
// Shortcuts
|
||||
|
||||
void EditorSettings::add_shortcut(const String &p_name, Ref<ShortCut> &p_shortcut) {
|
||||
|
|
@ -1287,8 +1364,8 @@ void EditorSettings::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("property_get_revert", "name"), &EditorSettings::property_get_revert);
|
||||
ClassDB::bind_method(D_METHOD("add_property_info", "info"), &EditorSettings::_add_property_info_bind);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_settings_path"), &EditorSettings::get_settings_path);
|
||||
ClassDB::bind_method(D_METHOD("get_project_settings_path"), &EditorSettings::get_project_settings_path);
|
||||
ClassDB::bind_method(D_METHOD("get_settings_dir"), &EditorSettings::get_settings_dir);
|
||||
ClassDB::bind_method(D_METHOD("get_project_settings_dir"), &EditorSettings::get_project_settings_dir);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_favorite_dirs", "dirs"), &EditorSettings::set_favorite_dirs);
|
||||
ClassDB::bind_method(D_METHOD("get_favorite_dirs"), &EditorSettings::get_favorite_dirs);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue