diff --git a/gio/gapplication.c b/gio/gapplication.c index 31964ec0e..25a2cc419 100644 --- a/gio/gapplication.c +++ b/gio/gapplication.c @@ -131,11 +131,12 @@ * application instance when a second instance fails to take the bus name. * @arguments contains the commandline arguments given to the second instance * and @data contains platform-specific additional data. - * - * On all platforms, @data is guaranteed to have a key "cwd" of type - * signature "ay" which contains the working directory of the invoked - * executable. - * + * + * On all platforms, @data will have a key "cwd" of type signature + * "ay" which contains the working directory of the invoked + * executable; this data is defined to be in the default GLib + * filesystem encoding for the platform. See g_filename_to_utf8(). + * * * * The InvokeAction function can be called to @@ -318,6 +319,38 @@ g_application_default_run (GApplication *application) g_main_loop_run (application->priv->mainloop); } +static GVariant * +append_cwd_to_platform_data (GVariant *platform_data) +{ + GVariantBuilder builder; + gchar *cwd; + GVariant *result; + + cwd = g_get_current_dir (); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + if (cwd) + g_variant_builder_add (&builder, "{sv}", + "cwd", + g_variant_new_byte_array (cwd, -1)); + g_free (cwd); + + if (platform_data) + { + GVariantIter iter; + GVariant *item; + + g_variant_iter_init (&iter, platform_data); + while (g_variant_iter_next (&iter, "@{sv}", &item)) + { + g_variant_builder_add_value (&builder, item); + g_variant_unref (item); + } + } + result = g_variant_builder_end (&builder); + return result; +} + static GVariant * variant_from_argv (int argc, char **argv) @@ -976,6 +1009,7 @@ g_application_init (GApplication *app) app->priv->default_quit = TRUE; app->priv->do_register = TRUE; app->priv->is_remote = TRUE; + app->priv->platform_data = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0); } static void @@ -1045,7 +1079,12 @@ g_application_set_property (GObject *object, break; case PROP_PLATFORM_DATA: - app->priv->platform_data = g_value_dup_variant (value); + { + GVariant *platform_data = g_value_get_variant (value); + if (app->priv->platform_data) + g_variant_unref (app->priv->platform_data); + app->priv->platform_data = g_variant_ref_sink (append_cwd_to_platform_data (platform_data)); + } break; default: diff --git a/gio/gdbusapplication.c b/gio/gdbusapplication.c index 39f46ed30..e376c04bb 100644 --- a/gio/gdbusapplication.c +++ b/gio/gdbusapplication.c @@ -346,16 +346,8 @@ _g_application_platform_register (GApplication *app, GVariant *result; g_variant_builder_init (&builder, G_VARIANT_TYPE ("(aaya{sv})")); - g_variant_builder_add (&builder, "@aay", app->priv->argv); - - if (app->priv->platform_data) - g_variant_builder_add (&builder, "@a{sv}", app->priv->platform_data); - else - { - g_variant_builder_open (&builder, G_VARIANT_TYPE ("a{sv}")); - g_variant_builder_close (&builder); - } - + g_variant_builder_add_value (&builder, app->priv->argv); + g_variant_builder_add_value (&builder, app->priv->platform_data); message = g_variant_builder_end (&builder); result = g_dbus_connection_call_sync (app->priv->session_bus, diff --git a/gio/tests/testapp.c b/gio/tests/testapp.c index 1985698dd..caed83015 100644 --- a/gio/tests/testapp.c +++ b/gio/tests/testapp.c @@ -31,6 +31,26 @@ on_app_activated (GApplication *application, GVariant *args, GVariant *platform_data) { + GVariantIter iter; + const char *key; + GVariant *value; + char *cwd; + + cwd = g_get_current_dir (); + g_variant_iter_init (&iter, platform_data); + while (g_variant_iter_next (&iter, "{&sv}", &key, &value)) + { + const char *activate_cwd; + gsize *len; + if (strcmp (key, "cwd") != 0) + continue; + + activate_cwd = g_variant_get_byte_array (value, &len); + g_assert_cmpstr (cwd, ==, activate_cwd); + g_variant_unref (value); + } + + g_free (cwd); } static gboolean