summaryrefslogtreecommitdiff
path: root/lib/Battery.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Battery.pm')
-rw-r--r--lib/Battery.pm81
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/Battery.pm b/lib/Battery.pm
new file mode 100644
index 0000000..3936b9b
--- /dev/null
+++ b/lib/Battery.pm
@@ -0,0 +1,81 @@
+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);
+
+ $self->{w}=$window;
+
+ my $bar = Gtk2::ProgressBar->new();
+ $bar->set_orientation('left-to-right');
+ $bar->set_pulse_step(0.01);
+ $self->{b}=$bar;
+
+ $window->add($bar);
+
+ $window->signal_connect(delete_event => \&quit);
+
+ Glib::Timeout->add(1,\&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%d},$h,$m;
+}
+
+sub update {
+ my ($self) = @_;
+
+ my $bs=get_battery_stats;
+ my $e=$bs->{energy_now}/$bs->{energy_full};
+ my $t=$bs->{energy_now}/$bs->{power_now};
+ my $tot=$bs->{energy_full}/$bs->{power_now};
+
+ $self->{b}->set_text(
+ sprintf '%s/%s %.0f%%',
+ _format_time($t),
+ _format_time($tot),
+ 100*$e
+ );
+ $self->{b}->set_fraction($t/$tot);
+}
+
+1;