Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /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 display_normalize {
- my $disp = shift() || '';
- my ($host, $display, $screen) = ('localhost', '0', '0');
- $disp =~ m{^([^:]+)?(?::(\d+)(?:\.(\d+))?)?$};
- $host = $1 if ($1);
- $display = $2 if ($2);
- $screen = $3 if ($3);
- return sprintf('%s:%s.%s', $host, $display, $screen);
- }
- sub get_cmdline {
- my $cmdline = '';
- my $pid = shift() || -1;
- return $cmdline unless ($pid > 0);
- my $dirname = sprintf('/proc/%d/', $pid);
- if (-d $dirname) {
- my %prepend = ();
- if (my (undef, undef, undef, undef, $uid, $gid) = stat($dirname)) {
- $prepend{'UID'} = $uid;
- if ($uid >= 0) {
- my ($user) = getpwuid($uid);
- $prepend{'USER'} = $user if ($user);
- }
- $prepend{'GID'} = $gid;
- if ($gid >= 0) {
- my ($group) = getgrgid($gid);
- $prepend{'GROUP'} = $group if ($group);
- }
- }
- my $filename = $dirname.'cmdline';
- if (-r $filename && open(F, '<', $filename)) {
- $cmdline = join('', <F>);
- close(F);
- $cmdline =~ tr/\x00/ /;
- $cmdline =~ s/(^\s+|\s+$)//;
- if ($pid == $$) {
- $prepend{'DISPLAY'} = &display_normalize($ENV{'DISPLAY'}) if ($ENV{'DISPLAY'});
- } else {
- $filename = $dirname.'environ';
- if (-r $filename && open(F, '<', $filename)) {
- my $env = join('', <F>);
- close(F);
- foreach my $var (split(/\x00/, $env)) {
- my @tmp = split(/=/, $var);
- my $name = shift(@tmp);
- my $value = join('=', @tmp);
- $prepend{$name} = &display_normalize($value) if ($name eq 'DISPLAY');
- }
- }
- }
- }
- if ($cmdline) {
- $cmdline = sprintf('U=%d:%s/G=%d:%s/D=%s#%s',
- $prepend{'UID'} || 0,
- $prepend{'USER'} || '',
- $prepend{'GID'} || 0,
- $prepend{'GROUP'} || '',
- $prepend{'DISPLAY'} || '',
- $cmdline || ''
- );
- }
- #$cmdline = join(' ', map({ sprintf('%s=%s', $_, $prepend{$_}); } sort(keys(%prepend))), $cmdline) if ($cmdline);
- }
- return $cmdline;
- }
- sub is_running {
- my $my_cmdline = &get_cmdline($$);
- foreach my $d (</proc/*>) {
- (-d $d) or next;
- my $pid = -1;
- $pid = int($1) if ($d =~ m{/(\d+)(/|$)});
- next if ($pid <= 0 || $pid == $$);
- my $cmdline = &get_cmdline($pid);
- next unless ($cmdline);
- return 1 if ($cmdline eq $my_cmdline);
- }
- return 0;
- }
- &is_running($0) and die("Applet is already running!\n");
- my $sysfs = '';
- open(F, '</proc/mounts') || die $!;
- while (<F>) {
- last if ($sysfs);
- chomp();
- my ($dev, $mntpt, $type, $opts, $n1, $n2) = split(/\s+/);
- $sysfs = $mntpt if ($type eq 'sysfs');
- }
- close(F);
- my @sensors = ();
- if ($sysfs) {
- 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, [ $f, sub {
- my $fh = shift();
- my $ret = <$fh> || '';
- chomp($ret);
- return int($ret) / 1000;
- } ]) if ($1);
- }
- }
- }
- unless (@sensors) {
- foreach my $d (</proc/acpi/thermal_zone/*>) {
- (-d $d) or next;
- foreach my $f (<$d/temperature>) {
- (-r $f) or next;
- push(@sensors, [ $f, sub {
- my $fh = shift();
- my $ln = <$fh> || '';
- $ln = ($ln =~ m{^temperature:\s*(\d+)}) ? $1 : -1;
- return int($ln);
- } ]);
- }
- }
- }
- die("Can't find any temperature sensors!\n") unless (@sensors);
- sub lm_get_temp {
- my @temps = ();
- foreach (@sensors) {
- open(F, '<', $_->[0]) || die $!;
- my $temp = undef;
- if ($_->[1]) {
- $temp = $_->[1](\*F);
- } else {
- $temp = <F>;
- }
- close(F);
- push(@temps, $temp);
- }
- return wantarray() ? @temps : shift(@temps);
- }
- use Gtk2;
- use Gtk2::TrayIcon;
- my ($icon, $eventbox, $img, $tt, $timeout) = (undef, undef, undef, undef, undef);
- 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 $?;
Advertisement
Add Comment
Please, Sign In to add comment