ソースを参照

LibDesktop: Add spawn() to AppFiles

This adds a convenience utility to AppFiles for quickly launching the
apps backed by the AppFile.
Spencer Dixon 4 年 前
コミット
ae20c178b9

+ 21 - 0
Userland/Libraries/LibDesktop/AppFile.cpp

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2020, Linus Groh <linusg@serenityos.org>
+ * Copyright (c) 2021, Spencer Dixon <spencercdixon@gmail.com>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -103,4 +104,24 @@ Vector<String> AppFile::launcher_protocols() const
     return protocols;
 }
 
+bool AppFile::spawn() const
+{
+    if (!is_valid())
+        return false;
+
+    pid_t child_pid;
+    const char* argv[] = { executable().characters(), nullptr };
+    if ((errno = posix_spawn(&child_pid, executable().characters(), nullptr, nullptr, const_cast<char**>(argv), environ))) {
+        perror("posix_spawn");
+        return false;
+    } else {
+        if (disown(child_pid) < 0) {
+            perror("disown");
+            return false;
+        }
+    }
+
+    return true;
+}
+
 }

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

@@ -28,6 +28,7 @@ public:
     String category() const;
     Vector<String> launcher_file_types() const;
     Vector<String> launcher_protocols() const;
+    bool spawn() const;
 
     GUI::Icon icon() const { return GUI::FileIconProvider::icon_for_path(executable()); };