[gnome-flashback] rewrite GfSession



commit 1be6e1fe1ca97611ee58e5ad2bceac06c2b2ef33
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Sep 6 01:28:37 2015 +0300

    rewrite GfSession

 gnome-flashback/gf-main.c    |  167 ++++++++-----
 gnome-flashback/gf-session.c |  534 +++++++++++++++++++++---------------------
 gnome-flashback/gf-session.h |   53 +++--
 3 files changed, 402 insertions(+), 352 deletions(-)
---
diff --git a/gnome-flashback/gf-main.c b/gnome-flashback/gf-main.c
index 36e3051..7636e51 100644
--- a/gnome-flashback/gf-main.c
+++ b/gnome-flashback/gf-main.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Alberts Muktupāvels
+ * Copyright (C) 2014 - 2015 Alberts Muktupāvels
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,109 +20,146 @@
 #include <glib-unix.h>
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
+#include <stdlib.h>
 
 #include "flashback-application.h"
 #include "gf-session.h"
 
+static GMainLoop *loop = NULL;
+static FlashbackApplication *application = NULL;
+
+static gboolean debug = FALSE;
 static gboolean initialize = FALSE;
 static gboolean replace = FALSE;
 
-static GOptionEntry entries[] = {
-       {
-               "initialize", 0, G_OPTION_FLAG_NONE,
-               G_OPTION_ARG_NONE, &initialize,
-               N_("Initialize GNOME Flashback session"),
-               NULL
-       },
-       {
-               "replace", 'r', G_OPTION_FLAG_NONE,
-               G_OPTION_ARG_NONE, &replace,
-               N_("Replace a currently running application"),
-               NULL
-       },
-       {
-               NULL
-       }
+static GOptionEntry entries[] =
+{
+  {
+    "debug", 0, G_OPTION_FLAG_NONE,
+    G_OPTION_ARG_NONE, &debug,
+    N_("Enable debugging code"),
+    NULL
+  },
+  {
+    "initialize", 0, G_OPTION_FLAG_NONE,
+    G_OPTION_ARG_NONE, &initialize,
+    N_("Initialize GNOME Flashback session"),
+    NULL
+  },
+  {
+    "replace", 'r', G_OPTION_FLAG_NONE,
+    G_OPTION_ARG_NONE, &replace,
+    N_("Replace a currently running application"),
+    NULL
+  },
+  {
+    NULL
+  }
 };
 
 static gboolean
-parse_context_options (int *argc, char ***argv)
+parse_arguments (int    *argc,
+                 char ***argv)
 {
-       GError *error;
-       GOptionContext *context;
+  GOptionContext *context;
+  GOptionGroup *gtk_group;
+  GError *error;
 
-       error = NULL;
-       context = g_option_context_new (NULL);
+  context = g_option_context_new (NULL);
+  gtk_group = gtk_get_option_group (FALSE);
 
-       g_option_context_add_main_entries (context, entries, NULL);
-       g_option_context_add_group (context, gtk_get_option_group (FALSE));
+  g_option_context_add_main_entries (context, entries, NULL);
+  g_option_context_add_group (context, gtk_group);
 
-       if (!g_option_context_parse (context, argc, argv, &error)) {
-               if (error != NULL) {
-                       g_warning ("%s", error->message);
-                       g_error_free (error);
-               }
+  error = NULL;
+  if (g_option_context_parse (context, argc, argv, &error) == FALSE)
+    {
+      g_warning ("Failed to parse command line arguments: %s", error->message);
+      g_error_free (error);
 
-               return FALSE;
-       }
+      return FALSE;
+    }
 
-       g_option_context_free (context);
+  if (debug)
+    g_setenv ("G_MESSAGES_DEBUG", "all", FALSE);
 
-       return TRUE;
+  return TRUE;
+}
+
+static void
+main_loop_quit (void)
+{
+  if (application != NULL)
+    g_clear_object (&application);
+
+  g_main_loop_quit (loop);
 }
 
 static gboolean
 on_term_signal (gpointer user_data)
 {
-        gtk_main_quit ();
+  main_loop_quit ();
 
-        return FALSE;
+  return G_SOURCE_REMOVE;
 }
 
 static gboolean
 on_int_signal (gpointer user_data)
 {
-        gtk_main_quit ();
+  main_loop_quit ();
 
-        return FALSE;
+  return G_SOURCE_REMOVE;
 }
 
-int
-main (int argc, char *argv[])
+static void
+session_ready_cb (GfSession *session,
+                  gpointer   user_data)
 {
-       FlashbackApplication *application;
-       FlashbackSession *session;
+  g_unix_signal_add (SIGTERM, on_term_signal, NULL);
+  g_unix_signal_add (SIGINT, on_int_signal, NULL);
+
+  if (initialize)
+    {
+      gf_session_set_environment (session, "XDG_MENU_PREFIX", "gnome-flashback-");
+      gf_session_register (session);
+
+      g_main_loop_quit (loop);
+    }
+  else
+    {
+      application = flashback_application_new ();
+      gf_session_register (session);
+    }
+}
 
-       g_set_prgname ("gnome-flashback");
+static void
+session_end_cb (GfSession *session,
+                gpointer   user_data)
+{
+  main_loop_quit ();
+}
 
-       bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
-       bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-       textdomain (GETTEXT_PACKAGE);
+int
+main (int argc, char *argv[])
+{
+  GfSession *session;
 
-       gtk_init (&argc, &argv);
+  bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
+  bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+  textdomain (GETTEXT_PACKAGE);
 
-       g_unix_signal_add (SIGTERM, on_term_signal, NULL);
-       g_unix_signal_add (SIGINT, on_int_signal, NULL);
+  gtk_init (&argc, &argv);
 
-       if (!parse_context_options (&argc, &argv))
-               return 1;
+  if (!parse_arguments (&argc, &argv))
+    return EXIT_FAILURE;
 
-       session = flashback_session_new (replace);
-       if (session == NULL)
-               return 1;
+  loop = g_main_loop_new (NULL, FALSE);
+  session = gf_session_new (replace, session_ready_cb, session_end_cb, NULL);
 
-       if (initialize) {
-               flashback_session_set_environment (session, "XDG_MENU_PREFIX", "gnome-flashback-");
-               flashback_session_register_client (session);
-       } else {
-               application = flashback_application_new ();
-               flashback_session_register_client (session);
-               gtk_main ();
-       }
+  g_main_loop_run (loop);
 
-       if (!initialize)
-               g_object_unref (application);
-       g_object_unref (session);
+  g_object_unref (session);
+  g_main_loop_unref (loop);
 
-       return 0;
+  return EXIT_SUCCESS;
 }
diff --git a/gnome-flashback/gf-session.c b/gnome-flashback/gf-session.c
index 46e4f68..4e4bdfb 100644
--- a/gnome-flashback/gf-session.c
+++ b/gnome-flashback/gf-session.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Alberts Muktupāvels
+ * Copyright (C) 2014 - 2015 Alberts Muktupāvels
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,327 +17,339 @@
 
 #include "config.h"
 
-#include <dbus/dbus-glib.h>
-#include <gtk/gtk.h>
+#include <gio/gio.h>
 
 #include "gf-session.h"
 
-#define FLASHBACK_DBUS_SERVICE "org.gnome.Flashback"
+#define GF_DBUS_NAME "org.gnome.Flashback"
 
-#define SESSION_MANAGER_NAME      "org.gnome.SessionManager"
-#define SESSION_MANAGER_PATH      "/org/gnome/SessionManager"
-#define SESSION_MANAGER_INTERFACE "org.gnome.SessionManager"
+#define GSM_DBUS_NAME  "org.gnome.SessionManager"
+#define GSM_DBUS_PATH  "/org/gnome/SessionManager"
+#define GSM_DBUS_IFACE "org.gnome.SessionManager"
 
-#define SESSION_MANAGER_CLIENT_PRIVATE_INTERFACE "org.gnome.SessionManager.ClientPrivate"
+#define GSM_CLIENT_PRIVATE_DBUS_IFACE "org.gnome.SessionManager.ClientPrivate"
 
-struct _FlashbackSessionPrivate {
-       GDBusConnection *connection;
-       guint            name_lost_id;
+struct _GfSession
+{
+  GObject                 parent;
+
+  GfSessionReadyCallback  ready_cb;
+  GfSessionEndCallback    end_cb;
+  gpointer                user_data;
+
+  gulong                  name_id;
 
-       GDBusProxy      *session_manager_proxy;
+  GDBusProxy             *manager_proxy;
 
-       gchar           *object_path;
-       GDBusProxy      *client_proxy;
+  gchar                  *object_path;
+  GDBusProxy             *client_proxy;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (FlashbackSession, flashback_session, G_TYPE_OBJECT)
+G_DEFINE_TYPE (GfSession, gf_session, G_TYPE_OBJECT)
 
 static void
 respond_to_end_session (GDBusProxy *proxy)
 {
-       g_dbus_proxy_call (proxy,
-                          "EndSessionResponse",
-                          g_variant_new ("(bs)", TRUE, ""),
-                          G_DBUS_CALL_FLAGS_NONE,
-                          -1,
-                          NULL,
-                          NULL,
-                          NULL);
+  GVariant *parameters;
+
+  parameters = g_variant_new ("(bs)", TRUE, "");
+
+  g_dbus_proxy_call (proxy,
+                     "EndSessionResponse", parameters,
+                     G_DBUS_CALL_FLAGS_NONE,
+                     -1, NULL, NULL, NULL);
 }
 
 static void
-flashback_session_client_proxy_signal_cb (GDBusProxy *proxy,
-                                          gchar      *sender_name,
-                                          gchar      *signal_name,
-                                          GVariant   *parameters,
-                                          gpointer    user_data)
+g_signal_cb (GDBusProxy *proxy,
+             gchar      *sender_name,
+             gchar      *signal_name,
+             GVariant   *parameters,
+             gpointer    user_data)
 {
-       if (g_str_equal (signal_name, "QueryEndSession"))
-               respond_to_end_session (proxy);
-       else if (g_str_equal (signal_name, "EndSession"))
-               respond_to_end_session (proxy);
-       else if (g_str_equal (signal_name, "Stop"))
-               gtk_main_quit ();
+  GfSession *session;
+
+  session = GF_SESSION (user_data);
+
+  if (g_strcmp0 (signal_name, "QueryEndSession") == 0)
+    {
+      respond_to_end_session (proxy);
+    }
+  else if (g_strcmp0 (signal_name, "EndSession") == 0)
+    {
+      respond_to_end_session (proxy);
+    }
+  else if (g_strcmp0 (signal_name, "Stop") == 0)
+    {
+      if (session->end_cb != NULL)
+        session->end_cb (session, session->user_data);
+    }
 }
 
-static gboolean
-flashback_session_get_session_manager_proxy (FlashbackSession *session)
+static void
+client_proxy_ready_cb (GObject      *source_object,
+                       GAsyncResult *res,
+                       gpointer      user_data)
 {
-       FlashbackSessionPrivate *priv;
-       GError *error;
-       GDBusProxyFlags flags;
-
-       if (!session)
-               return FALSE;
-
-       priv = session->priv;
-       error = NULL;
-       flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
-               G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS;
-
-       priv->session_manager_proxy = g_dbus_proxy_new_sync (priv->connection,
-                                                            flags,
-                                                            NULL,
-                                                            SESSION_MANAGER_NAME,
-                                                            SESSION_MANAGER_PATH,
-                                                            SESSION_MANAGER_INTERFACE,
-                                                            NULL,
-                                                            &error);
-
-       if (error) {
-               g_warning ("Failed to get session manager proxy: %s", error->message);
-               g_error_free (error);
-               return FALSE;
-       }
-
-       return TRUE;
+  GfSession *session;
+  GError *error;
+
+  session = GF_SESSION (user_data);
+
+  error = NULL;
+  session->client_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+
+  if (error != NULL)
+    {
+      g_warning ("Failed to get a client proxy: %s", error->message);
+      g_error_free (error);
+
+      return;
+    }
+
+  g_signal_connect (session->client_proxy, "g-signal",
+                    G_CALLBACK (g_signal_cb), session);
 }
 
 static void
-flashback_session_name_lost (GDBusConnection *connection,
-                             const gchar     *sender_name,
-                             const gchar     *object_path,
-                             const gchar     *interface_name,
-                             const gchar     *signal_name,
-                             GVariant        *parameters,
-                             gpointer         user_data)
+manager_proxy_ready_cb (GObject      *source_object,
+                        GAsyncResult *res,
+                        gpointer      user_data)
 {
-       gtk_main_quit ();
+  GfSession *session;
+  GError *error;
+
+  session = GF_SESSION (user_data);
+
+  error = NULL;
+  session->manager_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+
+  if (error != NULL)
+    {
+      g_warning ("Failed to get session manager proxy: %s", error->message);
+      g_error_free (error);
+
+      if (session->end_cb != NULL)
+        session->end_cb (session, session->user_data);
+
+      return;
+    }
+
+  if (session->ready_cb != NULL)
+    session->ready_cb (session, session->user_data);
 }
 
-static gboolean
-flashback_session_request_name (FlashbackSession *session,
-                                gboolean          replace)
+static void
+name_acquired_cb (GDBusConnection *connection,
+                  const gchar     *name,
+                  gpointer         user_data)
 {
-       FlashbackSessionPrivate *priv;
-       GBusNameOwnerFlags flags;
-       GError *error;
-       GVariant *result;
-       guint32 reply;
-
-       priv = session->priv;
-       flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT;
-       error = NULL;
-
-       priv->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
-
-       if (error) {
-               g_warning ("Failed to get session bus: %s", error->message);
-               g_error_free (error);
-               return FALSE;
-       }
-
-       if (replace)
-               flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE;
-
-       result = g_dbus_connection_call_sync (priv->connection,
-                                             DBUS_SERVICE_DBUS,
-                                             DBUS_PATH_DBUS,
-                                             DBUS_INTERFACE_DBUS,
-                                             "RequestName",
-                                             g_variant_new ("(su)",
-                                                            FLASHBACK_DBUS_SERVICE,
-                                                            flags),
-                                             G_VARIANT_TYPE ("(u)"),
-                                             G_DBUS_CALL_FLAGS_NONE,
-                                             -1,
-                                             NULL,
-                                             &error);
-
-       if (error) {
-               g_warning ("Failed to request name: %s", error->message);
-               g_error_free (error);
-               return FALSE;
-       }
-
-       g_variant_get (result, "(u)", &reply);
-       g_variant_unref (result);
-
-       switch (reply) {
-               case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
-               case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
-                       priv->name_lost_id = g_dbus_connection_signal_subscribe (priv->connection,
-                                                                                DBUS_SERVICE_DBUS,
-                                                                                DBUS_INTERFACE_DBUS,
-                                                                                "NameLost",
-                                                                                DBUS_PATH_DBUS,
-                                                                                FLASHBACK_DBUS_SERVICE,
-                                                                                G_DBUS_SIGNAL_FLAGS_NONE,
-                                                                                (GDBusSignalCallback) 
flashback_session_name_lost,
-                                                                                session,
-                                                                                NULL);
-                       break;
-               case DBUS_REQUEST_NAME_REPLY_IN_QUEUE:
-               case DBUS_REQUEST_NAME_REPLY_EXISTS:
-                       g_warning ("Failed to request name: the name already has an owner");
-                       return FALSE;
-               default:
-                       g_warning ("Failed to request name: unhandled reply %u from RequestName", reply);
-                       return FALSE;
-       }
-
-       return TRUE;
+  GDBusProxyFlags flags;
+
+  flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
+          G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS;
+
+  g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, flags, NULL,
+                            GSM_DBUS_NAME, GSM_DBUS_PATH, GSM_DBUS_IFACE,
+                            NULL, manager_proxy_ready_cb, user_data);
 }
 
 static void
-flashback_session_finalize (GObject *object)
+name_lost_cb (GDBusConnection *connection,
+              const gchar     *name,
+              gpointer         user_data)
 {
-       FlashbackSession *session;
-       FlashbackSessionPrivate *priv;
+  GfSession *session;
+
+  session = GF_SESSION (user_data);
 
-       session = FLASHBACK_SESSION (object);
-       priv = session->priv;
+  if (session->end_cb != NULL)
+    session->end_cb (session, session->user_data);
+}
 
-       if (priv->object_path != NULL) {
-               g_free (priv->object_path);
-               priv->object_path = NULL;
-       }
+static void
+gf_session_dispose (GObject *object)
+{
+  GfSession *session;
 
-       g_clear_object (&priv->client_proxy);
-       g_clear_object (&priv->session_manager_proxy);
+  session = GF_SESSION (object);
 
-       if (priv->name_lost_id > 0) {
-               g_dbus_connection_signal_unsubscribe (priv->connection, priv->name_lost_id);
-               priv->name_lost_id = 0;
-       }
+  if (session->name_id > 0)
+    {
+      g_bus_unown_name (session->name_id);
+      session->name_id = 0;
+    }
 
-       g_clear_object (&priv->connection);
+  g_clear_object (&session->manager_proxy);
+  g_clear_object (&session->client_proxy);
 
-       G_OBJECT_CLASS (flashback_session_parent_class)->finalize (object);
+  G_OBJECT_CLASS (gf_session_parent_class)->dispose (object);
 }
 
 static void
-flashback_session_class_init (FlashbackSessionClass *class)
+gf_session_finalize (GObject *object)
 {
-       GObjectClass *object_class;
+  GfSession *session;
 
-       object_class = G_OBJECT_CLASS (class);
+  session = GF_SESSION (object);
 
-       object_class->finalize = flashback_session_finalize;
+  g_free (session->object_path);
+
+  G_OBJECT_CLASS (gf_session_parent_class)->finalize (object);
+}
+
+static void
+gf_session_class_init (GfSessionClass *session_class)
+{
+  GObjectClass *object_class;
+
+  object_class = G_OBJECT_CLASS (session_class);
+
+  object_class->dispose = gf_session_dispose;
+  object_class->finalize = gf_session_finalize;
 }
 
 static void
-flashback_session_init (FlashbackSession *session)
+gf_session_init (GfSession *session)
 {
-       session->priv = flashback_session_get_instance_private (session);
 }
 
-FlashbackSession *
-flashback_session_new (gboolean replace)
+/**
+ * gf_session_new:
+ * @replace: %TRUE to replace current session
+ * @ready_cb:
+ * @end_cb:
+ * @user_data: user data
+ *
+ * Creates a new #GfSession.
+ *
+ * Returns: (transfer full): a newly created #GfSession.
+ */
+GfSession *
+gf_session_new (gboolean                replace,
+                GfSessionReadyCallback  ready_cb,
+                GfSessionEndCallback    end_cb,
+                gpointer                user_data)
 {
-       FlashbackSession *session;
+  GfSession *session;
+  GBusNameOwnerFlags flags;
+
+  session = g_object_new (GF_TYPE_SESSION, NULL);
 
-       session = g_object_new (FLASHBACK_TYPE_SESSION, NULL);
+  session->ready_cb = ready_cb;
+  session->end_cb = end_cb;
+  session->user_data = user_data;
 
-       if (!flashback_session_request_name (session, replace))
-               g_clear_object (&session);
+  flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT;
+  if (replace)
+    flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE;
 
-       if (!flashback_session_get_session_manager_proxy (session))
-               g_clear_object (&session);
+  session->name_id = g_bus_own_name (G_BUS_TYPE_SESSION, GF_DBUS_NAME, flags,
+                                     NULL, name_acquired_cb, name_lost_cb,
+                                     session, NULL);
 
-       return session;
+  return session;
 }
 
+/**
+ * gf_session_set_environment:
+ * @session: a #GfSession
+ * @name: the variable name
+ * @value: the value
+ *
+ * Set environment variable to specified value. May only be used during the
+ * Session Manager initialization phase.
+ *
+ * Returns: %TRUE if environment was set, %FALSE otherwise.
+ */
 gboolean
-flashback_session_set_environment (FlashbackSession *session,
-                                   const gchar      *name,
-                                   const gchar      *value)
+gf_session_set_environment (GfSession   *session,
+                            const gchar *name,
+                            const gchar *value)
 {
-       GError *error;
-       GVariant *parameters;
-       GVariant *res;
-
-       error = NULL;
-       parameters = g_variant_new ("(ss)", name, value);
-       res = g_dbus_proxy_call_sync (session->priv->session_manager_proxy,
-                                     "Setenv",
-                                     parameters,
-                                     G_DBUS_CALL_FLAGS_NONE,
-                                     -1,
-                                     NULL,
-                                     &error);
-
-       if (error) {
-               g_debug ("Failed to set the environment: %s", error->message);
-               g_error_free (error);
-               return FALSE;
-       }
-
-       g_variant_unref (res);
-
-       return TRUE;
+  GVariant *parameters;
+  GError *error;
+  GVariant *variant;
+
+  parameters = g_variant_new ("(ss)", name, value);
+
+  error = NULL;
+  variant = g_dbus_proxy_call_sync (session->manager_proxy,
+                                    "Setenv", parameters,
+                                    G_DBUS_CALL_FLAGS_NONE,
+                                    -1, NULL, &error);
+
+  if (error != NULL)
+    {
+      g_warning ("Failed to set the environment: %s", error->message);
+      g_error_free (error);
+
+      return FALSE;
+    }
+
+  g_variant_unref (variant);
+
+  return TRUE;
 }
 
+/**
+ * gf_session_register:
+ * @session: a #GfSession
+ *
+ * Register as a Session Management client.
+ *
+ * Returns: %TRUE if we have registered as client, %FALSE otherwise.
+ */
 gboolean
-flashback_session_register_client (FlashbackSession *session)
+gf_session_register (GfSession *session)
 {
-       FlashbackSessionPrivate *priv;
-       GError *error;
-       const gchar *app_id;
-       const gchar *client_startup_id;
-       gchar *startup_id;
-       GVariant *parameters;
-       GVariant *res;
-
-       priv = session->priv;
-       error = NULL;
-       app_id = "gnome-flashback";
-       client_startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
-
-       if (client_startup_id != NULL) {
-               startup_id = g_strdup (client_startup_id);
-               g_unsetenv ("DESKTOP_AUTOSTART_ID");
-       } else {
-               startup_id = g_strdup ("");
-       }
-
-       parameters = g_variant_new ("(ss)", app_id, startup_id);
-       g_free (startup_id);
-
-       res = g_dbus_proxy_call_sync (priv->session_manager_proxy,
-                                     "RegisterClient",
-                                     parameters,
-                                     G_DBUS_CALL_FLAGS_NONE,
-                                     -1,
-                                     NULL,
-                                     &error);
-
-       if (error) {
-               g_warning ("Failed to register client: %s", error->message);
-               g_error_free (error);
-               return FALSE;
-       }
-
-       g_variant_get (res, "(o)", &priv->object_path);
-       g_variant_unref (res);
-
-       priv->client_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
-                                                           G_DBUS_PROXY_FLAGS_NONE,
-                                                           NULL,
-                                                           SESSION_MANAGER_NAME,
-                                                           priv->object_path,
-                                                           SESSION_MANAGER_CLIENT_PRIVATE_INTERFACE,
-                                                           NULL,
-                                                           &error);
-
-       if (error) {
-               g_warning ("Failed to get a client proxy: %s", error->message);
-               g_error_free (error);
-               return FALSE;
-       }
-
-       g_signal_connect (priv->client_proxy, "g-signal",
-                         G_CALLBACK (flashback_session_client_proxy_signal_cb), session);
-
-       return TRUE;
+  const gchar *app_id;
+  const gchar *autostart_id;
+  gchar *client_startup_id;
+  GVariant *parameters;
+  GError *error;
+  GVariant *variant;
+  GDBusProxyFlags flags;
+
+  app_id = "gnome-flashback";
+  autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID");
+
+  if (autostart_id != NULL)
+    {
+      client_startup_id = g_strdup (autostart_id);
+      g_unsetenv ("DESKTOP_AUTOSTART_ID");
+    }
+  else
+    {
+      client_startup_id = g_strdup ("");
+    }
+
+  parameters = g_variant_new ("(ss)", app_id, client_startup_id);
+  g_free (client_startup_id);
+
+  error = NULL;
+  variant = g_dbus_proxy_call_sync (session->manager_proxy,
+                                    "RegisterClient", parameters,
+                                    G_DBUS_CALL_FLAGS_NONE,
+                                    -1, NULL, &error);
+
+  if (error != NULL)
+    {
+      g_warning ("Failed to register client: %s", error->message);
+      g_error_free (error);
+
+      return FALSE;
+    }
+
+  g_variant_get (variant, "(o)", &session->object_path);
+  g_variant_unref (variant);
+
+  flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES;
+
+  g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, flags, NULL,
+                            GSM_DBUS_NAME, session->object_path,
+                            GSM_CLIENT_PRIVATE_DBUS_IFACE,
+                            NULL, client_proxy_ready_cb, session);
+
+  return TRUE;
 }
diff --git a/gnome-flashback/gf-session.h b/gnome-flashback/gf-session.h
index cfe9dc8..e48eb7c 100644
--- a/gnome-flashback/gf-session.h
+++ b/gnome-flashback/gf-session.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Alberts Muktupāvels
+ * Copyright (C) 2014 - 2015 Alberts Muktupāvels
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -15,41 +15,42 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef FLASHBACK_SESSION_H
-#define FLASHBACK_SESSION_H
+#ifndef GF_SESSION_H
+#define GF_SESSION_H
 
 #include <glib-object.h>
 
 G_BEGIN_DECLS
 
-#define FLASHBACK_TYPE_SESSION         (flashback_session_get_type ())
-#define FLASHBACK_SESSION(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), FLASHBACK_TYPE_SESSION, 
FlashbackSession))
-#define FLASHBACK_IS_SESSION(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), FLASHBACK_TYPE_SESSION))
-#define FLASHBACK_SESSION_CLASS(c)     (G_TYPE_CHECK_CLASS_CAST ((c),    FLASHBACK_TYPE_SESSION, 
FlashbackSessionClass))
-#define FLASHBACK_IS_SESSION_CLASS(c)  (G_TYPE_CHECK_CLASS_TYPE ((c),    FLASHBACK_TYPE_SESSION))
-#define FLASHBACK_SESSION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),  FLASHBACK_TYPE_SESSION, 
FlashbackSessionClass))
+#define GF_TYPE_SESSION gf_session_get_type ()
+G_DECLARE_FINAL_TYPE (GfSession, gf_session, GF, SESSION, GObject)
 
-typedef struct _FlashbackSession        FlashbackSession;
-typedef struct _FlashbackSessionClass   FlashbackSessionClass;
-typedef struct _FlashbackSessionPrivate FlashbackSessionPrivate;
-
-struct _FlashbackSession {
-       GObject                  parent;
-       FlashbackSessionPrivate *priv;
-};
+/**
+ * GfSessionReadyCallback:
+ * @session: a #GfSession
+ * @user_data: user data
+ */
+typedef void (*GfSessionReadyCallback) (GfSession *session,
+                                        gpointer   user_data);
 
-struct _FlashbackSessionClass {
-       GObjectClass parent_class;
-};
+/**
+ * GfSessionEndCallback:
+ * @session: a #GfSession
+ * @user_data: user data
+ */
+typedef void (*GfSessionEndCallback) (GfSession *session,
+                                      gpointer   user_data);
 
-GType             flashback_session_get_type        (void);
+GfSession *gf_session_new             (gboolean                replace,
+                                       GfSessionReadyCallback  ready_cb,
+                                       GfSessionEndCallback    end_cb,
+                                       gpointer                user_data);
 
-FlashbackSession *flashback_session_new             (gboolean          replace);
+gboolean   gf_session_set_environment (GfSession              *session,
+                                       const gchar            *name,
+                                       const gchar            *value);
 
-gboolean          flashback_session_set_environment (FlashbackSession *session,
-                                                     const gchar      *name,
-                                                     const gchar      *value);
-gboolean          flashback_session_register_client (FlashbackSession *session);
+gboolean   gf_session_register        (GfSession              *session);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]