gboolean vfs_exec( const char* work_dir, char** argv, char** envp, const char* disp_name, GSpawnFlags flags, GError **err ) { return vfs_exec_on_screen( gdk_screen_get_default(), work_dir, argv, envp, disp_name, flags, err ); }
gboolean vfs_app_desktop_open_files( GdkScreen* screen, const char* working_dir, VFSAppDesktop* app, GList* file_paths, GError** err ) { char* exec = NULL; char* cmd; GList* l; gchar** argv = NULL; gint argc = 0; const char* sn_desc; if( vfs_app_desktop_get_exec( app ) ) { if ( ! strchr( vfs_app_desktop_get_exec( app ), '%' ) ) { /* No filename parameters */ exec = g_strconcat( vfs_app_desktop_get_exec( app ), " %f", NULL ); } else { exec = g_strdup( vfs_app_desktop_get_exec( app ) ); } } if ( exec ) { if( !screen ) screen = gdk_screen_get_default(); sn_desc = vfs_app_desktop_get_disp_name( app ); if( !sn_desc ) sn_desc = exec; if( vfs_app_desktop_open_multiple_files( app ) ) { cmd = translate_app_exec_to_command_line( app, file_paths ); if ( cmd ) { if ( vfs_app_desktop_open_in_terminal( app ) ) exec_in_terminal( sn_desc, app->path && app->path[0] ? app->path : working_dir, cmd ); else { /* g_debug( "Execute %s\n", cmd ); */ if( g_shell_parse_argv( cmd, &argc, &argv, NULL ) ) { vfs_exec_on_screen( screen, app->path && app->path[0] ? app->path : working_dir, argv, NULL, sn_desc, VFS_EXEC_DEFAULT_FLAGS, err ); g_strfreev( argv ); } } g_free( cmd ); } } else { // app does not accept multiple files, so run multiple times GList* single; l = file_paths; do { if ( l ) { // just pass a single file path to translate single = g_list_append( NULL, l->data ); } else { // there are no files being passed, just run once single = NULL; } cmd = translate_app_exec_to_command_line( app, single ); g_list_free( single ); if ( cmd ) { if ( vfs_app_desktop_open_in_terminal( app ) ) exec_in_terminal( sn_desc, app->path && app->path[0] ? app->path : working_dir, cmd ); else { /* g_debug( "Execute %s\n", cmd ); */ if( g_shell_parse_argv( cmd, &argc, &argv, NULL ) ) { vfs_exec_on_screen( screen, app->path && app->path[0] ? app->path : working_dir, argv, NULL, sn_desc, G_SPAWN_SEARCH_PATH| G_SPAWN_STDOUT_TO_DEV_NULL| G_SPAWN_STDERR_TO_DEV_NULL, err ); g_strfreev( argv ); } } g_free( cmd ); } } while ( l = l ? l->next : NULL ); } g_free( exec ); return TRUE; } g_set_error( err, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, _("Command not found") ); return FALSE; }