1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
|
namespace AstalBattery {
public Device get_default() {
return Device.get_default();
}
public class Device : Object {
private static Device display_device;
public static Device? get_default() {
if (display_device != null)
return display_device;
try {
display_device = new Device("/org/freedesktop/UPower/devices/DisplayDevice");
return display_device;
} catch (Error error) {
critical(error.message);
}
return null;
}
private IUPowerDevice proxy;
public Device(string path) throws Error {
proxy = Bus.get_proxy_sync(BusType.SYSTEM, "org.freedesktop.UPower", path);
proxy.g_properties_changed.connect(sync);
sync();
}
public Type device_type { get; private set; }
public string native_path { owned get; private set; }
public string vendor { owned get; private set; }
public string model { owned get; private set; }
public string serial { owned get; private set; }
public uint64 update_time { get; private set; }
public bool power_supply { get; private set; }
public bool has_history { get; private set; }
public bool has_statistics { get; private set; }
public bool online { get; private set; }
public double energy { get; private set; }
public double energy_empty { get; private set; }
public double energy_full { get; private set; }
public double energy_full_design { get; private set; }
public double energy_rate { get; private set; }
public double voltage { get; private set; }
public int charge_cycles { get; private set; }
public double luminosity { get; private set; }
public int64 time_to_empty { get; private set; }
public int64 time_to_full { get; private set;}
public double percentage { get; private set; }
public double temperature { get; private set; }
public bool is_present { get; private set; }
public State state { get; private set; }
public bool is_rechargable { get; private set; }
public double capacity { get; private set; }
public Technology technology { get; private set; }
public WarningLevel warning_level { get; private set; }
public BatteryLevel battery_level { get; private set; }
public string icon_name { owned get; private set; }
public bool charging { get; private set; }
public bool is_battery { get; private set; }
public string battery_icon_name { get; private set; }
public string device_type_name { get; private set; }
public string device_type_icon { get; private set; }
private unowned string get_battery_icon() {
if (percentage <= 0)
return "battery-good";
if (percentage < 0.10)
return "battery-empty";
if (percentage < 0.37)
return "battery-caution";
if (percentage < 0.62)
return "battery-low";
if (percentage < 0.87)
return "battery-good";
return "battery-full";
}
public void sync() {
device_type = (Type)proxy.Type;
native_path = proxy.native_path;
vendor = proxy.vendor;
model = proxy.model;
serial = proxy.serial;
update_time = proxy.update_time;
power_supply = proxy.power_supply;
has_history = proxy.has_history;
has_statistics = proxy.has_statistics;
online = proxy.online;
energy = proxy.energy;
energy_empty = proxy.energy_empty;
energy_full = proxy.energy_full;
energy_full_design = proxy.energy_full_design;
energy_rate = proxy.energy_rate;
voltage = proxy.voltage;
charge_cycles = proxy.charge_cycles;
luminosity = proxy.luminosity;
time_to_empty = proxy.time_to_empty;
time_to_full = proxy.time_to_full;
percentage = proxy.percentage / 100;
temperature = proxy.temperature;
is_present = proxy.is_present;
state = (State)proxy.state;
is_rechargable = proxy.is_rechargable;
capacity = proxy.capacity;
technology = (Technology)proxy.technology;
warning_level = (WarningLevel)proxy.warning_level;
battery_level = (BatteryLevel)proxy.battery_level;
icon_name = proxy.icon_name;
charging = state == State.FULLY_CHARGED || state == State.CHARGING;
is_battery = device_type != Type.UNKNOWN && device_type != Type.LINE_POWER;
if (!is_battery)
battery_icon_name = "preferences-system-power";
else if (percentage == 1.0 && charging)
battery_icon_name = "battery-full-charged";
else
battery_icon_name = charging ? get_battery_icon() + "-charging" : get_battery_icon();
device_type_name = device_type.get_name();
device_type_icon = device_type.get_icon_name();
}
}
[CCode (type_signature = "u")]
public enum State {
UNKNOWN,
CHARGING,
DISCHARGING,
EMPTY,
FULLY_CHARGED,
PENDING_CHARGE,
PENDING_DISCHARGE,
}
[CCode (type_signature = "u")]
public enum Technology {
UNKNOWN,
LITHIUM_ION,
LITHIUM_POLYMER,
LITHIUM_IRON_PHOSPHATE,
LEAD_ACID,
NICKEL_CADMIUM,
NICKEL_METAL_HYDRIDE,
}
[CCode (type_signature = "u")]
public enum WarningLevel {
UNKNOWN,
NONE,
DISCHARGING,
LOW,
CRITICIAL,
ACTION,
}
[CCode (type_signature = "u")]
public enum BatteryLevel {
UNKNOWN,
NONE,
LOW,
CRITICIAL,
NORMAL,
HIGH,
FULL,
}
[CCode (type_signature = "u")]
public enum Type {
UNKNOWN,
LINE_POWER,
BATTERY,
UPS,
MONITOR,
MOUSE,
KEYBOARD,
PDA,
PHONE,
MEDIA_PLAYER,
TABLET,
COMPUTER,
GAMING_INPUT,
PEN,
TOUCHPAD,
MODEM,
NETWORK,
HEADSET,
SPEAKERS,
HEADPHONES,
VIDEO,
OTHER_AUDIO,
REMOVE_CONTROL,
PRINTER,
SCANNER,
CAMERA,
WEARABLE,
TOY,
BLUETOOTH_GENERIC;
// TODO: add more icon names
public string? get_icon_name () {
switch (this) {
case UPS:
return "uninterruptible-power-supply";
case MOUSE:
return "input-mouse";
case KEYBOARD:
return "input-keyboard";
case PDA:
case PHONE:
return "phone";
case MEDIA_PLAYER:
return "multimedia-player";
case TABLET:
case PEN:
return "input-tablet";
case GAMING_INPUT:
return "input-gaming";
default:
return null;
}
}
public unowned string? get_name () {
switch (this) {
case LINE_POWER:
return "Plugged In";
case BATTERY:
return "Battery";
case UPS:
return "UPS";
case MONITOR:
return "Display";
case MOUSE:
return "Mouse";
case KEYBOARD:
return "Keyboard";
case PDA:
return "PDA";
case PHONE:
return "Phone";
case MEDIA_PLAYER:
return "Media Player";
case TABLET:
return "Tablet";
case COMPUTER:
return "Computer";
case GAMING_INPUT:
return "Controller";
case PEN:
return "Pen";
case TOUCHPAD:
return "Touchpad";
case MODEM:
return "Modem";
case NETWORK:
return "Network";
case HEADSET:
return "Headset";
case SPEAKERS:
return "Speakers";
case HEADPHONES:
return "Headphones";
case VIDEO:
return "Video";
case OTHER_AUDIO:
return "Other Audio";
case REMOVE_CONTROL:
return "Remove Control";
case PRINTER:
return "Printer";
case SCANNER:
return "Scanner";
case CAMERA:
return "Camera";
case WEARABLE:
return "Wearable";
case TOY:
return "Toy";
case BLUETOOTH_GENERIC:
return "Bluetooth Generic";
default:
return "Unknown";
}
}
}
}
|