#! /usr/bin/perl -w use strict; $| = 1; use constant COLOR_BG => scalar 'None'; use constant COLOR_FG => scalar '#303030'; use constant COLOR_BORDER => scalar 'None'; sub is_running { my $name = shift(); $name = $1 if ($name =~ m#/([^/]+)$#); my $nm = ''; foreach (split(/[\r\n]+/, `ps h -o '%P %p %c' -u "$ENV{'USER'}" 2>/dev/null`)) { last if ($nm); my ($ppid, $pid, $n) = /^\s*(\d+)\s+(\d+)\s+(.*)/; $nm = $n if ($ppid != 1 && $pid != $$ && $n eq $name); } return $nm; } &is_running($0) and die("Applet already running"); my $sysfs = ''; open(F, ') { last if ($sysfs); chomp(); my ($dev, $mntpt, $type, $opts, $n1, $n2) = split(/\s+/); $sysfs = $mntpt if ($type eq 'sysfs'); } close(F); die "sysfs doesn't seem to be mounted!" unless ($sysfs); my @sensors = (); foreach my $d (<$sysfs/bus/i2c/devices/*>) { (-d $d) or next; foreach my $f (<$d/temp*_input>) { (-r $f) or next; $f =~ m#^/.*/temp(\d+)_input$#; ($1 == 2) or next; # FIXME: use sensor #2 (works for me...) push(@sensors, [ $d, $1 ]) if ($1); } } die "Can't find any temperature sensors!" unless (@sensors); use Gtk2; use Gtk2::TrayIcon; my ($icon, $eventbox, $img, $tt, $timeout) = (undef, undef, undef, undef, undef); sub lm_get_temp { my @temps = (); foreach (@sensors) { open(F, "<".sprintf("%s/temp%d"."_input", $_->[0], $_->[1])) || die $!; my $temp = ; close(F); chomp($temp); push(@temps, int($temp) / 1000); } return wantarray() ? @temps : shift(@temps); } my %nums = ( '-w' => 6, '-h' => 15, '0' => [ ' oooo ', 'o oo o', 'oo oo', 'oo oo', 'oo oo', 'oo oo', 'o o', ' ', 'o o', 'oo oo', 'oo oo', 'oo oo', 'oo oo', 'o oo o', ' oooo ' ], '1' => [ ' ', ' o', ' oo', ' oo', ' oo', ' oo', ' o', ' ', ' o', ' oo', ' oo', ' oo', ' oo', ' o', ' ' ], '2' => [ ' oooo ', ' oo o', ' oo', ' oo', ' oo', ' oo', ' oo o', ' oooo ', 'o oo ', 'oo ', 'oo ', 'oo ', 'oo ', 'o oo ', ' oooo ' ], '3' => [ ' oooo ', ' oo o', ' oo', ' oo', ' oo', ' oo', ' oo o', ' oooo ', ' oo o', ' oo', ' oo', ' oo', ' oo', ' oo o', ' oooo ' ], '4' => [ ' ', 'o o', 'oo oo', 'oo oo', 'oo oo', 'oo oo', 'o oo o', ' oooo ', ' oo o', ' oo', ' oo', ' oo', ' oo', ' o', ' ' ], '5' => [ ' oooo ', 'o oo ', 'oo ', 'oo ', 'oo ', 'oo ', 'o oo ', ' oooo ', ' oo o', ' oo', ' oo', ' oo', ' oo', ' oo o', ' oooo ' ], '6' => [ ' oooo ', 'o oo ', 'oo ', 'oo ', 'oo ', 'oo ', 'o oo ', ' oooo ', 'o oo o', 'oo oo', 'oo oo', 'oo oo', 'oo oo', 'o oo o', ' oooo ' ], '7' => [ ' oooo ', ' oo o', ' oo', ' oo', ' oo', ' oo', ' o', ' ', ' o', ' oo', ' oo', ' oo', ' oo', ' o', ' ' ], '8' => [ ' oooo ', 'o oo o', 'oo oo', 'oo oo', 'oo oo', 'oo oo', 'o oo o', ' oooo ', 'o oo o', 'oo oo', 'oo oo', 'oo oo', 'oo oo', 'o oo o', ' oooo ' ], '9' => [ ' oooo ', 'o oo o', 'oo oo', 'oo oo', 'oo oo', 'oo oo', 'o oo o', ' oooo ', ' oo o', ' oo', ' oo', ' oo', ' oo', ' oo o', ' oooo ' ], '-deg' => [ ' oo ', 'o o', 'o o', ' oo ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ] ); my $old_temp = 0; sub icon_refresh { my $val = int(shift() || 0); return if ($old_temp == $val); $old_temp = $val; my $w = 24; my $h = 24; my ($i, $j, $k) = (0, 0, 0); my $pixbuf = $img->get_pixbuf(); my @data = ( sprintf('%d %d 4 1', $w, $h), '# c None', ' c '.COLOR_BG, 'o c '.COLOR_FG, '. c '.COLOR_BORDER ); push(@data, '#' x $w); push(@data, '##'.('.' x ($w - 4)).'##'); $j++; my $h_top = int(($h - $nums{'-h'}) / 2 + 0.5); while ($j <= $h_top - 2) { push(@data, '#.'.(' ' x ($w - 4)).'.#'); $j++; } my @nums = split(//, int($val).""); my $w_left = int(($w - ($nums{'-w'} * (scalar(@nums) - 1) + (scalar(@nums) - 1))) / 2) - length($nums{'-deg'}->[0]) - 1; push(@nums, '-deg'); $k = 0; while ($k < $nums{'-h'}) { my $ln = '#.'.(' ' x ($w_left - 2)); foreach (@nums) { $ln .= $nums{$_}->[$k] || (' ' x ($nums{'-w'} - 2)); $ln .= ' '; } $k++; $ln .= (' ' x ($w - length($ln) - 2)).'.#'; push(@data, $ln); $j++; } while ($j < $h - 3) { push(@data, '#.'.(' ' x ($w - 4)).'.#'); $j++; } push(@data, '##'.('.' x ($w - 4)).'##'); push(@data, '#' x $w); my $tmp = Gtk2::Gdk::Pixbuf->new_from_xpm_data(@data); $img->set_from_pixbuf($tmp); $tt->set_tip($eventbox, sprintf('CPU temperature: %.01f%sC', $val, chr(176))); } Gtk2->init(); $icon = Gtk2::TrayIcon->new("TempSensor_Applet"); $eventbox = Gtk2::EventBox->new(); $img = Gtk2::Image->new(); $eventbox->add($img); $icon->add($eventbox); $tt = Gtk2::Tooltips->new(); &icon_refresh(&lm_get_temp()); $timeout = Glib::Timeout->add(1500, sub { &icon_refresh(&lm_get_temp()); 1; }); $icon->show_all(); Gtk2->main(); exit $?;