source-dialog: use DBus to spawn Control Center

In a Flatpak'd world, we cannot rely on the fact that
gnome-control-center binary will be installed at the
app's sandbox. But since it's a core app, we can rely
on the fact that it's available outside the sandbox.

To make it work, use DBus rather than raw spawn to
open control center.
This commit is contained in:
Georges Basile Stavracas Neto
2017-05-17 09:03:24 -03:00
parent dde6b5bf05
commit 05af332937
+62 -8
View File
@@ -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