1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 21:07:35 +00:00

FileManager: Add Open in Terminal on folder context menu

This commit is contained in:
pancake 2021-07-08 11:22:44 +02:00 committed by Ali Mohammad Pur
parent 47e1d5c05e
commit 86a4d0694f
3 changed files with 42 additions and 12 deletions

View file

@ -26,6 +26,23 @@
namespace FileManager { 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<char**>(argv), environ))) {
perror("posix_spawn");
} else {
if (disown(pid) < 0)
perror("disown");
}
posix_spawn_file_actions_destroy(&spawn_actions);
}
enum class FileOperation { enum class FileOperation {
Copy, 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&) { 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; spawn_terminal(path());
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<char**>(argv), environ))) {
perror("posix_spawn");
} else {
if (disown(pid) < 0)
perror("disown");
}
posix_spawn_file_actions_destroy(&spawn_actions);
}); });
m_delete_action = GUI::CommonActions::make_delete_action([this](auto&) { do_delete(true); }, window()); m_delete_action = GUI::CommonActions::make_delete_action([this](auto&) { do_delete(true); }, window());

View file

@ -20,6 +20,8 @@
namespace FileManager { namespace FileManager {
void spawn_terminal(String const& directory);
class LauncherHandler : public RefCounted<LauncherHandler> { class LauncherHandler : public RefCounted<LauncherHandler> {
public: public:
LauncherHandler(const NonnullRefPtr<Desktop::Launcher::Details>& details) LauncherHandler(const NonnullRefPtr<Desktop::Launcher::Details>& details)

View file

@ -699,6 +699,26 @@ int run_in_windowed_mode(RefPtr<Core::ConfigFile> config, String initial_locatio
}, },
window); 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<String> 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 auto shortcut_action
= GUI::Action::create( = GUI::Action::create(
"Create Desktop &Shortcut", "Create Desktop &Shortcut",
@ -1015,6 +1035,7 @@ int run_in_windowed_mode(RefPtr<Core::ConfigFile> config, String initial_locatio
}; };
directory_context_menu->add_action(open_in_new_window_action); 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(copy_action);
directory_context_menu->add_action(cut_action); directory_context_menu->add_action(cut_action);
directory_context_menu->add_action(folder_specific_paste_action); directory_context_menu->add_action(folder_specific_paste_action);
@ -1033,6 +1054,7 @@ int run_in_windowed_mode(RefPtr<Core::ConfigFile> config, String initial_locatio
directory_view_context_menu->add_action(properties_action); 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_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(copy_action);
tree_view_directory_context_menu->add_action(cut_action); tree_view_directory_context_menu->add_action(cut_action);
tree_view_directory_context_menu->add_action(paste_action); tree_view_directory_context_menu->add_action(paste_action);