diff --git a/Applications/FileManager/DirectoryView.cpp b/Applications/FileManager/DirectoryView.cpp index 8efe532ec3..c30f76f14f 100644 --- a/Applications/FileManager/DirectoryView.cpp +++ b/Applications/FileManager/DirectoryView.cpp @@ -484,4 +484,19 @@ void DirectoryView::setup_actions() ASSERT(rc >= 0); } }); + + 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); + }); } diff --git a/Applications/FileManager/DirectoryView.h b/Applications/FileManager/DirectoryView.h index 9ee572ac4f..1e35b48b00 100644 --- a/Applications/FileManager/DirectoryView.h +++ b/Applications/FileManager/DirectoryView.h @@ -136,6 +136,7 @@ public: GUI::Action& mkdir_action() { return *m_mkdir_action; } GUI::Action& touch_action() { return *m_touch_action; } + GUI::Action& open_terminal_action() { return *m_open_terminal_action; } private: explicit DirectoryView(Mode); @@ -171,4 +172,5 @@ private: RefPtr m_mkdir_action; RefPtr m_touch_action; + RefPtr m_open_terminal_action; }; diff --git a/Applications/FileManager/main.cpp b/Applications/FileManager/main.cpp index 6ceb449c21..41b9ea9cf8 100644 --- a/Applications/FileManager/main.cpp +++ b/Applications/FileManager/main.cpp @@ -181,6 +181,7 @@ int run_in_desktop_mode(RefPtr config) desktop_view_context_menu->add_separator(); desktop_view_context_menu->add_action(file_manager_action); + desktop_view_context_menu->add_action(directory_view.open_terminal_action()); desktop_view_context_menu->add_separator(); desktop_view_context_menu->add_action(display_properties_action); @@ -291,21 +292,6 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio directory_view.open_parent_directory(); }); - auto open_terminal_action = GUI::Action::create("Open Terminal here...", Gfx::Bitmap::load_from_file("/res/icons/16x16/app-terminal.png"), [&](const GUI::Action&) { - posix_spawn_file_actions_t spawn_actions; - posix_spawn_file_actions_init(&spawn_actions); - posix_spawn_file_actions_addchdir(&spawn_actions, directory_view.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); - }); - RefPtr view_as_table_action; RefPtr view_as_icons_action; RefPtr view_as_columns_action; @@ -560,7 +546,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio app_menu.add_action(copy_action); app_menu.add_action(paste_action); app_menu.add_action(delete_action); - app_menu.add_action(open_terminal_action); + app_menu.add_action(directory_view.open_terminal_action()); app_menu.add_separator(); app_menu.add_action(properties_action); app_menu.add_separator(); @@ -606,7 +592,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio main_toolbar.add_action(copy_action); main_toolbar.add_action(paste_action); main_toolbar.add_action(delete_action); - main_toolbar.add_action(open_terminal_action); + main_toolbar.add_action(directory_view.open_terminal_action()); main_toolbar.add_separator(); main_toolbar.add_action(*view_as_icons_action); @@ -683,7 +669,7 @@ int run_in_windowed_mode(RefPtr config, String initial_locatio directory_view_context_menu->add_action(directory_view.mkdir_action()); directory_view_context_menu->add_action(directory_view.touch_action()); directory_view_context_menu->add_action(paste_action); - directory_view_context_menu->add_action(open_terminal_action); + directory_view_context_menu->add_action(directory_view.open_terminal_action()); directory_view_context_menu->add_separator(); directory_view_context_menu->add_action(properties_action);