[easytag] Use g_spawn_async() to launch open with process



commit c04889482be6f2b6baa20b321cf2581dc606c8ff
Author: David King <amigadave amigadave com>
Date:   Tue Jan 21 19:18:37 2014 +0000

    Use g_spawn_async() to launch open with process

 src/browser.c |   87 +++++++++++++++++++++++++++-----------------------------
 src/misc.c    |    6 ++++
 src/misc.h    |    2 +
 3 files changed, 50 insertions(+), 45 deletions(-)
---
diff --git a/src/browser.c b/src/browser.c
index 45e3678..4556645 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -4226,15 +4226,19 @@ Run_Program (const gchar *program_name, GList *args_list)
 {
 #ifdef G_OS_WIN32
     GList              *filelist;
-    gchar             **argv;
-    gint                argv_index = 0;
     gchar              *argv_join;
     gchar              *full_command;
     STARTUPINFO         siStartupInfo;
     PROCESS_INFORMATION piProcessInfo;
 #else /* !G_OS_WIN32 */
-    pid_t   pid;
+    gchar **argv_user;
+    gint    argv_user_number;
+    gchar  *msg;
+    GPid pid;
+    GError *error = NULL;
 #endif /* !G_OS_WIN32 */
+    gchar **argv;
+    gint    argv_index = 0;
     GList *l;
     gchar *program_path;
 
@@ -4276,6 +4280,7 @@ Run_Program (const gchar *program_name, GList *args_list)
     }
 
 
+    /* TODO: Replace with g_spawn_async()? */
 #ifdef G_OS_WIN32
     filelist = args_list;
 
@@ -4334,53 +4339,45 @@ Run_Program (const gchar *program_name, GList *args_list)
 
     g_free(program_path); // Freed as never used
 
-    pid = fork();
-    switch (pid)
-    {
-        case -1:
-            Log_Print(LOG_ERROR,_("Cannot fork another process\n"));
-            //exit(-1);
-            break;
-        case 0:
-        {
-            gchar **argv;
-            gint    argv_index = 0;
-            gchar **argv_user;
-            gint    argv_user_number;
-            gchar  *msg;
-
-            argv_user = g_strsplit(program_name," ",0); // the string may contains arguments, space is the 
delimiter
-            // Number of arguments into 'argv_user'
-            for (argv_user_number=0;argv_user[argv_user_number];argv_user_number++);
+    argv_user = g_strsplit(program_name," ",0); // the string may contains arguments, space is the delimiter
+    // Number of arguments into 'argv_user'
+    for (argv_user_number=0;argv_user[argv_user_number];argv_user_number++);
 
-            argv = g_new0(gchar *,argv_user_number + g_list_length(args_list) + 1); // +1 for NULL
+    argv = g_new0(gchar *,argv_user_number + g_list_length(args_list) + 1); // +1 for NULL
 
-            // Load 'user' arguments (program name and more...)
-            while (argv_user[argv_index])
-            {
-                argv[argv_index] = argv_user[argv_index];
-                argv_index++;
-            }
-            // Load arguments from 'args_list'
-            for (l = args_list; l != NULL; l = g_list_next (l))
-            {
-                argv[argv_index] = (gchar *)l->data;
-                argv_index++;
-            }
-            argv[argv_index] = NULL;
+    // Load 'user' arguments (program name and more...)
+    while (argv_user[argv_index])
+    {
+        argv[argv_index] = argv_user[argv_index];
+        argv_index++;
+    }
+    // Load arguments from 'args_list'
+    for (l = args_list; l != NULL; l = g_list_next (l))
+    {
+        argv[argv_index] = (gchar *)l->data;
+        argv_index++;
+    }
+    argv[argv_index] = NULL;
 
-            // Execution ...
-            execvp(argv[0],argv);
+    /* Execution ... */
+    if (g_spawn_async (NULL, argv, NULL,
+                       G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
+                       NULL, NULL, &pid, &error))
+    {
+        g_child_watch_add (pid, et_on_child_exited, NULL);
 
-            msg = g_strdup_printf (_("Executed command: %s"), program_name);
-            Statusbar_Message(msg,TRUE);
-            g_free(msg);
-            //_exit(-1);
-            break;
-        }
-        default:
-            break;
+        msg = g_strdup_printf (_("Executed command: %s"), program_name);
+        Statusbar_Message (msg, TRUE);
+        g_free (msg);
     }
+    else
+    {
+        Log_Print (LOG_ERROR, _("Failed to launch program: %s"),
+                   error->message);
+        g_clear_error (&error);
+    }
+
+    g_strfreev (argv_user);
 #endif /* !G_OS_WIN32 */
 
     return TRUE;
diff --git a/src/misc.c b/src/misc.c
index 7bc79d4..d31cd8a 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -3761,3 +3761,9 @@ et_track_number_to_string (const guint track_number)
                                                     track_number)
                                  : g_strdup_printf ("%d", track_number);
 }
+
+void
+et_on_child_exited (GPid pid, gint status, gpointer user_data)
+{
+    g_spawn_close_pid (pid);
+}
diff --git a/src/misc.h b/src/misc.h
index e496fe7..10fc981 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -106,4 +106,6 @@ void Load_Filename_Window_Apply_Changes (void);
 gchar * et_disc_number_to_string (const guint disc_number);
 gchar * et_track_number_to_string (const guint track_number);
 
+void et_on_child_exited (GPid pid, gint status, gpointer user_data);
+
 #endif /* __MISC_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]