Commit 38dd76c7 authored by Bob Ham's avatar Bob Ham
Browse files

Use GtkApplication::register-session property to register

We can use GtkApplication to register with the GNOME session rather
than doing it ourselves, simplifying things in CallsApplication very
slightly and allowing us to remove session.{c,h}.
parent 950c207a
......@@ -34,7 +34,6 @@
#include "calls-call-window.h"
#include "calls-main-window.h"
#include "calls-application.h"
#include "session.h"
#define HANDY_USE_UNSTABLE_API
#include <handy.h>
......@@ -403,8 +402,6 @@ constructed (GObject *object)
actions, G_N_ELEMENTS (actions), self);
g_object_unref (action_group);
calls_session_register (APP_ID);
parent_class->constructed (object);
}
......@@ -414,8 +411,6 @@ dispose (GObject *object)
{
CallsApplication *self = (CallsApplication *)object;
calls_session_unregister ();
g_clear_object (&self->call_window);
g_clear_object (&self->main_window);
g_clear_object (&self->record_store);
......@@ -496,5 +491,6 @@ calls_application_new (void)
return g_object_new (CALLS_TYPE_APPLICATION,
"application-id", APP_ID,
"flags", G_APPLICATION_HANDLES_OPEN,
"register-session", TRUE,
NULL);
}
......@@ -56,7 +56,6 @@ calls_sources = files(['calls-message-source.c', 'calls-message-source.h',
'calls-call-record.c', 'calls-call-record.h',
'calls-record-store.c', 'calls-record-store.h',
'calls-call-record-row.c', 'calls-call-record-row.h',
'session.c', 'session.h',
])
calls_config_data = config_data
......
/*
* Copyright (C) 2018, 2019 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*
* Copied from phosh and modified for Calls
* by Bob Ham <bob.ham@puri.sm>
*
* Based on code from gnome-settings-daemon
*/
#define G_LOG_DOMAIN "calls-session"
#include "session.h"
#include <gio/gio.h>
#include <gtk/gtk.h>
#define GNOME_SESSION_DBUS_NAME "org.gnome.SessionManager"
#define GNOME_SESSION_DBUS_OBJECT "/org/gnome/SessionManager"
#define GNOME_SESSION_DBUS_INTERFACE "org.gnome.SessionManager"
#define GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate"
static GDBusProxy *_proxy;
static void
respond_to_end_session (GDBusProxy *proxy)
{
/* we must answer with "EndSessionResponse" */
g_dbus_proxy_call (proxy, "EndSessionResponse",
g_variant_new ("(bs)", TRUE, ""),
G_DBUS_CALL_FLAGS_NONE,
-1, NULL, NULL, NULL);
}
static void
do_stop (void)
{
gtk_main_quit ();
}
static void
client_proxy_signal_cb (GDBusProxy *proxy,
gchar *sender_name,
gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{
if (g_strcmp0 (signal_name, "QueryEndSession") == 0) {
g_debug ("Got QueryEndSession signal");
respond_to_end_session (proxy);
} else if (g_strcmp0 (signal_name, "EndSession") == 0) {
g_debug ("Got EndSession signal");
respond_to_end_session (proxy);
} else if (g_strcmp0 (signal_name, "Stop") == 0) {
g_debug ("Got Stop signal");
do_stop ();
}
}
static void
on_client_registered (GObject *source_object,
GAsyncResult *res,
gpointer user_data)
{
GVariant *variant;
GDBusProxy *client_proxy;
GError *error = NULL;
gchar *object_path = NULL;
variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error);
if (!variant) {
g_warning ("Unable to register client: %s", error->message);
g_error_free (error);
return;
}
g_variant_get (variant, "(o)", &object_path);
g_debug ("Registered client at path %s", object_path);
client_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, 0, NULL,
GNOME_SESSION_DBUS_NAME,
object_path,
GNOME_SESSION_CLIENT_PRIVATE_DBUS_INTERFACE,
NULL,
&error);
if (!client_proxy) {
g_warning ("Unable to get the session client proxy: %s", error->message);
g_error_free (error);
return;
}
g_signal_connect (client_proxy, "g-signal",
G_CALLBACK (client_proxy_signal_cb), NULL);
g_free (object_path);
g_variant_unref (variant);
}
void
calls_session_register (const char *client_id)
{
const char *startup_id;
GError *err = NULL;
if (!_proxy) {
_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION,
NULL,
GNOME_SESSION_DBUS_NAME,
GNOME_SESSION_DBUS_OBJECT,
GNOME_SESSION_DBUS_INTERFACE,
NULL,
&err);
if (!_proxy) {
g_debug ("Failed to contact gnome-session: %s", err->message);
g_clear_error (&err);
return;
}
};
startup_id = g_getenv ("DESKTOP_AUTOSTART_ID");
g_dbus_proxy_call (_proxy,
"RegisterClient",
g_variant_new ("(ss)", client_id, startup_id ? startup_id : ""),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
(GAsyncReadyCallback) on_client_registered,
NULL);
}
void
calls_session_unregister (void)
{
g_clear_object (&_proxy);
}
/*
* Copyright (C) 2018, 2019 Purism SPC
* SPDX-License-Identifier: GPL-3.0+
* Author: Guido Günther <agx@sigxcpu.org>
*
* Copied from phosh and modified for Calls
* by Bob Ham <bob.ham@puri.sm>
*/
#pragma once
#include <glib-object.h>
void calls_session_register (const char *client_id);
void calls_session_unregister (void);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment