Add Desktop to file dialog drive on Unix

This commit is contained in:
Shlomi 2020-01-27 18:08:12 +02:00 committed by Rémi Verschelde
parent 4e7223ce49
commit 22da234eb6
1 changed files with 13 additions and 4 deletions

View File

@ -33,6 +33,7 @@
#if defined(UNIX_ENABLED) || defined(LIBC_FILEIO_ENABLED)
#include "core/os/memory.h"
#include "core/os/os.h"
#include "core/string/print_string.h"
#include "core/templates/list.h"
@ -212,10 +213,11 @@ static bool _filter_drive(struct mntent *mnt) {
#endif
static void _get_drives(List<String> *list) {
// Add root.
list->push_back("/");
#if defined(HAVE_MNTENT) && defined(X11_ENABLED)
// Check /etc/mtab for the list of mounted partitions
// Check /etc/mtab for the list of mounted partitions.
FILE *mtab = setmntent("/etc/mtab", "r");
if (mtab) {
struct mntent mnt;
@ -235,7 +237,7 @@ static void _get_drives(List<String> *list) {
}
#endif
// Add $HOME
// Add $HOME.
const char *home = getenv("HOME");
if (home) {
// Only add if it's not a duplicate
@ -244,7 +246,8 @@ static void _get_drives(List<String> *list) {
list->push_back(home_name);
}
// Check $HOME/.config/gtk-3.0/bookmarks
// Check GTK+3 bookmarks for both XDG locations (Documents, Downloads, etc.)
// and potential user-defined bookmarks.
char path[1024];
snprintf(path, 1024, "%s/.config/gtk-3.0/bookmarks", home);
FILE *fd = fopen(path, "r");
@ -253,7 +256,7 @@ static void _get_drives(List<String> *list) {
while (fgets(string, 1024, fd)) {
// Parse only file:// links
if (strncmp(string, "file://", 7) == 0) {
// Strip any unwanted edges on the strings and push_back if it's not a duplicate
// Strip any unwanted edges on the strings and push_back if it's not a duplicate.
String fpath = String::utf8(string + 7).strip_edges().split_spaces()[0].uri_decode();
if (!list->find(fpath)) {
list->push_back(fpath);
@ -263,6 +266,12 @@ static void _get_drives(List<String> *list) {
fclose(fd);
}
// Add Desktop dir.
String dpath = OS::get_singleton()->get_system_dir(OS::SystemDir::SYSTEM_DIR_DESKTOP);
if (dpath.length() > 0 && !list->find(dpath)) {
list->push_back(dpath);
}
}
list->sort();