From 8db4819271a7b84b488153e5e1ca1fca9329ad73 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 9 Apr 2021 23:02:15 +0200 Subject: [PATCH] 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. :^) --- Userland/Libraries/LibGUI/FilePicker.cpp | 2 +- Userland/Libraries/LibGUI/FileSystemModel.cpp | 10 ++++++++++ Userland/Libraries/LibGUI/FileSystemModel.h | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibGUI/FilePicker.cpp b/Userland/Libraries/LibGUI/FilePicker.cpp index c68dbf09e8..0ec144353a 100644 --- a/Userland/Libraries/LibGUI/FilePicker.cpp +++ b/Userland/Libraries/LibGUI/FilePicker.cpp @@ -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 { diff --git a/Userland/Libraries/LibGUI/FileSystemModel.cpp b/Userland/Libraries/LibGUI/FileSystemModel.cpp index 330daa0fe2..8cf034518b 100644 --- a/Userland/Libraries/LibGUI/FileSystemModel.cpp +++ b/Userland/Libraries/LibGUI/FileSystemModel.cpp @@ -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 lineage; diff --git a/Userland/Libraries/LibGUI/FileSystemModel.h b/Userland/Libraries/LibGUI/FileSystemModel.h index 5b10438a4a..9189a99131 100644 --- a/Userland/Libraries/LibGUI/FileSystemModel.h +++ b/Userland/Libraries/LibGUI/FileSystemModel.h @@ -79,6 +79,7 @@ public: mutable RefPtr 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; }