1
0
Fork 0
mirror of https://gitlab.gnome.org/GNOME/calls.git synced 2025-01-06 03:25:31 +00:00

Start up in daemon mode when GNOME starts

Hat tip to Guido for the session.{c,h} files.

Closes #45
This commit is contained in:
Bob Ham 2019-08-08 14:38:28 +01:00
parent fc16ec7a71
commit 646682b878
6 changed files with 190 additions and 0 deletions

View file

@ -1,8 +1,12 @@
datadir = get_option('datadir')
sysconfdir = get_option('sysconfdir')
# Desktop file
install_data('sm.puri.Calls.desktop',
install_dir : join_paths(datadir, 'applications'))
install_data('sm.puri.Calls-daemon.desktop',
rename : 'sm.puri.Calls.desktop',
install_dir : join_paths(sysconfdir, 'xdg/autostart'))
desktop_utils = find_program('desktop-file-validate', required: false)
if desktop_utils.found()
@ -10,6 +14,10 @@ if desktop_utils.found()
args: [join_paths(meson.current_source_dir(),
'sm.puri.Calls.desktop')
])
test('Validate daemon desktop file', desktop_utils,
args: [join_paths(meson.current_source_dir(),
'sm.puri.Calls-daemon.desktop')
])
endif
# Appdata file

View file

@ -0,0 +1,16 @@
[Desktop Entry]
Name=Calls (daemon)
GenericName=Phone
Comment=A phone dialer and call handler (daemon mode)
# Translators: These are desktop search terms. Do not translate semicolons, end line with a semicolon.
Keywords=Telephone;Call;Phone;Dial;Dialer;PTSN;
# Translators: Do NOT translate or transliterate this text (this is an icon file name)!
Icon=sm.puri.Calls
TryExec=calls
Exec=calls --daemon
Type=Application
StartupNotify=true
NoDisplay=true
Terminal=false
Categories=GNOME;GTK;Telephony;
X-GNOME-AutoRestart=true

View file

@ -34,6 +34,7 @@
#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>
@ -402,6 +403,8 @@ constructed (GObject *object)
actions, G_N_ELEMENTS (actions), self);
g_object_unref (action_group);
calls_session_register (APP_ID);
parent_class->constructed (object);
}
@ -411,6 +414,8 @@ 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);

View file

@ -56,6 +56,7 @@ 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

145
src/session.c Normal file
View file

@ -0,0 +1,145 @@
/*
* 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);
}

15
src/session.h Normal file
View file

@ -0,0 +1,15 @@
/*
* 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);