1 /* Not particularly good interface to hal, for programs that used to use
12 int num_batteries
= 0;
23 static void get_devinfo(gpointer device
, gpointer result
)
31 struct context
*ctx
= result
;
33 g_object_get(G_OBJECT(device
), "percentage", &percentage
,
37 "time-to-empty", &time_to_empty
,
38 "time-to-full", &time_to_full
,
40 if (kind
== UP_DEVICE_KIND_BATTERY
) {
41 if (ctx
->current
== ctx
->needed
) {
42 ctx
->percentage
= (int)percentage
;
45 ctx
->time
= time_to_empty
;
47 ctx
->time
= time_to_full
;
50 } else if (kind
== UP_DEVICE_KIND_LINE_POWER
) {
55 int upower_supported(void)
63 GPtrArray
*devices
= up_client_get_devices(up
);
69 g_ptr_array_unref(devices
);
76 /* Fill the passed apm_info struct. */
77 int upower_read(int battery
, apm_info
*info
)
80 GPtrArray
*devices
= NULL
;
87 #if !UP_CHECK_VERSION(0, 9, 99)
88 /* Allow a battery that was not present before to appear. */
89 up_client_enumerate_devices_sync(up
, NULL
, NULL
);
92 devices
= up_client_get_devices(up
);
97 info
->battery_flags
= 0;
98 info
->using_minutes
= 0;
100 struct context ctx
= {
102 .needed
= battery
- 1,
103 .state
= UP_DEVICE_STATE_UNKNOWN
,
109 g_ptr_array_foreach(devices
, &get_devinfo
, &ctx
);
111 info
->ac_line_status
= ctx
.ac
;
113 /* remaining_time and charge_level.percentage are not a mandatory
114 * keys, so if not present, -1 will be returned */
115 info
->battery_time
= ctx
.time
;
116 info
->battery_percentage
= ctx
.percentage
;
117 if (ctx
.state
== UP_DEVICE_STATE_DISCHARGING
) {
118 info
->battery_status
= BATTERY_STATUS_CHARGING
;
119 /* charge_level.warning and charge_level.low are not
120 * required to be available; this is good enough */
121 if (info
->battery_percentage
< 1)
122 info
->battery_status
= BATTERY_STATUS_CRITICAL
;
123 else if (info
->battery_percentage
< 10)
124 info
->battery_status
= BATTERY_STATUS_LOW
;
125 } else if (info
->ac_line_status
&& ctx
.state
== UP_DEVICE_STATE_CHARGING
) {
126 info
->battery_status
= BATTERY_STATUS_CHARGING
;
127 info
->battery_flags
= info
->battery_flags
| BATTERY_FLAGS_CHARGING
;
128 } else if (info
->ac_line_status
) {
129 /* Must be fully charged. */
130 info
->battery_status
= BATTERY_STATUS_HIGH
;
132 fprintf(stderr
, "unknown battery state\n");
135 if (ctx
.percentage
< 0) {
136 info
->battery_percentage
= 0;
137 info
->battery_time
= 0;
138 info
->battery_status
= BATTERY_STATUS_ABSENT
;
141 g_ptr_array_free(devices
, TRUE
);