From 01fcbc199f2475c85d028c11bdce35d3576f7688 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Wed, 10 Dec 2003 13:49:58 +0000 Subject: [PATCH] Utility functions for multi-screen applications which need to ensure 2003-12-10 Mark McLoughlin Utility functions for multi-screen applications which need to ensure launched applications appear on a certain screen. See bug #95897. * gdk/gdkspawn.h: header for multi-screen launching support. * gdk/Makefile.am: install gdkspawn.h. * gdk/x11/Makefile.am: * gdk/x11/gdkspawn-x11.c: (gdk_spawn_make_environment_for_screen): private function to create an environment vector with DISPLAY set appropriately for the screen. (gdk_spawn_on_screen): multi-screen version of g_spawn_async(). (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes(). (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async(). * gdk/linux-fb/Makefile.am, gdk/linux-fb/gdkspawn-fb.c: linux-fb impl. * gdk/win32/Makefile.am, gdk/win32/gdkspawn-win32.c: win32 impl. --- ChangeLog | 26 ++++ ChangeLog.pre-2-10 | 26 ++++ ChangeLog.pre-2-4 | 26 ++++ ChangeLog.pre-2-6 | 26 ++++ ChangeLog.pre-2-8 | 26 ++++ gdk/Makefile.am | 1 + gdk/gdkspawn.h | 59 ++++++++++ gdk/linux-fb/Makefile.am | 1 + gdk/linux-fb/gdkspawn-fb.c | 104 ++++++++++++++++ gdk/win32/Makefile.am | 1 + gdk/win32/gdkspawn-win32.c | 104 ++++++++++++++++ gdk/x11/Makefile.am | 1 + gdk/x11/gdkspawn-x11.c | 236 +++++++++++++++++++++++++++++++++++++ 13 files changed, 637 insertions(+) create mode 100644 gdk/gdkspawn.h create mode 100644 gdk/linux-fb/gdkspawn-fb.c create mode 100644 gdk/win32/gdkspawn-win32.c create mode 100644 gdk/x11/gdkspawn-x11.c diff --git a/ChangeLog b/ChangeLog index 7b4735dbf9..82a5eb01de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2003-12-10 Mark McLoughlin + + Utility functions for multi-screen applications which need + to ensure launched applications appear on a certain screen. + See bug #95897. + + * gdk/gdkspawn.h: header for multi-screen launching + support. + + * gdk/Makefile.am: install gdkspawn.h. + + * gdk/x11/Makefile.am: + * gdk/x11/gdkspawn-x11.c: + (gdk_spawn_make_environment_for_screen): private function + to create an environment vector with DISPLAY set appropriately + for the screen. + (gdk_spawn_on_screen): multi-screen version of g_spawn_async(). + (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes(). + (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async(). + + * gdk/linux-fb/Makefile.am, + gdk/linux-fb/gdkspawn-fb.c: linux-fb impl. + + * gdk/win32/Makefile.am, + gdk/win32/gdkspawn-win32.c: win32 impl. + 2003-12-09 Federico Mena Quintero * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home" diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 7b4735dbf9..82a5eb01de 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,29 @@ +2003-12-10 Mark McLoughlin + + Utility functions for multi-screen applications which need + to ensure launched applications appear on a certain screen. + See bug #95897. + + * gdk/gdkspawn.h: header for multi-screen launching + support. + + * gdk/Makefile.am: install gdkspawn.h. + + * gdk/x11/Makefile.am: + * gdk/x11/gdkspawn-x11.c: + (gdk_spawn_make_environment_for_screen): private function + to create an environment vector with DISPLAY set appropriately + for the screen. + (gdk_spawn_on_screen): multi-screen version of g_spawn_async(). + (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes(). + (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async(). + + * gdk/linux-fb/Makefile.am, + gdk/linux-fb/gdkspawn-fb.c: linux-fb impl. + + * gdk/win32/Makefile.am, + gdk/win32/gdkspawn-win32.c: win32 impl. + 2003-12-09 Federico Mena Quintero * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home" diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 7b4735dbf9..82a5eb01de 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,29 @@ +2003-12-10 Mark McLoughlin + + Utility functions for multi-screen applications which need + to ensure launched applications appear on a certain screen. + See bug #95897. + + * gdk/gdkspawn.h: header for multi-screen launching + support. + + * gdk/Makefile.am: install gdkspawn.h. + + * gdk/x11/Makefile.am: + * gdk/x11/gdkspawn-x11.c: + (gdk_spawn_make_environment_for_screen): private function + to create an environment vector with DISPLAY set appropriately + for the screen. + (gdk_spawn_on_screen): multi-screen version of g_spawn_async(). + (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes(). + (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async(). + + * gdk/linux-fb/Makefile.am, + gdk/linux-fb/gdkspawn-fb.c: linux-fb impl. + + * gdk/win32/Makefile.am, + gdk/win32/gdkspawn-win32.c: win32 impl. + 2003-12-09 Federico Mena Quintero * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home" diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 7b4735dbf9..82a5eb01de 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,29 @@ +2003-12-10 Mark McLoughlin + + Utility functions for multi-screen applications which need + to ensure launched applications appear on a certain screen. + See bug #95897. + + * gdk/gdkspawn.h: header for multi-screen launching + support. + + * gdk/Makefile.am: install gdkspawn.h. + + * gdk/x11/Makefile.am: + * gdk/x11/gdkspawn-x11.c: + (gdk_spawn_make_environment_for_screen): private function + to create an environment vector with DISPLAY set appropriately + for the screen. + (gdk_spawn_on_screen): multi-screen version of g_spawn_async(). + (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes(). + (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async(). + + * gdk/linux-fb/Makefile.am, + gdk/linux-fb/gdkspawn-fb.c: linux-fb impl. + + * gdk/win32/Makefile.am, + gdk/win32/gdkspawn-win32.c: win32 impl. + 2003-12-09 Federico Mena Quintero * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home" diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 7b4735dbf9..82a5eb01de 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,29 @@ +2003-12-10 Mark McLoughlin + + Utility functions for multi-screen applications which need + to ensure launched applications appear on a certain screen. + See bug #95897. + + * gdk/gdkspawn.h: header for multi-screen launching + support. + + * gdk/Makefile.am: install gdkspawn.h. + + * gdk/x11/Makefile.am: + * gdk/x11/gdkspawn-x11.c: + (gdk_spawn_make_environment_for_screen): private function + to create an environment vector with DISPLAY set appropriately + for the screen. + (gdk_spawn_on_screen): multi-screen version of g_spawn_async(). + (gdk_spawn_on_screen_with_pipes): version of g_spawn_async_with_pipes(). + (gdk_spawn_command_line_on_screen): version of g_spawn_command_line_async(). + + * gdk/linux-fb/Makefile.am, + gdk/linux-fb/gdkspawn-fb.c: linux-fb impl. + + * gdk/win32/Makefile.am, + gdk/win32/gdkspawn-win32.c: win32 impl. + 2003-12-09 Federico Mena Quintero * gtk/gtkfilechooserdefault.c (shortcuts_append_home): Use "Home" diff --git a/gdk/Makefile.am b/gdk/Makefile.am index bfe5fe6d61..29cfbcc46d 100644 --- a/gdk/Makefile.am +++ b/gdk/Makefile.am @@ -69,6 +69,7 @@ gdk_public_h_sources = \ gdkrgb.h \ gdkscreen.h \ gdkselection.h \ + gdkspawn.h \ gdktypes.h \ gdkvisual.h \ gdkwindow.h diff --git a/gdk/gdkspawn.h b/gdk/gdkspawn.h new file mode 100644 index 0000000000..72901010d3 --- /dev/null +++ b/gdk/gdkspawn.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2003 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Mark McLoughlin + */ + +#ifndef __GDK_SPAWN_H__ +#define __GDK_SPAWN_H__ + +#include +#include + +G_BEGIN_DECLS + +gboolean gdk_spawn_on_screen (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + GError **error); + +gboolean gdk_spawn_on_screen_with_pipes (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error); + +gboolean gdk_spawn_command_line_on_screen (GdkScreen *screen, + const gchar *command_line, + GError **error); + +G_END_DECLS + +#endif /* __GDK_SPAWN_H__ */ diff --git a/gdk/linux-fb/Makefile.am b/gdk/linux-fb/Makefile.am index be1c16b70f..2287c33a8f 100644 --- a/gdk/linux-fb/Makefile.am +++ b/gdk/linux-fb/Makefile.am @@ -51,6 +51,7 @@ libgdk_linux_fb_la_SOURCES = \ gdkrender-fb.c \ gdkscreen-fb.c \ gdkselection-fb.c \ + gdkspawn-fb.c \ gdkvisual-fb.c \ gdkwindow-fb.c \ mi.h \ diff --git a/gdk/linux-fb/gdkspawn-fb.c b/gdk/linux-fb/gdkspawn-fb.c new file mode 100644 index 0000000000..e00b49734c --- /dev/null +++ b/gdk/linux-fb/gdkspawn-fb.c @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2003 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Mark McLoughlin + */ + +#include + +#include "gdkspawn.h" + +#include +#include + +gboolean +gdk_spawn_on_screen (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + GError **error) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + + return g_spawn_async (working_directory, + argv, + envp, + flags, + child_setup, + user_data, + child_pid, + error); +} + +gboolean +gdk_spawn_on_screen_with_pipes (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + + return g_spawn_async_with_pipes (working_directory, + argv, + envp, + flags, + child_setup, + user_data, + child_pid, + standard_input, + standard_output, + standard_error, + error); +} + +gboolean +gdk_spawn_command_line_on_screen (GdkScreen *screen, + const gchar *command_line, + GError **error) +{ + gchar **argv = NULL; + gboolean retval; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = gdk_spawn (screen, + NULL, argv, NULL, + G_SPAWN_SEARCH_PATH, + NULL, NULL, NULL, + error); + g_strfreev (argv); + + return retval; +} diff --git a/gdk/win32/Makefile.am b/gdk/win32/Makefile.am index 9e11c20949..213fb20f3f 100644 --- a/gdk/win32/Makefile.am +++ b/gdk/win32/Makefile.am @@ -68,6 +68,7 @@ libgdk_win32_la_SOURCES = \ gdkproperty-win32.c \ gdkscreen-win32.c \ gdkselection-win32.c \ + gdkspawn-win32.c \ gdkvisual-win32.c \ gdkwin32.h \ gdkwin32id.c \ diff --git a/gdk/win32/gdkspawn-win32.c b/gdk/win32/gdkspawn-win32.c new file mode 100644 index 0000000000..e00b49734c --- /dev/null +++ b/gdk/win32/gdkspawn-win32.c @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2003 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Mark McLoughlin + */ + +#include + +#include "gdkspawn.h" + +#include +#include + +gboolean +gdk_spawn_on_screen (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + GError **error) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + + return g_spawn_async (working_directory, + argv, + envp, + flags, + child_setup, + user_data, + child_pid, + error); +} + +gboolean +gdk_spawn_on_screen_with_pipes (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + + return g_spawn_async_with_pipes (working_directory, + argv, + envp, + flags, + child_setup, + user_data, + child_pid, + standard_input, + standard_output, + standard_error, + error); +} + +gboolean +gdk_spawn_command_line_on_screen (GdkScreen *screen, + const gchar *command_line, + GError **error) +{ + gchar **argv = NULL; + gboolean retval; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = gdk_spawn (screen, + NULL, argv, NULL, + G_SPAWN_SEARCH_PATH, + NULL, NULL, NULL, + error); + g_strfreev (argv); + + return retval; +} diff --git a/gdk/x11/Makefile.am b/gdk/x11/Makefile.am index 3fb2f2b1d4..d7c529431c 100644 --- a/gdk/x11/Makefile.am +++ b/gdk/x11/Makefile.am @@ -46,6 +46,7 @@ libgdk_x11_la_SOURCES = \ gdkscreen-x11.c \ gdkscreen-x11.h \ gdkselection-x11.c \ + gdkspawn-x11.c \ gdkvisual-x11.c \ gdkwindow-x11.c \ gdkwindow-x11.h \ diff --git a/gdk/x11/gdkspawn-x11.c b/gdk/x11/gdkspawn-x11.c new file mode 100644 index 0000000000..3309c8961a --- /dev/null +++ b/gdk/x11/gdkspawn-x11.c @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2003 Sun Microsystems Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Mark McLoughlin + */ + +#include +#include + +#include "gdkspawn.h" + +#include +#include + +extern char **environ; + +/** + * gdk_make_spawn_environment_for_screen: + * @screen: A #GdkScreen + * @envp: program environment to copy, or NULL to use current environment. + * + * Returns a modified copy of the program environment @envp (or the current + * environment if @envp is NULL) with $DISPLAY set such that a launched + * application (which calls gdk_display_open()) inheriting this environment + * would have @screen as its default screen.. + * + * Returns: a newly-allocated %NULL-terminated array of strings. + * Use g_strfreev() to free it. + **/ +static gchar ** +gdk_spawn_make_environment_for_screen (GdkScreen *screen, + gchar **envp) +{ + gchar **retval = NULL; + gchar *display_name; + gint display_index = -1; + gint i, env_len; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + if (envp == NULL) + envp = environ; + + for (env_len = 0; envp[env_len]; env_len++) + if (strncmp (envp[env_len], "DISPLAY", strlen ("DISPLAY")) == 0) + display_index = env_len; + + retval = g_new (char *, env_len + 1); + retval[env_len] = NULL; + + display_name = gdk_screen_make_display_name (screen); + + for (i = 0; i < env_len; i++) + if (i == display_index) + retval[i] = g_strconcat ("DISPLAY=", display_name, NULL); + else + retval[i] = g_strdup (envp[i]); + + g_assert (i == env_len); + + g_free (display_name); + + return retval; +} + +/** + * gdk_spawn_on_screen: + * @screen: a #GdkScreen + * @working_directory: child's current working directory, or %NULL to inherit parent's + * @argv: child's argument vector + * @envp: child's environment, or %NULL to inherit parent's + * @flags: flags from #GSpawnFlags + * @child_setup: function to run in the child just before exec() + * @user_data: user data for @child_setup + * @child_pid: return location for child process ID, or %NULL + * @error: return location for error + * + * Like g_spawn_async(), except the child process is spawned in such + * an environment that on calling gdk_display_open() it would be + * returned a #GdkDisplay with @screen as the default screen. + * + * This is useful for applications which wish to launch an application + * on a specific screen. + * + * Return value: %TRUE on success, %FALSE if error is set + **/ +gboolean +gdk_spawn_on_screen (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + GError **error) +{ + gchar **new_envp; + gboolean retval; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + + new_envp = gdk_spawn_make_environment_for_screen (screen, envp); + + retval = g_spawn_async (working_directory, + argv, + new_envp, + flags, + child_setup, + user_data, + child_pid, + error); + + g_strfreev (new_envp); + + return retval; +} + +/** + * gdk_spawn_on_screen_with_pipes: + * @screen: a #GdkScreen + * @working_directory: child's current working directory, or %NULL to inherit parent's + * @argv: child's argument vector + * @envp: child's environment, or %NULL to inherit parent's + * @flags: flags from #GSpawnFlags + * @child_setup: function to run in the child just before exec() + * @user_data: user data for @child_setup + * @child_pid: return location for child process ID, or %NULL + * @standard_input: return location for file descriptor to write to child's stdin, or %NULL + * @standard_output: return location for file descriptor to read child's stdout, or %NULL + * @standard_error: return location for file descriptor to read child's stderr, or %NULL + * @error: return location for error + * + * Like g_spawn_async_with_pipes(), except the child process is + * spawned in such an environment that on calling gdk_display_open() + * it would be returned a #GdkDisplay with @screen as the default + * screen. + * + * This is useful for applications which wish to launch an application + * on a specific screen. + * + * Return value: %TRUE on success, %FALSE if an error was set + **/ +gboolean +gdk_spawn_on_screen_with_pipes (GdkScreen *screen, + const gchar *working_directory, + gchar **argv, + gchar **envp, + GSpawnFlags flags, + GSpawnChildSetupFunc child_setup, + gpointer user_data, + gint *child_pid, + gint *standard_input, + gint *standard_output, + gint *standard_error, + GError **error) +{ + gchar **new_envp; + gboolean retval; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + + new_envp = gdk_spawn_make_environment_for_screen (screen, envp); + + retval = g_spawn_async_with_pipes (working_directory, + argv, + new_envp, + flags, + child_setup, + user_data, + child_pid, + standard_input, + standard_output, + standard_error, + error); + + g_strfreev (new_envp); + + return retval; +} + +/** + * gdk_spawn_command_line_on_screen: + * @screen: a #GdkScreen + * @command_line: a command line + * @error: return location for errors + * + * Like g_spawn_command_line_async(), except the child process is + * spawned in such an environment that on calling gdk_display_open() + * it would be returned a #GdkDisplay with @screen as the default + * screen. + * + * This is useful for applications which wish to launch an application + * on a specific screen. + * + * Return value: %TRUE on success, %FALSE if error is set. + **/ +gboolean +gdk_spawn_command_line_on_screen (GdkScreen *screen, + const gchar *command_line, + GError **error) +{ + gchar **argv = NULL; + gboolean retval; + + g_return_val_if_fail (command_line != NULL, FALSE); + + if (!g_shell_parse_argv (command_line, + NULL, &argv, + error)) + return FALSE; + + retval = gdk_spawn (screen, + NULL, argv, NULL, + G_SPAWN_SEARCH_PATH, + NULL, NULL, NULL, + error); + g_strfreev (argv); + + return retval; +}