[GApplication] Add working directory to platform data

https://bugzilla.gnome.org/show_bug.cgi?id=621838
This commit is contained in:
Colin Walters 2010-06-16 14:17:26 -04:00
parent 6ff13071ae
commit 8f5bde679e
3 changed files with 67 additions and 16 deletions

View File

@ -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().
*
* </para>
* <para>
* The <methodname>InvokeAction</methodname> 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:

View File

@ -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,

View File

@ -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