From 86a4d0694f86b81f0e71b44747f6b282809195fa Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 8 Jul 2021 11:22:44 +0200 Subject: [PATCH] FileManager: Add Open in Terminal on folder context menu --- .../FileManager/DirectoryView.cpp | 30 +++++++++++-------- .../Applications/FileManager/DirectoryView.h | 2 ++ Userland/Applications/FileManager/main.cpp | 22 ++++++++++++++ 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/Userland/Applications/FileManager/DirectoryView.cpp b/Userland/Applications/FileManager/DirectoryView.cpp index 763dbdb56f..361bc99a61 100644 --- a/Userland/Applications/FileManager/DirectoryView.cpp +++ b/Userland/Applications/FileManager/DirectoryView.cpp @@ -26,6 +26,23 @@ namespace FileManager { +void spawn_terminal(String const& directory) +{ + posix_spawn_file_actions_t spawn_actions; + posix_spawn_file_actions_init(&spawn_actions); + posix_spawn_file_actions_addchdir(&spawn_actions, directory.characters()); + + pid_t pid; + const char* argv[] = { "Terminal", nullptr }; + if ((errno = posix_spawn(&pid, "/bin/Terminal", &spawn_actions, nullptr, const_cast(argv), environ))) { + perror("posix_spawn"); + } else { + if (disown(pid) < 0) + perror("disown"); + } + posix_spawn_file_actions_destroy(&spawn_actions); +} + enum class FileOperation { Copy, }; @@ -570,18 +587,7 @@ void DirectoryView::setup_actions() }); m_open_terminal_action = GUI::Action::create("Open &Terminal Here", Gfx::Bitmap::load_from_file("/res/icons/16x16/app-terminal.png"), [&](auto&) { - posix_spawn_file_actions_t spawn_actions; - posix_spawn_file_actions_init(&spawn_actions); - posix_spawn_file_actions_addchdir(&spawn_actions, path().characters()); - pid_t pid; - const char* argv[] = { "Terminal", nullptr }; - if ((errno = posix_spawn(&pid, "/bin/Terminal", &spawn_actions, nullptr, const_cast(argv), environ))) { - perror("posix_spawn"); - } else { - if (disown(pid) < 0) - perror("disown"); - } - posix_spawn_file_actions_destroy(&spawn_actions); + spawn_terminal(path()); }); m_delete_action = GUI::CommonActions::make_delete_action([this](auto&) { do_delete(true); }, window()); diff --git a/Userland/Applications/FileManager/DirectoryView.h b/Userland/Applications/FileManager/DirectoryView.h index c93b870ddf..3dec5bdabc 100644 --- a/Userland/Applications/FileManager/DirectoryView.h +++ b/Userland/Applications/FileManager/DirectoryView.h @@ -20,6 +20,8 @@ namespace FileManager { +void spawn_terminal(String const& directory); + class LauncherHandler : public RefCounted { public: LauncherHandler(const NonnullRefPtr& details) diff --git a/Userland/Applications/FileManager/main.cpp b/Userland/Applications/FileManager/main.cpp index c9a671bb71..ed1ee2ab8a 100644 --- a/Userland/Applications/FileManager/main.cpp +++ b/Userland/Applications/FileManager/main.cpp @@ -699,6 +699,26 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio }, window); + auto open_in_new_terminal_action + = GUI::Action::create( + "Open in &Terminal", + {}, + Gfx::Bitmap::load_from_file("/res/icons/16x16/app-terminal.png"), + [&](GUI::Action const& action) { + Vector paths; + if (action.activator() == tree_view_directory_context_menu) + paths = tree_view_selected_file_paths(); + else + paths = directory_view.selected_file_paths(); + + for (auto& path : paths) { + if (Core::File::is_directory(path)) { + spawn_terminal(path); + } + } + }, + window); + auto shortcut_action = GUI::Action::create( "Create Desktop &Shortcut", @@ -1015,6 +1035,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio }; directory_context_menu->add_action(open_in_new_window_action); + directory_context_menu->add_action(open_in_new_terminal_action); directory_context_menu->add_action(copy_action); directory_context_menu->add_action(cut_action); directory_context_menu->add_action(folder_specific_paste_action); @@ -1033,6 +1054,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio directory_view_context_menu->add_action(properties_action); tree_view_directory_context_menu->add_action(open_in_new_window_action); + tree_view_directory_context_menu->add_action(open_in_new_terminal_action); tree_view_directory_context_menu->add_action(copy_action); tree_view_directory_context_menu->add_action(cut_action); tree_view_directory_context_menu->add_action(paste_action);