File: [Platon] / thinkpad-status / thinkpad.pl (download)
Revision 1.1.1.1 (vendor branch), Sun Feb 11 15:38:06 2007 UTC (17 years, 1 month ago) by rajo
Changes since 1.1: +0 -0 lines
GUI ThinkPad laptop status utility written in Perl and Gtk2::GladeXML toolkit.
|
#!/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/
|