Platon Technologies
not logged in Login Registration
EnglishSlovak
open source software development celebrating 10 years of open source development! Friday, March 29, 2024

File: [Platon] / thinkpad-status / thinkpad.pl (download)

Revision 1.2, Sun Feb 11 15:46:00 2007 UTC (17 years, 1 month ago) by rajo

Changes since 1.1: +0 -0 lines

Sync.

#!/usr/bin/perl -w
# vim600: ts=4 fdm=marker fdl=0 fdc=3

#
# thinkpad.pl - show status of ThinkPad laptop
#
# Developed by Lubomir Host 'rajo' <rajo AT platon.sk>
# Copyright (c) 2007 Platon Group, http://platon.sk/
# Licensed under terms of GNU General Public License.
# All rights reserved.
#
# Changelog:
# 2007-02-11 - created
#

# $Platon$

use strict;
use warnings;

use File::Spec; # portable path manipulations
use Gtk2 '-init'; # auto-initialize Gtk2
use Gtk2::GladeXML;
use Gtk2::SimpleList;   # easy wrapper for list views
use Gtk2::Gdk::Keysyms; # keyboard code constants
use Data::Dumper;
use English;
use Time::HiRes qw( gettimeofday );
use POSIX qw(strftime);

undef $/;

use vars qw (
    $glade
    $x_mainwin $x_status $x_preferences $x_about
    $x_refresh_interval

    $glib_refresh $refresh_interval $default_update_interval

    $xx_temperatures $x_temperatures @temperatures
);

$default_update_interval = 1; # 1 second

# Load the UI from the Glade-2 file
my $data = <DATA>;
if ($data !~ m/^\s*<\?xml/m) {
    $glade = Gtk2::GladeXML->new("thinkpad.glade");
}
else {
    $glade = Gtk2::GladeXML->new_from_buffer($data);
}

# Connect signals magically
$glade->signal_autoconnect_from_package('main');

init_gui();

Gtk2->main; # Start Gtk2 main loop

exit 0;

sub init_gui
{ # {{{

    # connect a few widgets we'll access frequently

    $x_mainwin = $glade->get_widget('main');
    $x_status = $glade->get_widget('statusbar');
    $x_preferences = $glade->get_widget('preferences');
    $x_about = $glade->get_widget('about');

    # refresh interval
    $x_refresh_interval = $glade->get_widget('refresh_interval');
    # temperatures
    $xx_temperatures = $glade->get_widget('temperatures');
    $x_temperatures = Gtk2::SimpleList->new_from_treeview(
        $xx_temperatures,
        'Name'            => 'text',
        'Temperature'    => 'text',
    );
    # set some useful SimpleList properties
    $x_temperatures->set_headers_clickable(0);
    foreach ($x_temperatures->get_columns()) {
        $_->set_resizable(1);
        $_->set_sizing('grow-only');
    }

    # set up a 'refresh' timer
    $x_refresh_interval->set_text($default_update_interval);
    update_timer($default_update_interval);

    make_refresh();

} # }}}

sub make_refresh()
{ # {{{
    print_info("make_refresh() called");

    refresh_temperature();
    
    return 1;

} # }}}

# refresh data for tab 'Fan'
sub refresh_fan()
{ # {{{
    @{$x_temperatures->{data}} = ();

    open(FAN, "</proc/acpi/ibm/fan") or die "Can't open /proc/acpi/ibm/fan: $!";
    shift @temperatures; # remove description
    close (FAN);

    foreach my $desc ('Processor', 'Mini-PCI', 'Harddisk',  'Graphics', 'System battery', 'UltraBay battery', 'System battery', 'UltraBay battery') {
        push @{$x_temperatures->{data}}, [$desc, shift(@temperatures)];
    }

} # }}}

# refresh data for tab 'Thermal'
sub refresh_temperature()
{ # {{{
    @{$x_temperatures->{data}} = ();

    open(THERMAL, "</proc/acpi/ibm/thermal") or die "Can't open /proc/acpi/ibm/thermal: $!";
    @temperatures = split(/\s+/, <THERMAL>, 9);
    shift @temperatures; # remove description
    close (THERMAL);

    # http://www.thinkwiki.org/wiki/Thermal_sensors
    foreach my $desc ('Processor', 'Mini-PCI', 'Harddisk',  'Graphics', 'System battery', 'UltraBay battery', 'System battery', 'UltraBay battery') {
        push @{$x_temperatures->{data}}, [$desc, shift(@temperatures)];
    }

} # }}}

sub update_timer($)
{ # {{{
    my ($delay) = @_;
    return unless $delay; # avoid setting interval to 0
    if (defined $glib_refresh) {
        Glib::Source->remove($glib_refresh);
    }
    print_info("update_timer( $delay )");
    $glib_refresh = Glib::Timeout->add(1000 * $delay, \&make_refresh);

} # }}}

# Refresh interval in preferences
sub on_refresh_interval_value_changed
{ # {{{
    my $w = shift; 
    update_timer($w->get_text());
} # }}}

sub print_info($;@)
{ # {{{
    my ($info, @text) = @_;

    printf "[%s PID = $PID ] $0: %s", cur_date(), $info;
    print @text if (scalar(@text) > 0);
    print "\r\n";

} # }}}

sub cur_date()
{ # {{{
    my ($sec, $msec) = Time::HiRes::gettimeofday;
    my $time_string = strftime("%Y-%m-%d %X", localtime) . sprintf('.%04d', $msec / 1E4);

    return $time_string;
} # }}}

# Glade 2 basic handlers {{{
#----------------------------------------------------------------------
# Signal handlers to match signals defined using Glade-2
#----------------------------------------------------------------------

# Some very simple handlers

sub on_quit_activate {Gtk2->main_quit;}
sub on_prefs_button_clicked {$x_preferences->show_all;}
sub on_preferences_activate {$x_preferences->show_all;}
sub on_about_activate {$x_about->show_all;}
sub on_main_delete_event {Gtk2->main_quit;}
sub on_prefs_cancelbutton_clicked {$x_preferences->hide;}
sub on_about_okbutton_clicked {$x_about->hide;}

#----------------------------------------------------------------------
# Handle dialog 'close' (window-decoration induced close)
#   * Just hide the dialog, and tell Gtk not to do anything else
#
sub on_dialog_delete_event {
    my $w = shift; 
    $w->hide; 
    1; # consume this event!
}

#----------------------------------------------------------------------
# Handle preferencess apply click
#
sub on_prefs_applybutton_clicked {
    my $x_context = $x_status->get_context_id('Main');
    $x_status->push($x_context, 'Preferences updated');
}
    
#----------------------------------------------------------------------
# Handle prefs ok click (apply/dismiss dialog)
#
sub on_prefs_okbutton_clicked {
    on_prefs_applybutton_clicked();
    $x_preferences->hide;
}

# }}}

__DATA__

Platon Group <platon@platon.org> http://platon.org/
Copyright © 2002-2006 Platon Group
Site powered by Metafox CMS
Go to Top