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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user