2
* * Copyright (C) 2009-2011 Ali <aliov@xfce.org>
4
* Licensed under the GNU General Public License Version 2
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31
#include <libxfce4util/libxfce4util.h>
33
#include "xfpm-battery.h"
34
#include "xfpm-dbus.h"
35
#include "xfpm-icons.h"
36
#include "xfpm-xfconf.h"
37
#include "xfpm-notify.h"
38
#include "xfpm-config.h"
39
#include "xfpm-button.h"
40
#include "xfpm-enum-glib.h"
41
#include "xfpm-enum-types.h"
42
#include "xfpm-debug.h"
43
#include "xfpm-power-common.h"
44
#include "xfpm-common.h"
46
static void xfpm_battery_finalize (GObject *object);
48
#define XFPM_BATTERY_GET_PRIVATE(o) \
49
(G_TYPE_INSTANCE_GET_PRIVATE ((o), XFPM_TYPE_BATTERY, XfpmBatteryPrivate))
51
struct XfpmBatteryPrivate
57
DBusGProxy *proxy_prop;
61
XfpmBatteryCharge charge;
62
XfpmDeviceState state;
70
const gchar *battery_name;
88
BATTERY_CHARGE_CHANGED,
92
static guint signals [LAST_SIGNAL] = { 0 };
94
G_DEFINE_TYPE (XfpmBattery, xfpm_battery, GTK_TYPE_STATUS_ICON)
96
static const gchar * G_GNUC_CONST
97
xfpm_battery_get_icon_index (XfpmDeviceType type, guint percent)
103
else if (percent < 30)
105
return ( (type == XFPM_DEVICE_TYPE_BATTERY || type == XFPM_DEVICE_TYPE_UPS) ? "020" : "030");
107
else if (percent < 50)
109
return ( (type == XFPM_DEVICE_TYPE_BATTERY || type == XFPM_DEVICE_TYPE_UPS ) ? "040" : "030");
111
else if (percent < 70)
115
else if (percent < 90)
117
return ((type == XFPM_DEVICE_TYPE_BATTERY || type == XFPM_DEVICE_TYPE_UPS) ? "080" : "060");
124
xfpm_battery_refresh_visible (XfpmBattery *battery)
126
XfpmShowIcon show_icon;
127
gboolean visible = TRUE;
129
g_object_get (G_OBJECT (battery->priv->conf),
130
SHOW_TRAY_ICON_CFG, &show_icon,
133
if ( show_icon == SHOW_ICON_ALWAYS )
135
else if ( show_icon == NEVER_SHOW_ICON )
137
else if ( show_icon == SHOW_ICON_WHEN_BATTERY_PRESENT )
139
if ( battery->priv->present )
141
else visible = FALSE;
143
else if ( show_icon == SHOW_ICON_WHEN_BATTERY_CHARGING_DISCHARGING )
145
if ( battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
150
XFPM_DEBUG_ENUM (show_icon, XFPM_TYPE_SHOW_ICON, "visible=%s", xfpm_bool_to_string (visible));
152
gtk_status_icon_set_visible (GTK_STATUS_ICON (battery), visible);
160
xfpm_battery_get_time_string (guint seconds)
162
char* timestring = NULL;
166
/* Add 0.5 to do rounding */
167
minutes = (int) ( ( seconds / 60.0 ) + 0.5 );
171
timestring = g_strdup (_("Unknown time"));
177
timestring = g_strdup_printf (ngettext ("%i minute",
183
hours = minutes / 60;
184
minutes = minutes % 60;
187
timestring = g_strdup_printf (ngettext (
192
/* TRANSLATOR: "%i %s %i %s" are "%i hours %i minutes"
193
* Swap order with "%2$s %2$i %1$s %1$i if needed */
194
timestring = g_strdup_printf (_("%i %s %i %s"),
195
hours, ngettext ("hour", "hours", hours),
196
minutes, ngettext ("minute", "minutes", minutes));
201
xfpm_battery_get_message_from_battery_state (XfpmBattery *battery)
206
if (battery->priv->type == XFPM_DEVICE_TYPE_BATTERY || battery->priv->type == XFPM_DEVICE_TYPE_UPS)
208
switch (battery->priv->state)
210
case XFPM_DEVICE_STATE_FULLY_CHARGED:
211
msg = g_strdup_printf (_("Your %s is fully charged"), battery->priv->battery_name);
213
case XFPM_DEVICE_STATE_CHARGING:
214
msg = g_strdup_printf (_("Your %s is charging"), battery->priv->battery_name);
216
if ( battery->priv->time_to_full != 0 )
218
gchar *tmp, *est_time_str;
219
tmp = g_strdup (msg);
222
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_full);
224
msg = g_strdup_printf (_("%s (%i%%)\n%s until is fully charged."), tmp, battery->priv->percentage, est_time_str);
225
g_free (est_time_str);
230
case XFPM_DEVICE_STATE_DISCHARGING:
231
if (battery->priv->ac_online)
232
msg = g_strdup_printf (_("Your %s is discharging"), battery->priv->battery_name);
234
msg = g_strdup_printf (_("System is running on %s power"), battery->priv->battery_name);
236
if ( battery->priv->time_to_empty != 0 )
238
gchar *tmp, *est_time_str;
239
tmp = g_strdup (msg);
242
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_empty);
244
msg = g_strdup_printf (_("%s (%i%%)\nEstimated time left is %s."), tmp, battery->priv->percentage, est_time_str);
246
g_free (est_time_str);
249
case XFPM_DEVICE_STATE_EMPTY:
250
msg = g_strdup_printf (_("Your %s is empty"), battery->priv->battery_name);
257
else if (battery->priv->type >= XFPM_DEVICE_TYPE_MONITOR)
259
switch (battery->priv->state)
261
case XFPM_DEVICE_STATE_FULLY_CHARGED:
262
msg = g_strdup_printf (_("Your %s is fully charged"), battery->priv->battery_name);
264
case XFPM_DEVICE_STATE_CHARGING:
265
msg = g_strdup_printf (_("Your %s is charging"), battery->priv->battery_name);
267
case XFPM_DEVICE_STATE_DISCHARGING:
268
msg = g_strdup_printf (_("Your %s is discharging"), battery->priv->battery_name);
270
case XFPM_DEVICE_STATE_EMPTY:
271
msg = g_strdup_printf (_("Your %s is empty"), battery->priv->battery_name);
282
xfpm_battery_refresh_icon (XfpmBattery *battery)
284
gchar icon_name[128];
286
XFPM_DEBUG ("Battery state %d", battery->priv->state);
288
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
289
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
291
if (!battery->priv->present)
293
g_snprintf (icon_name, 128, "%s%s", battery->priv->icon_prefix, "missing");
295
else if (battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
297
g_snprintf (icon_name, 128, "%s%s", battery->priv->icon_prefix, battery->priv->ac_online ? "charged" : "100");
299
else if ( battery->priv->state == XFPM_DEVICE_STATE_CHARGING ||
300
battery->priv->state == XFPM_DEVICE_STATE_PENDING_CHARGING)
302
g_snprintf (icon_name, 128, "%s%s-%s",
303
battery->priv->icon_prefix,
304
xfpm_battery_get_icon_index (battery->priv->type, battery->priv->percentage),
307
else if ( battery->priv->state == XFPM_DEVICE_STATE_DISCHARGING ||
308
battery->priv->state == XFPM_DEVICE_STATE_PENDING_DISCHARGING)
310
g_snprintf (icon_name, 128, "%s%s",
311
battery->priv->icon_prefix,
312
xfpm_battery_get_icon_index (battery->priv->type, battery->priv->percentage));
314
else if ( battery->priv->state == XFPM_DEVICE_STATE_EMPTY)
316
g_snprintf (icon_name, 128, "%s%s", battery->priv->icon_prefix, battery->priv->ac_online ? "000-charging" : "000");
321
if ( !battery->priv->present || battery->priv->state == XFPM_DEVICE_STATE_EMPTY )
323
g_snprintf (icon_name, 128, "%s-000", battery->priv->icon_prefix);
325
else if ( battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
327
g_snprintf (icon_name, 128, "%s-100", battery->priv->icon_prefix);
329
else if ( battery->priv->state == XFPM_DEVICE_STATE_DISCHARGING )
331
g_snprintf (icon_name, 128, "%s-%s",
332
battery->priv->icon_prefix,
333
xfpm_battery_get_icon_index (battery->priv->type, battery->priv->percentage));
337
gtk_status_icon_set_from_icon_name (GTK_STATUS_ICON (battery), icon_name);
341
xfpm_battery_notify (XfpmBattery *battery)
343
gchar *message = NULL;
345
message = xfpm_battery_get_message_from_battery_state (battery);
350
xfpm_notify_show_notification (battery->priv->notify,
353
gtk_status_icon_get_icon_name (GTK_STATUS_ICON (battery)),
357
GTK_STATUS_ICON (battery));
363
xfpm_battery_notify_idle (gpointer data)
365
XfpmBattery *battery = XFPM_BATTERY (data);
367
xfpm_battery_notify (battery);
368
battery->priv->notify_idle = 0;
374
xfpm_battery_notify_state (XfpmBattery *battery)
377
static gboolean starting_up = TRUE;
379
if ( !gtk_status_icon_get_visible (GTK_STATUS_ICON (battery)) )
382
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
383
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
391
g_object_get (G_OBJECT (battery->priv->conf),
392
GENERAL_NOTIFICATION_CFG, ¬ify,
397
if (battery->priv->notify_idle == 0)
398
battery->priv->notify_idle = g_idle_add (xfpm_battery_notify_idle, battery);
404
* Refresh tooltip function for UPS and battery device only.
407
xfpm_battery_set_tooltip_primary (XfpmBattery *battery, GtkTooltip *tooltip)
410
gchar *est_time_str = NULL;
411
gchar *power_status = NULL;
413
power_status = g_strdup_printf (battery->priv->ac_online ? _("Adaptor is online") : _("System is running on battery power"));
415
if ( battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
417
if ( battery->priv->time_to_empty > 0 )
419
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_empty);
420
tip = g_strdup_printf (_("%s\nYour %s is fully charged (%i%%).\nProvides %s runtime"),
422
battery->priv->battery_name,
423
battery->priv->percentage,
425
g_free (est_time_str);
429
tip = g_strdup_printf (_("%s\nYour %s is fully charged (%i%%)."),
431
battery->priv->battery_name,
432
battery->priv->percentage);
435
else if ( battery->priv->state == XFPM_DEVICE_STATE_CHARGING )
437
if ( battery->priv->time_to_full != 0 )
439
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_full);
440
tip = g_strdup_printf (_("%s\nYour %s is charging (%i%%)\n%s until is fully charged."),
442
battery->priv->battery_name,
443
battery->priv->percentage,
445
g_free (est_time_str);
449
tip = g_strdup_printf (_("%s\nYour %s is charging (%i%%)."),
451
battery->priv->battery_name,
452
battery->priv->percentage);
455
else if ( battery->priv->state == XFPM_DEVICE_STATE_DISCHARGING )
457
if ( battery->priv->time_to_empty != 0 )
459
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_empty);
460
tip = g_strdup_printf (_("%s\nYour %s is discharging (%i%%)\nEstimated time left is %s."),
462
battery->priv->battery_name,
463
battery->priv->percentage,
465
g_free (est_time_str);
469
tip = g_strdup_printf (_("%s\nYour %s is discharging (%i%%)."),
471
battery->priv->battery_name,
472
battery->priv->percentage);
476
else if ( battery->priv->state == XFPM_DEVICE_STATE_PENDING_CHARGING )
478
tip = g_strdup_printf (_("%s\n%s waiting to discharge (%i%%)."), power_status, battery->priv->battery_name, battery->priv->percentage);
480
else if ( battery->priv->state == XFPM_DEVICE_STATE_PENDING_DISCHARGING )
482
tip = g_strdup_printf (_("%s\n%s waiting to charge (%i%%)."), power_status, battery->priv->battery_name, battery->priv->percentage);
484
else if ( battery->priv->state == XFPM_DEVICE_STATE_EMPTY )
486
tip = g_strdup_printf (_("%s\nYour %s is empty"), power_status, battery->priv->battery_name);
489
gtk_tooltip_set_text (tooltip, tip);
490
g_free (power_status);
495
xfpm_battery_check_charge (XfpmBattery *battery)
497
XfpmBatteryCharge charge;
498
guint critical_level, low_level;
500
g_object_get (G_OBJECT (battery->priv->conf),
501
CRITICAL_POWER_LEVEL, &critical_level,
504
low_level = critical_level + 10;
506
if ( battery->priv->percentage > low_level )
507
charge = XFPM_BATTERY_CHARGE_OK;
508
else if ( battery->priv->percentage <= low_level && battery->priv->percentage > critical_level )
509
charge = XFPM_BATTERY_CHARGE_LOW;
510
else if ( battery->priv->percentage <= critical_level )
511
charge = XFPM_BATTERY_CHARGE_CRITICAL;
513
if ( charge != battery->priv->charge)
515
battery->priv->charge = charge;
517
* only emit signal when when battery charge changes from ok->low->critical
518
* and not the other way round.
520
if ( battery->priv->charge != XFPM_BATTERY_CHARGE_CRITICAL || charge != XFPM_BATTERY_CHARGE_LOW )
521
g_signal_emit (G_OBJECT (battery), signals [BATTERY_CHARGE_CHANGED], 0);
526
xfpm_battery_refresh (XfpmBattery *battery, GHashTable *props)
531
value = g_hash_table_lookup (props, "IsPresent");
535
g_warning ("No 'IsPresent' property found");
539
battery->priv->present = g_value_get_boolean (value);
541
value = g_hash_table_lookup (props, "State");
545
g_warning ("No 'State' property found");
548
state = g_value_get_uint (value);
549
if ( state != battery->priv->state )
551
battery->priv->state = state;
552
xfpm_battery_refresh_visible (battery);
553
xfpm_battery_notify_state (battery);
556
value = g_hash_table_lookup (props, "Percentage");
560
g_warning ("No 'Percentage' property found on battery device");
564
battery->priv->percentage = (guint) g_value_get_double (value);
566
xfpm_battery_check_charge (battery);
568
xfpm_battery_refresh_icon (battery);
570
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
571
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
573
value = g_hash_table_lookup (props, "TimeToEmpty");
577
g_warning ("No 'TimeToEmpty' property found on battery device");
581
battery->priv->time_to_empty = g_value_get_int64 (value);
583
value = g_hash_table_lookup (props, "TimeToFull");
587
g_warning ("No 'TimeToFull' property found on battery device");
591
battery->priv->time_to_full = g_value_get_int64 (value);
595
g_hash_table_destroy (props);
599
xfpm_battery_button_pressed_cb (XfpmButton *button, XfpmButtonKey type, XfpmBattery *battery)
601
if (type == BUTTON_BATTERY)
602
xfpm_battery_notify (battery);
606
xfpm_battery_changed_cb (DBusGProxy *proxy, XfpmBattery *battery)
610
props = xfpm_power_get_interface_properties (battery->priv->proxy_prop,
611
UPOWER_IFACE_DEVICE);
614
xfpm_battery_refresh (battery, props);
618
xfpm_battery_query_tooltip (GtkStatusIcon *icon,
621
gboolean keyboard_mode,
624
XfpmBattery *battery;
626
battery = XFPM_BATTERY (icon);
628
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
629
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
631
xfpm_battery_set_tooltip_primary (battery, tooltip);
639
xfpm_battery_tray_icon_settings_changed (GObject *obj, GParamSpec *spec, XfpmBattery *battery)
641
xfpm_battery_refresh_visible (battery);
644
static void xfpm_battery_get_property (GObject *object,
649
XfpmBattery *battery;
651
battery = XFPM_BATTERY (object);
656
g_value_set_boolean (value, battery->priv->ac_online);
658
case PROP_DEVICE_TYPE:
659
g_value_set_enum (value, battery->priv->type);
661
case PROP_CHARGE_STATUS:
662
g_value_set_enum (value, battery->priv->charge);
665
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
670
static void xfpm_battery_set_property (GObject *object,
675
XfpmBattery *battery;
677
battery = XFPM_BATTERY (object);
682
battery->priv->ac_online = g_value_get_boolean (value);
683
xfpm_battery_refresh_icon (battery);
686
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
693
xfpm_battery_class_init (XfpmBatteryClass *klass)
695
GObjectClass *object_class = G_OBJECT_CLASS (klass);
696
GtkStatusIconClass *status_icon_class = GTK_STATUS_ICON_CLASS (klass);
698
object_class->finalize = xfpm_battery_finalize;
699
object_class->get_property = xfpm_battery_get_property;
700
object_class->set_property = xfpm_battery_set_property;
702
status_icon_class->query_tooltip = xfpm_battery_query_tooltip;
704
signals [BATTERY_CHARGE_CHANGED] =
705
g_signal_new ("battery-charge-changed",
708
G_STRUCT_OFFSET(XfpmBatteryClass, battery_charge_changed),
710
g_cclosure_marshal_VOID__VOID,
711
G_TYPE_NONE, 0, G_TYPE_NONE);
713
g_object_class_install_property (object_class,
715
g_param_spec_boolean("ac-online",
720
g_object_class_install_property (object_class,
722
g_param_spec_enum ("device-type",
724
XFPM_TYPE_DEVICE_TYPE,
725
XFPM_DEVICE_TYPE_UNKNOWN,
728
g_object_class_install_property (object_class,
730
g_param_spec_enum ("charge-status",
732
XFPM_TYPE_BATTERY_CHARGE,
733
XFPM_BATTERY_CHARGE_UNKNOWN,
736
g_type_class_add_private (klass, sizeof (XfpmBatteryPrivate));
740
xfpm_battery_init (XfpmBattery *battery)
742
battery->priv = XFPM_BATTERY_GET_PRIVATE (battery);
744
battery->priv->conf = xfpm_xfconf_new ();
745
battery->priv->notify = xfpm_notify_new ();
746
battery->priv->proxy_prop = NULL;
747
battery->priv->state = XFPM_DEVICE_STATE_UNKNOWN;
748
battery->priv->type = XFPM_DEVICE_TYPE_UNKNOWN;
749
battery->priv->charge = XFPM_BATTERY_CHARGE_UNKNOWN;
750
battery->priv->icon_prefix = NULL;
751
battery->priv->time_to_full = 0;
752
battery->priv->time_to_empty = 0;
753
battery->priv->button = xfpm_button_new ();
754
battery->priv->ac_online = TRUE;
756
battery->priv->sig = g_signal_connect (G_OBJECT (battery->priv->conf), "notify::" SHOW_TRAY_ICON_CFG,
757
G_CALLBACK (xfpm_battery_tray_icon_settings_changed), battery);
760
battery->priv->sig_bt = g_signal_connect (G_OBJECT (battery->priv->button), "button-pressed",
761
G_CALLBACK (xfpm_battery_button_pressed_cb), battery);
765
xfpm_battery_finalize (GObject *object)
767
XfpmBattery *battery;
769
battery = XFPM_BATTERY (object);
771
g_free (battery->priv->icon_prefix);
773
if (battery->priv->notify_idle != 0)
774
g_source_remove (battery->priv->notify_idle);
776
dbus_g_proxy_disconnect_signal (battery->priv->proxy, "Changed",
777
G_CALLBACK (xfpm_battery_changed_cb), battery);
779
if ( g_signal_handler_is_connected (battery->priv->conf, battery->priv->sig ) )
780
g_signal_handler_disconnect (G_OBJECT (battery->priv->conf), battery->priv->sig);
782
if ( g_signal_handler_is_connected (battery->priv->button, battery->priv->sig_bt ) )
783
g_signal_handler_disconnect (G_OBJECT (battery->priv->button), battery->priv->sig_bt);
785
g_object_unref (battery->priv->proxy);
786
g_object_unref (battery->priv->proxy_prop);
787
g_object_unref (battery->priv->conf);
788
g_object_unref (battery->priv->notify);
789
g_object_unref (battery->priv->button);
791
G_OBJECT_CLASS (xfpm_battery_parent_class)->finalize (object);
795
xfpm_battery_get_icon_prefix_device_enum_type (XfpmDeviceType type)
797
if ( type == XFPM_DEVICE_TYPE_BATTERY )
799
return g_strdup (XFPM_PRIMARY_ICON_PREFIX);
801
else if ( type == XFPM_DEVICE_TYPE_UPS )
803
return g_strdup (XFPM_UPS_ICON_PREFIX);
805
else if ( type == XFPM_DEVICE_TYPE_MOUSE )
807
return g_strdup (XFPM_MOUSE_ICON_PREFIX);
809
else if ( type == XFPM_DEVICE_TYPE_KBD )
811
return g_strdup (XFPM_KBD_ICON_PREFIX);
813
else if ( type == XFPM_DEVICE_TYPE_PHONE )
815
return g_strdup (XFPM_PHONE_ICON_PREFIX);
818
return g_strdup (XFPM_PRIMARY_ICON_PREFIX);
822
xfpm_battery_get_name (XfpmDeviceType type)
824
const gchar *name = NULL;
828
case XFPM_DEVICE_TYPE_BATTERY:
831
case XFPM_DEVICE_TYPE_UPS:
834
case XFPM_DEVICE_TYPE_MONITOR:
835
name = _("monitor battery");
837
case XFPM_DEVICE_TYPE_MOUSE:
838
name = _("mouse battery");
840
case XFPM_DEVICE_TYPE_KBD:
841
name = _("keyboard battery");
843
case XFPM_DEVICE_TYPE_PDA:
844
name = _("PDA battery");
846
case XFPM_DEVICE_TYPE_PHONE:
847
name = _("Phone battery");
858
xfpm_battery_new (void)
860
XfpmBattery *battery = NULL;
862
battery = g_object_new (XFPM_TYPE_BATTERY, NULL);
864
return GTK_STATUS_ICON (battery);
867
void xfpm_battery_monitor_device (XfpmBattery *battery,
869
DBusGProxy *proxy_prop,
870
XfpmDeviceType device_type)
872
battery->priv->type = device_type;
873
battery->priv->proxy_prop = proxy_prop;
874
battery->priv->proxy = proxy;
875
battery->priv->icon_prefix = xfpm_battery_get_icon_prefix_device_enum_type (device_type);
876
battery->priv->battery_name = xfpm_battery_get_name (device_type);
879
dbus_g_proxy_add_signal (proxy, "Changed", G_TYPE_INVALID);
880
dbus_g_proxy_connect_signal (proxy, "Changed",
881
G_CALLBACK (xfpm_battery_changed_cb), battery, NULL);
883
g_object_set (G_OBJECT (battery),
887
xfpm_battery_changed_cb (proxy, battery);
890
XfpmDeviceType xfpm_battery_get_device_type (XfpmBattery *battery)
892
g_return_val_if_fail (XFPM_IS_BATTERY (battery), XFPM_DEVICE_TYPE_UNKNOWN );
894
return battery->priv->type;
897
XfpmBatteryCharge xfpm_battery_get_charge (XfpmBattery *battery)
899
g_return_val_if_fail (XFPM_IS_BATTERY (battery), XFPM_BATTERY_CHARGE_UNKNOWN);
901
return battery->priv->charge;
904
const gchar *xfpm_battery_get_battery_name (XfpmBattery *battery)
906
g_return_val_if_fail (XFPM_IS_BATTERY (battery), NULL);
908
return battery->priv->battery_name;
911
gchar *xfpm_battery_get_time_left (XfpmBattery *battery)
913
g_return_val_if_fail (XFPM_IS_BATTERY (battery), NULL);
915
return xfpm_battery_get_time_string (battery->priv->time_to_empty);