#!/home/dakkar/perl5/perlbrew/perls/perl-5.20.1/bin/perl use lib '/home/dakkar/.perlbrew/libs/perl-5.20.1@dakkar/lib/perl5'; use strict; use warnings; use 5.016; use Gtk2 -init; 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'); my $bar = Gtk2::ProgressBar->new(); $bar->set_orientation('left-to-right'); $bar->set_name('dakkar-battery-bar'); $window->add($bar); $window->signal_connect(delete_event => \&quit); Glib::Timeout->add(1000,\&update); 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 $bs=get_battery_stats; my $now = $bs->{energy_now} // $bs->{charge_now}; my $full = $bs->{energy_ful} // $bs->{charge_full}; my $deriv = $bs->{power_now} // $bs->{current_now}; my $e=$now/$full; my $txt=''; my $charging = lc($bs->{status}) eq 'charging'; my $is_full = lc($bs->{status}) eq 'full'; if ($charging) { $txt = "\x{1f50c}"; } elsif (!$is_full) { $txt = "\x{1f50b}"; } if ($deriv && !$charging) { my $t=$now/$deriv; my $tot=$full/$deriv; $txt .= sprintf "%s/%s\x{2009}", _format_time($t), _format_time($tot); $bar->set_fraction($t/$tot); } else { $bar->set_fraction($e); } $txt .= sprintf '%.0f%%', 100*$e; $bar->set_text($txt); return 1; } $window->show_all; Gtk2->main;