142
122
else if ( show_icon == SHOW_ICON_WHEN_BATTERY_PRESENT )
144
if ( battery->priv->state == BATTERY_NOT_PRESENT )
124
if ( battery->priv->present )
126
else visible = FALSE;
148
128
else if ( show_icon == SHOW_ICON_WHEN_BATTERY_CHARGING_DISCHARGING )
150
if ( battery->priv->state == BATTERY_FULLY_CHARGED )
130
if ( battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
152
132
else visible = TRUE;
155
XFPM_DEBUG_ENUM ("Tray icon configuration: ", show_icon, XFPM_TYPE_SHOW_ICON);
156
XFPM_DEBUG_ENUM_FULL (battery->priv->state, XFPM_TYPE_BATTERY_STATE, " setting tray icon visible %s",
157
xfpm_bool_to_string (visible));
158
xfpm_tray_icon_set_visible (battery->priv->icon, visible);
135
XFPM_DEBUG_ENUM (show_icon, XFPM_TYPE_SHOW_ICON, "visible=%s", xfpm_bool_to_string (visible));
137
gtk_status_icon_set_visible (GTK_STATUS_ICON (battery), visible);
141
static const gchar * G_GNUC_CONST
142
xfpm_battery_get_message_from_battery_state (XfpmDeviceState state, gboolean ac_online)
146
case XFPM_DEVICE_STATE_FULLY_CHARGED:
147
return _("Your battery is fully charged");
149
case XFPM_DEVICE_STATE_CHARGING:
150
return _("Your battery is charging");
152
case XFPM_DEVICE_STATE_DISCHARGING:
153
return ac_online ? _("Your battery is discharging"): _("System is running on battery power");
162
xfpm_battery_refresh_icon (XfpmBattery *battery,
163
XfpmBatteryState state,
161
xfpm_battery_refresh_icon (XfpmBattery *battery)
168
if ( state == BATTERY_NOT_PRESENT )
170
xfpm_tray_icon_set_icon (battery->priv->icon,
171
battery->priv->type == HAL_DEVICE_TYPE_UPS ?
172
XFPM_UPS_ICON_PREFIX "missing" :
173
XFPM_PRIMARY_ICON_PREFIX "missing");
178
if ( state == BATTERY_FULLY_CHARGED )
180
if ( battery->priv->type == HAL_DEVICE_TYPE_PRIMARY)
181
xfpm_tray_icon_set_icon (battery->priv->icon,
182
battery->priv->adapter_present ?
183
XFPM_PRIMARY_ICON_PREFIX "charged" :
184
XFPM_PRIMARY_ICON_PREFIX "100");
187
icon = g_strdup_printf("%s%s",
188
battery->priv->icon_prefix,
189
xfpm_battery_get_icon_index (battery->priv->type, percentage));
190
xfpm_tray_icon_set_icon (battery->priv->icon, icon);
194
else if ( state == BATTERY_NOT_FULLY_CHARGED )
196
if ( battery->priv->adapter_present )
198
icon = g_strdup_printf("%s%s-%s",
199
battery->priv->icon_prefix,
200
xfpm_battery_get_icon_index (battery->priv->type, percentage),
205
icon = g_strdup_printf("%s%s",
206
battery->priv->icon_prefix,
207
xfpm_battery_get_icon_index (battery->priv->type, percentage));
209
xfpm_tray_icon_set_icon (battery->priv->icon, icon);
213
else if ( state == BATTERY_IS_CHARGING )
215
icon = g_strdup_printf("%s%s-%s",
216
battery->priv->icon_prefix,
217
xfpm_battery_get_icon_index (battery->priv->type, percentage),
220
xfpm_tray_icon_set_icon (battery->priv->icon, icon);
223
else if ( state == BATTERY_IS_DISCHARGING || state == BATTERY_CHARGE_CRITICAL ||
224
state == BATTERY_CHARGE_LOW )
226
icon = g_strdup_printf("%s%s",
227
battery->priv->icon_prefix,
228
xfpm_battery_get_icon_index (battery->priv->type, percentage));
230
xfpm_tray_icon_set_icon (battery->priv->icon, icon);
163
gchar icon_name[128];
165
XFPM_DEBUG ("Battery state %d", battery->priv->state);
167
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
168
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
170
if (!battery->priv->present)
172
g_snprintf (icon_name, 128, "%s%s", battery->priv->icon_prefix, "missing");
174
else if (battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
176
g_snprintf (icon_name, 128, "%s%s", battery->priv->icon_prefix, battery->priv->ac_online ? "charged" : "100");
178
else if ( battery->priv->state == XFPM_DEVICE_STATE_CHARGING ||
179
battery->priv->state == XFPM_DEVICE_STATE_PENDING_CHARGING)
181
g_snprintf (icon_name, 128, "%s%s-%s",
182
battery->priv->icon_prefix,
183
xfpm_battery_get_icon_index (battery->priv->type, battery->priv->percentage),
186
else if ( battery->priv->state == XFPM_DEVICE_STATE_DISCHARGING ||
187
battery->priv->state == XFPM_DEVICE_STATE_PENDING_DISCHARGING)
189
g_snprintf (icon_name, 128, "%s%s",
190
battery->priv->icon_prefix,
191
xfpm_battery_get_icon_index (battery->priv->type, battery->priv->percentage));
196
if ( !battery->priv->present )
198
g_snprintf (icon_name, 128, "%s-000", battery->priv->icon_prefix);
200
else if ( battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
202
g_snprintf (icon_name, 128, "%s-100", battery->priv->icon_prefix);
204
else if ( battery->priv->state == XFPM_DEVICE_STATE_DISCHARGING )
206
g_snprintf (icon_name, 128, "%s-%s",
207
battery->priv->icon_prefix,
208
xfpm_battery_get_icon_index (battery->priv->type, battery->priv->percentage));
212
gtk_status_icon_set_from_icon_name (GTK_STATUS_ICON (battery), icon_name);
242
221
battery = XFPM_BATTERY (data);
244
message = xfpm_battery_get_message_from_battery_state (battery->priv->state, battery->priv->adapter_present);
223
message = xfpm_battery_get_message_from_battery_state (battery->priv->state, battery->priv->ac_online);
248
228
xfpm_notify_show_notification (battery->priv->notify,
249
_("Xfce power manager"),
251
xfpm_tray_icon_get_icon_name (battery->priv->icon),
253
battery->priv->type == HAL_DEVICE_TYPE_PRIMARY ? FALSE : TRUE,
255
xfpm_tray_icon_get_tray_icon(battery->priv->icon));
229
_("Xfce power manager"),
231
gtk_status_icon_get_icon_name (GTK_STATUS_ICON (battery)),
235
GTK_STATUS_ICON (battery));
261
xfpm_battery_notify (XfpmBattery *battery)
240
xfpm_battery_notify_state (XfpmBattery *battery)
264
243
static gboolean starting_up = TRUE;
245
if ( !gtk_status_icon_get_visible (GTK_STATUS_ICON (battery)) )
248
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
249
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
257
g_object_get (G_OBJECT (battery->priv->conf),
258
GENERAL_NOTIFICATION_CFG, ¬ify,
263
g_idle_add ((GSourceFunc) xfpm_battery_notify_idle, battery);
272
xfpm_battery_get_time_string (guint seconds)
274
char* timestring = NULL;
278
/* Add 0.5 to do rounding */
279
minutes = (int) ( ( seconds / 60.0 ) + 0.5 );
283
timestring = g_strdup (_("Unknown time"));
289
timestring = g_strdup_printf (ngettext ("%i minute",
295
hours = minutes / 60;
296
minutes = minutes % 60;
299
timestring = g_strdup_printf (ngettext (
304
/* TRANSLATOR: "%i %s %i %s" are "%i hours %i minutes"
305
* Swap order with "%2$s %2$i %1$s %1$i if needed */
306
timestring = g_strdup_printf (_("%i %s %i %s"),
307
hours, ngettext ("hour", "hours", hours),
308
minutes, ngettext ("minute", "minutes", minutes));
313
* Refresh tooltip function for UPS and battery device only.
316
xfpm_battery_set_tooltip_primary (XfpmBattery *battery, GtkTooltip *tooltip)
318
const gchar *battery_name;
320
gchar *est_time_str = NULL;
321
gchar *power_status = NULL;
323
power_status = g_strdup_printf (battery->priv->ac_online ? _("Adaptor is online") : _("System is running on battery power"));
325
battery_name = battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ? _("Battery") : _("UPS");
327
if ( battery->priv->state == XFPM_DEVICE_STATE_FULLY_CHARGED )
329
if ( battery->priv->time_to_empty > 0 )
331
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_empty);
332
tip = g_strdup_printf (_("%s\nYour %s is fully charged (%i%%).\nProvides %s runtime"),
335
battery->priv->percentage,
337
g_free (est_time_str);
341
tip = g_strdup_printf (_("%s\nYour %s is fully charged (%i%%)."),
344
battery->priv->percentage);
347
else if ( battery->priv->state == XFPM_DEVICE_STATE_CHARGING )
349
if ( battery->priv->time_to_full != 0 )
351
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_full);
352
tip = g_strdup_printf (_("%s\nYour %s is charging (%i%%)\n%s until is fully charged."),
355
battery->priv->percentage,
357
g_free (est_time_str);
361
tip = g_strdup_printf (_("%s\nYour %s is charging (%i%%)."),
364
battery->priv->percentage);
367
else if ( battery->priv->state == XFPM_DEVICE_STATE_DISCHARGING )
369
if ( battery->priv->time_to_empty != 0 )
371
est_time_str = xfpm_battery_get_time_string (battery->priv->time_to_empty);
372
tip = g_strdup_printf (_("%s\nYour %s is discharging (%i%%)\nestimated time left is %s."),
375
battery->priv->percentage,
377
g_free (est_time_str);
381
tip = g_strdup_printf (_("%s\nYour %s is discharging (%i%%)."),
384
battery->priv->percentage);
388
else if ( battery->priv->state == XFPM_DEVICE_STATE_PENDING_CHARGING )
390
tip = g_strdup_printf (_("%s\n%s waiting to discharge (%i%%)."), power_status, battery_name, battery->priv->percentage);
392
else if ( battery->priv->state == XFPM_DEVICE_STATE_PENDING_DISCHARGING )
394
tip = g_strdup_printf (_("%s\n%s waiting to charge (%i%%)."), power_status, battery_name, battery->priv->percentage);
396
else if ( battery->priv->state == XFPM_DEVICE_STATE_EMPTY )
398
tip = g_strdup_printf (_("%s\nYour %s is empty"), power_status, battery_name);
401
gtk_tooltip_set_text (tooltip, tip);
402
g_free (power_status);
407
xfpm_battery_check_charge (XfpmBattery *battery)
409
XfpmBatteryCharge charge;
410
guint critical_level, low_level;
272
412
g_object_get (G_OBJECT (battery->priv->conf),
273
GENERAL_NOTIFICATION_CFG, ¬ify,
413
CRITICAL_POWER_LEVEL, &critical_level,
278
g_idle_add ((GSourceFunc) xfpm_battery_notify_idle, battery);
282
static const gchar * G_GNUC_CONST
283
_get_battery_name (HalDeviceType type)
285
if ( type == HAL_DEVICE_TYPE_UPS)
286
return _("Your UPS");
287
else if ( type == HAL_DEVICE_TYPE_MOUSE )
288
return _("Your Mouse battery");
289
else if ( type == HAL_DEVICE_TYPE_KEYBOARD )
290
return _("Your Keyboard battery");
291
else if ( type == HAL_DEVICE_TYPE_CAMERA )
292
return _("Your Camera battery");
293
else if ( type == HAL_DEVICE_TYPE_PDA)
294
return _("Your PDA battery");
416
low_level = critical_level + 10;
418
if ( battery->priv->percentage > low_level )
419
charge = XFPM_BATTERY_CHARGE_OK;
420
else if ( battery->priv->percentage <= low_level && battery->priv->percentage > critical_level )
421
charge = XFPM_BATTERY_CHARGE_LOW;
422
else if ( battery->priv->percentage <= critical_level )
423
charge = XFPM_BATTERY_CHARGE_CRITICAL;
296
return _("Your Battery");
299
static const gchar * G_GNUC_PURE
300
xfpm_battery_get_battery_state (XfpmBatteryState *state,
301
gboolean is_charging,
302
gboolean is_discharging,
304
guint32 current_charge,
306
guint8 critical_level)
308
if ( G_UNLIKELY (current_charge == 0 || percentage == 0) )
310
*state = BATTERY_CHARGE_CRITICAL;
311
return _("is empty");
314
if ( !is_charging && !is_discharging && current_charge >= last_full )
316
*state = BATTERY_FULLY_CHARGED;
317
return _("is fully charged");
319
else if ( !is_charging && !is_discharging && last_full != current_charge )
321
*state = BATTERY_NOT_FULLY_CHARGED;
322
return _("charge level");
324
else if ( is_charging && !is_discharging )
326
*state = BATTERY_IS_CHARGING;
327
return _("is charging");
329
else if ( !is_charging && is_discharging )
331
if ( percentage >= 30 )
333
*state = BATTERY_IS_DISCHARGING;
334
return _("is discharging");
336
else if ( percentage >= critical_level && percentage < 30)
338
*state = BATTERY_CHARGE_LOW;
339
return _("charge is low");
341
else if ( percentage < critical_level )
343
*state = BATTERY_CHARGE_CRITICAL;
344
return _("is almost empty");
348
g_warn_if_reached ();
425
if ( charge != battery->priv->charge)
427
battery->priv->charge = charge;
429
* only emit signal when when battery charge changes from ok->low->critical
430
* and not the other way round.
432
if ( battery->priv->charge != XFPM_BATTERY_CHARGE_CRITICAL || charge != XFPM_BATTERY_CHARGE_LOW )
433
g_signal_emit (G_OBJECT (battery), signals [BATTERY_CHARGE_CHANGED], 0);
354
xfpm_battery_refresh_common (XfpmBattery *battery, guint percentage, XfpmBatteryState state)
438
xfpm_battery_refresh (XfpmBattery *battery, GHashTable *props)
356
XfpmShowIcon show_icon;
358
g_object_get (G_OBJECT (battery->priv->conf),
359
SHOW_TRAY_ICON_CFG, &show_icon,
362
if ( show_icon != NEVER_SHOW_ICON )
363
xfpm_battery_refresh_icon (battery, state, percentage);
365
if ( battery->priv->state != state)
443
value = g_hash_table_lookup (props, "IsPresent");
447
g_warning ("No 'IsPresent' property found");
451
battery->priv->present = g_value_get_boolean (value);
453
value = g_hash_table_lookup (props, "State");
457
g_warning ("No 'State' property found");
460
state = g_value_get_uint (value);
461
if ( state != battery->priv->state )
367
463
battery->priv->state = state;
368
XFPM_DEBUG_ENUM ("battery state change", battery->priv->state, XFPM_TYPE_BATTERY_STATE);
369
TRACE("Emitting signal battery state changed");
370
g_signal_emit (G_OBJECT(battery), signals[BATTERY_STATE_CHANGED], 0, state);
372
if ( battery->priv->state != BATTERY_NOT_FULLY_CHARGED && show_icon != NEVER_SHOW_ICON)
373
xfpm_battery_notify (battery);
375
xfpm_notify_close_normal (battery->priv->notify);
380
xfpm_battery_refresh_misc (XfpmBattery *battery, gboolean is_present,
381
gboolean is_charging, gboolean is_discharging,
382
guint32 last_full, guint32 current_charge,
383
guint percentage, guint time_per)
386
XfpmBatteryState state;
388
guint critical_level;
390
g_object_get (G_OBJECT (battery->priv->conf),
391
CRITICAL_POWER_LEVEL, &critical_level,
396
tip = g_strdup_printf ("%s %s", _get_battery_name(battery->priv->type), _("is not present"));
397
xfpm_tray_icon_set_tooltip (battery->priv->icon, tip);
399
battery->priv->state = BATTERY_NOT_PRESENT;
403
state = battery->priv->state;
404
str = xfpm_battery_get_battery_state (&state, is_charging, is_discharging,
405
last_full, current_charge, percentage,
407
tip = g_strdup_printf("%i%% %s %s", percentage, _get_battery_name(battery->priv->type), str);
408
//FIXME: Time for misc batteries
409
xfpm_tray_icon_set_tooltip (battery->priv->icon, tip);
412
xfpm_battery_refresh_common (battery, percentage, state);
416
xfpm_battery_refresh_primary (XfpmBattery *battery, gboolean is_present,
417
gboolean is_charging, gboolean is_discharging,
418
guint32 last_full, guint32 current_charge,
419
guint percentage, guint time_per)
423
guint critical_level;
425
XfpmBatteryState state = battery->priv->state;
427
g_object_get (G_OBJECT (battery->priv->conf),
428
CRITICAL_POWER_LEVEL, &critical_level,
435
xfpm_tray_icon_set_tooltip(battery->priv->icon, _("Battery not present"));
436
battery->priv->state = BATTERY_NOT_PRESENT;
440
str = xfpm_battery_get_battery_state (&state, is_charging, is_discharging,
441
last_full, current_charge, percentage, critical_level);
443
XFPM_DEBUG_ENUM ("battery state", state, XFPM_TYPE_BATTERY_STATE);
445
if ( time_per != 0 && time_per <= 28800 /* 8 hours */ &&
446
state != BATTERY_FULLY_CHARGED && state != BATTERY_NOT_FULLY_CHARGED )
450
const gchar *est_time;
452
gint minutes, hours, minutes_left;
453
hours = time_per / 3600;
454
minutes = time_per / 60;
455
minutes_left = minutes % 60;
457
tip_no_time = g_strdup_printf ("%i%% %s %s\n%s",
461
battery->priv->adapter_present ?
462
_("System is running on AC power") :
463
_("System is running on battery power"));
465
if ( state == BATTERY_IS_DISCHARGING ||
466
state == BATTERY_CHARGE_LOW ||
467
state == BATTERY_CHARGE_CRITICAL )
469
est_time = _("Estimated time left");
471
else //* BATTERY_IS_CHARGING
473
est_time = _("Estimated time to be fully charged");
476
time_str = g_strdup_printf("%s: %d %s %d %s",est_time,
477
hours,hours > 1 ? _("hours") : _("hour") ,
478
minutes_left, minutes_left > 1 ? _("minutes") : _("minute"));
480
tip = (hours != 0 || minutes_left != 0 ) ?
481
g_strdup_printf ("%s\n%s", tip_no_time, time_str) :
482
g_strdup (tip_no_time);
484
g_free (tip_no_time);
489
tip = g_strdup_printf ("%i%% %s %s\n%s",
493
battery->priv->adapter_present ?
494
_("System is running on AC power") :
495
_("System is running on battery power"));
498
xfpm_tray_icon_set_tooltip(battery->priv->icon, tip);
501
xfpm_battery_refresh_common (battery, percentage, state);
505
xfpm_battery_refresh (XfpmBattery *battery)
507
gboolean is_present, is_charging, is_discharging = FALSE;
508
guint percentage = 0;
509
guint32 last_full, current_charge = 0;
512
g_object_get (G_OBJECT(battery->priv->device),
513
"is-present", &is_present,
514
"is-charging", &is_charging,
515
"is-discharging", &is_discharging,
516
"percentage", &percentage,
517
"last-full", &last_full,
518
"current-charge", ¤t_charge,
522
TRACE ("Battery status is_present %s is_charging %s is_discharging %s",
523
xfpm_bool_to_string (is_present),
524
xfpm_bool_to_string (is_charging),
525
xfpm_bool_to_string (is_discharging));
527
TRACE ("Battery info precentage %i last_full %i current_charge %i time_per %i",
528
percentage, last_full, current_charge, time_per);
530
battery->priv->type == HAL_DEVICE_TYPE_PRIMARY ?
531
xfpm_battery_refresh_primary (battery, is_present,
532
is_charging, is_discharging,
533
last_full, current_charge,
534
percentage, time_per)
536
xfpm_battery_refresh_misc (battery, is_present,
537
is_charging, is_discharging,
538
last_full, current_charge,
539
percentage, time_per);
541
xfpm_battery_refresh_visible_icon (battery);
545
xfpm_battery_device_changed_cb (HalBattery *device, XfpmBattery *battery)
548
xfpm_battery_refresh (battery);
464
xfpm_battery_refresh_visible (battery);
465
xfpm_battery_notify_state (battery);
468
value = g_hash_table_lookup (props, "Percentage");
472
g_warning ("No 'Percentage' property found on battery device");
476
battery->priv->percentage = (guint) g_value_get_double (value);
478
xfpm_battery_check_charge (battery);
480
xfpm_battery_refresh_icon (battery);
482
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
483
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
485
value = g_hash_table_lookup (props, "TimeToEmpty");
489
g_warning ("No 'TimeToEmpty' property found on battery device");
493
battery->priv->time_to_empty = g_value_get_int64 (value);
495
value = g_hash_table_lookup (props, "TimeToFull");
499
g_warning ("No 'TimeToFull' property found on battery device");
503
battery->priv->time_to_full = g_value_get_int64 (value);
507
g_hash_table_destroy (props);
511
xfpm_battery_changed_cb (DBusGProxy *proxy, XfpmBattery *battery)
515
props = xfpm_power_get_interface_properties (battery->priv->proxy_prop,
516
battery->priv->backend_iface_device);
519
xfpm_battery_refresh (battery, props);
523
xfpm_battery_query_tooltip (GtkStatusIcon *icon,
526
gboolean keyboard_mode,
529
XfpmBattery *battery;
531
battery = XFPM_BATTERY (icon);
533
if ( battery->priv->type == XFPM_DEVICE_TYPE_BATTERY ||
534
battery->priv->type == XFPM_DEVICE_TYPE_UPS )
536
xfpm_battery_set_tooltip_primary (battery, tooltip);
544
xfpm_battery_tray_icon_settings_changed (GObject *obj, GParamSpec *spec, XfpmBattery *battery)
546
xfpm_battery_refresh_visible (battery);
549
static void xfpm_battery_get_property (GObject *object,
554
XfpmBattery *battery;
556
battery = XFPM_BATTERY (object);
561
g_value_set_boolean (value, battery->priv->ac_online);
563
case PROP_DEVICE_TYPE:
564
g_value_set_enum (value, battery->priv->type);
566
case PROP_CHARGE_STATUS:
567
g_value_set_enum (value, battery->priv->charge);
570
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
575
static void xfpm_battery_set_property (GObject *object,
580
XfpmBattery *battery;
582
battery = XFPM_BATTERY (object);
587
battery->priv->ac_online = g_value_get_boolean (value);
588
xfpm_battery_refresh_icon (battery);
591
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
598
xfpm_battery_class_init (XfpmBatteryClass *klass)
600
GObjectClass *object_class = G_OBJECT_CLASS (klass);
601
GtkStatusIconClass *status_icon_class = GTK_STATUS_ICON_CLASS (klass);
603
object_class->finalize = xfpm_battery_finalize;
604
object_class->get_property = xfpm_battery_get_property;
605
object_class->set_property = xfpm_battery_set_property;
607
status_icon_class->query_tooltip = xfpm_battery_query_tooltip;
609
signals [BATTERY_CHARGE_CHANGED] =
610
g_signal_new ("battery-charge-changed",
613
G_STRUCT_OFFSET(XfpmBatteryClass, battery_charge_changed),
615
g_cclosure_marshal_VOID__VOID,
616
G_TYPE_NONE, 0, G_TYPE_NONE);
618
g_object_class_install_property (object_class,
620
g_param_spec_boolean("ac-online",
625
g_object_class_install_property (object_class,
627
g_param_spec_enum ("device-type",
629
XFPM_TYPE_DEVICE_TYPE,
630
XFPM_DEVICE_TYPE_UNKNOWN,
633
g_object_class_install_property (object_class,
635
g_param_spec_enum ("charge-status",
637
XFPM_TYPE_BATTERY_CHARGE,
638
XFPM_BATTERY_CHARGE_UNKNOWN,
641
g_type_class_add_private (klass, sizeof (XfpmBatteryPrivate));
645
xfpm_battery_init (XfpmBattery *battery)
647
battery->priv = XFPM_BATTERY_GET_PRIVATE (battery);
649
battery->priv->conf = xfpm_xfconf_new ();
650
battery->priv->notify = xfpm_notify_new ();
651
battery->priv->proxy_prop = NULL;
652
battery->priv->state = XFPM_DEVICE_STATE_UNKNOWN;
653
battery->priv->type = XFPM_DEVICE_TYPE_UNKNOWN;
654
battery->priv->charge = XFPM_BATTERY_CHARGE_UNKNOWN;
655
battery->priv->icon_prefix = NULL;
656
battery->priv->time_to_full = 0;
657
battery->priv->time_to_empty = 0;
658
battery->priv->ac_online = TRUE;
660
battery->priv->sig = g_signal_connect (G_OBJECT (battery->priv->conf), "notify::" SHOW_TRAY_ICON_CFG,
661
G_CALLBACK (xfpm_battery_tray_icon_settings_changed), battery);
665
xfpm_battery_finalize (GObject *object)
667
XfpmBattery *battery;
669
battery = XFPM_BATTERY (object);
671
g_free (battery->priv->icon_prefix);
673
dbus_g_proxy_disconnect_signal (battery->priv->proxy, "Changed",
674
G_CALLBACK (xfpm_battery_changed_cb), battery);
676
if ( g_signal_handler_is_connected (battery->priv->conf, battery->priv->sig ) )
677
g_signal_handler_disconnect (G_OBJECT (battery->priv->conf), battery->priv->sig);
679
g_object_unref (battery->priv->proxy);
680
g_object_unref (battery->priv->proxy_prop);
681
g_object_unref (battery->priv->conf);
682
g_object_unref (battery->priv->notify);
684
G_OBJECT_CLASS (xfpm_battery_parent_class)->finalize (object);
552
_get_icon_prefix_from_enum_type (HalDeviceType type)
688
xfpm_battery_get_icon_prefix_device_enum_type (XfpmDeviceType type)
554
if ( type == HAL_DEVICE_TYPE_PRIMARY )
690
if ( type == XFPM_DEVICE_TYPE_BATTERY )
556
692
return g_strdup (XFPM_PRIMARY_ICON_PREFIX);
558
else if ( type == HAL_DEVICE_TYPE_UPS )
694
else if ( type == XFPM_DEVICE_TYPE_UPS )
560
696
return g_strdup (XFPM_UPS_ICON_PREFIX);
562
else if ( type == HAL_DEVICE_TYPE_MOUSE )
698
else if ( type == XFPM_DEVICE_TYPE_MOUSE )
564
700
return g_strdup (XFPM_MOUSE_ICON_PREFIX);
566
else if ( type == HAL_DEVICE_TYPE_KEYBOARD )
702
else if ( type == XFPM_DEVICE_TYPE_KBD )
568
704
return g_strdup (XFPM_KBD_ICON_PREFIX);
570
else if ( type == HAL_DEVICE_TYPE_CAMERA )
572
return g_strdup (XFPM_CAMERA_ICON_PREFIX);
574
else if ( type == HAL_DEVICE_TYPE_PDA )
576
return g_strdup (XFPM_PDA_ICON_PREFIX);
578
else if ( type == HAL_DEVICE_TYPE_KEYBOARD_MOUSE )
580
return g_strdup (XFPM_KBD_MOUSE_ICON_PREFIX);
706
else if ( type == XFPM_DEVICE_TYPE_PHONE )
708
return g_strdup (XFPM_PHONE_ICON_PREFIX);
583
711
return g_strdup (XFPM_PRIMARY_ICON_PREFIX);
587
xfpm_battery_adapter_changed_cb (XfpmAdapter *adapter, gboolean present, XfpmBattery *battery)
589
battery->priv->adapter_present = present;
590
xfpm_battery_refresh (battery);
594
xfpm_battery_tray_icon_settings_changed (GObject *obj, GParamSpec *spec, XfpmBattery *battery)
596
xfpm_battery_refresh_visible_icon (battery);
600
xfpm_battery_show_info (XfpmTrayIcon *tray, XfpmBattery *battery)
602
gchar *icon = g_strdup_printf("%s%s",
603
battery->priv->icon_prefix,
604
xfpm_battery_get_icon_index(battery->priv->type, 100));
606
GtkWidget *info = xfpm_battery_info_new (battery->priv->device, icon);
610
gtk_widget_show_all (info);
614
xfpm_battery_class_init(XfpmBatteryClass *klass)
616
GObjectClass *object_class = G_OBJECT_CLASS(klass);
618
signals[BATTERY_STATE_CHANGED] =
619
g_signal_new("battery-state-changed",
622
G_STRUCT_OFFSET(XfpmBatteryClass, battery_state_changed),
624
g_cclosure_marshal_VOID__ENUM,
625
G_TYPE_NONE, 1, XFPM_TYPE_BATTERY_STATE);
627
object_class->finalize = xfpm_battery_finalize;
629
g_type_class_add_private(klass,sizeof(XfpmBatteryPrivate));
633
xfpm_battery_init(XfpmBattery *battery)
635
battery->priv = XFPM_BATTERY_GET_PRIVATE(battery);
637
battery->priv->icon = xfpm_tray_icon_new ();
638
battery->priv->adapter = xfpm_adapter_new ();
639
battery->priv->conf = xfpm_xfconf_new ();
640
battery->priv->notify = xfpm_notify_new ();
641
battery->priv->state = BATTERY_STATE_UNKNOWN;
642
battery->priv->icon_prefix = NULL;
644
battery->priv->adapter_present = xfpm_adapter_get_present (battery->priv->adapter);
646
battery->priv->sig_1 = g_signal_connect (battery->priv->adapter ,"adapter-changed",
647
G_CALLBACK (xfpm_battery_adapter_changed_cb), battery);
649
g_signal_connect (battery->priv->icon, "show-information",
650
G_CALLBACK (xfpm_battery_show_info), battery);
654
xfpm_battery_finalize(GObject *object)
656
XfpmBattery *battery;
657
battery = XFPM_BATTERY(object);
659
if ( g_signal_handler_is_connected (battery->priv->adapter, battery->priv->sig_1 ) )
660
g_signal_handler_disconnect (G_OBJECT (battery->priv->adapter), battery->priv->sig_1);
662
if ( g_signal_handler_is_connected (battery->priv->conf, battery->priv->sig_2 ) )
663
g_signal_handler_disconnect (G_OBJECT (battery->priv->conf), battery->priv->sig_2);
665
if ( g_signal_handler_is_connected (battery->priv->device, battery->priv->sig_3 ) )
666
g_signal_handler_disconnect (G_OBJECT (battery->priv->device), battery->priv->sig_3);
668
g_object_unref (battery->priv->icon);
670
g_object_unref (battery->priv->device);
672
if ( battery->priv->icon_prefix )
673
g_free(battery->priv->icon_prefix);
675
g_object_unref (battery->priv->adapter);
677
g_object_unref (battery->priv->conf);
679
g_object_unref (battery->priv->notify);
681
G_OBJECT_CLASS(xfpm_battery_parent_class)->finalize(object);
685
xfpm_battery_new(const HalBattery *device)
715
xfpm_battery_new (void)
687
717
XfpmBattery *battery = NULL;
689
battery = g_object_new(XFPM_TYPE_BATTERY, NULL);
691
battery->priv->device = (HalBattery *)g_object_ref(G_OBJECT(device));
693
g_object_get(G_OBJECT(battery->priv->device), "type", &battery->priv->type, NULL);
695
battery->priv->icon_prefix = _get_icon_prefix_from_enum_type(battery->priv->type);
697
xfpm_battery_refresh (battery);
699
battery->priv->sig_3 = g_signal_connect (G_OBJECT(battery->priv->device), "battery-changed",
700
G_CALLBACK(xfpm_battery_device_changed_cb), battery);
702
battery->priv->sig_2 = g_signal_connect (G_OBJECT(battery->priv->conf), "notify::" SHOW_TRAY_ICON_CFG,
703
G_CALLBACK(xfpm_battery_tray_icon_settings_changed), battery);
709
xfpm_battery_get_device (XfpmBattery *battery)
711
g_return_val_if_fail (XFPM_IS_BATTERY(battery), NULL);
713
return battery->priv->device;
716
XfpmBatteryState xfpm_battery_get_state (XfpmBattery *battery)
718
g_return_val_if_fail (XFPM_IS_BATTERY(battery), BATTERY_NOT_PRESENT);
720
return battery->priv->state;
723
GtkStatusIcon *xfpm_battery_get_status_icon (XfpmBattery *battery)
725
g_return_val_if_fail (XFPM_IS_BATTERY(battery), NULL);
727
return xfpm_tray_icon_get_tray_icon (battery->priv->icon);
731
const gchar *xfpm_battery_get_icon_name (XfpmBattery *battery)
733
g_return_val_if_fail (XFPM_IS_BATTERY (battery), NULL);
735
return xfpm_tray_icon_get_icon_name (battery->priv->icon);
719
battery = g_object_new (XFPM_TYPE_BATTERY, NULL);
721
return GTK_STATUS_ICON (battery);
724
void xfpm_battery_monitor_device (XfpmBattery *battery,
726
DBusGProxy *proxy_prop,
727
const gchar *backend_iface_device,
728
XfpmDeviceType device_type)
730
battery->priv->type = device_type;
731
battery->priv->proxy_prop = proxy_prop;
732
battery->priv->proxy = proxy;
733
battery->priv->icon_prefix = xfpm_battery_get_icon_prefix_device_enum_type (device_type);
734
battery->priv->backend_iface_device = backend_iface_device;
736
dbus_g_proxy_add_signal (proxy, "Changed", G_TYPE_INVALID);
737
dbus_g_proxy_connect_signal (proxy, "Changed",
738
G_CALLBACK (xfpm_battery_changed_cb), battery, NULL);
740
g_object_set (G_OBJECT (battery),
744
xfpm_battery_changed_cb (proxy, battery);
747
XfpmDeviceType xfpm_battery_get_device_type (XfpmBattery *battery)
749
g_return_val_if_fail (XFPM_IS_BATTERY (battery), XFPM_DEVICE_TYPE_UNKNOWN );
751
return battery->priv->type;
754
XfpmBatteryCharge xfpm_battery_get_charge (XfpmBattery *battery)
756
g_return_val_if_fail (XFPM_IS_BATTERY (battery), XFPM_BATTERY_CHARGE_UNKNOWN);
758
return battery->priv->charge;