浏览代码

Use .godot as file extension for project files.

Now project files don't have to be named "godot.cfg" anymore, they can have any name so as long as it ends with *.godot.
Also godot will automatically start the editor now if launched with a project file as an argument.
This allows for double-clicking of projects to open them :)

Code-wise this should be complete, but there's still work to do:

- Make a nice icon for godot projects.
- Work on installers/packaging -> register the extension and icon with godot.
- Update the 2.1 to 3.0 exporter.

Tested on linux and windows so far.
Andreas Haas 8 年之前
父节点
当前提交
c06a2db63a
共有 7 个文件被更改,包括 148 次插入45 次删除
  1. 58 14
      core/global_config.cpp
  2. 3 0
      core/global_config.h
  3. 1 1
      doc/base/classes.xml
  4. 33 15
      editor/editor_file_system.cpp
  5. 31 11
      editor/project_manager.cpp
  6. 2 1
      editor/project_settings.cpp
  7. 20 3
      main/main.cpp

+ 58 - 14
core/global_config.cpp

@@ -53,6 +53,11 @@ String GlobalConfig::get_resource_path() const {
 	return resource_path;
 	return resource_path;
 };
 };
 
 
+String GlobalConfig::get_project_file_name() const {
+
+	return project_file_name;
+}
+
 String GlobalConfig::localize_path(const String &p_path) const {
 String GlobalConfig::localize_path(const String &p_path) const {
 
 
 	if (resource_path == "")
 	if (resource_path == "")
@@ -236,13 +241,43 @@ bool GlobalConfig::_load_resource_pack(const String &p_pack) {
 	return true;
 	return true;
 }
 }
 
 
+static String _find_project_file(DirAccess *p_diraccess, bool p_res = false) {
+	p_diraccess->list_dir_begin();
+	String ret = "";
+	while (true) {
+		bool isdir;
+		String file = p_diraccess->get_next(&isdir);
+		if (file == "")
+			break;
+
+		if (!isdir) {
+			if (file.get_extension() == "godot") {
+
+				if (p_res) {
+					ret = "res://" + file;
+				} else {
+					ret = p_diraccess->get_current_dir() + "/" + file;
+				}
+			}
+		}
+	}
+	p_diraccess->list_dir_end();
+	return ret;
+}
+
+static String _find_project_file() {
+	DirAccess *dir = DirAccess::create(DirAccess::ACCESS_RESOURCES);
+	String ret = _find_project_file(dir, true);
+	memdelete(dir);
+	return ret;
+}
+
 Error GlobalConfig::setup(const String &p_path, const String &p_main_pack) {
 Error GlobalConfig::setup(const String &p_path, const String &p_main_pack) {
 
 
 	//If looking for files in network, just use network!
 	//If looking for files in network, just use network!
-
 	if (FileAccessNetworkClient::get_singleton()) {
 	if (FileAccessNetworkClient::get_singleton()) {
-
-		if (_load_settings("res://godot.cfg") == OK || _load_settings_binary("res://godot.cfb") == OK) {
+		String gdproj = _find_project_file();
+		if (_load_settings(gdproj) == OK || _load_settings_binary("res://godot.cfb") == OK) {
 
 
 			_load_settings("res://override.cfg");
 			_load_settings("res://override.cfg");
 		}
 		}
@@ -258,8 +293,8 @@ Error GlobalConfig::setup(const String &p_path, const String &p_main_pack) {
 
 
 		bool ok = _load_resource_pack(p_main_pack);
 		bool ok = _load_resource_pack(p_main_pack);
 		ERR_FAIL_COND_V(!ok, ERR_CANT_OPEN);
 		ERR_FAIL_COND_V(!ok, ERR_CANT_OPEN);
-
-		if (_load_settings("res://godot.cfg") == OK || _load_settings_binary("res://godot.cfb") == OK) {
+		String gdproj = _find_project_file();
+		if (_load_settings(gdproj) == OK || _load_settings_binary("res://godot.cfb") == OK) {
 			//load override from location of the main pack
 			//load override from location of the main pack
 			_load_settings(p_main_pack.get_base_dir().plus_file("override.cfg"));
 			_load_settings(p_main_pack.get_base_dir().plus_file("override.cfg"));
 		}
 		}
@@ -272,7 +307,8 @@ Error GlobalConfig::setup(const String &p_path, const String &p_main_pack) {
 
 
 		if (_load_resource_pack(exec_path.get_basename() + ".pck")) {
 		if (_load_resource_pack(exec_path.get_basename() + ".pck")) {
 
 
-			if (_load_settings("res://godot.cfg") == OK || _load_settings_binary("res://godot.cfb") == OK) {
+			String gdproj = _find_project_file();
+			if (_load_settings(gdproj) == OK || _load_settings_binary("res://godot.cfb") == OK) {
 				//load override from location of executable
 				//load override from location of executable
 				_load_settings(exec_path.get_base_dir().plus_file("override.cfg"));
 				_load_settings(exec_path.get_base_dir().plus_file("override.cfg"));
 			}
 			}
@@ -292,15 +328,15 @@ Error GlobalConfig::setup(const String &p_path, const String &p_main_pack) {
 
 
 		// data.pck and data.zip are deprecated and no longer supported, apologies.
 		// data.pck and data.zip are deprecated and no longer supported, apologies.
 		// make sure this is loaded from the resource path
 		// make sure this is loaded from the resource path
-
-		if (_load_settings("res://godot.cfg") == OK || _load_settings_binary("res://godot.cfb") == OK) {
+		String gdproj = _find_project_file();
+		if (_load_settings(gdproj) == OK || _load_settings_binary("res://godot.cfb") == OK) {
 			_load_settings("res://override.cfg");
 			_load_settings("res://override.cfg");
 		}
 		}
 
 
 		return OK;
 		return OK;
 	}
 	}
 
 
-	//Nothing was found, try to find a godot.cfg somewhere!
+	//Nothing was found, try to find a *.godot somewhere!
 
 
 	DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
 	DirAccess *d = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
 	ERR_FAIL_COND_V(!d, ERR_CANT_CREATE);
 	ERR_FAIL_COND_V(!d, ERR_CANT_CREATE);
@@ -313,8 +349,8 @@ Error GlobalConfig::setup(const String &p_path, const String &p_main_pack) {
 
 
 	while (true) {
 	while (true) {
 		//try to load settings in ascending through dirs shape!
 		//try to load settings in ascending through dirs shape!
-
-		if (_load_settings(current_dir + "/godot.cfg") == OK || _load_settings_binary(current_dir + "/godot.cfb") == OK) {
+		String gdproj = _find_project_file(d);
+		if (_load_settings(gdproj) == OK || _load_settings_binary(current_dir + "/godot.cfb") == OK) {
 
 
 			_load_settings(current_dir + "/override.cfg");
 			_load_settings(current_dir + "/override.cfg");
 			candidate = current_dir;
 			candidate = current_dir;
@@ -428,6 +464,7 @@ Error GlobalConfig::_load_settings(const String p_path) {
 		err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, NULL, true);
 		err = VariantParser::parse_tag_assign_eof(&stream, lines, error_text, next_tag, assign, value, NULL, true);
 		if (err == ERR_FILE_EOF) {
 		if (err == ERR_FILE_EOF) {
 			memdelete(f);
 			memdelete(f);
+			project_file_name = p_path.get_file();
 			return OK;
 			return OK;
 		} else if (err != OK) {
 		} else if (err != OK) {
 			ERR_PRINTS("GlobalConfig::load - " + p_path + ":" + itos(lines) + " error: " + error_text);
 			ERR_PRINTS("GlobalConfig::load - " + p_path + ":" + itos(lines) + " error: " + error_text);
@@ -449,6 +486,7 @@ Error GlobalConfig::_load_settings(const String p_path) {
 		}
 		}
 	}
 	}
 
 
+	project_file_name = p_path.get_file();
 	memdelete(f);
 	memdelete(f);
 
 
 	return OK;
 	return OK;
@@ -474,7 +512,12 @@ void GlobalConfig::clear(const String &p_name) {
 
 
 Error GlobalConfig::save() {
 Error GlobalConfig::save() {
 
 
-	return save_custom(get_resource_path() + "/godot.cfg");
+	if (project_file_name.empty()) {
+		String name = ((String)get("application/name")).replace(" ", "_");
+		return save_custom(get_resource_path() + "/" + name + ".godot");
+	} else {
+		return save_custom(get_resource_path() + "/" + project_file_name);
+	}
 }
 }
 
 
 Error GlobalConfig::_save_settings_binary(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom) {
 Error GlobalConfig::_save_settings_binary(const String &p_file, const Map<String, List<String> > &props, const CustomMap &p_custom) {
@@ -483,7 +526,7 @@ Error GlobalConfig::_save_settings_binary(const String &p_file, const Map<String
 	FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
 	FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
 	if (err != OK) {
 	if (err != OK) {
 
 
-		ERR_EXPLAIN("Coudln't save godot.cfb at " + p_file);
+		ERR_EXPLAIN("Couldn't save godot.cfb at " + p_file);
 		ERR_FAIL_COND_V(err, err)
 		ERR_FAIL_COND_V(err, err)
 	}
 	}
 
 
@@ -548,7 +591,7 @@ Error GlobalConfig::_save_settings_text(const String &p_file, const Map<String,
 	FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
 	FileAccess *file = FileAccess::open(p_file, FileAccess::WRITE, &err);
 
 
 	if (err) {
 	if (err) {
-		ERR_EXPLAIN("Coudln't save godot.cfg - " + p_file);
+		ERR_EXPLAIN("Couldn't save project file - " + p_file);
 		ERR_FAIL_COND_V(err, err)
 		ERR_FAIL_COND_V(err, err)
 	}
 	}
 
 
@@ -828,6 +871,7 @@ void GlobalConfig::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("clear", "name"), &GlobalConfig::clear);
 	ClassDB::bind_method(D_METHOD("clear", "name"), &GlobalConfig::clear);
 	ClassDB::bind_method(D_METHOD("localize_path", "path"), &GlobalConfig::localize_path);
 	ClassDB::bind_method(D_METHOD("localize_path", "path"), &GlobalConfig::localize_path);
 	ClassDB::bind_method(D_METHOD("globalize_path", "path"), &GlobalConfig::globalize_path);
 	ClassDB::bind_method(D_METHOD("globalize_path", "path"), &GlobalConfig::globalize_path);
+	ClassDB::bind_method(D_METHOD("get_project_file_name"), &GlobalConfig::get_project_file_name);
 	ClassDB::bind_method(D_METHOD("save"), &GlobalConfig::save);
 	ClassDB::bind_method(D_METHOD("save"), &GlobalConfig::save);
 	ClassDB::bind_method(D_METHOD("has_singleton", "name"), &GlobalConfig::has_singleton);
 	ClassDB::bind_method(D_METHOD("has_singleton", "name"), &GlobalConfig::has_singleton);
 	ClassDB::bind_method(D_METHOD("get_singleton", "name"), &GlobalConfig::get_singleton_object);
 	ClassDB::bind_method(D_METHOD("get_singleton", "name"), &GlobalConfig::get_singleton_object);

+ 3 - 0
core/global_config.h

@@ -111,6 +111,8 @@ protected:
 
 
 	void _add_property_info_bind(const Dictionary &p_info);
 	void _add_property_info_bind(const Dictionary &p_info);
 
 
+	String project_file_name;
+
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
 
 
@@ -124,6 +126,7 @@ public:
 	Variant property_get_revert(const String &p_name);
 	Variant property_get_revert(const String &p_name);
 
 
 	String get_resource_path() const;
 	String get_resource_path() const;
+	String get_project_file_name() const;
 
 
 	static GlobalConfig *get_singleton();
 	static GlobalConfig *get_singleton();
 
 

+ 1 - 1
doc/base/classes.xml

@@ -16414,7 +16414,7 @@
 		Contains global variables accessible from everywhere.
 		Contains global variables accessible from everywhere.
 	</brief_description>
 	</brief_description>
 	<description>
 	<description>
-		Contains global variables accessible from everywhere. Use the normal [Object] API, such as "Globals.get(variable)", "Globals.set(variable,value)" or "Globals.has(variable)" to access them. Variables stored in godot.cfg are also loaded into globals, making this object very useful for reading custom game configuration options.
+		Contains global variables accessible from everywhere. Use the normal [Object] API, such as "Globals.get(variable)", "Globals.set(variable,value)" or "Globals.has(variable)" to access them. Variables stored in the project file (*.godot) are also loaded into globals, making this object very useful for reading custom game configuration options.
 	</description>
 	</description>
 	<methods>
 	<methods>
 		<method name="add_property_info">
 		<method name="add_property_info">

+ 33 - 15
editor/editor_file_system.cpp

@@ -487,6 +487,22 @@ bool EditorFileSystem::_check_missing_imported_files(const String &p_path) {
 	return true;
 	return true;
 }
 }
 
 
+static bool _find_project(const String &p_path) {
+	DirAccess *dir_access = DirAccess::create_for_path(p_path);
+	bool ret = false;
+	while (true) {
+		bool is_dir;
+		String file = dir_access->get_next(&is_dir);
+		if (file == "")
+			break;
+		if (file.ends_with(".godot")) {
+			ret = true;
+		}
+	}
+	memdelete(dir_access);
+	return ret;
+}
+
 void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess *da, const ScanProgress &p_progress) {
 void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess *da, const ScanProgress &p_progress) {
 
 
 	List<String> dirs;
 	List<String> dirs;
@@ -509,8 +525,9 @@ void EditorFileSystem::_scan_new_dir(EditorFileSystemDirectory *p_dir, DirAccess
 			if (f.begins_with(".")) //ignore hidden and . / ..
 			if (f.begins_with(".")) //ignore hidden and . / ..
 				continue;
 				continue;
 
 
-			if (FileAccess::exists(cd.plus_file(f).plus_file("godot.cfg"))) // skip if another project inside this
+			if (_find_project(cd.plus_file(f))) {
 				continue;
 				continue;
+			}
 
 
 			dirs.push_back(f);
 			dirs.push_back(f);
 
 
@@ -676,34 +693,35 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
 		while (true) {
 		while (true) {
 
 
 			bool isdir;
 			bool isdir;
-			String f = da->get_next(&isdir);
-			if (f == "")
+			String file = da->get_next(&isdir);
+			if (file == "")
 				break;
 				break;
 
 
 			if (isdir) {
 			if (isdir) {
 
 
-				if (f.begins_with(".")) //ignore hidden and . / ..
+				if (file.begins_with(".")) //ignore hidden and . / ..
 					continue;
 					continue;
 
 
-				int idx = p_dir->find_dir_index(f);
+				int idx = p_dir->find_dir_index(file);
 				if (idx == -1) {
 				if (idx == -1) {
 
 
-					if (FileAccess::exists(cd.plus_file(f).plus_file("godot.cfg"))) // skip if another project inside this
+					if (_find_project(cd.plus_file(file))) {
 						continue;
 						continue;
+					}
 
 
 					EditorFileSystemDirectory *efd = memnew(EditorFileSystemDirectory);
 					EditorFileSystemDirectory *efd = memnew(EditorFileSystemDirectory);
 
 
 					efd->parent = p_dir;
 					efd->parent = p_dir;
-					efd->name = f;
+					efd->name = file;
 					DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
 					DirAccess *d = DirAccess::create(DirAccess::ACCESS_RESOURCES);
-					d->change_dir(cd.plus_file(f));
+					d->change_dir(cd.plus_file(file));
 					_scan_new_dir(efd, d, p_progress.get_sub(1, 1));
 					_scan_new_dir(efd, d, p_progress.get_sub(1, 1));
 					memdelete(d);
 					memdelete(d);
 
 
 					ItemAction ia;
 					ItemAction ia;
 					ia.action = ItemAction::ACTION_DIR_ADD;
 					ia.action = ItemAction::ACTION_DIR_ADD;
 					ia.dir = p_dir;
 					ia.dir = p_dir;
-					ia.file = f;
+					ia.file = file;
 					ia.new_dir = efd;
 					ia.new_dir = efd;
 					scan_actions.push_back(ia);
 					scan_actions.push_back(ia);
 				} else {
 				} else {
@@ -711,16 +729,16 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
 				}
 				}
 
 
 			} else {
 			} else {
-				String ext = f.get_extension().to_lower();
+				String ext = file.get_extension().to_lower();
 				if (!valid_extensions.has(ext))
 				if (!valid_extensions.has(ext))
 					continue; //invalid
 					continue; //invalid
 
 
-				int idx = p_dir->find_file_index(f);
+				int idx = p_dir->find_file_index(file);
 
 
 				if (idx == -1) {
 				if (idx == -1) {
 					//never seen this file, add actition to add it
 					//never seen this file, add actition to add it
 					EditorFileSystemDirectory::FileInfo *fi = memnew(EditorFileSystemDirectory::FileInfo);
 					EditorFileSystemDirectory::FileInfo *fi = memnew(EditorFileSystemDirectory::FileInfo);
-					fi->file = f;
+					fi->file = file;
 
 
 					String path = cd.plus_file(fi->file);
 					String path = cd.plus_file(fi->file);
 					fi->modified_time = FileAccess::get_modified_time(path);
 					fi->modified_time = FileAccess::get_modified_time(path);
@@ -731,7 +749,7 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
 						ItemAction ia;
 						ItemAction ia;
 						ia.action = ItemAction::ACTION_FILE_ADD;
 						ia.action = ItemAction::ACTION_FILE_ADD;
 						ia.dir = p_dir;
 						ia.dir = p_dir;
-						ia.file = f;
+						ia.file = file;
 						ia.new_file = fi;
 						ia.new_file = fi;
 						scan_actions.push_back(ia);
 						scan_actions.push_back(ia);
 					}
 					}
@@ -739,14 +757,14 @@ void EditorFileSystem::_scan_fs_changes(EditorFileSystemDirectory *p_dir, const
 					if (import_extensions.has(ext)) {
 					if (import_extensions.has(ext)) {
 						//if it can be imported, and it was added, it needs to be reimported
 						//if it can be imported, and it was added, it needs to be reimported
 						print_line("REIMPORT: file was not found before, reimport");
 						print_line("REIMPORT: file was not found before, reimport");
-						print_line("at dir: " + p_dir->get_path() + " file: " + f);
+						print_line("at dir: " + p_dir->get_path() + " file: " + file);
 						for (int i = 0; i < p_dir->files.size(); i++) {
 						for (int i = 0; i < p_dir->files.size(); i++) {
 							print_line(itos(i) + ": " + p_dir->files[i]->file);
 							print_line(itos(i) + ": " + p_dir->files[i]->file);
 						}
 						}
 						ItemAction ia;
 						ItemAction ia;
 						ia.action = ItemAction::ACTION_FILE_REIMPORT;
 						ia.action = ItemAction::ACTION_FILE_REIMPORT;
 						ia.dir = p_dir;
 						ia.dir = p_dir;
-						ia.file = f;
+						ia.file = file;
 						scan_actions.push_back(ia);
 						scan_actions.push_back(ia);
 					}
 					}
 
 

+ 31 - 11
editor/project_manager.cpp

@@ -50,6 +50,19 @@
 #include "scene/gui/tool_button.h"
 #include "scene/gui/tool_button.h"
 #include "version.h"
 #include "version.h"
 
 
+static String _find_project_file(DirAccess *p_da) {
+	p_da->list_dir_begin();
+	while (true) {
+		String f = p_da->get_next();
+		if (f == "")
+			break;
+		if (f.get_extension() == "godot")
+			return p_da->get_current_dir() + "/" + f;
+	}
+	p_da->list_dir_end();
+	return "";
+}
+
 class NewProjectDialog : public ConfirmationDialog {
 class NewProjectDialog : public ConfirmationDialog {
 
 
 	GDCLASS(NewProjectDialog, ConfirmationDialog);
 	GDCLASS(NewProjectDialog, ConfirmationDialog);
@@ -92,18 +105,18 @@ private:
 
 
 		if (mode != MODE_IMPORT) {
 		if (mode != MODE_IMPORT) {
 
 
-			if (d->file_exists("godot.cfg")) {
+			if (_find_project_file(d) != "") {
 
 
-				error->set_text(TTR("Invalid project path, godot.cfg must not exist."));
+				error->set_text(TTR("Invalid project path, *.godot must not exist."));
 				memdelete(d);
 				memdelete(d);
 				return "";
 				return "";
 			}
 			}
 
 
 		} else {
 		} else {
 
 
-			if (valid_path != "" && !d->file_exists("godot.cfg")) {
+			if (valid_path != "" && _find_project_file(d) == "") {
 
 
-				error->set_text(TTR("Invalid project path, godot.cfg must exist."));
+				error->set_text(TTR("Invalid project path, *.godot must exist."));
 				memdelete(d);
 				memdelete(d);
 				return "";
 				return "";
 			}
 			}
@@ -136,7 +149,7 @@ private:
 
 
 		String p = p_path;
 		String p = p_path;
 		if (mode == MODE_IMPORT) {
 		if (mode == MODE_IMPORT) {
-			if (p.ends_with("godot.cfg")) {
+			if (p.get_extension() == "godot") {
 
 
 				p = p.get_base_dir();
 				p = p.get_base_dir();
 			}
 			}
@@ -162,7 +175,7 @@ private:
 
 
 			fdialog->set_mode(FileDialog::MODE_OPEN_FILE);
 			fdialog->set_mode(FileDialog::MODE_OPEN_FILE);
 			fdialog->clear_filters();
 			fdialog->clear_filters();
-			fdialog->add_filter("godot.cfg ; " _MKSTR(VERSION_NAME) " Project");
+			fdialog->add_filter("*.godot ; " _MKSTR(VERSION_NAME) " Project");
 		} else {
 		} else {
 			fdialog->set_mode(FileDialog::MODE_OPEN_DIR);
 			fdialog->set_mode(FileDialog::MODE_OPEN_DIR);
 		}
 		}
@@ -186,9 +199,9 @@ private:
 		} else {
 		} else {
 			if (mode == MODE_NEW) {
 			if (mode == MODE_NEW) {
 
 
-				FileAccess *f = FileAccess::open(dir.plus_file("/godot.cfg"), FileAccess::WRITE);
+				FileAccess *f = FileAccess::open(dir.plus_file("/" + project_name->get_text().replace(" ", "_") + ".godot"), FileAccess::WRITE);
 				if (!f) {
 				if (!f) {
-					error->set_text(TTR("Couldn't create godot.cfg in project path."));
+					error->set_text(TTR("Couldn't create *.godot project file in project path."));
 				} else {
 				} else {
 
 
 					f->store_line("; Engine configuration file.");
 					f->store_line("; Engine configuration file.");
@@ -741,10 +754,17 @@ void ProjectManager::_load_recent_projects() {
 			continue;
 			continue;
 
 
 		String project = _name.get_slice("/", 1);
 		String project = _name.get_slice("/", 1);
-		String conf = path.plus_file("godot.cfg");
+		DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
+		if (dir_access->change_dir(path) != OK) {
+			EditorSettings::get_singleton()->erase(_name);
+			continue;
+		}
+		String conf = _find_project_file(dir_access);
+		memdelete(dir_access);
 		bool favorite = (_name.begins_with("favorite_projects/")) ? true : false;
 		bool favorite = (_name.begins_with("favorite_projects/")) ? true : false;
 
 
 		uint64_t last_modified = 0;
 		uint64_t last_modified = 0;
+
 		if (FileAccess::exists(conf)) {
 		if (FileAccess::exists(conf)) {
 			last_modified = FileAccess::get_modified_time(conf);
 			last_modified = FileAccess::get_modified_time(conf);
 
 
@@ -1006,7 +1026,7 @@ void ProjectManager::_scan_dir(DirAccess *da, float pos, float total, List<Strin
 	while (n != String()) {
 	while (n != String()) {
 		if (da->current_is_dir() && !n.begins_with(".")) {
 		if (da->current_is_dir() && !n.begins_with(".")) {
 			subdirs.push_front(n);
 			subdirs.push_front(n);
-		} else if (n == "godot.cfg") {
+		} else if (n.get_extension() == "godot") {
 			r_projects->push_back(da->get_current_dir());
 			r_projects->push_back(da->get_current_dir());
 		}
 		}
 		n = da->get_next();
 		n = da->get_next();
@@ -1117,7 +1137,7 @@ void ProjectManager::_files_dropped(PoolStringArray p_files, int p_screen) {
 				dir->list_dir_begin();
 				dir->list_dir_begin();
 				String file = dir->get_next();
 				String file = dir->get_next();
 				while (confirm && file != String()) {
 				while (confirm && file != String()) {
-					if (!dir->current_is_dir() && file.ends_with("godot.cfg")) {
+					if (!dir->current_is_dir() && file.get_extension() == "godot") {
 						confirm = false;
 						confirm = false;
 					}
 					}
 					file = dir->get_next();
 					file = dir->get_next();

+ 2 - 1
editor/project_settings.cpp

@@ -1168,7 +1168,8 @@ void ProjectSettings::_bind_methods() {
 ProjectSettings::ProjectSettings(EditorData *p_data) {
 ProjectSettings::ProjectSettings(EditorData *p_data) {
 
 
 	singleton = this;
 	singleton = this;
-	set_title(TTR("Project Settings (godot.cfg)"));
+	String project_file = "(" + GlobalConfig::get_singleton()->get_project_file_name() + ")";
+	set_title(TTR("Project Settings " + project_file));
 	set_resizable(true);
 	set_resizable(true);
 	undo_redo = &p_data->get_undo_redo();
 	undo_redo = &p_data->get_undo_redo();
 	data = p_data;
 	data = p_data;

+ 20 - 3
main/main.cpp

@@ -129,7 +129,7 @@ void Main::print_help(const char *p_binary) {
 	OS::get_singleton()->print(VERSION_FULL_NAME " (c) 2008-2017 Juan Linietsky, Ariel Manzur.\n");
 	OS::get_singleton()->print(VERSION_FULL_NAME " (c) 2008-2017 Juan Linietsky, Ariel Manzur.\n");
 	OS::get_singleton()->print("Usage: %s [options] [scene]\n", p_binary);
 	OS::get_singleton()->print("Usage: %s [options] [scene]\n", p_binary);
 	OS::get_singleton()->print("Options:\n");
 	OS::get_singleton()->print("Options:\n");
-	OS::get_singleton()->print("\t-path [dir] : Path to a game, containing godot.cfg\n");
+	OS::get_singleton()->print("\t-path [dir] : Path to a game, containing *.godot\n");
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
 	OS::get_singleton()->print("\t-e,-editor : Bring up the editor instead of running the scene.\n");
 	OS::get_singleton()->print("\t-e,-editor : Bring up the editor instead of running the scene.\n");
 #endif
 #endif
@@ -447,6 +447,23 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 			} else {
 			} else {
 				goto error;
 				goto error;
 			}
 			}
+		} else if (I->get().ends_with(".godot")) {
+			String path;
+			String file = I->get();
+			int sep = MAX(file.find_last("/"), file.find_last("\\"));
+			if (sep == -1)
+				path = ".";
+			else {
+				path = file.substr(0, sep);
+			}
+			if (OS::get_singleton()->set_cwd(path) == OK) {
+
+			} else {
+				game_path = path;
+			}
+#ifdef TOOLS_ENABLED
+			editor = true;
+#endif
 		} else if (I->get() == "-bp") { // /breakpoints
 		} else if (I->get() == "-bp") { // /breakpoints
 
 
 			if (I->next()) {
 			if (I->next()) {
@@ -673,7 +690,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 	else
 	else
 		input_map->load_from_globals(); //keys for game
 		input_map->load_from_globals(); //keys for game
 
 
-	if (video_driver == "") // specified in godot.cfg
+	if (video_driver == "") // specified in *.godot
 		video_driver = GLOBAL_DEF("display/driver/name", Variant((const char *)OS::get_singleton()->get_video_driver_name(0)));
 		video_driver = GLOBAL_DEF("display/driver/name", Variant((const char *)OS::get_singleton()->get_video_driver_name(0)));
 
 
 	if (!force_res && use_custom_res && globals->has("display/window/width"))
 	if (!force_res && use_custom_res && globals->has("display/window/width"))
@@ -725,7 +742,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 
 
 	/* Determine Video Driver */
 	/* Determine Video Driver */
 
 
-	if (audio_driver == "") { // specified in godot.cfg
+	if (audio_driver == "") { // specified in *.godot
 		audio_driver = GLOBAL_DEF("audio/driver", OS::get_singleton()->get_audio_driver_name(0));
 		audio_driver = GLOBAL_DEF("audio/driver", OS::get_singleton()->get_audio_driver_name(0));
 	}
 	}