Commit 03ede5b5 authored by Bob Ham's avatar Bob Ham
Browse files

Merge branch 'session-rework' into 'master'

Use GtkApplication::register-session property to register

See merge request Librem5/calls!65
parents 950c207a 38dd76c7
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include "calls-call-window.h" #include "calls-call-window.h"
#include "calls-main-window.h" #include "calls-main-window.h"
#include "calls-application.h" #include "calls-application.h"
#include "session.h"
#define HANDY_USE_UNSTABLE_API #define HANDY_USE_UNSTABLE_API
#include <handy.h> #include <handy.h>
...@@ -403,8 +402,6 @@ constructed (GObject *object) ...@@ -403,8 +402,6 @@ constructed (GObject *object)
actions, G_N_ELEMENTS (actions), self); actions, G_N_ELEMENTS (actions), self);
g_object_unref (action_group); g_object_unref (action_group);
calls_session_register (APP_ID);
parent_class->constructed (object); parent_class->constructed (object);
} }
...@@ -414,8 +411,6 @@ dispose (GObject *object) ...@@ -414,8 +411,6 @@ dispose (GObject *object)
{ {
CallsApplication *self = (CallsApplication *)object; CallsApplication *self = (CallsApplication *)object;
calls_session_unregister ();
g_clear_object (&self->call_window); g_clear_object (&self->call_window);
g_clear_object (&self->main_window); g_clear_object (&self->main_window);
g_clear_object (&self->record_store); g_clear_object (&self->record_store);
...@@ -496,5 +491,6 @@ calls_application_new (void) ...@@ -496,5 +491,6 @@ calls_application_new (void)
return g_object_new (CALLS_TYPE_APPLICATION, return g_object_new (CALLS_TYPE_APPLICATION,
"application-id", APP_ID, "application-id", APP_ID,
"flags", G_APPLICATION_HANDLES_OPEN, "flags", G_APPLICATION_HANDLES_OPEN,
"register-session", TRUE,
NULL); NULL);
} }
...@@ -56,7 +56,6 @@ calls_sources = files(['calls-message-source.c', 'calls-message-source.h', ...@@ -56,7 +56,6 @@ calls_sources = files(['calls-message-source.c', 'calls-message-source.h',
'calls-call-record.c', 'calls-call-record.h', 'calls-call-record.c', 'calls-call-record.h',
'calls-record-store.c', 'calls-record-store.h', 'calls-record-store.c', 'calls-record-store.h',
'calls-call-record-row.c', 'calls-call-record-row.h', 'calls-call-record-row.c', 'calls-call-record-row.h',
'session.c', 'session.h',
]) ])
calls_config_data = config_data 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