diff --git a/ChangeLog b/ChangeLog index 480b659b456ef7a23f3adc07544aa2e26a3e1e11..6054409699d5842c936bcf69d101b557eabe3948 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-11-28 Benedikt Meurer <benny@xfce.org> + + * thunar-vfs/thunar-vfs-exec.c(thunar_vfs_exec_on_screen): + Make sure to pass the correct $DISPLAY value to processes + spawned by Thunar and xfdesktop. Bug #3667. + 2007-08-24 Jean-François Wauthy <pollux@xfce.org> * docs/manual/fr/Thunar.xml.in: minor corrections in French diff --git a/thunar-vfs/thunar-vfs-exec.c b/thunar-vfs/thunar-vfs-exec.c index b3ceb3df8a83a71af66e90c2036f183b5a0b0145..425eb1a82ab9fb0ac116bb965ad9873b862dfdc6 100644 --- a/thunar-vfs/thunar-vfs-exec.c +++ b/thunar-vfs/thunar-vfs-exec.c @@ -434,15 +434,30 @@ thunar_vfs_exec_on_screen (GdkScreen *screen, #ifdef HAVE_LIBSTARTUP_NOTIFICATION SnLauncherContext *sn_launcher = NULL; TvsnStartupData *startup_data; - extern gchar **environ; SnDisplay *sn_display = NULL; gint sn_workspace; - gint n, m; #endif + extern gchar **environ; gboolean succeed; - gchar **sn_envp = envp; + gchar *display_name; + gchar **cenvp = envp; + gint n_cenvp, n; GPid pid; + /* setup the child environment (stripping $DESKTOP_STARTUP_ID and $DISPLAY) */ + if (G_LIKELY (envp == NULL)) + envp = (gchar **) environ; + for (n = 0; envp[n] != NULL; ++n) ; + cenvp = g_new0 (gchar *, n + 3); + for (n_cenvp = n = 0; envp[n] != NULL; ++n) + if (strncmp (envp[n], "DESKTOP_STARTUP_ID", 18) != 0 && strncmp (envp[n], "DISPLAY", 7) != 0) + cenvp[n_cenvp++] = g_strdup (envp[n]); + + /* add the real display name for the screen */ + display_name = gdk_screen_make_display_name (screen); + cenvp[n_cenvp++] = g_strconcat ("DISPLAY=", display_name, NULL); + g_free (display_name); + #ifdef HAVE_LIBSTARTUP_NOTIFICATION /* initialize the sn launcher context */ if (G_LIKELY (startup_notify)) @@ -464,17 +479,8 @@ thunar_vfs_exec_on_screen (GdkScreen *screen, sn_launcher_context_set_icon_name (sn_launcher, (icon_name != NULL) ? icon_name : "applications-other"); sn_launcher_context_initiate (sn_launcher, g_get_prgname (), argv[0], CurrentTime); - /* setup the child environment */ - if (G_LIKELY (envp == NULL)) - envp = (gchar **) environ; - for (n = 0; envp[n] != NULL; ++n) - ; - sn_envp = g_new (gchar *, n + 2); - for (n = m = 0; envp[n] != NULL; ++n) - if (strncmp (envp[n], "DESKTOP_STARTUP_ID", 18) != 0) - sn_envp[m++] = g_strdup (envp[n]); - sn_envp[m++] = g_strconcat ("DESKTOP_STARTUP_ID=", sn_launcher_context_get_startup_id (sn_launcher), NULL); - sn_envp[m] = NULL; + /* add the real startup id to the child environment */ + cenvp[n_cenvp++] = g_strconcat ("DESKTOP_STARTUP_ID=", sn_launcher_context_get_startup_id (sn_launcher), NULL); /* we want to watch the child process */ flags |= G_SPAWN_DO_NOT_REAP_CHILD; @@ -484,7 +490,7 @@ thunar_vfs_exec_on_screen (GdkScreen *screen, #endif /* try to spawn the new process */ - succeed = gdk_spawn_on_screen (screen, working_directory, argv, sn_envp, flags, NULL, NULL, &pid, error); + succeed = g_spawn_async (working_directory, argv, cenvp, flags, NULL, NULL, &pid, error); #ifdef HAVE_LIBSTARTUP_NOTIFICATION /* handle the sn launcher context */ @@ -513,9 +519,8 @@ thunar_vfs_exec_on_screen (GdkScreen *screen, sn_display_unref (sn_display); #endif - /* release the environment */ - if (G_UNLIKELY (sn_envp != envp)) - g_strfreev (sn_envp); + /* release the child environment */ + g_strfreev (cenvp); return succeed; }