Introduce 'spawn_command_async()', with error reporting
authorHenry Gebhardt <hsggebhardt@gmail.com>
Sun, 25 Aug 2013 16:32:44 +0000 (12:32 -0400)
committerHenry Gebhardt <hsggebhardt@gmail.com>
Sun, 25 Aug 2013 22:35:28 +0000 (18:35 -0400)
This should clarify bugs such as ID 3614887,
https://sourceforge.net/tracker/?func=detail&atid=894869&aid=3614887&group_id=180858

src/configurator.c
src/gtk-run.c
src/misc.c
src/plugins/dclock.c
src/plugins/dirmenu.c
src/plugins/launchbar.c
src/plugins/menu.c
src/plugins/monitors/monitors.c

index 8afe8da..8722391 100644 (file)
@@ -1227,16 +1227,10 @@ void logout(void)
     if( ! l_logout_cmd && getenv("_LXSESSION_PID") )
         l_logout_cmd = "lxsession-logout";
 
-    if( l_logout_cmd ) {
-        GError* err = NULL;
-        if( ! g_spawn_command_line_async( l_logout_cmd, &err ) ) {
-            show_error( NULL, err->message );
-            g_error_free( err );
-        }
-    }
-    else {
+    if( l_logout_cmd )
+        spawn_command_async(NULL, NULL, l_logout_cmd);
+    else
         show_error( NULL, _("Logout command is not set") );
-    }
 }
 
 static void notify_apply_config( GtkWidget* widget )
@@ -1515,3 +1509,6 @@ lxpanel_get_terminal()
 {
     return terminal_cmd ? terminal_cmd : "lxterminal -e %s";
 }
+
+
+/* vim: set sw=4 et sts=4 : */
index 6db6af6..c46aae0 100644 (file)
@@ -256,11 +256,8 @@ static void on_response( GtkDialog* dlg, gint response, gpointer user_data )
     GtkEntry* entry = (GtkEntry*)user_data;
     if( G_LIKELY(response == GTK_RESPONSE_OK) )
     {
-        GError* err = NULL;
-        if( !g_spawn_command_line_async( gtk_entry_get_text(entry), &err ) )
+        if (!spawn_command_async(GTK_WINDOW(dlg), NULL, gtk_entry_get_text(entry)))
         {
-            show_error( (GtkWindow*)dlg, err->message );
-            g_error_free( err );
             g_signal_stop_emission_by_name( dlg, "response" );
             return;
         }
@@ -402,3 +399,5 @@ void gtk_run()
        activate_window(GTK_WINDOW(win));
 }
 
+
+/* vim: set sw=4 et sts=4 ts=4 : */
index 5a14d04..6550607 100644 (file)
@@ -1548,6 +1548,30 @@ _finish:
     return g_string_free( cmd, FALSE );
 }
 
+gboolean spawn_command_async(GtkWindow *parent_window, gchar const* workdir,
+        gchar const* cmd)
+{
+    GError* err = NULL;
+    gchar** argv = NULL;
+
+    LOG(LOG_INFO, "lxpanel: spawning \"%s\"...\n", cmd);
+
+    g_shell_parse_argv(cmd, NULL, &argv, &err);
+    if (!err)
+        g_spawn_async(workdir, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &err);
+
+    if (err)
+    {
+        ERR("%s\n", err->message);
+        show_error(parent_window, err->message);
+        g_error_free(err);
+    }
+
+    g_strfreev(argv);
+
+    return !err;
+}
+
 gboolean lxpanel_launch_app(const char* exec, GList* files, gboolean in_terminal)
 {
     GError *error = NULL;
@@ -1569,12 +1593,12 @@ gboolean lxpanel_launch_app(const char* exec, GList* files, gboolean in_terminal
             g_free(cmd);
         cmd = term_cmd;
     }
-    LOG(LOG_INFO, "lxpanel: spawning \"%s\"...\n", cmd);
-    if (! g_spawn_command_line_async(cmd, &error) ) {
-        ERR("can't spawn %s\nError is %s\n", cmd, error->message);
-        g_error_free (error);
-    }
+
+    spawn_command_async(NULL, NULL, cmd);
+
     g_free(cmd);
 
     return (error == NULL);
 }
+
+/* vim: set sw=4 et sts=4 : */
index e1975c2..e2d84a9 100644 (file)
@@ -117,7 +117,7 @@ static gboolean dclock_button_press_event(GtkWidget * widget, GdkEventButton * e
 
     /* If an action is set, execute it. */
     if (dc->action != NULL)
-        g_spawn_command_line_async(dc->action, NULL);
+        spawn_command_async(NULL, NULL, dc->action);
 
     /* If no action is set, toggle the presentation of the calendar. */
     else
index e673a06..c3f5ff3 100644 (file)
@@ -70,21 +70,14 @@ static void dirmenu_open_in_file_manager(Plugin * p, const char * path)
     const char * fm = lxpanel_get_file_manager();
     char * cmd = ((strstr(fm, "%s") != NULL) ? g_strdup_printf(fm, quote) : g_strdup_printf("%s %s", fm, quote));
     g_free(quote);
-    g_spawn_command_line_async(cmd, NULL);
+    spawn_command_async(NULL, NULL, cmd);
     g_free(cmd);
 }
 
 /* Open a specified path in a terminal. */
 static void dirmenu_open_in_terminal(Plugin * p, const char * path)
 {
-    const char * term = lxpanel_get_terminal();
-    char * argv[2];
-    char * sp = strchr(term, ' ');
-    argv[0] = ((sp != NULL) ? g_strndup(term, sp - term) : (char *) term);
-    argv[1] = NULL;
-    g_spawn_async(path, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
-    if (argv[0] != term)
-        g_free(argv[0]);
+    spawn_command_async(NULL, path, lxpanel_get_terminal());
 }
 
 /* Handler for activate event on popup Open menu item. */
index 4333396..2a8c099 100644 (file)
@@ -304,7 +304,7 @@ static void launchbutton_drag_data_received_event(
                 s = e+1;
             }
 
-            g_spawn_command_line_async(str, NULL);
+            spawn_command_async(NULL, NULL, str);
             g_free(str);
         }
     }
index 2c21950..2fc3cbc 100644 (file)
@@ -104,14 +104,9 @@ menu_destructor(Plugin *p)
 static void
 spawn_app(GtkWidget *widget, gpointer data)
 {
-    GError *error = NULL;
-
     ENTER;
     if (data) {
-        if (! g_spawn_command_line_async(data, &error) ) {
-            ERR("can't spawn %s\nError is %s\n", (char *)data, error->message);
-            g_error_free (error);
-        }
+        spawn_command_async(NULL, NULL, data);
     }
     RET();
 }
@@ -336,9 +331,16 @@ static void on_menu_item_properties(GtkMenuItem* item, MenuCacheApp* app)
         "-o",
         NULL,
         NULL};
+    GError* err = NULL;
     argv[2] = ifile;
     argv[4] = ofile;
-    g_spawn_async( NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL );
+    g_spawn_async( NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, &err );
+    if (err)
+    {
+        ERR("%s\n", err->message);
+        show_error(NULL, err->message);
+        g_error_free(err);
+    }
     g_free( ifile );
     g_free( ofile );
 }
@@ -1110,3 +1112,4 @@ PluginClass menu_plugin_class = {
     .panel_configuration_changed = menu_panel_configuration_changed
 };
 
+/* vim: set sw=4 et sts=4 : */
index d916346..26a2639 100644 (file)
@@ -489,9 +489,9 @@ static gboolean monitors_button_press_event(GtkWidget* widget, GdkEventButton* e
         return TRUE;
 
     if (mp->action != NULL)
-        g_spawn_command_line_async(mp->action, NULL);
+        spawn_command_async(NULL, NULL, mp->action);
     else
-        g_spawn_command_line_async("lxtask", NULL);
+        spawn_command_async(NULL, NULL, "lxtask");
 
     return TRUE;
 }