[gnome-flashback] rewrite GfSession
- From: Alberts MuktupÄvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] rewrite GfSession
- Date: Sun, 6 Sep 2015 20:58:50 +0000 (UTC)
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]