1 /* Not particularly good interface to hal, for programs that used to use
25 static void get_devinfo(gpointer device
, gpointer result
)
33 struct context
*ctx
= result
;
35 g_object_get(G_OBJECT(device
), "percentage", &percentage
,
39 "time-to-empty", &time_to_empty
,
40 "time-to-full", &time_to_full
,
42 if (kind
== UP_DEVICE_KIND_BATTERY
) {
43 if (ctx
->current
== ctx
->needed
) {
44 ctx
->percentage
= (int)percentage
;
47 ctx
->time
= time_to_empty
;
49 ctx
->time
= time_to_full
;
52 } else if (kind
== UP_DEVICE_KIND_LINE_POWER
) {
57 int upower_supported(void)
64 GPtrArray
*devices
= up_client_get_devices(up
);
69 g_ptr_array_unref(devices
);
75 /* Fill the passed apm_info struct. */
76 int upower_read(int battery
, apm_info
*info
)
78 GPtrArray
*devices
= NULL
;
79 static int retries
= 0;
86 #if !UP_CHECK_VERSION(0, 9, 99)
87 /* Allow a battery that was not present before to appear. */
88 up_client_enumerate_devices_sync(up
, NULL
, NULL
);
91 devices
= up_client_get_devices(up
);
95 if (retries
< MAX_RETRIES
)
96 return 0; /* fine immediately after hibernation */
102 info
->battery_flags
= 0;
103 info
->using_minutes
= 0;
105 struct context ctx
= {
107 .needed
= battery
- 1,
108 .state
= UP_DEVICE_STATE_UNKNOWN
,
114 g_ptr_array_foreach(devices
, &get_devinfo
, &ctx
);
116 info
->ac_line_status
= ctx
.ac
;
118 /* remaining_time and charge_level.percentage are not a mandatory
119 * keys, so if not present, -1 will be returned */
120 info
->battery_time
= ctx
.time
;
121 info
->battery_percentage
= ctx
.percentage
;
122 if (ctx
.state
== UP_DEVICE_STATE_DISCHARGING
) {
123 info
->battery_status
= BATTERY_STATUS_CHARGING
;
124 /* charge_level.warning and charge_level.low are not
125 * required to be available; this is good enough */
126 if (info
->battery_percentage
< 1)
127 info
->battery_status
= BATTERY_STATUS_CRITICAL
;
128 else if (info
->battery_percentage
< 10)
129 info
->battery_status
= BATTERY_STATUS_LOW
;
130 } else if (info
->ac_line_status
&& ctx
.state
== UP_DEVICE_STATE_CHARGING
) {
131 info
->battery_status
= BATTERY_STATUS_CHARGING
;
132 info
->battery_flags
= info
->battery_flags
| BATTERY_FLAGS_CHARGING
;
133 } else if (info
->ac_line_status
) {
134 /* Must be fully charged. */
135 info
->battery_status
= BATTERY_STATUS_HIGH
;
137 fprintf(stderr
, "unknown battery state\n");
140 if (ctx
.percentage
< 0) {
141 info
->battery_percentage
= 0;
142 info
->battery_time
= 0;
143 info
->battery_status
= BATTERY_STATUS_ABSENT
;
146 g_ptr_array_free(devices
, TRUE
);