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:
parent
47e1d5c05e
commit
86a4d0694f
3 changed files with 42 additions and 12 deletions
|
@ -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());
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue