#!/usr/bin/perl -w use strict; use Gtk; my $fullcmdline="$0 ".join(" ",@ARGV); sub restart() { system("(sleep 2; $fullcmdline &) &"); Gtk->quit(); } my %opts=(); my $false=0; my $true=1; my $gtkInited=$false; sub showPanel() { my ($file)=@_; my %aliases=(); my $win=undef; my $box=undef; $aliases{"pid"}=$$; $aliases{"user"}=`id -un`; open(IN,"<$file") or die "Could not open $file\n"; for my $line () { chomp $line; my $str=$line; my $cmd=undef; print "line:$line\n"; if(!$line) { next; } #skip comments if($str =~ /^\s*[#]/) { next; } elsif($str =~ /^%(.*)=(.*)$/) { $opts{$1}=$2; next; } if($str=~ /^\s*(.*)\s*=\s*(.*)$/) { print "alias $1=$2\n"; my $name=$1; my $val=$2; if($val =~ /`(.*)`/) { $val=$1; print "evaluating: $val\n"; $val=eval("$val"); chomp $val; print " evaluated to $val\n"; } $aliases{$name}=$val; next; } if($str =~ /^\s*([^,]*)\s*,\s*(.*)$/) { $str=$1; $cmd=$2; } for my $key (keys %aliases) { $str =~ s/\$$key/$aliases{$key}/g; if($cmd) { $cmd =~ s/\$$key/$aliases{$key}/g; } } #unquote and trim spaces if quoted (to allow indenting) if($str =~ /^\s*"(.*)"\s*$/) { $str = $1; } my $widg=undef; if(!$gtkInited) { print "initing GTK\n"; Gtk->init; } if(!$win) { my $gtkrc=$opts{"gtkrc"}; if($gtkrc && stat($gtkrc)) { Gtk::Rc->parse($opts{"gtkrc"}); } $win=new Gtk::Window -toplevel ; $win->set_title("minipanel:$file"); my $pos = $opts{"pos"}; if(defined($pos) && $pos =~ /^(\d+),(\d+)$/) { my $x=$1; my $y=$2; $win->set_uposition($x,$y); } $win->signal_connect("realize", sub { my $deco = $opts{"decorations"}; if(defined($deco)) { $win->window->set_decorations($deco); } my $pos = $opts{"pos"}; if(defined($pos) && $pos =~ /^(\d+),(\d+)$/) { my $x=$1; my $y=$2; my $n=0; Gtk->timeout_add(10,sub{ #some FUCKED window managers absolutely refuse to let #a window start up in the position it wants, and ignore #ALL USER CONFIGURATION to tell it not to do such FUCKED #things. (sawfish) $win->set_uposition($x,$y); $win->window->move($x ,$y); return $n++ <10; }); } }); my $orient = "h"; if($opts{"orient"}) { $orient=$opts{"orient"}; } $box=$orient eq "v" ? new Gtk::VBox(): new Gtk::HBox(); $gtkInited=$true; $win->add($box); $box->border_width(0); $box->show; } if($cmd) { $widg=new Gtk::Button($str); if($cmd =~ /^\s*%close\s*$/) { $widg->signal_connect("clicked", sub { Gtk->exit(0); }); } if($cmd =~ /^\s*%restart\s*$/) { $widg->signal_connect("clicked", sub { &restart; }); } else { $widg->signal_connect("clicked", sub { system("$cmd &"); }); } $widg->border_width(0); } else { $widg=new Gtk::Label($str); } if($widg) { $box->pack_start($widg,0,0,0); } } close IN; if($win) { $win->show_all; return $true; } else { return $false; } } if(@ARGV) { my $shown=$false; while(@ARGV) { my $file=shift @ARGV; $shown=&showPanel($file) || $shown; } if($shown) { Gtk->main; } else { print "no window to show\n"; } }