From 27ff72c90a3c0fb0e5c14349d23c41db31f20056 Mon Sep 17 00:00:00 2001 From: FreeSlave Date: Mon, 11 Apr 2016 10:53:56 -0400 Subject: [PATCH 1/2] Fix getting of gtk bookmarks --- src/dlangui/core/files.d | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/dlangui/core/files.d b/src/dlangui/core/files.d index 216a950b..b0d65f6d 100644 --- a/src/dlangui/core/files.d +++ b/src/dlangui/core/files.d @@ -379,6 +379,7 @@ RootEntry[] getBookmarkPaths() nothrow import std.string : startsWith; import std.stdio : File; import std.exception : collectException; + import std.uri : decode; try { enum fileProtocol = "file://"; auto configPath = environment.get("XDG_CONFIG_HOME"); @@ -388,14 +389,26 @@ RootEntry[] getBookmarkPaths() nothrow auto bookmarksFile = buildPath(configPath, "gtk-3.0/bookmarks"); foreach(line; File(bookmarksFile, "r").byLineCopy()) { if (line.startsWith(fileProtocol)) { - auto path = line[fileProtocol.length..$]; + auto splitted = line.findSplit(" "); + string path; + if (splitted[1].length) { + path = splitted[0][fileProtocol.length..$]; + } else { + path = line[fileProtocol.length..$]; + } + path = decode(path); if (path.isAbsolute) { - // Note: GTK supports regular files in bookmarks too, but we allow directories only. bool dirExists; collectException(path.isDir, dirExists); if (dirExists) { - res ~= RootEntry(RootEntryType.BOOKMARK, path, path.baseName.toUTF32); + dstring label; + if (splitted[1].length) { + label = splitted[2].toUTF32; + } else { + label = path.baseName.toUTF32; + } + res ~= RootEntry(RootEntryType.BOOKMARK, path, label); } } } From 05f8ddb6aa148006a8523183d23b605c7c561013 Mon Sep 17 00:00:00 2001 From: FreeSlave Date: Mon, 11 Apr 2016 23:56:57 +0300 Subject: [PATCH 2/2] Add isHidden --- src/dlangui/core/files.d | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/dlangui/core/files.d b/src/dlangui/core/files.d index b0d65f6d..995877e1 100644 --- a/src/dlangui/core/files.d +++ b/src/dlangui/core/files.d @@ -499,6 +499,35 @@ bool isRoot(in string path) pure nothrow { return false; } +/** + * Check if path is hidden. + */ +bool isHidden(in string path) nothrow { + version(Windows) { + import core.sys.windows.winnt : FILE_ATTRIBUTE_HIDDEN; + import std.exception : collectException; + uint attrs; + if (collectException(path.getAttributes(), attrs) is null) { + return (attrs & FILE_ATTRIBUTE_HIDDEN) != 0; + } else { + return false; + } + } else version(Posix) { + return path.baseName.startsWith("."); + } else { + return false; + } +} + +/// +unittest +{ + version(Posix) { + assert(!"path/to/normal_file".isHidden()); + assert("path/to/.hidden_file".isHidden()); + } +} + /// returns parent directory for specified path string parentDir(in string path) pure nothrow { return buildNormalizedPath(path, ".."); @@ -545,8 +574,7 @@ bool listDirectory(in string dir, in bool includeDirs, in bool includeFiles, in DirEntry[] dirs; DirEntry[] files; foreach (DirEntry e; dirEntries(dir, SpanMode.shallow)) { - string fn = baseName(e.name); - if (!showHiddenFiles && fn.startsWith(".")) + if (!showHiddenFiles && e.name.isHidden()) continue; if (e.isDir) { dirs ~= e;