power: Fix run-time for DeviceChanged signal removal
The DeviceChanged signal was removed, instead, each interesting device should be monitored individually. This means we need to keep our own device list locally. https://bugzilla.gnome.org/show_bug.cgi?id=710393
This commit is contained in:
parent
ceafe6f4c5
commit
6f78b2ab0f
1 changed files with 61 additions and 14 deletions
|
@ -70,6 +70,7 @@ struct _CcPowerPanelPrivate
|
|||
GtkBuilder *builder;
|
||||
GtkWidget *automatic_suspend_dialog;
|
||||
UpClient *up_client;
|
||||
GPtrArray *devices;
|
||||
GDBusProxy *screen_proxy;
|
||||
GDBusProxy *kbd_proxy;
|
||||
gboolean has_batteries;
|
||||
|
@ -142,6 +143,11 @@ cc_power_panel_dispose (GObject *object)
|
|||
g_clear_object (&priv->builder);
|
||||
g_clear_object (&priv->screen_proxy);
|
||||
g_clear_object (&priv->kbd_proxy);
|
||||
if (priv->devices)
|
||||
{
|
||||
g_ptr_array_foreach (priv->devices, (GFunc) g_object_unref, NULL);
|
||||
g_clear_pointer (&priv->devices, g_ptr_array_unref);
|
||||
}
|
||||
g_clear_object (&priv->up_client);
|
||||
#ifdef HAVE_BLUETOOTH
|
||||
g_clear_object (&priv->bt_client);
|
||||
|
@ -624,7 +630,6 @@ up_client_changed (UpClient *client,
|
|||
CcPowerPanel *self)
|
||||
{
|
||||
CcPowerPanelPrivate *priv = self->priv;
|
||||
GPtrArray *devices;
|
||||
GList *children, *l;
|
||||
gint i;
|
||||
UpDeviceKind kind;
|
||||
|
@ -658,8 +663,6 @@ up_client_changed (UpClient *client,
|
|||
g_list_free (children);
|
||||
gtk_widget_hide (priv->device_section);
|
||||
|
||||
devices = up_client_get_devices (client);
|
||||
|
||||
#ifdef TEST_FAKE_DEVICES
|
||||
{
|
||||
static gboolean fake_devices_added = FALSE;
|
||||
|
@ -675,7 +678,7 @@ up_client_changed (UpClient *client,
|
|||
"state", UP_DEVICE_STATE_DISCHARGING,
|
||||
"time-to-empty", 287,
|
||||
NULL);
|
||||
g_ptr_array_add (devices, device);
|
||||
g_ptr_array_add (priv->devices, device);
|
||||
device = up_device_new ();
|
||||
g_object_set (device,
|
||||
"kind", UP_DEVICE_KIND_KEYBOARD,
|
||||
|
@ -683,7 +686,7 @@ up_client_changed (UpClient *client,
|
|||
"state", UP_DEVICE_STATE_DISCHARGING,
|
||||
"time-to-empty", 250,
|
||||
NULL);
|
||||
g_ptr_array_add (devices, device);
|
||||
g_ptr_array_add (priv->devices, device);
|
||||
device = up_device_new ();
|
||||
g_object_set (device,
|
||||
"kind", UP_DEVICE_KIND_BATTERY,
|
||||
|
@ -694,7 +697,7 @@ up_client_changed (UpClient *client,
|
|||
"energy-rate", 15.0,
|
||||
"time-to-empty", 400,
|
||||
NULL);
|
||||
g_ptr_array_add (devices, device);
|
||||
g_ptr_array_add (priv->devices, device);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -709,9 +712,9 @@ up_client_changed (UpClient *client,
|
|||
"power-supply", TRUE,
|
||||
"is-present", TRUE,
|
||||
NULL);
|
||||
for (i = 0; devices != NULL && i < devices->len; i++)
|
||||
for (i = 0; priv->devices != NULL && i < priv->devices->len; i++)
|
||||
{
|
||||
UpDevice *device = (UpDevice*) g_ptr_array_index (devices, i);
|
||||
UpDevice *device = (UpDevice*) g_ptr_array_index (priv->devices, i);
|
||||
g_object_get (device,
|
||||
"kind", &kind,
|
||||
"state", &state,
|
||||
|
@ -776,9 +779,9 @@ up_client_changed (UpClient *client,
|
|||
if (!on_ups && n_batteries > 1)
|
||||
set_primary (self, composite);
|
||||
|
||||
for (i = 0; devices != NULL && i < devices->len; i++)
|
||||
for (i = 0; priv->devices != NULL && i < priv->devices->len; i++)
|
||||
{
|
||||
UpDevice *device = (UpDevice*) g_ptr_array_index (devices, i);
|
||||
UpDevice *device = (UpDevice*) g_ptr_array_index (priv->devices, i);
|
||||
g_object_get (device, "kind", &kind, NULL);
|
||||
if (kind == UP_DEVICE_KIND_LINE_POWER)
|
||||
{
|
||||
|
@ -802,10 +805,47 @@ up_client_changed (UpClient *client,
|
|||
}
|
||||
}
|
||||
|
||||
g_clear_pointer (&devices, g_ptr_array_unref);
|
||||
g_object_unref (composite);
|
||||
}
|
||||
|
||||
static void
|
||||
up_client_device_removed (UpClient *client,
|
||||
const char *object_path,
|
||||
CcPowerPanel *self)
|
||||
{
|
||||
CcPowerPanelPrivate *priv = self->priv;
|
||||
guint i;
|
||||
|
||||
if (priv->devices == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < priv->devices->len; i++)
|
||||
{
|
||||
UpDevice *device = g_ptr_array_index (priv->devices, i);
|
||||
|
||||
if (g_strcmp0 (object_path, up_device_get_object_path (device)) == 0)
|
||||
{
|
||||
g_ptr_array_remove_index (priv->devices, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
up_client_changed (self->priv->up_client, NULL, self);
|
||||
}
|
||||
|
||||
static void
|
||||
up_client_device_added (UpClient *client,
|
||||
UpDevice *device,
|
||||
CcPowerPanel *self)
|
||||
{
|
||||
CcPowerPanelPrivate *priv = self->priv;
|
||||
|
||||
g_ptr_array_add (priv->devices, g_object_ref (device));
|
||||
g_signal_connect (G_OBJECT (device), "notify",
|
||||
G_CALLBACK (up_client_changed), self);
|
||||
up_client_changed (priv->up_client, NULL, self);
|
||||
}
|
||||
|
||||
static void
|
||||
set_brightness_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
|
||||
{
|
||||
|
@ -2163,6 +2203,7 @@ cc_power_panel_init (CcPowerPanel *self)
|
|||
GError *error;
|
||||
GtkWidget *widget;
|
||||
GtkWidget *box;
|
||||
guint i;
|
||||
|
||||
priv = self->priv = POWER_PANEL_PRIVATE (self);
|
||||
g_resources_register (cc_power_get_resource ());
|
||||
|
@ -2226,9 +2267,15 @@ cc_power_panel_init (CcPowerPanel *self)
|
|||
update_automatic_suspend_label (self);
|
||||
|
||||
/* populate batteries */
|
||||
g_signal_connect (priv->up_client, "device-added", G_CALLBACK (up_client_changed), self);
|
||||
g_signal_connect (priv->up_client, "device-changed", G_CALLBACK (up_client_changed), self);
|
||||
g_signal_connect (priv->up_client, "device-removed", G_CALLBACK (up_client_changed), self);
|
||||
g_signal_connect (priv->up_client, "device-added", G_CALLBACK (up_client_device_added), self);
|
||||
g_signal_connect (priv->up_client, "device-removed", G_CALLBACK (up_client_device_removed), self);
|
||||
|
||||
priv->devices = up_client_get_devices (priv->up_client);
|
||||
for (i = 0; priv->devices != NULL && i < priv->devices->len; i++) {
|
||||
UpDevice *device = g_ptr_array_index (priv->devices, i);
|
||||
g_signal_connect (G_OBJECT (device), "notify",
|
||||
G_CALLBACK (up_client_changed), self);
|
||||
}
|
||||
up_client_changed (priv->up_client, NULL, self);
|
||||
|
||||
widget = WID (priv->builder, "vbox_power");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue