diff options
Diffstat (limited to 'platform/linuxbsd')
| -rw-r--r-- | platform/linuxbsd/detect.py | 3 | ||||
| -rw-r--r-- | platform/linuxbsd/detect_prime_x11.cpp | 2 | ||||
| -rw-r--r-- | platform/linuxbsd/display_server_x11.cpp | 13 | ||||
| -rw-r--r-- | platform/linuxbsd/display_server_x11.h | 29 | ||||
| -rw-r--r-- | platform/linuxbsd/joypad_linux.cpp | 9 | ||||
| -rw-r--r-- | platform/linuxbsd/joypad_linux.h | 13 | ||||
| -rw-r--r-- | platform/linuxbsd/os_linuxbsd.cpp | 154 | ||||
| -rw-r--r-- | platform/linuxbsd/os_linuxbsd.h | 34 | 
8 files changed, 163 insertions, 94 deletions
diff --git a/platform/linuxbsd/detect.py b/platform/linuxbsd/detect.py index 277aafc107..a819731328 100644 --- a/platform/linuxbsd/detect.py +++ b/platform/linuxbsd/detect.py @@ -12,7 +12,6 @@ def get_name():  def can_build(): -      if os.name != "posix" or sys.platform == "darwin":          return False @@ -81,12 +80,10 @@ def get_opts():  def get_flags(): -      return []  def configure(env): -      ## Build type      if env["target"] == "release": diff --git a/platform/linuxbsd/detect_prime_x11.cpp b/platform/linuxbsd/detect_prime_x11.cpp index e5a9bb4737..709523e836 100644 --- a/platform/linuxbsd/detect_prime_x11.cpp +++ b/platform/linuxbsd/detect_prime_x11.cpp @@ -56,7 +56,7 @@ typedef GLXContext (*GLXCREATECONTEXTATTRIBSARBPROC)(Display *, GLXFBConfig, GLX  struct vendor {  	const char *glxvendor; -	int priority; +	int priority = 0;  };  vendor vendormap[] = { diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index 136bee68e3..9669de5ed6 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -95,6 +95,15 @@  static const double abs_resolution_mult = 10000.0;  static const double abs_resolution_range_mult = 10.0; +// Hints for X11 fullscreen +struct Hints { +	unsigned long flags = 0; +	unsigned long functions = 0; +	unsigned long decorations = 0; +	long inputMode = 0; +	unsigned long status = 0; +}; +  bool DisplayServerX11::has_feature(Feature p_feature) const {  	switch (p_feature) {  		case FEATURE_SUBWINDOWS: @@ -613,7 +622,7 @@ String DisplayServerX11::_clipboard_get(Atom p_source, Window x11_window) const  	if (utf8_atom != None) {  		ret = _clipboard_get_impl(p_source, x11_window, utf8_atom);  	} -	if (ret.empty()) { +	if (ret.is_empty()) {  		ret = _clipboard_get_impl(p_source, x11_window, XA_STRING);  	}  	return ret; @@ -625,7 +634,7 @@ String DisplayServerX11::clipboard_get() const {  	String ret;  	ret = _clipboard_get(XInternAtom(x11_display, "CLIPBOARD", 0), windows[MAIN_WINDOW_ID].x11_window); -	if (ret.empty()) { +	if (ret.is_empty()) {  		ret = _clipboard_get(XA_PRIMARY, windows[MAIN_WINDOW_ID].x11_window);  	} diff --git a/platform/linuxbsd/display_server_x11.h b/platform/linuxbsd/display_server_x11.h index 3c6f462e92..6f437f3be9 100644 --- a/platform/linuxbsd/display_server_x11.h +++ b/platform/linuxbsd/display_server_x11.h @@ -61,27 +61,18 @@  #include <X11/extensions/Xrandr.h>  #include <X11/keysym.h> -// Hints for X11 fullscreen -typedef struct { -	unsigned long flags; -	unsigned long functions; -	unsigned long decorations; -	long inputMode; -	unsigned long status; -} Hints; -  typedef struct _xrr_monitor_info {  	Atom name; -	Bool primary; -	Bool automatic; -	int noutput; -	int x; -	int y; -	int width; -	int height; -	int mwidth; -	int mheight; -	RROutput *outputs; +	Bool primary = false; +	Bool automatic = false; +	int noutput = 0; +	int x = 0; +	int y = 0; +	int width = 0; +	int height = 0; +	int mwidth = 0; +	int mheight = 0; +	RROutput *outputs = nullptr;  } xrr_monitor_info;  #undef CursorShape diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index 4a9d0a8181..0676587f7a 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -49,15 +49,6 @@  static const char *ignore_str = "/dev/input/js";  #endif -JoypadLinux::Joypad::Joypad() { -	fd = -1; -	dpad = 0; -	devpath = ""; -	for (int i = 0; i < MAX_ABS; i++) { -		abs_info[i] = nullptr; -	} -} -  JoypadLinux::Joypad::~Joypad() {  	for (int i = 0; i < MAX_ABS; i++) {  		if (abs_info[i]) { diff --git a/platform/linuxbsd/joypad_linux.h b/platform/linuxbsd/joypad_linux.h index 0d175193a5..71eab78f99 100644 --- a/platform/linuxbsd/joypad_linux.h +++ b/platform/linuxbsd/joypad_linux.h @@ -56,17 +56,16 @@ private:  		Input::JoyAxis curr_axis[MAX_ABS];  		int key_map[MAX_KEY];  		int abs_map[MAX_ABS]; -		int dpad; -		int fd; +		int dpad = 0; +		int fd = -1;  		String devpath; -		input_absinfo *abs_info[MAX_ABS]; +		input_absinfo *abs_info[MAX_ABS] = {}; -		bool force_feedback; -		int ff_effect_id; -		uint64_t ff_effect_timestamp; +		bool force_feedback = false; +		int ff_effect_id = 0; +		uint64_t ff_effect_timestamp = 0; -		Joypad();  		~Joypad();  		void reset();  	}; diff --git a/platform/linuxbsd/os_linuxbsd.cpp b/platform/linuxbsd/os_linuxbsd.cpp index e569aa03d7..4bc3c9421e 100644 --- a/platform/linuxbsd/os_linuxbsd.cpp +++ b/platform/linuxbsd/os_linuxbsd.cpp @@ -65,9 +65,9 @@ void OS_LinuxBSD::initialize_joypads() {  String OS_LinuxBSD::get_unique_id() const {  	static String machine_id; -	if (machine_id.empty()) { +	if (machine_id.is_empty()) {  		if (FileAccess *f = FileAccess::open("/etc/machine-id", FileAccess::READ)) { -			while (machine_id.empty() && !f->eof_reached()) { +			while (machine_id.is_empty() && !f->eof_reached()) {  				machine_id = f->get_line().strip_edges();  			}  			f->close(); @@ -246,7 +246,7 @@ void OS_LinuxBSD::run() {  		return;  	} -	main_loop->init(); +	main_loop->initialize();  	//uint64_t last_ticks=get_ticks_usec(); @@ -263,7 +263,7 @@ void OS_LinuxBSD::run() {  		}  	}; -	main_loop->finish(); +	main_loop->finalize();  }  void OS_LinuxBSD::disable_crash_handler() { @@ -303,65 +303,147 @@ static String get_mountpoint(const String &p_path) {  }  Error OS_LinuxBSD::move_to_trash(const String &p_path) { -	String trash_can = ""; +	int err_code; +	List<String> args; +	args.push_back(p_path); +	args.push_front("trash"); // The command is `gio trash <file_name>` so we need to add it to args. +	Error result = execute("gio", args, true, nullptr, nullptr, &err_code); // For GNOME based machines. +	if (result == OK && !err_code) { +		return OK; +	} else if (err_code == 2) { +		return ERR_FILE_NOT_FOUND; +	} + +	args.pop_front(); +	args.push_front("move"); +	args.push_back("trash:/"); // The command is `kioclient5 move <file_name> trash:/`. +	result = execute("kioclient5", args, true, nullptr, nullptr, &err_code); // For KDE based machines. +	if (result == OK && !err_code) { +		return OK; +	} else if (err_code == 2) { +		return ERR_FILE_NOT_FOUND; +	} + +	args.pop_front(); +	args.pop_back(); +	result = execute("gvfs-trash", args, true, nullptr, nullptr, &err_code); // For older Linux machines. +	if (result == OK && !err_code) { +		return OK; +	} else if (err_code == 2) { +		return ERR_FILE_NOT_FOUND; +	} + +	// If the commands `kioclient5`, `gio` or `gvfs-trash` don't exist on the system we do it manually. +	String trash_path = "";  	String mnt = get_mountpoint(p_path); -	// If there is a directory "[Mountpoint]/.Trash-[UID]/files", use it as the trash can. +	// If there is a directory "[Mountpoint]/.Trash-[UID], use it as the trash can.  	if (mnt != "") { -		String path(mnt + "/.Trash-" + itos(getuid()) + "/files"); +		String path(mnt + "/.Trash-" + itos(getuid()));  		struct stat s;  		if (!stat(path.utf8().get_data(), &s)) { -			trash_can = path; +			trash_path = path;  		}  	} -	// Otherwise, if ${XDG_DATA_HOME} is defined, use "${XDG_DATA_HOME}/Trash/files" as the trash can. -	if (trash_can == "") { +	// Otherwise, if ${XDG_DATA_HOME} is defined, use "${XDG_DATA_HOME}/Trash" as the trash can. +	if (trash_path == "") {  		char *dhome = getenv("XDG_DATA_HOME");  		if (dhome) { -			trash_can = String(dhome) + "/Trash/files"; +			trash_path = String(dhome) + "/Trash";  		}  	} -	// Otherwise, if ${HOME} is defined, use "${HOME}/.local/share/Trash/files" as the trash can. -	if (trash_can == "") { +	// Otherwise, if ${HOME} is defined, use "${HOME}/.local/share/Trash" as the trash can. +	if (trash_path == "") {  		char *home = getenv("HOME");  		if (home) { -			trash_can = String(home) + "/.local/share/Trash/files"; +			trash_path = String(home) + "/.local/share/Trash";  		}  	}  	// Issue an error if none of the previous locations is appropriate for the trash can. -	if (trash_can == "") { -		ERR_PRINT("move_to_trash: Could not determine the trash can location"); -		return FAILED; -	} +	ERR_FAIL_COND_V_MSG(trash_path == "", FAILED, "Could not determine the trash can location");  	// Create needed directories for decided trash can location. -	DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); -	Error err = dir_access->make_dir_recursive(trash_can); -	memdelete(dir_access); +	{ +		DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); +		Error err = dir_access->make_dir_recursive(trash_path); + +		// Issue an error if trash can is not created proprely. +		ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\""); +		err = dir_access->make_dir_recursive(trash_path + "/files"); +		ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"/files"); +		err = dir_access->make_dir_recursive(trash_path + "/info"); +		ERR_FAIL_COND_V_MSG(err != OK, err, "Could not create the trash path \"" + trash_path + "\"/info"); +		memdelete(dir_access); +	} -	// Issue an error if trash can is not created proprely. -	if (err != OK) { -		ERR_PRINT("move_to_trash: Could not create the trash can \"" + trash_can + "\""); -		return err; +	// The trash can is successfully created, now we check that we don't exceed our file name length limit. +	// If the file name is too long trim it so we can add the identifying number and ".trashinfo". +	// Assumes that the file name length limit is 255 characters. +	String file_name = basename(p_path.utf8().get_data()); +	if (file_name.length() > 240) { +		file_name = file_name.substr(0, file_name.length() - 15); +	} + +	String dest_path = trash_path + "/files/" + file_name; +	struct stat buff; +	int id_number = 0; +	String fn = file_name; + +	// Checks if a resource with the same name already exist in the trash can, +	// if there is, add an identifying number to our resource's name. +	while (stat(dest_path.utf8().get_data(), &buff) == 0) { +		id_number++; + +		// Added a limit to check for identically named files already on the trash can +		// if there are too many it could make the editor unresponsive. +		ERR_FAIL_COND_V_MSG(id_number > 99, FAILED, "Too many identically named resources already in the trash can."); +		fn = file_name + "." + itos(id_number); +		dest_path = trash_path + "/files/" + fn; +	} +	file_name = fn; + +	// Generates the .trashinfo file +	OS::Date date = OS::get_singleton()->get_date(false); +	OS::Time time = OS::get_singleton()->get_time(false); +	String timestamp = vformat("%04d-%02d-%02dT%02d:%02d:", date.year, date.month, date.day, time.hour, time.min); +	timestamp = vformat("%s%02d", timestamp, time.sec); // vformat only supports up to 6 arguments. +	String trash_info = "[Trash Info]\nPath=" + p_path.http_escape() + "\nDeletionDate=" + timestamp + "\n"; +	{ +		Error err; +		FileAccess *file = FileAccess::open(trash_path + "/info/" + file_name + ".trashinfo", FileAccess::WRITE, &err); +		ERR_FAIL_COND_V_MSG(err != OK, err, "Can't create trashinfo file:" + trash_path + "/info/" + file_name + ".trashinfo"); +		file->store_string(trash_info); +		file->close(); + +		// Rename our resource before moving it to the trash can. +		DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); +		err = dir_access->rename(p_path, p_path.get_base_dir() + "/" + file_name); +		ERR_FAIL_COND_V_MSG(err != OK, err, "Can't rename file \"" + p_path + "\""); +		memdelete(dir_access);  	} -	// The trash can is successfully created, now move the given resource to it. +	// Move the given resource to the trash can.  	// Do not use DirAccess:rename() because it can't move files across multiple mountpoints.  	List<String> mv_args; -	mv_args.push_back(p_path); -	mv_args.push_back(trash_can); -	int retval; -	err = execute("mv", mv_args, true, nullptr, nullptr, &retval); - -	// Issue an error if "mv" failed to move the given resource to the trash can. -	if (err != OK || retval != 0) { -		ERR_PRINT("move_to_trash: Could not move the resource \"" + p_path + "\" to the trash can \"" + trash_can + "\""); -		return FAILED; +	mv_args.push_back(p_path.get_base_dir() + "/" + file_name); +	mv_args.push_back(trash_path + "/files"); +	{ +		int retval; +		Error err = execute("mv", mv_args, true, nullptr, nullptr, &retval); + +		// Issue an error if "mv" failed to move the given resource to the trash can. +		if (err != OK || retval != 0) { +			ERR_PRINT("move_to_trash: Could not move the resource \"" + p_path + "\" to the trash can \"" + trash_path + "/files\""); +			DirAccess *dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); +			err = dir_access->rename(p_path.get_base_dir() + "/" + file_name, p_path); +			memdelete(dir_access); +			ERR_FAIL_COND_V_MSG(err != OK, err, "Could not rename " + p_path.get_base_dir() + "/" + file_name + " back to its original name:" + p_path); +			return FAILED; +		}  	} -  	return OK;  } diff --git a/platform/linuxbsd/os_linuxbsd.h b/platform/linuxbsd/os_linuxbsd.h index 6e93bf6ef2..89d0bcd0f2 100644 --- a/platform/linuxbsd/os_linuxbsd.h +++ b/platform/linuxbsd/os_linuxbsd.h @@ -43,7 +43,7 @@  #include "servers/rendering_server.h"  class OS_LinuxBSD : public OS_Unix { -	virtual void delete_main_loop(); +	virtual void delete_main_loop() override;  	bool force_quit; @@ -68,36 +68,36 @@ class OS_LinuxBSD : public OS_Unix {  	MainLoop *main_loop;  protected: -	virtual void initialize(); -	virtual void finalize(); +	virtual void initialize() override; +	virtual void finalize() override; -	virtual void initialize_joypads(); +	virtual void initialize_joypads() override; -	virtual void set_main_loop(MainLoop *p_main_loop); +	virtual void set_main_loop(MainLoop *p_main_loop) override;  public: -	virtual String get_name() const; +	virtual String get_name() const override; -	virtual MainLoop *get_main_loop() const; +	virtual MainLoop *get_main_loop() const override; -	virtual String get_config_path() const; -	virtual String get_data_path() const; -	virtual String get_cache_path() const; +	virtual String get_config_path() const override; +	virtual String get_data_path() const override; +	virtual String get_cache_path() const override; -	virtual String get_system_dir(SystemDir p_dir) const; +	virtual String get_system_dir(SystemDir p_dir) const override; -	virtual Error shell_open(String p_uri); +	virtual Error shell_open(String p_uri) override; -	virtual String get_unique_id() const; +	virtual String get_unique_id() const override; -	virtual bool _check_internal_feature_support(const String &p_feature); +	virtual bool _check_internal_feature_support(const String &p_feature) override;  	void run(); -	void disable_crash_handler(); -	bool is_disable_crash_handler() const; +	virtual void disable_crash_handler() override; +	virtual bool is_disable_crash_handler() const override; -	virtual Error move_to_trash(const String &p_path); +	virtual Error move_to_trash(const String &p_path) override;  	OS_LinuxBSD();  };  |