Pārlūkot izejas kodu

LibDesktop+Taskbar: Add 'WorkingDirectory' property to app files

cflip 2 gadi atpakaļ
vecāks
revīzija
05e7b338ad

+ 6 - 1
Userland/Libraries/LibDesktop/AppFile.cpp

@@ -82,6 +82,11 @@ String AppFile::category() const
     return m_config->read_entry("App", "Category").trim_whitespace();
 }
 
+String AppFile::working_directory() const
+{
+    return m_config->read_entry("App", "WorkingDirectory").trim_whitespace();
+}
+
 String AppFile::icon_path() const
 {
     return m_config->read_entry("App", "IconPath").trim_whitespace();
@@ -145,7 +150,7 @@ bool AppFile::spawn() const
     if (!is_valid())
         return false;
 
-    auto pid = Core::Process::spawn(executable());
+    auto pid = Core::Process::spawn(executable(), Span<String const> {}, working_directory());
     if (pid.is_error())
         return false;
 

+ 1 - 0
Userland/Libraries/LibDesktop/AppFile.h

@@ -29,6 +29,7 @@ public:
     String executable() const;
     String category() const;
     String description() const;
+    String working_directory() const;
     String icon_path() const;
     GUI::Icon icon() const;
     bool run_in_terminal() const;

+ 6 - 2
Userland/Services/Taskbar/main.cpp

@@ -88,6 +88,7 @@ struct AppMetadata {
     String executable;
     String name;
     String category;
+    String working_directory;
     GUI::Icon icon;
     bool run_in_terminal;
 };
@@ -104,7 +105,7 @@ ErrorOr<Vector<String>> discover_apps_and_categories()
     HashTable<String> seen_app_categories;
     Desktop::AppFile::for_each([&](auto af) {
         if (access(af->executable().characters(), X_OK) == 0) {
-            g_apps.append({ af->executable(), af->name(), af->category(), af->icon(), af->run_in_terminal() });
+            g_apps.append({ af->executable(), af->name(), af->category(), af->working_directory(), af->icon(), af->run_in_terminal() });
             seen_app_categories.set(af->category());
         }
     });
@@ -202,7 +203,10 @@ ErrorOr<NonnullRefPtr<GUI::Menu>> build_system_menu(WindowRefence& window_ref)
             posix_spawn_file_actions_t spawn_actions;
             posix_spawn_file_actions_init(&spawn_actions);
             auto home_directory = Core::StandardPaths::home_directory();
-            posix_spawn_file_actions_addchdir(&spawn_actions, home_directory.characters());
+            if (app.working_directory.is_empty())
+                posix_spawn_file_actions_addchdir(&spawn_actions, home_directory.characters());
+            else
+                posix_spawn_file_actions_addchdir(&spawn_actions, app.working_directory.characters());
 
             pid_t child_pid;
             if ((errno = posix_spawn(&child_pid, argv[0], &spawn_actions, nullptr, const_cast<char**>(argv), environ))) {