mirror of
https://gitlab.gnome.org/GNOME/calls.git
synced 2025-01-07 12:25:31 +00:00
Merge branch 'monitor-modemmanager' into 'master'
Fix modem addition/removal and deal with ModemManager appearing/vanishing Closes #15 and #16 See merge request Librem5/calls!32
This commit is contained in:
commit
07cc15ceae
8 changed files with 304 additions and 79 deletions
|
@ -52,7 +52,6 @@ struct _CallsApplication
|
||||||
{
|
{
|
||||||
GtkApplication parent_instance;
|
GtkApplication parent_instance;
|
||||||
|
|
||||||
GDBusConnection *connection;
|
|
||||||
CallsProvider *provider;
|
CallsProvider *provider;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -60,12 +59,11 @@ G_DEFINE_TYPE (CallsApplication, calls_application, GTK_TYPE_APPLICATION)
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
finalize (GObject *object)
|
dispose (GObject *object)
|
||||||
{
|
{
|
||||||
CallsApplication *self = (CallsApplication *)object;
|
CallsApplication *self = (CallsApplication *)object;
|
||||||
|
|
||||||
g_clear_object (&self->provider);
|
g_clear_object (&self->provider);
|
||||||
g_clear_object (&self->connection);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (calls_application_parent_class)->finalize (object);
|
G_OBJECT_CLASS (calls_application_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
@ -78,14 +76,7 @@ startup (GApplication *application)
|
||||||
|
|
||||||
G_APPLICATION_CLASS (calls_application_parent_class)->startup (application);
|
G_APPLICATION_CLASS (calls_application_parent_class)->startup (application);
|
||||||
|
|
||||||
self->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
|
self->provider = CALLS_PROVIDER (calls_mm_provider_new ());
|
||||||
|
|
||||||
if (!self->connection)
|
|
||||||
{
|
|
||||||
g_error ("Error creating D-Bus connection: %s", error->message);
|
|
||||||
}
|
|
||||||
|
|
||||||
self->provider = CALLS_PROVIDER (calls_mm_provider_new (self->connection));
|
|
||||||
g_assert (self->provider != NULL);
|
g_assert (self->provider != NULL);
|
||||||
|
|
||||||
g_set_prgname (APP_ID);
|
g_set_prgname (APP_ID);
|
||||||
|
@ -123,7 +114,7 @@ calls_application_class_init (CallsApplicationClass *klass)
|
||||||
GApplicationClass *application_class = G_APPLICATION_CLASS (klass);
|
GApplicationClass *application_class = G_APPLICATION_CLASS (klass);
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->finalize = finalize;
|
object_class->dispose = dispose;
|
||||||
|
|
||||||
application_class->startup = startup;
|
application_class->startup = startup;
|
||||||
application_class->activate = activate;
|
application_class->activate = activate;
|
||||||
|
|
|
@ -44,6 +44,12 @@ G_DEFINE_TYPE_WITH_CODE (CallsDummyProvider, calls_dummy_provider, G_TYPE_OBJECT
|
||||||
calls_dummy_provider_provider_interface_init))
|
calls_dummy_provider_provider_interface_init))
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_STATUS,
|
||||||
|
PROP_LAST_PROP,
|
||||||
|
};
|
||||||
|
|
||||||
static const gchar *
|
static const gchar *
|
||||||
get_name (CallsProvider *iface)
|
get_name (CallsProvider *iface)
|
||||||
{
|
{
|
||||||
|
@ -66,6 +72,24 @@ calls_dummy_provider_new ()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
switch (property_id) {
|
||||||
|
case PROP_STATUS:
|
||||||
|
g_value_set_string (value, "Normal");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dispose (GObject *object)
|
dispose (GObject *object)
|
||||||
{
|
{
|
||||||
|
@ -85,6 +109,9 @@ calls_dummy_provider_class_init (CallsDummyProviderClass *klass)
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->dispose = dispose;
|
object_class->dispose = dispose;
|
||||||
|
object_class->get_property = get_property;
|
||||||
|
|
||||||
|
g_object_class_override_property (object_class, PROP_STATUS, "status");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,8 +35,10 @@ struct _CallsMMProvider
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
|
|
||||||
/** D-Bus connection */
|
/* The status property */
|
||||||
GDBusConnection *connection;
|
gchar *status;
|
||||||
|
/** ID for the D-Bus watch */
|
||||||
|
guint watch_id;
|
||||||
/** ModemManager object proxy */
|
/** ModemManager object proxy */
|
||||||
MMManager *mm;
|
MMManager *mm;
|
||||||
/** Map of D-Bus object paths to origins */
|
/** Map of D-Bus object paths to origins */
|
||||||
|
@ -52,13 +54,11 @@ G_DEFINE_TYPE_WITH_CODE (CallsMMProvider, calls_mm_provider, G_TYPE_OBJECT,
|
||||||
G_IMPLEMENT_INTERFACE (CALLS_TYPE_PROVIDER,
|
G_IMPLEMENT_INTERFACE (CALLS_TYPE_PROVIDER,
|
||||||
calls_mm_provider_provider_interface_init))
|
calls_mm_provider_provider_interface_init))
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_CONNECTION,
|
PROP_STATUS,
|
||||||
PROP_LAST_PROP,
|
PROP_LAST_PROP,
|
||||||
};
|
};
|
||||||
static GParamSpec *props[PROP_LAST_PROP];
|
|
||||||
|
|
||||||
|
|
||||||
static const gchar *
|
static const gchar *
|
||||||
|
@ -76,15 +76,61 @@ get_origins (CallsProvider *iface)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_status (CallsMMProvider *self,
|
||||||
|
const gchar *new_status)
|
||||||
|
{
|
||||||
|
if (strcmp (self->status, new_status) == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (self->status);
|
||||||
|
self->status = g_strdup (new_status);
|
||||||
|
g_object_notify (G_OBJECT (self), "status");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_status (CallsMMProvider *self)
|
||||||
|
{
|
||||||
|
const gchar *s;
|
||||||
|
|
||||||
|
if (!self->mm)
|
||||||
|
{
|
||||||
|
s = _("ModemManager unavailable");
|
||||||
|
}
|
||||||
|
else if (g_hash_table_size (self->origins) == 0)
|
||||||
|
{
|
||||||
|
s = _("No voice-capable modem available");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
s = _("Normal");
|
||||||
|
}
|
||||||
|
|
||||||
|
set_status (self, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_origin (CallsMMProvider *self,
|
add_origin (CallsMMProvider *self,
|
||||||
GDBusObject *object)
|
GDBusObject *object)
|
||||||
{
|
{
|
||||||
MMObject *mm_obj;
|
MMObject *mm_obj;
|
||||||
CallsMMOrigin *origin;
|
CallsMMOrigin *origin;
|
||||||
|
const gchar *path;
|
||||||
|
|
||||||
g_debug ("Adding new voice-cable modem `%s'",
|
path = g_dbus_object_get_object_path (object);
|
||||||
g_dbus_object_get_object_path (object));
|
if (g_hash_table_contains (self->origins, path))
|
||||||
|
{
|
||||||
|
g_warning ("New voice interface on existing"
|
||||||
|
" origin with path `%s'", path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_debug ("Adding new voice-capable modem `%s'",
|
||||||
|
path);
|
||||||
|
|
||||||
g_assert (MM_IS_OBJECT (object));
|
g_assert (MM_IS_OBJECT (object));
|
||||||
mm_obj = MM_OBJECT (object);
|
mm_obj = MM_OBJECT (object);
|
||||||
|
@ -97,6 +143,7 @@ add_origin (CallsMMProvider *self,
|
||||||
|
|
||||||
g_signal_emit_by_name (CALLS_PROVIDER (self),
|
g_signal_emit_by_name (CALLS_PROVIDER (self),
|
||||||
"origin-added", origin);
|
"origin-added", origin);
|
||||||
|
update_status (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -109,6 +156,10 @@ interface_added_cb (CallsMMProvider *self,
|
||||||
|
|
||||||
info = g_dbus_interface_get_info (interface);
|
info = g_dbus_interface_get_info (interface);
|
||||||
|
|
||||||
|
g_debug ("ModemManager interface `%s' found on object `%s'",
|
||||||
|
info->name,
|
||||||
|
g_dbus_object_get_object_path (object));
|
||||||
|
|
||||||
if (g_strcmp0 (info->name,
|
if (g_strcmp0 (info->name,
|
||||||
"org.freedesktop.ModemManager1.Modem.Voice") == 0)
|
"org.freedesktop.ModemManager1.Modem.Voice") == 0)
|
||||||
{
|
{
|
||||||
|
@ -118,21 +169,26 @@ interface_added_cb (CallsMMProvider *self,
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_origin (CallsMMProvider *self,
|
remove_modem_object (CallsMMProvider *self,
|
||||||
GDBusObject *object)
|
const gchar *path,
|
||||||
|
GDBusObject *object)
|
||||||
{
|
{
|
||||||
const gchar *path;
|
|
||||||
gpointer *origin;
|
gpointer *origin;
|
||||||
|
|
||||||
path = g_dbus_object_get_object_path (object);
|
|
||||||
|
|
||||||
origin = g_hash_table_lookup (self->origins, path);
|
origin = g_hash_table_lookup (self->origins, path);
|
||||||
g_assert (origin != NULL && CALLS_IS_ORIGIN (origin));
|
if (!origin)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert (CALLS_IS_ORIGIN (origin));
|
||||||
|
|
||||||
g_signal_emit_by_name (CALLS_PROVIDER (self),
|
g_signal_emit_by_name (CALLS_PROVIDER (self),
|
||||||
"origin-removed", CALLS_ORIGIN (origin));
|
"origin-removed", CALLS_ORIGIN (origin));
|
||||||
|
|
||||||
g_hash_table_remove (self->origins, path);
|
g_hash_table_remove (self->origins, path);
|
||||||
|
|
||||||
|
update_status (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -141,39 +197,23 @@ interface_removed_cb (CallsMMProvider *self,
|
||||||
GDBusObject *object,
|
GDBusObject *object,
|
||||||
GDBusInterface *interface)
|
GDBusInterface *interface)
|
||||||
{
|
{
|
||||||
|
const gchar *path;
|
||||||
GDBusInterfaceInfo *info;
|
GDBusInterfaceInfo *info;
|
||||||
|
|
||||||
|
path = g_dbus_object_get_object_path (object);
|
||||||
info = g_dbus_interface_get_info (interface);
|
info = g_dbus_interface_get_info (interface);
|
||||||
|
|
||||||
|
g_debug ("ModemManager interface `%s' removed on object `%s'",
|
||||||
|
info->name, path);
|
||||||
|
|
||||||
if (g_strcmp0 (info->name,
|
if (g_strcmp0 (info->name,
|
||||||
"org.freedesktop.ModemManager1.Modem.Voice") != 0)
|
"org.freedesktop.ModemManager1.Modem.Voice") != 0)
|
||||||
{
|
{
|
||||||
remove_origin (self, object);
|
remove_modem_object (self, path, object);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_property (GObject *object,
|
|
||||||
guint property_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
|
||||||
|
|
||||||
switch (property_id) {
|
|
||||||
case PROP_CONNECTION:
|
|
||||||
g_set_object (&self->connection,
|
|
||||||
g_value_get_object (value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_mm_object (CallsMMProvider *self, GDBusObject *object)
|
add_mm_object (CallsMMProvider *self, GDBusObject *object)
|
||||||
{
|
{
|
||||||
|
@ -205,6 +245,30 @@ add_mm_objects (CallsMMProvider *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
object_added_cb (CallsMMProvider *self,
|
||||||
|
GDBusObject *object)
|
||||||
|
{
|
||||||
|
g_debug ("ModemManager object `%s' added",
|
||||||
|
g_dbus_object_get_object_path (object));
|
||||||
|
|
||||||
|
add_mm_object (self, object);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
object_removed_cb (CallsMMProvider *self,
|
||||||
|
GDBusObject *object)
|
||||||
|
{
|
||||||
|
const gchar *path;
|
||||||
|
|
||||||
|
path = g_dbus_object_get_object_path (object);
|
||||||
|
g_debug ("ModemManager object `%s' removed", path);
|
||||||
|
|
||||||
|
remove_modem_object (self, path, object);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mm_manager_new_cb (GDBusConnection *connection,
|
mm_manager_new_cb (GDBusConnection *connection,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
|
@ -221,18 +285,69 @@ mm_manager_new_cb (GDBusConnection *connection,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
g_signal_connect_swapped (self->mm, "interface-added",
|
g_signal_connect_swapped (G_DBUS_OBJECT_MANAGER (self->mm),
|
||||||
|
"interface-added",
|
||||||
G_CALLBACK (interface_added_cb), self);
|
G_CALLBACK (interface_added_cb), self);
|
||||||
g_signal_connect_swapped (self->mm, "interface-removed",
|
g_signal_connect_swapped (G_DBUS_OBJECT_MANAGER (self->mm),
|
||||||
|
"interface-removed",
|
||||||
G_CALLBACK (interface_removed_cb), self);
|
G_CALLBACK (interface_removed_cb), self);
|
||||||
|
g_signal_connect_swapped (G_DBUS_OBJECT_MANAGER (self->mm),
|
||||||
|
"object-added",
|
||||||
|
G_CALLBACK (object_added_cb), self);
|
||||||
|
g_signal_connect_swapped (G_DBUS_OBJECT_MANAGER (self->mm),
|
||||||
|
"object-removed",
|
||||||
|
G_CALLBACK (object_removed_cb), self);
|
||||||
|
|
||||||
|
update_status (self);
|
||||||
add_mm_objects (self);
|
add_mm_objects (self);
|
||||||
if (g_hash_table_size (self->origins) == 0)
|
}
|
||||||
{
|
|
||||||
g_warning ("No modem with voice capability available");
|
|
||||||
CALLS_EMIT_MESSAGE (self, "No modems available",
|
static void
|
||||||
GTK_MESSAGE_WARNING);
|
mm_appeared_cb (GDBusConnection *connection,
|
||||||
}
|
const gchar *name,
|
||||||
|
const gchar *name_owner,
|
||||||
|
CallsMMProvider *self)
|
||||||
|
{
|
||||||
|
g_debug ("ModemManager appeared on D-Bus");
|
||||||
|
|
||||||
|
mm_manager_new (connection,
|
||||||
|
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
|
||||||
|
NULL,
|
||||||
|
(GAsyncReadyCallback) mm_manager_new_cb,
|
||||||
|
self);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
remove_origins_cb (const gchar *path,
|
||||||
|
CallsMMOrigin *origin,
|
||||||
|
CallsMMProvider *self)
|
||||||
|
{
|
||||||
|
g_signal_emit_by_name (CALLS_PROVIDER (self),
|
||||||
|
"origin-removed", CALLS_ORIGIN (origin));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
clear_dbus (CallsMMProvider *self)
|
||||||
|
{
|
||||||
|
g_hash_table_foreach_remove (self->origins,
|
||||||
|
(GHRFunc)remove_origins_cb,
|
||||||
|
self);
|
||||||
|
g_clear_object (&self->mm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
mm_vanished_cb (GDBusConnection *connection,
|
||||||
|
const gchar *name,
|
||||||
|
CallsMMProvider *self)
|
||||||
|
{
|
||||||
|
g_debug ("ModemManager vanished from D-Bus");
|
||||||
|
clear_dbus (self);
|
||||||
|
update_status (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -242,25 +357,53 @@ constructed (GObject *object)
|
||||||
GObjectClass *parent_class = g_type_class_peek (G_TYPE_OBJECT);
|
GObjectClass *parent_class = g_type_class_peek (G_TYPE_OBJECT);
|
||||||
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
||||||
|
|
||||||
mm_manager_new (self->connection,
|
self->watch_id =
|
||||||
G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
|
g_bus_watch_name (G_BUS_TYPE_SYSTEM,
|
||||||
NULL,
|
MM_DBUS_SERVICE,
|
||||||
(GAsyncReadyCallback) mm_manager_new_cb,
|
G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
|
||||||
self);
|
(GBusNameAppearedCallback)mm_appeared_cb,
|
||||||
|
(GBusNameVanishedCallback)mm_vanished_cb,
|
||||||
|
self, NULL);
|
||||||
|
|
||||||
|
g_debug ("Watching for ModemManager");
|
||||||
|
|
||||||
parent_class->constructed (object);
|
parent_class->constructed (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_property (GObject *object,
|
||||||
|
guint property_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
||||||
|
|
||||||
|
switch (property_id) {
|
||||||
|
case PROP_STATUS:
|
||||||
|
g_value_set_string (value, self->status);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
dispose (GObject *object)
|
dispose (GObject *object)
|
||||||
{
|
{
|
||||||
GObjectClass *parent_class = g_type_class_peek (G_TYPE_OBJECT);
|
GObjectClass *parent_class = g_type_class_peek (G_TYPE_OBJECT);
|
||||||
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
||||||
|
|
||||||
g_hash_table_remove_all (self->origins);
|
if (self->watch_id)
|
||||||
g_clear_object (&self->mm);
|
{
|
||||||
g_clear_object (&self->connection);
|
g_bus_unwatch_name (self->watch_id);
|
||||||
|
self->watch_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_dbus (self);
|
||||||
|
|
||||||
parent_class->dispose (object);
|
parent_class->dispose (object);
|
||||||
}
|
}
|
||||||
|
@ -273,6 +416,7 @@ finalize (GObject *object)
|
||||||
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
CallsMMProvider *self = CALLS_MM_PROVIDER (object);
|
||||||
|
|
||||||
g_hash_table_unref (self->origins);
|
g_hash_table_unref (self->origins);
|
||||||
|
g_free (self->status);
|
||||||
|
|
||||||
parent_class->finalize (object);
|
parent_class->finalize (object);
|
||||||
}
|
}
|
||||||
|
@ -283,19 +427,12 @@ calls_mm_provider_class_init (CallsMMProviderClass *klass)
|
||||||
{
|
{
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->set_property = set_property;
|
|
||||||
object_class->constructed = constructed;
|
object_class->constructed = constructed;
|
||||||
|
object_class->get_property = get_property;
|
||||||
object_class->dispose = dispose;
|
object_class->dispose = dispose;
|
||||||
object_class->finalize = finalize;
|
object_class->finalize = finalize;
|
||||||
|
|
||||||
props[PROP_CONNECTION] =
|
g_object_class_override_property (object_class, PROP_STATUS, "status");
|
||||||
g_param_spec_object ("connection",
|
|
||||||
_("Connection"),
|
|
||||||
_("The D-Bus connection to use for communication with ModemManager"),
|
|
||||||
G_TYPE_DBUS_CONNECTION,
|
|
||||||
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
|
|
||||||
|
|
||||||
g_object_class_install_properties (object_class, PROP_LAST_PROP, props);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -316,17 +453,14 @@ calls_mm_provider_provider_interface_init (CallsProviderInterface *iface)
|
||||||
static void
|
static void
|
||||||
calls_mm_provider_init (CallsMMProvider *self)
|
calls_mm_provider_init (CallsMMProvider *self)
|
||||||
{
|
{
|
||||||
|
self->status = g_strdup (_("Initialised"));
|
||||||
self->origins = g_hash_table_new_full (g_str_hash, g_str_equal,
|
self->origins = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
g_free, g_object_unref);
|
g_free, g_object_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CallsMMProvider *
|
CallsMMProvider *
|
||||||
calls_mm_provider_new (GDBusConnection *connection)
|
calls_mm_provider_new ()
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
|
return g_object_new (CALLS_TYPE_MM_PROVIDER, NULL);
|
||||||
|
|
||||||
return g_object_new (CALLS_TYPE_MM_PROVIDER,
|
|
||||||
"connection", connection,
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ G_BEGIN_DECLS
|
||||||
|
|
||||||
G_DECLARE_FINAL_TYPE (CallsMMProvider, calls_mm_provider, CALLS, MM_PROVIDER, GObject);
|
G_DECLARE_FINAL_TYPE (CallsMMProvider, calls_mm_provider, CALLS, MM_PROVIDER, GObject);
|
||||||
|
|
||||||
CallsMMProvider *calls_mm_provider_new (GDBusConnection *connection);
|
CallsMMProvider *calls_mm_provider_new ();
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@ struct _CallsNewCallBox
|
||||||
GtkListStore *origin_store;
|
GtkListStore *origin_store;
|
||||||
GtkComboBox *origin_box;
|
GtkComboBox *origin_box;
|
||||||
GtkSearchEntry *number_entry;
|
GtkSearchEntry *number_entry;
|
||||||
|
GtkButton *dial;
|
||||||
|
GtkLabel *status;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (CallsNewCallBox, calls_new_call_box, GTK_TYPE_BOX);
|
G_DEFINE_TYPE (CallsNewCallBox, calls_new_call_box, GTK_TYPE_BOX);
|
||||||
|
@ -108,6 +110,21 @@ dial_clicked_cb (CallsNewCallBox *self,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
notify_status_cb (CallsNewCallBox *self,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
CallsProvider *provider)
|
||||||
|
{
|
||||||
|
gchar *status;
|
||||||
|
|
||||||
|
g_assert (CALLS_IS_PROVIDER (provider));
|
||||||
|
|
||||||
|
status = calls_provider_get_status (provider);
|
||||||
|
gtk_label_set_text (self->status, status);
|
||||||
|
g_free (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
update_origin_box (CallsNewCallBox *self)
|
update_origin_box (CallsNewCallBox *self)
|
||||||
{
|
{
|
||||||
|
@ -117,11 +134,16 @@ update_origin_box (CallsNewCallBox *self)
|
||||||
if (!gtk_tree_model_get_iter_first (origin_store, &iter))
|
if (!gtk_tree_model_get_iter_first (origin_store, &iter))
|
||||||
{
|
{
|
||||||
gtk_widget_hide (GTK_WIDGET (self->origin_box));
|
gtk_widget_hide (GTK_WIDGET (self->origin_box));
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (self->dial), FALSE);
|
||||||
|
gtk_widget_set_visible (GTK_WIDGET (self->status), TRUE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We know there is at least one origin. */
|
/* We know there is at least one origin. */
|
||||||
|
|
||||||
|
gtk_widget_set_sensitive (GTK_WIDGET (self->dial), TRUE);
|
||||||
|
gtk_widget_set_visible (GTK_WIDGET (self->status), FALSE);
|
||||||
|
|
||||||
if (!gtk_tree_model_iter_next (origin_store, &iter))
|
if (!gtk_tree_model_iter_next (origin_store, &iter))
|
||||||
{
|
{
|
||||||
gtk_combo_box_set_active (self->origin_box, 0);
|
gtk_combo_box_set_active (self->origin_box, 0);
|
||||||
|
@ -205,6 +227,8 @@ add_provider_origins (CallsNewCallBox *self, CallsProvider *provider)
|
||||||
static void
|
static void
|
||||||
set_provider (CallsNewCallBox *self, CallsProvider *provider)
|
set_provider (CallsNewCallBox *self, CallsProvider *provider)
|
||||||
{
|
{
|
||||||
|
g_signal_connect_swapped (provider, "notify::status",
|
||||||
|
G_CALLBACK (notify_status_cb), self);
|
||||||
g_signal_connect_swapped (provider, "origin-added",
|
g_signal_connect_swapped (provider, "origin-added",
|
||||||
G_CALLBACK (add_origin), self);
|
G_CALLBACK (add_origin), self);
|
||||||
g_signal_connect_swapped (provider, "origin-removed",
|
g_signal_connect_swapped (provider, "origin-removed",
|
||||||
|
@ -282,6 +306,8 @@ calls_new_call_box_class_init (CallsNewCallBoxClass *klass)
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, origin_store);
|
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, origin_store);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, origin_box);
|
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, origin_box);
|
||||||
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, number_entry);
|
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, number_entry);
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, dial);
|
||||||
|
gtk_widget_class_bind_template_child (widget_class, CallsNewCallBox, status);
|
||||||
gtk_widget_class_bind_template_callback (widget_class, dial_clicked_cb);
|
gtk_widget_class_bind_template_callback (widget_class, dial_clicked_cb);
|
||||||
gtk_widget_class_bind_template_callback (widget_class, dial_pad_deleted_cb);
|
gtk_widget_class_bind_template_callback (widget_class, dial_pad_deleted_cb);
|
||||||
gtk_widget_class_bind_template_callback (widget_class, dial_pad_symbol_clicked_cb);
|
gtk_widget_class_bind_template_callback (widget_class, dial_pad_symbol_clicked_cb);
|
||||||
|
|
|
@ -27,6 +27,8 @@
|
||||||
#include "calls-message-source.h"
|
#include "calls-message-source.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:calls-provider
|
* SECTION:calls-provider
|
||||||
* @short_description: An abstraction of call providers, such as
|
* @short_description: An abstraction of call providers, such as
|
||||||
|
@ -43,6 +45,14 @@
|
||||||
|
|
||||||
G_DEFINE_INTERFACE (CallsProvider, calls_provider, CALLS_TYPE_MESSAGE_SOURCE);
|
G_DEFINE_INTERFACE (CallsProvider, calls_provider, CALLS_TYPE_MESSAGE_SOURCE);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_0,
|
||||||
|
PROP_STATUS,
|
||||||
|
PROP_LAST_PROP,
|
||||||
|
};
|
||||||
|
static GParamSpec *props[PROP_LAST_PROP];
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SIGNAL_ORIGIN_ADDED,
|
SIGNAL_ORIGIN_ADDED,
|
||||||
SIGNAL_ORIGIN_REMOVED,
|
SIGNAL_ORIGIN_REMOVED,
|
||||||
|
@ -55,6 +65,15 @@ calls_provider_default_init (CallsProviderInterface *iface)
|
||||||
{
|
{
|
||||||
GType arg_types = CALLS_TYPE_ORIGIN;
|
GType arg_types = CALLS_TYPE_ORIGIN;
|
||||||
|
|
||||||
|
props[PROP_STATUS] =
|
||||||
|
g_param_spec_string ("status",
|
||||||
|
_("Status"),
|
||||||
|
_("A text string describing the status for display to the user"),
|
||||||
|
"",
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_interface_install_property (iface, props[PROP_STATUS]);
|
||||||
|
|
||||||
signals[SIGNAL_ORIGIN_ADDED] =
|
signals[SIGNAL_ORIGIN_ADDED] =
|
||||||
g_signal_newv ("origin-added",
|
g_signal_newv ("origin-added",
|
||||||
G_TYPE_FROM_INTERFACE (iface),
|
G_TYPE_FROM_INTERFACE (iface),
|
||||||
|
@ -86,6 +105,21 @@ calls_provider_default_init (CallsProviderInterface *iface)
|
||||||
*/
|
*/
|
||||||
DEFINE_PROVIDER_FUNC(get_name, const gchar *, NULL);
|
DEFINE_PROVIDER_FUNC(get_name, const gchar *, NULL);
|
||||||
|
|
||||||
|
gchar *
|
||||||
|
calls_provider_get_status (CallsProvider *self)
|
||||||
|
{
|
||||||
|
gchar *status;
|
||||||
|
|
||||||
|
g_return_val_if_fail (CALLS_IS_PROVIDER (self), NULL);
|
||||||
|
|
||||||
|
g_object_get (G_OBJECT (self),
|
||||||
|
"status", &status,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* calls_provider_get_origins:
|
* calls_provider_get_origins:
|
||||||
* @self: a #CallsProvider
|
* @self: a #CallsProvider
|
||||||
|
|
|
@ -45,6 +45,7 @@ struct _CallsProviderInterface
|
||||||
|
|
||||||
|
|
||||||
const gchar * calls_provider_get_name (CallsProvider *self);
|
const gchar * calls_provider_get_name (CallsProvider *self);
|
||||||
|
gchar * calls_provider_get_status (CallsProvider *self);
|
||||||
GList * calls_provider_get_origins (CallsProvider *self);
|
GList * calls_provider_get_origins (CallsProvider *self);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
|
@ -109,5 +109,17 @@
|
||||||
<property name="fill">True</property>
|
<property name="fill">True</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="status">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="wrap">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="padding">16</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
</template>
|
</template>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
Loading…
Reference in a new issue