[gnome-calendar/gnome-3-24] source-dialog: use DBus to spawn Control Center
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/gnome-3-24] source-dialog: use DBus to spawn Control Center
- Date: Fri, 9 Jun 2017 02:42:36 +0000 (UTC)
commit 59c8802a5b36f2dc206820226e69bd6816729e47
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Wed May 17 09:03:24 2017 -0300
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.
src/gcal-source-dialog.c | 70 ++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 62 insertions(+), 8 deletions(-)
---
diff --git a/src/gcal-source-dialog.c b/src/gcal-source-dialog.c
index 9eb41bc..88189be 100644
--- a/src/gcal-source-dialog.c
+++ b/src/gcal-source-dialog.c
@@ -207,6 +207,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,
@@ -515,9 +519,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;
}
@@ -685,15 +687,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);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]