mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:37:35 +00:00
LibGUI: Allow navigating into symlinked directories in FilePicker
If you double-click on a symlink to a directory while browsing with a FilePicker, you most likely want to open the directory the symlink points to, not open the symlink itself. So let's do that. :^)
This commit is contained in:
parent
bcd05e199b
commit
8db4819271
3 changed files with 12 additions and 1 deletions
|
@ -214,7 +214,7 @@ FilePicker::FilePicker(Window* parent_window, Mode mode, const StringView& file_
|
|||
const FileSystemModel::Node& node = m_model->node(local_index);
|
||||
auto path = node.full_path();
|
||||
|
||||
if (node.is_directory()) {
|
||||
if (node.is_directory() || node.is_symlink_to_directory()) {
|
||||
set_path(path);
|
||||
// NOTE: 'node' is invalid from here on
|
||||
} else {
|
||||
|
|
|
@ -164,6 +164,16 @@ void FileSystemModel::Node::reify_if_needed()
|
|||
fetch_data(full_path(), parent == nullptr || parent->m_parent_of_root);
|
||||
}
|
||||
|
||||
bool FileSystemModel::Node::is_symlink_to_directory() const
|
||||
{
|
||||
if (!S_ISLNK(mode))
|
||||
return false;
|
||||
struct stat st;
|
||||
if (lstat(symlink_target.characters(), &st) < 0)
|
||||
return false;
|
||||
return S_ISDIR(st.st_mode);
|
||||
}
|
||||
|
||||
String FileSystemModel::Node::full_path() const
|
||||
{
|
||||
Vector<String, 32> lineage;
|
||||
|
|
|
@ -79,6 +79,7 @@ public:
|
|||
|
||||
mutable RefPtr<Gfx::Bitmap> thumbnail;
|
||||
bool is_directory() const { return S_ISDIR(mode); }
|
||||
bool is_symlink_to_directory() const;
|
||||
bool is_executable() const { return mode & (S_IXUSR | S_IXGRP | S_IXOTH); }
|
||||
|
||||
bool is_selected() const { return m_selected; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue