diff --git a/plugins/power/csd-power-manager.c b/plugins/power/csd-power-manager.c index 5754a85..b604a37 100644 --- a/plugins/power/csd-power-manager.c +++ b/plugins/power/csd-power-manager.c @@ -182,6 +182,7 @@ struct CsdPowerManagerPrivate gboolean use_time_primary; GIcon *previous_icon; guint previous_percentage; + guint previous_charge_state; GPtrArray *devices_array; guint action_percentage; guint action_time; @@ -441,7 +442,8 @@ typedef enum { static void engine_emit_changed (CsdPowerManager *manager, gboolean icon_changed, - gboolean percentage_changed) + gboolean percentage_changed, + gboolean charge_state_changed) { /* not yet connected to the bus */ if (manager->priv->power_iface == NULL) @@ -469,6 +471,12 @@ engine_emit_changed (CsdPowerManager *manager, need_flush = TRUE; } + if (charge_state_changed) { + csd_power_set_state (manager->priv->power_iface, + manager->priv->previous_charge_state); + need_flush = TRUE; + } + if (need_flush) { g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (manager->priv->power_iface)); } @@ -791,18 +799,63 @@ engine_recalculate_state_percentage (CsdPowerManager *manager) return FALSE; } +static guint +engine_get_battery_charge_state (CsdPowerManager *manager) +{ + guint i; + GPtrArray *array; + UpDevice *device; + UpDeviceKind kind; + gboolean is_present; + UpDeviceState state = UP_DEVICE_STATE_UNKNOWN; + + array = manager->priv->devices_array; + for (i = 0; i < array->len; i++) { + device = g_ptr_array_index (array, i); + g_object_get (device, + "kind", &kind, + "is-present", &is_present, + NULL); + + if (!is_present || kind != UP_DEVICE_KIND_BATTERY) + continue; + + device = engine_get_composite_device (manager, device); + g_object_get (device, "state", &state, NULL); + return (guint) state; + } + + return (guint) UP_DEVICE_STATE_UNKNOWN; +} + +static gboolean +engine_recalculate_state_charge_state (CsdPowerManager *manager) +{ + guint charge_state; + + charge_state = engine_get_battery_charge_state (manager); + if (manager->priv->previous_charge_state != charge_state) { + manager->priv->previous_charge_state = charge_state; + return TRUE; + } + + return FALSE; +} + static void engine_recalculate_state (CsdPowerManager *manager) { gboolean icon_changed = FALSE; gboolean percentage_changed = FALSE; + gboolean charge_state_changed = FALSE; icon_changed = engine_recalculate_state_icon (manager); percentage_changed = engine_recalculate_state_percentage (manager); + charge_state_changed = engine_recalculate_state_charge_state (manager); - /* emit if the icon or percentage has changed */ - if (icon_changed || percentage_changed) - engine_emit_changed (manager, icon_changed, percentage_changed); + /* emit if the icon, percentage, or charge state has changed */ + if (icon_changed || percentage_changed || charge_state_changed) + engine_emit_changed (manager, icon_changed, percentage_changed, charge_state_changed); } static UpDevice * @@ -4886,6 +4939,7 @@ csd_power_manager_init (CsdPowerManager *manager) manager->priv = CSD_POWER_MANAGER_GET_PRIVATE (manager); manager->priv->inhibit_lid_switch_fd = -1; manager->priv->inhibit_suspend_fd = -1; + manager->priv->previous_charge_state = G_MAXUINT; } static void diff --git a/plugins/power/org.cinnamon.SettingsDaemon.Power.xml b/plugins/power/org.cinnamon.SettingsDaemon.Power.xml index 07bfb88..6ff937d 100644 --- a/plugins/power/org.cinnamon.SettingsDaemon.Power.xml +++ b/plugins/power/org.cinnamon.SettingsDaemon.Power.xml @@ -8,6 +8,8 @@ + +