[easytag] Use g_spawn_async() to launch open with process
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [easytag] Use g_spawn_async() to launch open with process
- Date: Tue, 21 Jan 2014 20:09:06 +0000 (UTC)
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]