#!/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' # 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 = ; 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, "{data}}, [$desc, shift(@temperatures)]; } } # }}} # refresh data for tab 'Thermal' sub refresh_temperature() { # {{{ @{$x_temperatures->{data}} = (); open(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__