From e40bb68c056d69e3cb1252a421bae94166ea45aa Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Wed, 15 Dec 2021 13:41:00 +0800 Subject: [PATCH] Add / to the unix shortcut drive list Also made `get_current_drive()` to pick the longest match on Unix. (cherry picked from commit 67f04b381bea03857c21d6bda3eb56cfb6c60fd5) --- doc/classes/Directory.xml | 10 ++++++++-- drivers/unix/dir_access_unix.cpp | 16 ++++++++++++++++ drivers/unix/dir_access_unix.h | 1 + 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/doc/classes/Directory.xml b/doc/classes/Directory.xml index 87fdda8a53b..ec80286eb38 100644 --- a/doc/classes/Directory.xml +++ b/doc/classes/Directory.xml @@ -81,13 +81,19 @@ - On Windows, returns the name of the drive (partition) passed as an argument (e.g. [code]C:[/code]). On other platforms, or if the requested drive does not exist, the method returns an empty String. + On Windows, returns the name of the drive (partition) passed as an argument (e.g. [code]C:[/code]). + On macOS, returns the path to the mounted volume passed as an argument. + On Linux, returns the path to the mounted volume or GTK 3 bookmark passed as an argument. + On other platforms, or if the requested drive does not exist, the method returns an empty String. - On Windows, returns the number of drives (partitions) mounted on the current filesystem. On other platforms, the method returns 0. + On Windows, returns the number of drives (partitions) mounted on the current filesystem. + On macOS, returns the number of mounted volumes. + On Linux, returns the number of mounted volumes and GTK 3 bookmarks. + On other platforms, the method returns 0. diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index 4d0ea16a3ab..f39b7815357 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -194,6 +194,8 @@ static bool _filter_drive(struct mntent *mnt) { #endif static void _get_drives(List *list) { + list->push_back("/"); + #if defined(HAVE_MNTENT) && defined(X11_ENABLED) // Check /etc/mtab for the list of mounted partitions FILE *mtab = setmntent("/etc/mtab", "r"); @@ -262,6 +264,20 @@ String DirAccessUnix::get_drive(int p_drive) { return list[p_drive]; } +int DirAccessUnix::get_current_drive() { + int drive = 0; + int max_length = -1; + const String path = get_current_dir().to_lower(); + for (int i = 0; i < get_drive_count(); i++) { + const String d = get_drive(i).to_lower(); + if (max_length < d.length() && path.begins_with(d)) { + max_length = d.length(); + drive = i; + } + } + return drive; +} + bool DirAccessUnix::drives_are_shortcuts() { return true; } diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h index ba91753697e..52bc54ee673 100644 --- a/drivers/unix/dir_access_unix.h +++ b/drivers/unix/dir_access_unix.h @@ -63,6 +63,7 @@ public: virtual int get_drive_count(); virtual String get_drive(int p_drive); + virtual int get_current_drive(); virtual bool drives_are_shortcuts(); virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success