package Battery;
use strict;
use warnings;
use 5.016;
use Gtk2;
sub new {
my ($class)=@_;
my $self = bless {},$class;
my $window = Gtk2::Window->new('toplevel');
$window->set_accept_focus(0);
$window->set_decorated(0);
$window->set_has_frame(0);
$window->set_skip_pager_hint(1);
$window->set_skip_taskbar_hint(1);
$window->set_type_hint('utility');
$window->set_default_size(300,25);
$window->set_resizable(1);
$window->set_name('dakkar-battery');
$window->set_wmclass('dakkar-battery','dakkar-battery');
$self->{w}=$window;
my $bar = Gtk2::ProgressBar->new();
$bar->set_orientation('left-to-right');
$bar->set_name('dakkar-battery-bar');
$self->{b}=$bar;
$window->add($bar);
$window->signal_connect(delete_event => \&quit);
Glib::Timeout->add(1000,\&update,$self);
return $self;
}
sub show {
$_[0]->{w}->show_all;
}
sub quit {
Gtk2->main_quit;
}
sub get_battery_stats {
open my $fh,'<','/sys/class/power_supply/BAT1/uevent';
my %ret;
while (my $line=<$fh>) {
chomp $line;
my ($name,$value) = $line =~ m{\A POWER_SUPPLY_(.*?) = (.*) \z}x;
$ret{lc($name)}=$value;
}
return \%ret;
}
sub _format_time {
my ($t) = @_;
my $h=int($t);
my $m=int(($t-$h)*60);
return sprintf q{%dh%02d},$h,$m;
}
sub update {
my ($self) = @_;
my $bs=get_battery_stats;
my $e=$bs->{energy_now}/$bs->{energy_full};
my $txt='';
if ($bs->{power_now}) {
my $t=$bs->{energy_now}/$bs->{power_now};
my $tot=$bs->{energy_full}/$bs->{power_now};
$txt = sprintf '%s/%s ',
_format_time($t),
_format_time($tot);
$self->{b}->set_fraction($t/$tot);
}
else {
$self->{b}->set_fraction($e);
}
$txt .= sprintf '%.0f%%', 100*$e;
$self->{b}->set_text($txt);
return 1;
}
1;