146 lines
4.3 KiB
C
146 lines
4.3 KiB
C
/*
|
|
* 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);
|
|
}
|