[gnome-flashback] main: redo session handling
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] main: redo session handling
- Date: Sat, 28 Dec 2019 19:12:04 +0000 (UTC)
commit d703ff50f41bc113ec011129293335a53515c526
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Sat Dec 28 20:32:11 2019 +0200
main: redo session handling
gnome-flashback/gf-main.c | 97 ++++++--
gnome-flashback/gf-session.c | 579 ++++++++++++++++++++++++++-----------------
gnome-flashback/gf-session.h | 34 +--
3 files changed, 431 insertions(+), 279 deletions(-)
---
diff --git a/gnome-flashback/gf-main.c b/gnome-flashback/gf-main.c
index 3beeb7f..40015bb 100644
--- a/gnome-flashback/gf-main.c
+++ b/gnome-flashback/gf-main.c
@@ -25,8 +25,12 @@
#include "gf-application.h"
#include "gf-session.h"
-static GMainLoop *loop = NULL;
-static GfApplication *application = NULL;
+typedef struct
+{
+ GMainLoop *loop;
+ GfApplication *application;
+ int exit_status;
+} GfMainData;
static gboolean replace = FALSE;
static gboolean version = FALSE;
@@ -81,18 +85,16 @@ parse_arguments (int *argc,
}
static void
-main_loop_quit (void)
+main_loop_quit (GfMainData *main_data)
{
- if (application != NULL)
- g_clear_object (&application);
-
- g_main_loop_quit (loop);
+ g_clear_object (&main_data->application);
+ g_main_loop_quit (main_data->loop);
}
static gboolean
on_term_signal (gpointer user_data)
{
- main_loop_quit ();
+ main_loop_quit (user_data);
return G_SOURCE_REMOVE;
}
@@ -100,36 +102,63 @@ on_term_signal (gpointer user_data)
static gboolean
on_int_signal (gpointer user_data)
{
- main_loop_quit ();
+ main_loop_quit (user_data);
return G_SOURCE_REMOVE;
}
static void
-session_ready_cb (GfSession *session,
- gpointer user_data)
+name_lost_cb (GfSession *session,
+ gboolean was_acquired,
+ GfMainData *main_data)
+{
+ main_loop_quit (main_data);
+
+ if (was_acquired)
+ return;
+
+ main_data->exit_status = EXIT_FAILURE;
+
+ g_warning ("Failed to acquire bus name!");
+}
+
+static void
+session_ready_cb (GfSession *session,
+ gboolean is_session_running,
+ GfMainData *main_data)
{
- g_unix_signal_add (SIGTERM, on_term_signal, NULL);
- g_unix_signal_add (SIGINT, on_int_signal, NULL);
+ g_unix_signal_add (SIGTERM, on_term_signal, main_data);
+ g_unix_signal_add (SIGINT, on_int_signal, main_data);
+
+ if (!is_session_running)
+ {
+ gf_session_set_environment (session,
+ "XDG_MENU_PREFIX",
+ "gnome-flashback-");
- application = gf_application_new ();
- gf_session_set_environment (session, "XDG_MENU_PREFIX", "gnome-flashback-");
#ifdef HAVE_COMPIZ_SESSION
- gf_session_set_environment (session, "COMPIZ_CONFIG_PROFILE", "gnome-flashback");
+ gf_session_set_environment (session,
+ "COMPIZ_CONFIG_PROFILE",
+ "gnome-flashback");
#endif
+ }
+
+ main_data->application = gf_application_new ();
gf_session_register (session);
}
static void
-session_end_cb (GfSession *session,
- gpointer user_data)
+end_session_cb (GfSession *session,
+ GfMainData *main_data)
{
- main_loop_quit ();
+ main_loop_quit (main_data);
}
int
main (int argc, char *argv[])
{
+ const char *autostart_id;
+ GfMainData main_data;
GfSession *session;
bindtextdomain (GETTEXT_PACKAGE, LOCALE_DIR);
@@ -148,13 +177,33 @@ main (int argc, char *argv[])
return EXIT_SUCCESS;
}
- loop = g_main_loop_new (NULL, FALSE);
- session = gf_session_new (replace, session_ready_cb, session_end_cb, NULL);
+ main_data.exit_status = EXIT_SUCCESS;
+ main_data.loop = g_main_loop_new (NULL, FALSE);
+ main_data.application = NULL;
+
+ autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID");
+ session = gf_session_new (replace, autostart_id != NULL ? autostart_id : "");
+ g_unsetenv ("DESKTOP_AUTOSTART_ID");
+
+ g_signal_connect (session,
+ "name-lost",
+ G_CALLBACK (name_lost_cb),
+ &main_data);
+
+ g_signal_connect (session,
+ "session-ready",
+ G_CALLBACK (session_ready_cb),
+ &main_data);
+
+ g_signal_connect (session,
+ "end-session",
+ G_CALLBACK (end_session_cb),
+ &main_data);
- g_main_loop_run (loop);
+ g_main_loop_run (main_data.loop);
+ g_main_loop_unref (main_data.loop);
g_object_unref (session);
- g_main_loop_unref (loop);
- return EXIT_SUCCESS;
+ return main_data.exit_status;
}
diff --git a/gnome-flashback/gf-session.c b/gnome-flashback/gf-session.c
index 6a505ab..2ceb85f 100644
--- a/gnome-flashback/gf-session.c
+++ b/gnome-flashback/gf-session.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 - 2015 Alberts Muktupāvels
+ * Copyright (C) 2014 - 2019 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
@@ -16,200 +16,328 @@
*/
#include "config.h"
+#include "gf-session.h"
-#include <gio/gio.h>
+#include "dbus/gf-session-manager-gen.h"
+#include "dbus/gf-sm-client-private-gen.h"
-#include "gf-session.h"
+struct _GfSession
+{
+ GObject parent;
-#define GF_DBUS_NAME "org.gnome.Flashback"
+ gboolean replace;
+ char *startup_id;
-#define GSM_DBUS_NAME "org.gnome.SessionManager"
-#define GSM_DBUS_PATH "/org/gnome/SessionManager"
-#define GSM_DBUS_IFACE "org.gnome.SessionManager"
+ guint name_id;
+ gboolean name_acquired;
-#define GSM_CLIENT_PRIVATE_DBUS_IFACE "org.gnome.SessionManager.ClientPrivate"
+ GCancellable *cancellable;
-struct _GfSession
+ GfSessionManagerGen *session_manager;
+
+ char *client_id;
+ GfSmClientPrivateGen *client_private;
+};
+
+enum
{
- GObject parent;
+ PROP_0,
- GfSessionReadyCallback ready_cb;
- GfSessionEndCallback end_cb;
- gpointer user_data;
+ PROP_REPLACE,
+ PROP_STARTUP_ID,
- gulong name_id;
+ LAST_PROP
+};
- GDBusProxy *manager_proxy;
+static GParamSpec *session_properties[LAST_PROP] = { NULL };
- gchar *object_path;
- GDBusProxy *client_proxy;
+enum
+{
+ NAME_LOST,
+
+ SESSION_READY,
+ END_SESSION,
+
+ LAST_SIGNAL
};
+static guint session_signals[LAST_SIGNAL] = { 0 };
+
G_DEFINE_TYPE (GfSession, gf_session, G_TYPE_OBJECT)
-static gboolean
-is_session_running (GfSession *self)
+static void
+respond_to_end_session (GfSession *self)
+{
+ gf_sm_client_private_gen_call_end_session_response (self->client_private,
+ TRUE,
+ "",
+ self->cancellable,
+ NULL,
+ NULL);
+}
+
+static void
+end_session_cb (GfSmClientPrivateGen *object,
+ guint flags,
+ GfSession *self)
+{
+ respond_to_end_session (self);
+}
+
+static void
+query_end_session_cb (GfSmClientPrivateGen *object,
+ guint flags,
+ GfSession *self)
+{
+ respond_to_end_session (self);
+}
+
+static void
+stop_cb (GfSmClientPrivateGen *object,
+ GfSession *self)
+{
+ g_signal_emit (self, session_signals[END_SESSION], 0);
+}
+
+static void
+client_private_ready_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
{
GError *error;
- GVariant *variant;
- gboolean is_session_running;
+ GfSmClientPrivateGen *client_private;
+ GfSession *self;
error = NULL;
- variant = g_dbus_proxy_call_sync (self->manager_proxy,
- "IsSessionRunning", NULL,
- G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, &error);
+ client_private = gf_sm_client_private_gen_proxy_new_for_bus_finish (res,
+ &error);
if (error != NULL)
{
- g_warning ("Failed to check if the session has entered the Running phase: %s",
- error->message);
- g_error_free (error);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Failed to get a client private proxy: %s", error->message);
- return FALSE;
+ g_error_free (error);
+ return;
}
- g_variant_get_child (variant, 0, "b", &is_session_running, NULL);
- g_variant_unref (variant);
+ self = GF_SESSION (user_data);
+ self->client_private = client_private;
+
+ g_signal_connect (self->client_private,
+ "end-session",
+ G_CALLBACK (end_session_cb),
+ self);
- return is_session_running;
+ g_signal_connect (self->client_private,
+ "query-end-session",
+ G_CALLBACK (query_end_session_cb),
+ self);
+
+ g_signal_connect (self->client_private,
+ "stop",
+ G_CALLBACK (stop_cb),
+ self);
}
static void
-respond_to_end_session (GDBusProxy *proxy)
+register_client_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
{
- GVariant *parameters;
+ GError *error;
+ char *client_id;
+ GfSession *self;
- parameters = g_variant_new ("(bs)", TRUE, "");
+ error = NULL;
+ gf_session_manager_gen_call_register_client_finish (GF_SESSION_MANAGER_GEN (source_object),
+ &client_id,
+ res,
+ &error);
+
+ if (error != NULL)
+ {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Failed to register client: %s", error->message);
+
+ g_error_free (error);
+ return;
+ }
+
+ self = GF_SESSION (user_data);
+ self->client_id = client_id;
- g_dbus_proxy_call (proxy,
- "EndSessionResponse", parameters,
- G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, NULL, NULL);
+ gf_sm_client_private_gen_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+ "org.gnome.SessionManager",
+ self->client_id,
+ self->cancellable,
+ client_private_ready_cb,
+ self);
}
static void
-g_signal_cb (GDBusProxy *proxy,
- gchar *sender_name,
- gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
+setenv_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
{
- GfSession *session;
+ GError *error;
- session = GF_SESSION (user_data);
+ error = NULL;
+ gf_session_manager_gen_call_setenv_finish (GF_SESSION_MANAGER_GEN (source_object),
+ res,
+ &error);
- 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 (error != NULL)
{
- if (session->end_cb != NULL)
- session->end_cb (session, session->user_data);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Failed to set the environment: %s", error->message);
+
+ g_error_free (error);
+ return;
}
}
static void
-client_proxy_ready_cb (GObject *source_object,
+is_session_running_cb (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
- GfSession *session;
GError *error;
-
- session = GF_SESSION (user_data);
+ gboolean is_session_running;
+ GfSession *self;
error = NULL;
- session->client_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+ gf_session_manager_gen_call_is_session_running_finish (GF_SESSION_MANAGER_GEN (source_object),
+ &is_session_running,
+ res,
+ &error);
if (error != NULL)
{
- g_warning ("Failed to get a client proxy: %s", error->message);
- g_error_free (error);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ {
+ g_warning ("Failed to check if session has entered the Running phase: %s",
+ error->message);
+ }
+ g_error_free (error);
return;
}
- g_signal_connect (session->client_proxy, "g-signal",
- G_CALLBACK (g_signal_cb), session);
+ self = GF_SESSION (user_data);
+
+ g_signal_emit (self, session_signals[SESSION_READY], 0, is_session_running);
}
static void
-manager_proxy_ready_cb (GObject *source_object,
- GAsyncResult *res,
- gpointer user_data)
+session_manager_ready_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
{
- GfSession *session;
GError *error;
-
- session = GF_SESSION (user_data);
+ GfSessionManagerGen *session_manager;
+ GfSession *self;
error = NULL;
- session->manager_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+ session_manager = gf_session_manager_gen_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);
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Failed to get session manager proxy: %s", error->message);
+ g_error_free (error);
return;
}
- if (session->ready_cb != NULL)
- session->ready_cb (session, session->user_data);
+ self = GF_SESSION (user_data);
+ self->session_manager = session_manager;
+
+ gf_session_manager_gen_call_is_session_running (self->session_manager,
+ self->cancellable,
+ is_session_running_cb,
+ self);
}
static void
name_acquired_cb (GDBusConnection *connection,
- const gchar *name,
+ const char *name,
gpointer user_data)
{
+ GfSession *self;
GDBusProxyFlags flags;
+ self = GF_SESSION (user_data);
+ self->name_acquired = TRUE;
+
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);
+ gf_session_manager_gen_proxy_new_for_bus (G_BUS_TYPE_SESSION,
+ flags,
+ "org.gnome.SessionManager",
+ "/org/gnome/SessionManager",
+ self->cancellable,
+ session_manager_ready_cb,
+ self);
}
static void
name_lost_cb (GDBusConnection *connection,
- const gchar *name,
+ const char *name,
gpointer user_data)
{
- GfSession *session;
+ GfSession *self;
+
+ self = GF_SESSION (user_data);
+
+ g_signal_emit (self, session_signals[NAME_LOST], 0, self->name_acquired);
+}
+
+static void
+gf_session_constructed (GObject *object)
+{
+ GfSession *self;
+ GBusNameOwnerFlags flags;
+
+ self = GF_SESSION (object);
+
+ G_OBJECT_CLASS (gf_session_parent_class)->constructed (object);
- session = GF_SESSION (user_data);
+ flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT;
+ if (self->replace)
+ flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE;
- if (session->end_cb != NULL)
- session->end_cb (session, session->user_data);
+ self->name_id = g_bus_own_name (G_BUS_TYPE_SESSION,
+ "org.gnome.Flashback",
+ flags,
+ NULL,
+ name_acquired_cb,
+ name_lost_cb,
+ self,
+ NULL);
}
static void
gf_session_dispose (GObject *object)
{
- GfSession *session;
+ GfSession *self;
- session = GF_SESSION (object);
+ self = GF_SESSION (object);
- if (session->name_id > 0)
+ if (self->name_id != 0)
{
- g_bus_unown_name (session->name_id);
- session->name_id = 0;
+ g_bus_unown_name (self->name_id);
+ self->name_id = 0;
}
- g_clear_object (&session->manager_proxy);
- g_clear_object (&session->client_proxy);
+ g_cancellable_cancel (self->cancellable);
+ g_clear_object (&self->cancellable);
+
+ g_clear_object (&self->session_manager);
+ g_clear_object (&self->client_private);
G_OBJECT_CLASS (gf_session_parent_class)->dispose (object);
}
@@ -217,166 +345,159 @@ gf_session_dispose (GObject *object)
static void
gf_session_finalize (GObject *object)
{
- GfSession *session;
+ GfSession *self;
- session = GF_SESSION (object);
+ self = GF_SESSION (object);
- g_free (session->object_path);
+ g_clear_pointer (&self->startup_id, g_free);
+ g_clear_pointer (&self->client_id, g_free);
G_OBJECT_CLASS (gf_session_parent_class)->finalize (object);
}
static void
-gf_session_class_init (GfSessionClass *session_class)
+gf_session_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
{
- GObjectClass *object_class;
+ GfSession *self;
- object_class = G_OBJECT_CLASS (session_class);
+ self = GF_SESSION (object);
- object_class->dispose = gf_session_dispose;
- object_class->finalize = gf_session_finalize;
+ switch (property_id)
+ {
+ case PROP_REPLACE:
+ self->replace = g_value_get_boolean (value);
+ break;
+
+ case PROP_STARTUP_ID:
+ self->startup_id = g_value_dup_string (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
}
static void
-gf_session_init (GfSession *session)
+install_properties (GObjectClass *object_class)
{
+ session_properties[PROP_REPLACE] =
+ g_param_spec_boolean ("replace",
+ "replace",
+ "replace",
+ FALSE,
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_WRITABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ session_properties[PROP_STARTUP_ID] =
+ g_param_spec_string ("startup-id",
+ "startup-id",
+ "startup-id",
+ "",
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_WRITABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class,
+ LAST_PROP,
+ session_properties);
}
-/**
- * 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)
+static void
+install_signals (void)
{
- GfSession *session;
- GBusNameOwnerFlags flags;
-
- session = g_object_new (GF_TYPE_SESSION, NULL);
-
- session->ready_cb = ready_cb;
- session->end_cb = end_cb;
- session->user_data = user_data;
-
- flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT;
- if (replace)
- flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE;
-
- 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;
+ session_signals[NAME_LOST] =
+ g_signal_new ("name-lost",
+ GF_TYPE_SESSION,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_BOOLEAN);
+
+ session_signals[SESSION_READY] =
+ g_signal_new ("session-ready",
+ GF_TYPE_SESSION,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_BOOLEAN);
+
+ session_signals[END_SESSION] =
+ g_signal_new ("end-session",
+ GF_TYPE_SESSION,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ G_TYPE_NONE,
+ 0);
}
-/**
- * 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. If session has entered Running phase
- * this function does nothing.
- */
-void
-gf_session_set_environment (GfSession *session,
- const gchar *name,
- const gchar *value)
+static void
+gf_session_class_init (GfSessionClass *self_class)
{
- GVariant *parameters;
- GError *error;
- GVariant *variant;
-
- if (is_session_running (session))
- return;
-
- parameters = g_variant_new ("(ss)", name, value);
+ GObjectClass *object_class;
- error = NULL;
- variant = g_dbus_proxy_call_sync (session->manager_proxy,
- "Setenv", parameters,
- G_DBUS_CALL_FLAGS_NONE,
- -1, NULL, &error);
+ object_class = G_OBJECT_CLASS (self_class);
- if (error != NULL)
- {
- g_warning ("Failed to set the environment: %s", error->message);
- g_error_free (error);
- return;
- }
+ object_class->constructed = gf_session_constructed;
+ object_class->dispose = gf_session_dispose;
+ object_class->finalize = gf_session_finalize;
+ object_class->set_property = gf_session_set_property;
- g_variant_unref (variant);
+ install_properties (object_class);
+ install_signals ();
}
-/**
- * gf_session_register:
- * @session: a #GfSession
- *
- * Register as a Session Management client.
- *
- * Returns: %TRUE if we have registered as client, %FALSE otherwise.
- */
-gboolean
-gf_session_register (GfSession *session)
+static void
+gf_session_init (GfSession *self)
{
- 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);
+ self->cancellable = g_cancellable_new ();
+}
- flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES;
+GfSession *
+gf_session_new (gboolean replace,
+ const char *startup_id)
+{
+ return g_object_new (GF_TYPE_SESSION,
+ "replace", replace,
+ "startup-id", startup_id,
+ NULL);
+}
- 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);
+void
+gf_session_set_environment (GfSession *self,
+ const char *name,
+ const char *value)
+{
+ gf_session_manager_gen_call_setenv (self->session_manager,
+ name,
+ value,
+ self->cancellable,
+ setenv_cb,
+ self);
+}
- return TRUE;
+void
+gf_session_register (GfSession *self)
+{
+ gf_session_manager_gen_call_register_client (self->session_manager,
+ "gnome-flashback",
+ self->startup_id,
+ self->cancellable,
+ register_client_cb,
+ self);
}
diff --git a/gnome-flashback/gf-session.h b/gnome-flashback/gf-session.h
index 0ed69e6..efca0c4 100644
--- a/gnome-flashback/gf-session.h
+++ b/gnome-flashback/gf-session.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 - 2015 Alberts Muktupāvels
+ * Copyright (C) 2014 - 2019 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
@@ -22,35 +22,17 @@
G_BEGIN_DECLS
-#define GF_TYPE_SESSION gf_session_get_type ()
+#define GF_TYPE_SESSION (gf_session_get_type ())
G_DECLARE_FINAL_TYPE (GfSession, gf_session, GF, SESSION, GObject)
-/**
- * GfSessionReadyCallback:
- * @session: a #GfSession
- * @user_data: user data
- */
-typedef void (*GfSessionReadyCallback) (GfSession *session,
- gpointer user_data);
-
-/**
- * GfSessionEndCallback:
- * @session: a #GfSession
- * @user_data: user data
- */
-typedef void (*GfSessionEndCallback) (GfSession *session,
- gpointer user_data);
-
-GfSession *gf_session_new (gboolean replace,
- GfSessionReadyCallback ready_cb,
- GfSessionEndCallback end_cb,
- gpointer user_data);
+GfSession *gf_session_new (gboolean replace,
+ const char *startup_id);
-void gf_session_set_environment (GfSession *session,
- const gchar *name,
- const gchar *value);
+void gf_session_set_environment (GfSession *self,
+ const char *name,
+ const char *value);
-gboolean gf_session_register (GfSession *session);
+void gf_session_register (GfSession *self);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]