[gnome-calendar/gnome-3-24] source-dialog: use DBus to spawn Control Center



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]