diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c index b9efe0f2..f6c543ba 100644 --- a/src/gcal-source-dialog.c +++ b/src/gcal-source-dialog.c @@ -220,6 +220,10 @@ static void stack_visible_child_name_changed (GObject *ob static void settings_button_clicked (GtkWidget *button, gpointer user_data); + +static void spawn_goa_with_args (const gchar *action, + const gchar *arg); + static gboolean pulse_web_entry (GcalSourceDialog *dialog); static void url_entry_text_changed (GObject *object, @@ -495,9 +499,7 @@ description_label_link_activated (GtkWidget *widget, gchar *uri, gpointer user_data) { - const gchar* const command[] = { "gnome-control-center", "online-accounts", NULL }; - g_spawn_async (NULL, (gchar**) command, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL); - + spawn_goa_with_args (NULL, NULL); return TRUE; } @@ -640,15 +642,67 @@ name_entry_text_changed (GObject *object, e_source_set_display_name (self->source, gtk_entry_get_text (GTK_ENTRY (self->name_entry))); } +static GVariant* +build_dbus_parameters (const gchar *action, + const gchar *arg) +{ + GVariantBuilder builder; + GVariant *array[1], *params2[3]; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("av")); + + if (!action && !arg) + { + g_variant_builder_add (&builder, "v", g_variant_new_string ("")); + } + else + { + if (action) + g_variant_builder_add (&builder, "v", g_variant_new_string (action)); + + if (arg) + g_variant_builder_add (&builder, "v", g_variant_new_string (arg)); + } + + array[0] = g_variant_new ("v", g_variant_new ("(sav)", "online-accounts", &builder)); + + params2[0] = g_variant_new_string ("launch-panel"); + params2[1] = g_variant_new_array (G_VARIANT_TYPE ("v"), array, 1); + params2[2] = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0); + + return g_variant_new_tuple (params2, 3); +} + static void spawn_goa_with_args (const gchar *action, const gchar *arg) { - const gchar* const command[] = { "gnome-control-center", "online-accounts", action, arg, NULL }; - g_spawn_async (NULL, (gchar**) command, - NULL, - G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL, - NULL, NULL, NULL, NULL); + GDBusProxy *proxy; + + proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.gnome.ControlCenter", + "/org/gnome/ControlCenter", + "org.gtk.Actions", + NULL, + NULL); + + if (!proxy) + { + g_warning ("Couldn't open Online Accounts panel"); + return; + } + + g_dbus_proxy_call_sync (proxy, + "Activate", + build_dbus_parameters (action, arg), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + NULL); + + g_clear_object (&proxy); } static void