diff options
-rwxr-xr-x | src/ivymon | 2230 |
1 files changed, 1121 insertions, 1109 deletions
@@ -19,47 +19,49 @@ Construct Tk::Widget 'eLabFrame'; sub Populate { - my ($cw, $args) = @_; - my $f; - my $label; - my $button; - my $lside = exists $args->{-labelside} ? - delete $args->{-labelside} : 'top'; - my $ltext = delete $args->{-label}; - my $lbutton = delete $args->{-buttonbmp}; - $cw->SUPER::Populate($args); - if ($lside =~ /acrosstop/) { - my $border = $cw->Frame(-relief => 'groove', -bd => 2); - $cw->Advertise('border' => $border); - my $pad = $border->Frame; - $f = $border->Frame; - $label = $cw->Label(-text => $ltext); - $button = $cw->Button(-image => $lbutton) if defined $lbutton; - my $y = int($label->winfo('reqheight')) / 2; - my $ph = $y - int($border->cget(-bd)); - if ($ph < 0) { - $ph = 0; - } - $label->form(-top => 0, -left => 4, -padx => 6, -pady => 2); - $button->form(-top => 0, -right => -4, -padx => 6, -pady => 0) if defined $button; - # $label->place('-y' => 2, '-x' => 10); - $border->form(-top => $y, -bottom => -1, -left => 0, -right => -1, - -padx => 2, -pady => 2); - $pad->form(-left => 0, -right => -1, -top => 0, -bottom => $ph); - $f->form(-top => $pad, -bottom => -1, -left => 0, -right => -1); - # $cw->Delegates('pack' => $cw); - } else { - $f = $cw->Frame(-relief => 'groove', -bd => 2, %{$args}); - $label = $cw->Label(-text => $ltext); - $label->pack(-side => $lside); - $f->pack(-side => $lside, -fill => 'both', -expand => 1); - } - $cw->Advertise('frame' => $f); - $cw->Advertise('label' => $label); - $cw->Advertise('button' => $button) if defined $button; - $cw->Delegates(DEFAULT => $f); - $cw->ConfigSpecs(-labelside => ['PASSIVE', 'labelSide', 'LabelSide', 'acrosstop'], - 'DEFAULT' => [$f]); + my ($cw, $args) = @_; + my $f; + my $label; + my $button; + my $lside = exists $args->{-labelside} ? + delete $args->{-labelside} : 'top'; + my $ltext = delete $args->{-label}; + my $lbutton = delete $args->{-buttonbmp}; + $cw->SUPER::Populate($args); + if ($lside =~ /acrosstop/) { + my $border = $cw->Frame(-relief => 'groove', -bd => 2); + $cw->Advertise('border' => $border); + my $pad = $border->Frame; + $f = $border->Frame; + $label = $cw->Label(-text => $ltext); + $button = $cw->Button(-image => $lbutton) if defined $lbutton; + my $y = int($label->winfo('reqheight')) / 2; + my $ph = $y - int($border->cget(-bd)); + if ($ph < 0) { + $ph = 0; + } + $label->form(-top => 0, -left => 4, -padx => 6, -pady => 2); + $button->form(-top => 0, -right => -4, -padx => 6, -pady => 0) + if defined $button; + # $label->place('-y' => 2, '-x' => 10); + $border->form(-top => $y, -bottom => -1, -left => 0, -right => -1, + -padx => 2, -pady => 2); + $pad->form(-left => 0, -right => -1, -top => 0, -bottom => $ph); + $f->form(-top => $pad, -bottom => -1, -left => 0, -right => -1); + # $cw->Delegates('pack' => $cw); + } else { + $f = $cw->Frame(-relief => 'groove', -bd => 2, %{$args}); + $label = $cw->Label(-text => $ltext); + $label->pack(-side => $lside); + $f->pack(-side => $lside, -fill => 'both', -expand => 1); + } + $cw->Advertise('frame' => $f); + $cw->Advertise('label' => $label); + $cw->Advertise('button' => $button) if defined $button; + $cw->Delegates(DEFAULT => $f); + $cw->ConfigSpecs(-labelside => ['PASSIVE', 'labelSide', + 'LabelSide', 'acrosstop'], + 'DEFAULT' => [$f]); } @@ -88,10 +90,11 @@ use Carp; use strict; use Getopt::Long; use Tk::CmdLine; -use vars qw/$VERSION $opt_help $opt_b $opt_bus $opt_history @opt_bind @opt_send $opt_size - $opt_undersize $opt_out $opt_loadingmode $opt_replayrepeat $opt_replaystartregexp - $opt_replaystopregexp $opt_replaytimegranularity $opt_debug/; -# **** VERSION *** +use vars qw/$VERSION $opt_help $opt_b $opt_bus $opt_history @opt_bind + @opt_send $opt_size $opt_undersize $opt_out $opt_loadingmode + $opt_replayrepeat $opt_replaystartregexp + $opt_replaystopregexp $opt_replaytimegranularity $opt_debug/; +# **** VERSION **** $VERSION = '1.17'; # options initialisation @@ -217,10 +220,10 @@ Tk::CmdLine::SetArguments(-font => '7x14'); Tk::CmdLine::SetArguments(); if (not GetOptions('-help', '-history=s', '-b=s', '-bus=s', '-bind=s@', - '-send=s@', '-size=s', '-undersize', '-loadingmode=s', - '-replayrepeat', '-replaystartregexp=s', '-debug', - '-replaytimegranularity=s', - '-replaystopregexp=s', '-out=s') or $opt_help) { + '-send=s@', '-size=s', '-undersize', '-loadingmode=s', + '-replayrepeat', '-replaystartregexp=s', '-debug', + '-replaytimegranularity=s', + '-replaystopregexp=s', '-out=s') or $opt_help) { print "\n"; print "IvyMon version $VERSION\n"; print "\n"; @@ -297,49 +300,49 @@ push(@send_def, @opt_send); #=================================== # -# Size options +# Size options if($opt_size eq "UXGA" || $opt_size eq "1600") { - $minW = 1600; - $minH = 1200; - $smallsized = 0; - $coef = 1.2; - Tk::CmdLine::SetArguments(-font => '10x20'); - Tk::CmdLine::SetArguments(); + $minW = 1600; + $minH = 1200; + $smallsized = 0; + $coef = 1.2; + Tk::CmdLine::SetArguments(-font => '10x20'); + Tk::CmdLine::SetArguments(); }elsif($opt_size eq "SXGA" || $opt_size eq "1280") { - $minW = 1280; - $minH = 1024; - $smallsized = 0; - $coef = 1.1; - Tk::CmdLine::SetArguments(-font => '8x13'); - Tk::CmdLine::SetArguments(); + $minW = 1280; + $minH = 1024; + $smallsized = 0; + $coef = 1.1; + Tk::CmdLine::SetArguments(-font => '8x13'); + Tk::CmdLine::SetArguments(); }elsif($opt_size eq "XGA" || $opt_size eq "1024") { - $minW = 1024; - $minH = 768; - $smallsized = 1; - $coef = 1; - Tk::CmdLine::SetArguments(-font => '7x14'); - Tk::CmdLine::SetArguments(); + $minW = 1024; + $minH = 768; + $smallsized = 1; + $coef = 1; + Tk::CmdLine::SetArguments(-font => '7x14'); + Tk::CmdLine::SetArguments(); }elsif($opt_size eq "SVGA" || $opt_size eq "800") { - $minW = 800; - $minH = 600; - $smallsized = 1; - $coef = 0.64; - Tk::CmdLine::SetArguments(-font => '6x10'); - Tk::CmdLine::SetArguments(); + $minW = 800; + $minH = 600; + $smallsized = 1; + $coef = 0.64; + Tk::CmdLine::SetArguments(-font => '6x10'); + Tk::CmdLine::SetArguments(); }elsif($opt_size eq "VGA" || $opt_size eq "640"){ - $minW = 640; - $minH = 480; - $smallsized = 1; - $coef = 0.48; - Tk::CmdLine::SetArguments(-font => '5x7'); - Tk::CmdLine::SetArguments(); + $minW = 640; + $minH = 480; + $smallsized = 1; + $coef = 0.48; + Tk::CmdLine::SetArguments(-font => '5x7'); + Tk::CmdLine::SetArguments(); } if($opt_undersize) { - $minW -= 10; - $minH -= 30; + $minW -= 10; + $minH -= 30; } #================================================================================= @@ -389,77 +392,77 @@ $mw->bind("Tk::Text", "<FocusIn>", [sub { # create balloon help widget my $balloonhelp = $mw->Balloon(-balloonposition => 'mouse', - -state => 'none', - ); + -state => 'none', + ); # create base frames my $top_fm = $mw->Frame()->pack(-fill => 'both', - -side => 'top', - -expand => 1, - -padx => 5*$coef, -pady => 5*$coef); - + -side => 'top', + -expand => 1, + -padx => 5*$coef, -pady => 5*$coef); + my $bottom_fm = $mw->Frame()->pack(-fill => 'both', - -side => 'bottom', - -expand => 0, - -padx => 5*$coef, -pady => 5*$coef, - ); + -side => 'bottom', + -expand => 0, + -padx => 5*$coef, -pady => 5*$coef, + ); my $bindings_fm = $bottom_fm->LabFrame(-label => 'Bindings : ', - -labelside => 'acrosstop', - -borderwidth => 3)->pack(-fill => 'both', - -side => 'left', - -padx => 5*$coef, - -expand => 0, - ); + -labelside => 'acrosstop', + -borderwidth => 3)->pack(-fill => 'both', + -side => 'left', + -padx => 5*$coef, + -expand => 0, + ); my $clients_fm = $bottom_fm->LabFrame(-label => 'Applications : ', - -labelside => 'acrosstop', - -borderwidth => 3)->pack(-fill => 'both', - -side => 'left', - -expand => 0, - -padx => 5*$coef, - ); + -labelside => 'acrosstop', + -borderwidth => 3)->pack(-fill => 'both', + -side => 'left', + -expand => 0, + -padx => 5*$coef, + ); my $send_fm = $bottom_fm->eLabFrame(-label => ' Messages to send : ', - -buttonbmp => $enlargebmp, - -labelside => 'acrosstop', - -borderwidth => 3)->pack(-fill => 'x', - -side => 'left', - -expand => 1, - -padx => 5*$coef, - ); + -buttonbmp => $enlargebmp, + -labelside => 'acrosstop', + -borderwidth => 3)->pack(-fill => 'x', + -side => 'left', + -expand => 1, + -padx => 5*$coef, + ); my $sendEnlargeBtn = $send_fm->Subwidget('button'); $sendEnlargeBtn->configure(-relief => 'flat', - -command => sub { - if ($enlarge) { - &shrink; - $enlarge = 0; - $sendEnlargeBtn->configure(-image => $enlargebmp); - } else { - &enlarge; - $enlarge = 1; - $sendEnlargeBtn->configure(-image => $shrinkbmp); - } - }); + -command => sub { + if ($enlarge) { + &shrink; + $enlarge = 0; + $sendEnlargeBtn->configure(-image => $enlargebmp); + } else { + &enlarge; + $enlarge = 1; + $sendEnlargeBtn->configure(-image => $shrinkbmp); + } + }); my $searchandcontrol_fm = $bottom_fm->Frame()->pack(-fill => 'both', - -side => 'right', - -expand => 0); + -side => 'right', + -expand => 0); my $search_fm = $searchandcontrol_fm->LabFrame(-label => 'Search : ', - -labelside => 'acrosstop', - -borderwidth => 3)->pack(-fill => 'none', - -side => 'top', - -padx => 5*$coef, - -expand => 0); + -labelside => 'acrosstop', + -borderwidth => 3)->pack(-fill => 'none', + -side => 'top', + -padx => 5*$coef, + -expand => 0); my $control_fm = $searchandcontrol_fm->LabFrame(-label => 'Control : ', - -labelside => 'acrosstop', - -borderwidth => 3)->pack(-fill => 'none', - -side => 'bottom', - -padx => 5*$coef, - -expand => 0); + -labelside => 'acrosstop', + -borderwidth => 3)->pack(-fill => 'none', + -side => 'bottom', + -padx => 5*$coef, + -expand => 0); #---------------------------------------------------------------------------------- # Progress bar @@ -469,16 +472,17 @@ $tpl->Popup; $tpl->raise($mw); $tpl->title(""); $tpl->geometry("300x50"); -my $progressbar = $tpl->ProgressBar(-from => 0, - -length => 200, - -borderwidth => 2, - -colors => [ 0 => 'yellow'], - -relief => 'sunken', - -resolution => 0, - -anchor => 'w', - )->pack(-fill => 'both', - -expand => 1, - ); +my $progressbar = + $tpl->ProgressBar(-from => 0, + -length => 200, + -borderwidth => 2, + -colors => [ 0 => 'yellow'], + -relief => 'sunken', + -resolution => 0, + -anchor => 'w', + )->pack(-fill => 'both', + -expand => 1, + ); $progressbar->value(0); $tpl->withdraw; @@ -486,56 +490,56 @@ $tpl->withdraw; # Messages display area #---------------------------------------------------------------------------------- my $top2_fm = $top_fm->Frame()->pack(-side => 'top', - -fill => 'x', - ); + -fill => 'x', + ); my $messagesLabel = $top2_fm->Label(-text => "Messages :")->pack(-side => 'left'); my $messagesCounterValue = $top2_fm->Label(-textvariable => \$recordedNumber, - -width => 8, - -anchor => 'w')->pack(-side => 'right'); + -width => 8, + -anchor => 'w')->pack(-side => 'right'); my $messagesCounterLabel = $top2_fm->Label(-text => "Recorded :", - -width => 15, - -anchor => 'e')->pack(-side => 'right'); + -width => 15, + -anchor => 'e')->pack(-side => 'right'); my $messagesBufdValue = $top2_fm->Label(-textvariable => \$bufNumber, - -width => 8, - -anchor => 'w')->pack(-side => 'right'); + -width => 8, + -anchor => 'w')->pack(-side => 'right'); my $messagesBufLabel = $top2_fm->Label(-text => "Bufferized :", - -width => 17, - -anchor => 'e')->pack(-side => 'right'); + -width => 17, + -anchor => 'e')->pack(-side => 'right'); my $messagesDeletedValue = $top2_fm->Label(-textvariable => \$deletedNumber, - -width => 8, - -anchor => 'w')->pack(-side => 'right'); + -width => 8, + -anchor => 'w')->pack(-side => 'right'); my $messagesDeletedLabel = $top2_fm->Label(-text => "Skipped :", - -width => 14, - -anchor => 'e')->pack(-side => 'right'); + -width => 14, + -anchor => 'e')->pack(-side => 'right'); my $messagesMaxLabel = $top2_fm->Label(-text => "Recordable : $history", - -width => 25)->pack(-side => 'right'); + -width => 25)->pack(-side => 'right'); my $messagesText = $top_fm->Scrolled('Text', - -scrollbars => 'e', - -height => 18*$coef, - -spacing1 => 2, - -spacing2 => 0, - -spacing3 => 2, - -state => 'disabled', - )->pack(-fill => 'both', - -expand => 1, - -side => 'bottom'); + -scrollbars => 'e', + -height => 18*$coef, + -spacing1 => 2, + -spacing2 => 0, + -spacing3 => 2, + -state => 'disabled', + )->pack(-fill => 'both', + -expand => 1, + -side => 'bottom'); $focusedtext = $messagesText; &wheelmousebindings($messagesText); @@ -546,8 +550,8 @@ my $bgcolor = $messagesText->cget(-background); # text tag creation $messagesText->tagConfigure('sender', - -background => 'gray50', - -foreground => 'gray90'); + -background => 'gray50', + -foreground => 'gray90'); my @hide_option; if ($Tk::VERSION ge 804) { @hide_option = (-elide => 1); @@ -557,15 +561,15 @@ if ($Tk::VERSION ge 804) { $messagesText->tagConfigure('time', @hide_option); $messagesText->tagConfigure($appname, -foreground => 'gray30'); $messagesText->tagConfigure('marker0', -background => 'lightcoral', - -foreground => 'lightcoral'); + -foreground => 'lightcoral'); $messagesText->tagConfigure('marker1', -background => 'LightGoldenrod', - -foreground => 'LightGoldenrod'); + -foreground => 'LightGoldenrod'); $messagesText->tagConfigure('marker2', -background => 'skyblue', - -foreground => 'skyblue'); + -foreground => 'skyblue'); $messagesText->tagConfigure('marker3', -background => 'darkseagreen', - -foreground => 'darkseagreen'); + -foreground => 'darkseagreen'); $messagesText->tagConfigure('marker4', - -background => 'ivory', -foreground => 'ivory'); + -background => 'ivory', -foreground => 'ivory'); for my $marker (qw(marker0 marker1 marker2 marker3 marker4)) { $messagesText->tagBind($marker, '<Double-1>', \&marker); @@ -578,17 +582,17 @@ $messagesCounterValue->repeat(1000, sub { $messagesLastNumber = $messagesNumber; # if update mechanism is off, we flush data here if ($noUpdateFlag) { - $messagesText->see('end'); - $messagesCounterValue->update; + $messagesText->see('end'); + $messagesCounterValue->update; } # if too many messages, update mechanism is unset if ($messagesSpeed > 50) { - $noUpdateFlag = 1; - #print "$messagesSpeed received messages/second !\n"; + $noUpdateFlag = 1; + #print "$messagesSpeed received messages/second !\n"; # in nominal case, update mechanism is set # (each time a message is received, update is forced in Text window) } else { - $noUpdateFlag = 0; + $noUpdateFlag = 0; } }); @@ -597,11 +601,11 @@ $messagesCounterValue->repeat(1000, sub { #---------------------------------------------------------------------------------- my $bindingsEntry = $bindings_fm->Entry(-width => 30*$coef)->pack(-fill => 'x', - -side => 'top', - -anchor => 'w', - -ipady => 3, - -expand => 0, - -pady => 5*$coef); + -side => 'top', + -anchor => 'w', + -ipady => 3, + -expand => 0, + -pady => 5*$coef); $bindingsEntry->bind('<Escape>' => [\&addBindingExpression]); $bindingsEntry->bind('<Return>' => [\&addBinding]); @@ -614,24 +618,24 @@ $bindingsEntry->focus; my $bindingsList = $bindings_fm->Scrolled('Listbox', - -scrollbars => 'osoe', - -height => 4, - -width => 30*$coef)->pack(-fill => 'y', - -side => 'top', - -anchor => 'w', - -expand => 0); + -scrollbars => 'osoe', + -height => 4, + -width => 30*$coef)->pack(-fill => 'y', + -side => 'top', + -anchor => 'w', + -expand => 0); $bindingsList->bind('<1>', [\&selectBinding]); $bindingsList->bind('<Double-1>', [\&addBinding]); $bindingsEntry->bind('<Key>' => [\&findExprInList, $bindingsList]); my $effectivebindingsList = $bindings_fm->Scrolled('Listbox', - -scrollbars => 'osoe', - -height => 4, - -width => 30*$coef)->pack(-fill => 'y', - -side => 'bottom', - -anchor => 'w', - -expand => 1); + -scrollbars => 'osoe', + -height => 4, + -width => 30*$coef)->pack(-fill => 'y', + -side => 'bottom', + -anchor => 'w', + -expand => 1); $effectivebindingsList->bind('<Double-1>', [\&removeBinding]); &wheelmousebindings($bindingsList); @@ -641,10 +645,10 @@ $effectivebindingsList->bind('<Double-1>', [\&removeBinding]); #---------------------------------------------------------------------------------- my $clientsListbox = $clients_fm->Scrolled('Listbox', - -height => 9, - -scrollbars => 'osoe')->pack(-fill => 'both', - -expand => 0, - -side => 'top'); + -height => 9, + -scrollbars => 'osoe')->pack(-fill => 'both', + -expand => 0, + -side => 'top'); $clientsListbox->bind('<1>', [\&selectClient]); $clientsListbox->bind('<Double-1>', [\&showClientBindings]); &wheelmousebindings($clientsListbox); @@ -656,85 +660,89 @@ my $clientsButtons_fm = my $clientsSeeBindings_btn = $clientsButtons_fm->Button(-command => [\&showClientBindings], - -text => 'See bindings', - )->pack(-side => 'top', -fill => 'both', -expand => 1); + -text => 'See bindings', + )->pack(-side => 'top', -fill => 'both', + -expand => 1); my $clientsButtons2_fm = - $clientsButtons_fm->Frame()->pack(-fill => 'both', -expand => 1, -side => 'top'); + $clientsButtons_fm->Frame()->pack(-fill => 'both', -expand => 1, + -side => 'top'); my $clientsFilter_btn = $clientsButtons2_fm->Button(-command => [\&filterClient], - -text => "Filter", - )->pack(-side => 'left', -fill => 'both', -expand => 1); + -text => "Filter", + )->pack(-side => 'left', -fill => 'both', + -expand => 1); my $clientsKill_btn = $clientsButtons2_fm->Button(-command => [\&killClient], - -text => "Kill", - )->pack(-side => 'left', -fill => 'both', -expand => 1); + -text => "Kill", + )->pack(-side => 'left', -fill => 'both', + -expand => 1); #---------------------------------------------------------------------------------- # Messages to send area #---------------------------------------------------------------------------------- my $send1_fm = $send_fm->Frame()->pack(-side => 'top', - -expand => 1, - -fill => 'both'); + -expand => 1, + -fill => 'both'); my $sendEntry = $send1_fm->Entry(-width => 40*$coef)->pack(-fill => 'x', - -side => 'left', - -anchor => 'w', - -ipady => 3, - -expand => 1, - -pady => 0); + -side => 'left', + -anchor => 'w', + -ipady => 3, + -expand => 1, + -pady => 0); my $recipientLabel = $send1_fm->Label(-width => 2, - -relief => 'sunken')->pack(-fill => 'x', - -side => 'left', - -anchor => 'w', - -ipady => 3, - -pady => 0); + -relief => 'sunken')->pack(-fill => 'x', + -side => 'left', + -anchor => 'w', + -ipady => 3, + -pady => 0); my $send2_fm = $send_fm->Frame()->pack(-side => 'top', - -pady => 5*$coef, - -expand => 1, - -fill => 'both'); + -pady => 5*$coef, + -expand => 1, + -fill => 'both'); my $clockstartButtonmsg = "Clock Start"; my $clockstopButtonmsg = "Clock Stop"; my $clockbackCheckButtonmsg = "Backward"; if($smallsized){ -# $clockstartButtonmsg = "Start"; - $clockstartButtonmsg = "Go"; - $clockstopButtonmsg = "Stop"; - $clockbackCheckButtonmsg = "Backw"; +# $clockstartButtonmsg = "Start"; + $clockstartButtonmsg = "Go"; + $clockstopButtonmsg = "Stop"; + $clockbackCheckButtonmsg = "Backw"; } my $clockstartButton = $send2_fm->Button(-height => 1, - -command => [\&clockstart], - -text => $clockstartButtonmsg)->grid(-column => 1, - -row => 1); + -command => [\&clockstart], + -text => $clockstartButtonmsg)->grid(-column => 1, + -row => 1); my $clockstopButton = $send2_fm->Button(-height => 1, - -command => [\&clockstop], - -text => $clockstopButtonmsg)->grid(-column => 2, - -row => 1); + -command => [\&clockstop], + -text => $clockstopButtonmsg)->grid(-column => 2, + -row => 1); my $clockbackCheckbutton = $send2_fm->Checkbutton(-selectcolor => undef, - -indicatoron => 0, - -command => [\&clockswitch], - -variable => \$clockbackwardflag, - -text => $clockbackCheckButtonmsg)->grid(-column => 3, - -row => 1, - -ipadx => 10*$coef, - -sticky => 'nsew'); + -command => [\&clockswitch], + -variable => \$clockbackwardflag, + -text => $clockbackCheckButtonmsg, + -indicatoron => 0)->grid(-column => 3, + -row => 1, + -ipadx => 10*$coef, + -sticky => 'nsew'); my $sendList = $send_fm->Scrolled('Listbox', - -scrollbars => 'osoe', - -height => 9, - -width => 40*$coef)->pack(-fill => 'both', - -anchor => 'w', - -side => 'top', - -expand => 1); + -scrollbars => 'osoe', + -height => 9, + -width => 40*$coef)->pack(-fill => 'both', + -anchor => 'w', + -side => 'top', + -expand => 1); $sendEntry->bind('<Key>' => [\&findExprInList, $sendList]); $sendEntry->bind('<Return>' => [\&addMsgToSend, undef, 1]); @@ -753,12 +761,12 @@ $sendList->bind('<Double-1>', [\&addMsgToSend, undef, 1]); #---------------------------------------------------------------------------------- my $searchEntry = $search_fm->Entry(-width => 24)->grid(-column => 1, - -row => 1, - -columnspan => 3); + -row => 1, + -columnspan => 3); $searchEntry->eventAdd('<<SearchNext>>', '<Return>', '<Next>', - '<Control-s>', '<Control-f>'); + '<Control-s>', '<Control-f>'); $searchEntry->eventAdd('<<SearchPrev>>', '<Shift-Return>', '<Prior>', - '<Control-r>'); + '<Control-r>'); $searchEntry->eventAdd('<<SearchNextExpr>>', '<Down>', '<Control-n>'); $searchEntry->eventAdd('<<SearchPrevExpr>>', '<Up>', '<Control-p>'); @@ -770,37 +778,37 @@ $searchEntry->bind('<Key>' => [\&searchOnTheFly]); my $checkbutt_fm = $search_fm->Frame()->grid(-column => 1, - -row => 2, - -columnspan => 3); + -row => 2, + -columnspan => 3); my $casesensitive_cb = $checkbutt_fm->Checkbutton(-text => 'Case sens.', - -variable => \$casesensitiveflag - )->grid(-column => 1, - -row => 1); + -variable => \$casesensitiveflag + )->grid(-column => 1, + -row => 1); my $regexp_cb = $checkbutt_fm->Checkbutton(-text => 'Regexp', - -variable => \$regexpflag - )->grid(-column => 2, - -row => 1); + -variable => \$regexpflag + )->grid(-column => 2, + -row => 1); my $searchPrev = $search_fm->Button(-text => 'Prev', - -height => 1, - -width => 4, - -command => [\&searchPrev])->grid(-column => 1, - -row => 3); + -height => 1, + -width => 4, + -command => [\&searchPrev])->grid(-column => 1, + -row => 3); my $searchNext = $search_fm->Button(-text => 'Next', - -width => 4, - -height => 1, - -command => [\&searchNext])->grid(-column => 2, - -row => 3); + -width => 4, + -height => 1, + -command => [\&searchNext])->grid(-column => 2, + -row => 3); my $searchAll = $search_fm->Button(-text => 'All', - -width => 4, - -height => 1, - -command => [\&searchAll])->grid(-column => 3, - -row => 3); + -width => 4, + -height => 1, + -command => [\&searchAll])->grid(-column => 3, + -row => 3); #---------------------------------------------------------------------------------- # Control panel #---------------------------------------------------------------------------------- @@ -808,68 +816,68 @@ my $searchAll = my $balloonflag = 0; my $balloon_cb = $control_fm->Checkbutton(-text => 'Balloon help', - -variable => \$balloonflag, - -command => sub { - if ($balloonflag == 0) { - $balloonhelp->configure(-state => 'none'); - } else { - $balloonhelp->configure(-state => 'balloon'); - } - } - ); + -variable => \$balloonflag, + -command => sub { + if ($balloonflag == 0) { + $balloonhelp->configure(-state => 'none'); + } else { + $balloonhelp->configure(-state => 'balloon'); + } + } + ); $balloon_cb->grid(-column => 1, - -columnspan => 2, - -row => 1); + -columnspan => 2, + -row => 1); my $exitButton = $control_fm->Button(-height => 2, - -width => 4, - -command => [\&bye], - -text => 'Exit')->grid(-column => 3, - -row => 1); + -width => 4, + -command => [\&bye], + -text => 'Exit')->grid(-column => 3, + -row => 1); my $loadButton = $control_fm->Button(-height => 2, - -width => 4, - -command => [\&loadfile, 1], - -state => 'normal', - -text => 'Load')->grid(-column => 1, - -row => 2); + -width => 4, + -command => [\&loadfile, 1], + -state => 'normal', + -text => 'Load')->grid(-column => 1, + -row => 2); my $saveButton = $control_fm->Button(-height => 2, - -width => 4, - -command => [\&savefile, 1], - -state => 'normal', - -text => 'Save')->grid(-column => 2, - -row => 2); + -width => 4, + -command => [\&savefile, 1], + -state => 'normal', + -text => 'Save')->grid(-column => 2, + -row => 2); my $jumpButton = $control_fm->Button(-height => 2, - -width => 4, - -command => [\&jump], - -state => 'disabled', - -text => 'Jump')->grid(-column => 3, - -row => 2); + -width => 4, + -command => [\&jump], + -state => 'disabled', + -text => 'Jump')->grid(-column => 3, + -row => 2); my $startButton = $control_fm->Button(-height => 2, - -width => 4, - -command => [\&start, 1], - -state => 'disabled', - -text => 'Scroll')->grid(-column => 1, - -row => 3); + -width => 4, + -command => [\&start, 1], + -state => 'disabled', + -text => 'Scroll')->grid(-column => 1, + -row => 3); my $stopButton = $control_fm->Button(-height => 2, - -width => 4, - -command => [\&stop, 1], - -text => "Scroll\nLock")->grid(-column => 2, - -row => 3); + -width => 4, + -command => [\&stop, 1], + -text => "Scroll\nLock")->grid(-column => 2, + -row => 3); my $clearButton = $control_fm->Button(-height => 2, - -width => 4, - -command => [\&clear, 1], - -state => 'normal', - -text => 'Clear')->grid(-column => 3, - -row => 3); + -width => 4, + -command => [\&clear, 1], + -state => 'normal', + -text => 'Clear')->grid(-column => 3, + -row => 3); #---------------------------------------------------------------------------------- # Update default bindings and messages lists #---------------------------------------------------------------------------------- @@ -903,98 +911,98 @@ my $insertionText = "next rvalue field, and select it if defined. "; $balloonhelp->attach($messagesMaxLabel, -balloonmsg => - "Maximum number of recordable messages\n". - "(=history size value) " - ); + "Maximum number of recordable messages\n". + "(=history size value) " + ); $balloonhelp->attach($messagesDeletedLabel, -balloonmsg => - "Counter for received messages which are\n". - "skipped when history size is reached. " - ); + "Counter for received messages which are\n". + "skipped when history size is reached. " + ); $balloonhelp->attach($messagesBufLabel, -balloonmsg => - "Counter for received messages which are bufferized\n". - "when [Scroll Lock] button is active. They will be \n". - "displayed when user will restore scroll mode. " - ); + "Counter for received messages which are bufferized\n". + "when [Scroll Lock] button is active. They will be \n". + "displayed when user will restore scroll mode. " + ); $balloonhelp->attach($messagesCounterLabel, -balloonmsg => - "Counter for received and displayed messages." - ); + "Counter for received and displayed messages." + ); $balloonhelp->attach($bindingsEntry, -balloonmsg => - "This input field is used to enter new bindings or\n". - "edit default one from list above. In both case, \n". - "hit [Enter] to apply. \n". - $historyText."\n". - $completionText."\n". - $insertionText - ); + "This input field is used to enter new bindings or\n". + "edit default one from list above. In both case, \n". + "hit [Enter] to apply. \n". + $historyText."\n". + $completionText."\n". + $insertionText + ); $balloonhelp->attach($bindingsList, -balloonmsg => - "Available bindings list. Select an item for edition or\n". - "double-click on a predefined binding to activate it. " - ); + "Available bindings list. Select an item for edition or\n". + "double-click on a predefined binding to activate it. " + ); $balloonhelp->attach($effectivebindingsList, -balloonmsg => - "Effective bindings list. Double-click on binding to unset it." - ); + "Effective bindings list. Double-click on binding to unset it." + ); $balloonhelp->attach($clientsListbox,-balloonmsg => - "Select an application name to highlight related\n". - "Ivy messages in the Messages area. \n". - "Double-click on it to display the application \n". - "bindings or click on the 'See bindings' button.\n". - "To display messages in a separate window, click\n". - "on the 'Filter' button. \n". - "To kill an agent, click on the 'Kill' button. "); + "Select an application name to highlight related\n". + "Ivy messages in the Messages area. \n". + "Double-click on it to display the application \n". + "bindings or click on the 'See bindings' button.\n". + "To display messages in a separate window, click\n". + "on the 'Filter' button. \n". + "To kill an agent, click on the 'Kill' button. "); $balloonhelp->attach($sendEntry, -balloonmsg => - "This input field is used to enter new messages or\n". - "edit default one from list above. In both case, \n". - "hit [Enter] to send it. \n". - $historyText."\n". - $completionText."\n". - $insertionText - ); + "This input field is used to enter new messages or\n". + "edit default one from list above. In both case, \n". + "hit [Enter] to send it. \n". + $historyText."\n". + $completionText."\n". + $insertionText + ); $balloonhelp->attach($sendList, -balloonmsg => - "Available messages list. Select an item for edition\n". - "or double click on predefined message to send it. " - ); + "Available messages list. Select an item for edition\n". + "or double click on predefined message to send it. " + ); $balloonhelp->attach($recipientLabel, -balloonmsg => - "Number of last message recipients." - ); + "Number of last message recipients." + ); $balloonhelp->attach($messagesText, -balloonmsg => - "You can insert colored marker by double-clicking on a \n". - "message application name (marker will be createafter\n". - "the message). Then, you can quickly access markers \n". - "using the [Jump] button in control panel. To remove a \n". - "marker, just double-click on it. " - ); + "You can insert colored marker by double-clicking on a \n". + "message application name (marker will be createafter\n". + "the message). Then, you can quickly access markers \n". + "using the [Jump] button in control panel. To remove a \n". + "marker, just double-click on it. " + ); $balloonhelp->attach($searchEntry, -balloonmsg => - "This input field is used to search expressions in \n". - "messages list. Hit [Return], [Ctrl-s] or [Ctrl-f]\n". - "key to search forward and [Shift-Return] or [Ctrl-r]\n". - "key to search backward. \n". - $historyText - ); + "This input field is used to search expressions in \n". + "messages list. Hit [Return], [Ctrl-s] or [Ctrl-f]\n". + "key to search forward and [Shift-Return] or [Ctrl-r]\n". + "key to search backward. \n". + $historyText + ); $balloonhelp->attach($stopButton, -balloonmsg => - "Stop scrolling in Messages area." - ); + "Stop scrolling in Messages area." + ); $balloonhelp->attach($startButton, -balloonmsg => - "Restart scrolling in Messages area." - ); + "Restart scrolling in Messages area." + ); $balloonhelp->attach($jumpButton, -balloonmsg => - "Access next marker in Messages area." - ); + "Access next marker in Messages area." + ); $balloonhelp->attach($clearButton, -balloonmsg => - "Remove messages displayed\n". - "in Messages area. " - ); + "Remove messages displayed\n". + "in Messages area. " + ); $balloonhelp->attach($loadButton, -balloonmsg => - "Load messages file and display\n". - "its content in Messages area. " - ); + "Load messages file and display\n". + "its content in Messages area. " + ); $balloonhelp->attach($saveButton, -balloonmsg => - "Save the content of Messages\n". - "area in a file. " - ); + "Save the content of Messages\n". + "area in a file. " + ); $balloonhelp->attach($sendEnlargeBtn, -balloonmsg => - "Click here to enlarge or shrink this frame" - ); + "Click here to enlarge or shrink this frame" + ); #================================================================================= # @@ -1008,7 +1016,7 @@ $balloonhelp->attach($sendEnlargeBtn, -balloonmsg => Ivy->init(-loopMode => 'TK', -appName => $appname, -ivyBus => $ivy_port, - -onDieFunc => [\&quit], + -onDieFunc => [\&quit], ); my $ivy = Ivy->new(-statusFunc => \&checkClientsStatus); $ivy->start; @@ -1025,31 +1033,31 @@ for my $bind (@effectivebind) { #================================================================================= # loading mode $mw->Tk::Error("syntax error : -loadingmode accepts 'replay', 'replay-pause' ". - "or 'display' value") + "or 'display' value") if ($opt_loadingmode ne 'replay' and $opt_loadingmode ne 'replay-pause' - and $opt_loadingmode ne 'display'); + and $opt_loadingmode ne 'display'); # load input files if (@ARGV > 0) { my $file = $ARGV[0]; if ( not open(IN, $file)) { - $mw->Tk::Error("Can't open file '$file' ($!)"); + $mw->Tk::Error("Can't open file '$file' ($!)"); } else { - &showProgressbar(); - my ($step, $timefound) = &stepsnumber; - if ($opt_loadingmode eq 'replay-pause' or $opt_loadingmode eq 'replay') { - if ($timefound) { - &loadfileForReplay($step); - } else { - $mw->Tk::Error("No time information in file '$file'. ". - "Can't be replayed."); - } - &replayStart() if $opt_loadingmode eq 'replay'; - } elsif ($opt_loadingmode eq 'display') { - &loadfileForDisplay($step); - } - &hideProgressbar(); - close(IN); + &showProgressbar(); + my ($step, $timefound) = &stepsnumber; + if ($opt_loadingmode eq 'replay-pause' or $opt_loadingmode eq 'replay') { + if ($timefound) { + &loadfileForReplay($step); + } else { + $mw->Tk::Error("No time information in file '$file'. ". + "Can't be replayed."); + } + &replayStart() if $opt_loadingmode eq 'replay'; + } elsif ($opt_loadingmode eq 'display') { + &loadfileForDisplay($step); + } + &hideProgressbar(); + close(IN); } } @@ -1066,36 +1074,36 @@ MainLoop; # Ivy functions #---------------------------------------------------------------------------------- sub addIvyBinding { - my $binding = shift; - #print "in addIvyBinding $binding\n"; - $ivy->bindRegexp($binding, [sub { - my $sender = shift; - my $message; - if (@_ > 1) { - for (my $i = 0; $i < @_; $i++) { - $_[$i] = '"'.$_[$i].'"'; - } - $message = join(' ', @_); - } else { - $message = shift; - } - $messagesNumber++; - my $time = gettimeofday(); - if ($stopFlag) { - &bufferizeMessages($sender, $message, $time); - } else { - &beforeUpdatingMessages; - &updateMessages($sender, $message, $time); - &afterUpdatingMessages; - } - }]); + my $binding = shift; + #print "in addIvyBinding $binding\n"; + $ivy->bindRegexp($binding, [sub { + my $sender = shift; + my $message; + if (@_ > 1) { + for (my $i = 0; $i < @_; $i++) { + $_[$i] = '"'.$_[$i].'"'; + } + $message = join(' ', @_); + } else { + $message = shift; + } + $messagesNumber++; + my $time = gettimeofday(); + if ($stopFlag) { + &bufferizeMessages($sender, $message, $time); + } else { + &beforeUpdatingMessages; + &updateMessages($sender, $message, $time); + &afterUpdatingMessages; + } + }]); } # end addIvyBinding sub removeIvyBinding { - my $binding = shift; - $ivy->bindRegexp($binding); + my $binding = shift; + $ivy->bindRegexp($binding); } # end removeIvyBinding @@ -1104,33 +1112,33 @@ sub removeIvyBinding { # Functions related to connected applications management #---------------------------------------------------------------------------------- sub checkClientsStatus { - my $appname = $_[3]; - my $status = $_[4]; - my $host; - my $regexp; - my $newapi; - $newapi = 1 if (($ivy_cvsrevision == 1 and $ivy_version ge 1.40) or - ($ivy_cvsrevision == 0 and $ivy_version ge 4.18)); - if ($newapi) { - $host = $_[5]; - $regexp = $_[6]; - } else { - $host = $_[5]; - $regexp = $host; - } - $appname =~ s/ /_/g; - if ($status eq 'died') { - &removeClient($appname, $host); - } elsif ($status eq 'new') { - &addClient($appname, $host); - } elsif ($status eq 'subscribing') { - $clientsBindings{$appname}->{$host}++; - &newBinding($regexp); - } elsif ($status eq 'unsubscribing') { - $clientsBindings{$appname}->{$host}--; - } else { - carp "In Ivymon, checkClientsStatus function, unknown status <$status>\n"; - } + my $appname = $_[3]; + my $status = $_[4]; + my $host; + my $regexp; + my $newapi; + $newapi = 1 if (($ivy_cvsrevision == 1 and $ivy_version ge 1.40) or + ($ivy_cvsrevision == 0 and $ivy_version ge 4.18)); + if ($newapi) { + $host = $_[5]; + $regexp = $_[6]; + } else { + $host = $_[5]; + $regexp = $host; + } + $appname =~ s/ /_/g; + if ($status eq 'died') { + &removeClient($appname, $host); + } elsif ($status eq 'new') { + &addClient($appname, $host); + } elsif ($status eq 'subscribing') { + $clientsBindings{$appname}->{$host}++; + &newBinding($regexp); + } elsif ($status eq 'unsubscribing') { + $clientsBindings{$appname}->{$host}--; + } else { + carp "In Ivymon, checkClientsStatus function, unknown status <$status>\n"; + } } # end checkClientsStatus @@ -1153,7 +1161,7 @@ sub removeClient { $connectedClients{$client}->{$host}-- if $connectedClients{$client}->{$host} > 0; my $num = 0; for my $host ((keys(%{$connectedClients{$client}}))) { - $num += $connectedClients{$client}->{$host}; + $num += $connectedClients{$client}->{$host}; } delete $clientsBindings{$client} if $num == 0; &manageClient($client, $host); @@ -1162,38 +1170,38 @@ sub removeClient { sub manageClient { - my $client = shift; - my $host = shift; - my $i = 0; - for ($clientsListbox->get(0, 'end')) { - if ($_ =~ /^$client/ or $_ =~ /-- $client/) { - $clientsListbox->delete($i); - last; - } - $i++; - } - my $num = 0; - for (values(%{$connectedClients{$client}})) { - $num += $_; - } - if ($num == 0) { - $clientsListbox->insert('end', "-- $client died"); - } elsif ($num == 1) { - $clientsListbox->insert($i, "$client on $host"); - } elsif ($num > 1) { - my $msg = "$client "; - for my $host ((keys(%{$connectedClients{$client}}))) { - if ($connectedClients{$client}->{$host} == 0) { - next; - } elsif ($connectedClients{$client}->{$host} == 1) { - $msg .= "on $host, "; - } else { - $msg .= "on $host($connectedClients{$client}->{$host}), "; - } - } - $msg =~ s/, $//; - $clientsListbox->insert($i, $msg); - } + my $client = shift; + my $host = shift; + my $i = 0; + for ($clientsListbox->get(0, 'end')) { + if ($_ =~ /^$client/ or $_ =~ /-- $client/) { + $clientsListbox->delete($i); + last; + } + $i++; + } + my $num = 0; + for (values(%{$connectedClients{$client}})) { + $num += $_; + } + if ($num == 0) { + $clientsListbox->insert('end', "-- $client died"); + } elsif ($num == 1) { + $clientsListbox->insert($i, "$client on $host"); + } elsif ($num > 1) { + my $msg = "$client "; + for my $host ((keys(%{$connectedClients{$client}}))) { + if ($connectedClients{$client}->{$host} == 0) { + next; + } elsif ($connectedClients{$client}->{$host} == 1) { + $msg .= "on $host, "; + } else { + $msg .= "on $host($connectedClients{$client}->{$host}), "; + } + } + $msg =~ s/, $//; + $clientsListbox->insert($i, $msg); + } } # end manageClient @@ -1210,120 +1218,121 @@ sub killClient { } # end killClient sub selectClient { - $messagesText->tagConfigure($selectedClient, -background => $bgcolor) - if $selectedClient; - my $selindex = $clientsListbox->curselection; - my $client = $clientsListbox->get($selindex); - $client =~ s/^-- //; - $client =~ s/\(\d+\)$//; - $client =~ s/\s.*//; - if ($selectedClient eq $client) { - $selectedClient = undef; - $clientsListbox->selectionClear($selindex); - return; - } - $messagesText->tagConfigure($client, -background => 'gray70'); - $selectedClient = $client; + $messagesText->tagConfigure($selectedClient, -background => $bgcolor) + if $selectedClient; + my $selindex = $clientsListbox->curselection; + my $client = $clientsListbox->get($selindex); + $client =~ s/^-- //; + $client =~ s/\(\d+\)$//; + $client =~ s/\s.*//; + if ($selectedClient eq $client) { + $selectedClient = undef; + $clientsListbox->selectionClear($selindex); + return; + } + $messagesText->tagConfigure($client, -background => 'gray70'); + $selectedClient = $client; } # end selectClient sub filterClient { - my $selindex = $clientsListbox->curselection; - return unless defined $selindex; - my $client = $clientsListbox->get($selindex); - $client =~ s/^-- //; - $client =~ s/\(\d+\)$//; - $client =~ s/\s.*//; - # si une fenetre client existe, on la raise - if (defined $clientsMessagesTpl{$client} and + my $selindex = $clientsListbox->curselection; + return unless defined $selindex; + my $client = $clientsListbox->get($selindex); + $client =~ s/^-- //; + $client =~ s/\(\d+\)$//; + $client =~ s/\s.*//; + # si une fenetre client existe, on la raise + if (defined $clientsMessagesTpl{$client} and Tk::Exists $clientsMessagesTpl{$client}) { - $clientsMessagesTpl{$client}->toplevel->raise; - return; - # sinon, on la crée - } else { - my $tpl = $mw->Toplevel; - $tpl->group($mw); - my $title = "$client messages"; - $tpl->title($title); - $tpl->Label(-text => $title)->pack(-side => 'top', - -padx => 10, - -pady => 10); - $clientsMessagesTpl{$client} = - $tpl->Scrolled('Text', - -scrollbars => 'e', - )->pack(-side => 'top', - -fill => 'both', - -expand => 1); - $clientsMessagesTpl{$client}->bind('<1>', sub { - $clientsMessagesTpl{$client}->Subwidget('scrolled')->focus;}); - - &wheelmousebindings($clientsMessagesTpl{$client}); - - $tpl->Button(-text => 'Close', - -command => [sub { - my $text = $clientsMessagesTpl{$client}->Subwidget('scrolled'); - if ($focusedtext eq $text) { - $focusedtext = $messagesText; - $messagesText->focus; - } - $clientsMessagesTpl{$client} = undef; - $tpl->destroy; - }], - )->pack(-side => 'top', - -padx => 10, - -pady => 10); - } - - my @list = $messagesText->tagRanges($client); - for (my $i=0; $i < @list; $i += 2) { - &updateClientMessages($client, $messagesText->get($list[$i], $list[$i+1])); - } - $clientsMessagesTpl{$client}->configure(-state => 'disabled'); + $clientsMessagesTpl{$client}->toplevel->raise; + return; + # sinon, on la crée + } else { + my $tpl = $mw->Toplevel; + $tpl->group($mw); + my $title = "$client messages"; + $tpl->title($title); + $tpl->Label(-text => $title)->pack(-side => 'top', + -padx => 10, + -pady => 10); + $clientsMessagesTpl{$client} = + $tpl->Scrolled('Text', + -scrollbars => 'e', + )->pack(-side => 'top', + -fill => 'both', + -expand => 1); + $clientsMessagesTpl{$client}->bind('<1>', sub { + $clientsMessagesTpl{$client}->Subwidget('scrolled')->focus;}); + + &wheelmousebindings($clientsMessagesTpl{$client}); + + $tpl->Button(-text => 'Close', + -command => [sub { + my $text = + $clientsMessagesTpl{$client}->Subwidget('scrolled'); + if ($focusedtext eq $text) { + $focusedtext = $messagesText; + $messagesText->focus; + } + $clientsMessagesTpl{$client} = undef; + $tpl->destroy; + }], + )->pack(-side => 'top', + -padx => 10, + -pady => 10); + } + + my @list = $messagesText->tagRanges($client); + for (my $i=0; $i < @list; $i += 2) { + &updateClientMessages($client, $messagesText->get($list[$i], $list[$i+1])); + } + $clientsMessagesTpl{$client}->configure(-state => 'disabled'); } # end filterClient sub showClientBindings { - my $selindex = $clientsListbox->curselection; - return unless defined $selindex; - - my $client = $clientsListbox->get($selindex); - $client =~ s/\(\d+\)$//; - $client =~ s/ on .*//; - my $tpl = $clientBindingsTpl{$client}; - $tpl->destroy if defined $tpl and Tk::Exists($tpl); - $tpl = $mw->Toplevel; - $clientBindingsTpl{$client} = $tpl; - my $title = "Ivy bindings of $client application"; - $tpl->title($title); - $tpl->Label(-text => $title)->pack(-side => 'top', - -padx => 10, - -pady => 10); - my $t = $tpl->Scrolled('Text', - -scrollbars => 'e', - )->pack(-side => 'top', - -fill => 'both', - -expand => 1); - $t->tagConfigure('0', -background => '#d4d4d4'); - $t->tagConfigure('1', -background => '#e5e5e5'); - my $i = 0; - for my $regexp (sort keys(%{$clientsBindings{$client}})) { - - $t->insert('end', $regexp."\n", $i % 2) - if $clientsBindings{$client}->{$regexp} > 0; - $i++; - } - $t->configure(-state => 'disabled'); - $tpl->Button(-text => 'Close', - -command => [sub {$tpl->destroy; - $clientsListbox->selectionClear($_[0]) - unless $client eq $selectedClient; - }, $selindex, $client], - )->pack(-side => 'top', - -padx => 10, - -pady => 10); + my $selindex = $clientsListbox->curselection; + return unless defined $selindex; + + my $client = $clientsListbox->get($selindex); + $client =~ s/\(\d+\)$//; + $client =~ s/ on .*//; + my $tpl = $clientBindingsTpl{$client}; + $tpl->destroy if defined $tpl and Tk::Exists($tpl); + $tpl = $mw->Toplevel; + $clientBindingsTpl{$client} = $tpl; + my $title = "Ivy bindings of $client application"; + $tpl->title($title); + $tpl->Label(-text => $title)->pack(-side => 'top', + -padx => 10, + -pady => 10); + my $t = $tpl->Scrolled('Text', + -scrollbars => 'e', + )->pack(-side => 'top', + -fill => 'both', + -expand => 1); + $t->tagConfigure('0', -background => '#d4d4d4'); + $t->tagConfigure('1', -background => '#e5e5e5'); + my $i = 0; + for my $regexp (sort keys(%{$clientsBindings{$client}})) { + + $t->insert('end', $regexp."\n", $i % 2) + if $clientsBindings{$client}->{$regexp} > 0; + $i++; + } + $t->configure(-state => 'disabled'); + $tpl->Button(-text => 'Close', + -command => [sub {$tpl->destroy; + $clientsListbox->selectionClear($_[0]) + unless $client eq $selectedClient; + }, $selindex, $client], + )->pack(-side => 'top', + -padx => 10, + -pady => 10); } # end showClientBindings @@ -1333,38 +1342,38 @@ sub showClientBindings { # Functions related to messages display management #---------------------------------------------------------------------------------- sub marker { - return if $noMessageYet; - my @markers = $messagesText->markNames; - my $foundmarker; - my @markers2; - for (@markers) { - push(@markers2, $_) if (/^ivymon/); - } - $jumpButton->configure(-state => 'disabled') if @markers2 == 0; - for(@markers2) { - my $comp = $messagesText->compare('current linestart', '==', $_); - if ($comp) { - $foundmarker = $_; - $jumpButton->configure(-state => 'disabled') if @markers2 == 1; - last; - } - } - if ($foundmarker) { - &deletemarker($foundmarker); - } else { - my $index = $messagesText->index('current linestart + 1 lines'); - my $nb = $markers_cnt % 5; - &addmarker($index, 'marker'.$nb); - $markers_cnt++; - } - + return if $noMessageYet; + my @markers = $messagesText->markNames; + my $foundmarker; + my @markers2; + for (@markers) { + push(@markers2, $_) if (/^ivymon/); + } + $jumpButton->configure(-state => 'disabled') if @markers2 == 0; + for(@markers2) { + my $comp = $messagesText->compare('current linestart', '==', $_); + if ($comp) { + $foundmarker = $_; + $jumpButton->configure(-state => 'disabled') if @markers2 == 1; + last; + } + } + if ($foundmarker) { + &deletemarker($foundmarker); + } else { + my $index = $messagesText->index('current linestart + 1 lines'); + my $nb = $markers_cnt % 5; + &addmarker($index, 'marker'.$nb); + $markers_cnt++; + } + } # end marker sub deletemarker { my $marker = shift; $messagesText->configure(-state => 'normal'); - $messagesText->delete($marker, "$marker lineend + 1 chars"); + $messagesText->delete($marker, "$marker lineend + 1 chars"); $messagesText->markUnset($marker); $messagesText->configure(-state => 'disabled'); @@ -1409,23 +1418,23 @@ sub updateMessages { # Unless file has been loaded, look at history : compare widget text lines # number with history size if ($loadedFileFlag) { - &loadMessage($sender, $message, $time); - $messagesText->update unless $noUpdateFlag; + &loadMessage($sender, $message, $time); + $messagesText->update unless $noUpdateFlag; } else { - my ($linesNb) = split(/\./, $messagesText->index('end')); - $linesNb--; - #print "linesNb=$linesNb\n"; - if ($linesNb > $history) { - $deletedNumber += 1; - if ($deletedNumber == 1) { - $messagesDeletedLabel->configure(-foreground => 'red'); - $messagesDeletedValue->configure(-foreground => 'red'); - } - } else { - &loadMessage($sender, $message, $time); - $messagesText->update unless $noUpdateFlag; - } + my ($linesNb) = split(/\./, $messagesText->index('end')); + $linesNb--; + #print "linesNb=$linesNb\n"; + if ($linesNb > $history) { + $deletedNumber += 1; + if ($deletedNumber == 1) { + $messagesDeletedLabel->configure(-foreground => 'red'); + $messagesDeletedValue->configure(-foreground => 'red'); + } + } else { + &loadMessage($sender, $message, $time); + $messagesText->update unless $noUpdateFlag; + } } } # end updateMessages @@ -1477,8 +1486,8 @@ sub afterUpdatingMessages { sub highlightString { my ($i1, $i2) = @_; $focusedtext->tagConfigure('found', - -background => 'sienna', - -foreground => 'ivory'); + -background => 'sienna', + -foreground => 'ivory'); $focusedtext->tagAdd('found', $i1, $i2); } # end highlightString @@ -1487,8 +1496,8 @@ sub highlightString { sub highlightStringOff { $focusedtext->tagDelete('found'); $focusedtext->tagConfigure('found', - -background => 'sienna', - -foreground => 'ivory'); + -background => 'sienna', + -foreground => 'ivory'); } # end highlightStringOff @@ -1503,17 +1512,17 @@ sub addBindingExpression { sub bindingNextExpression { - my $cursorIndex = $bindingsEntry->index('insert'); - $cursorIndex = -1 if $bindingsEntry->index('end') == $cursorIndex; - if ($bindHistoryIndex == -1 or $bindHistoryIndex == @bindHistory - 1 - or @bindHistory <= 1) { - &warning1($bindingsEntry); - } else { - $bindHistoryIndex++; - $bindingsEntry->delete(0, 'end'); - $bindingsEntry->insert(0, $bindHistory[$bindHistoryIndex]); - $bindingsEntry->icursor($cursorIndex) if $cursorIndex >= 0; - } + my $cursorIndex = $bindingsEntry->index('insert'); + $cursorIndex = -1 if $bindingsEntry->index('end') == $cursorIndex; + if ($bindHistoryIndex == -1 or $bindHistoryIndex == @bindHistory - 1 + or @bindHistory <= 1) { + &warning1($bindingsEntry); + } else { + $bindHistoryIndex++; + $bindingsEntry->delete(0, 'end'); + $bindingsEntry->insert(0, $bindHistory[$bindHistoryIndex]); + $bindingsEntry->icursor($cursorIndex) if $cursorIndex >= 0; + } } # end bindingNextExpression @@ -1522,16 +1531,16 @@ sub bindingPrevExpression { my $cursorIndex = $bindingsEntry->index('insert'); $cursorIndex = -1 if $bindingsEntry->index('end') == $cursorIndex; if ($bindHistoryIndex == 0 or @bindHistory <= 1) { - &warning1($bindingsEntry); + &warning1($bindingsEntry); } else { - if ($bindHistoryIndex == -1) { - $bindHistoryIndex = @bindHistory - 2; - } else { - $bindHistoryIndex--; - } - $bindingsEntry->delete(0, 'end'); - $bindingsEntry->insert(0, $bindHistory[$bindHistoryIndex]); - $bindingsEntry->icursor($cursorIndex) if $cursorIndex >= 0; + if ($bindHistoryIndex == -1) { + $bindHistoryIndex = @bindHistory - 2; + } else { + $bindHistoryIndex--; + } + $bindingsEntry->delete(0, 'end'); + $bindingsEntry->insert(0, $bindHistory[$bindHistoryIndex]); + $bindingsEntry->icursor($cursorIndex) if $cursorIndex >= 0; } } # end bindingPrevExpression @@ -1547,13 +1556,13 @@ sub clearBinding { sub addBinding { my ($sender, $entry) = @_; unless ($entry) { - $entry = $bindingsEntry->get; - return unless $entry; + $entry = $bindingsEntry->get; + return unless $entry; } &bindHistoryGenList($entry); if ($effectivebindings{$entry}) { - &warning2($bindingsEntry); - return ; + &warning2($bindingsEntry); + return ; } $effectivebindingsList->insert('end', "bound to ".$entry); $effectivebindings{$entry} = 1; @@ -1575,8 +1584,8 @@ sub addBindingInList { my $index = 0; my $i = 0; for (sort @content) { - $index = $i if $_ eq $entry; - $i++; + $index = $i if $_ eq $entry; + $i++; } $bindingsList->insert($index, $entry); &bindingsGenList; @@ -1613,29 +1622,29 @@ sub newBinding { my @expr; my $msgsnum = 1; while ($msg =~ /\((.*?\|.*?)\)/g) { - push(@expr, $1); - $msgsnum *= split(/\|/, $1); + push(@expr, $1); + $msgsnum *= split(/\|/, $1); } my @msgs; for (my $i=0; $i < $msgsnum; $i++) { - push(@msgs, $msg); + push(@msgs, $msg); } if ($msgsnum > 1) { - for my $expr (@expr) { - my (@field) = split(/\|/, $expr); - my $j = 0; - for (my $i=0; $i < @msgs; $i++) { - my $qmexpr = quotemeta($expr); - $msgs[$i] =~ s/\($qmexpr\)/$field[$j]/; - $j++; - $j = 0 if $j == @field; - } - } - for (@msgs) { - &addMsgToSend(undef, $_); - } + for my $expr (@expr) { + my (@field) = split(/\|/, $expr); + my $j = 0; + for (my $i=0; $i < @msgs; $i++) { + my $qmexpr = quotemeta($expr); + $msgs[$i] =~ s/\($qmexpr\)/$field[$j]/; + $j++; + $j = 0 if $j == @field; + } + } + for (@msgs) { + &addMsgToSend(undef, $_); + } } else { - &addMsgToSend(undef, $msg); + &addMsgToSend(undef, $msg); } } # end newBinding @@ -1670,13 +1679,13 @@ sub bindingsGenList { my $i = 0; my $found = 0; for (keys %bindingsIndex) { - delete $bindingsIndex{$_}; - delete $bindings{$_}; + delete $bindingsIndex{$_}; + delete $bindings{$_}; } for ($bindingsList->get(0, 'end')) { - $found = 1; - $bindingsIndex{$_} = $i++; - $bindings{$_} = 1 + $found = 1; + $bindingsIndex{$_} = $i++; + $bindings{$_} = 1 } $bindingsFlag = $found; @@ -1699,13 +1708,13 @@ sub sendNextExpression { my $cursorIndex = $sendEntry->index('insert'); $cursorIndex = -1 if $sendEntry->index('end') == $cursorIndex; if ($sendHistoryIndex == -1 or $sendHistoryIndex == @sendHistory - 1 - or @sendHistory <= 1) { - &warning1($sendEntry); + or @sendHistory <= 1) { + &warning1($sendEntry); } else { - $sendHistoryIndex++; - $sendEntry->delete(0, 'end'); - $sendEntry->insert(0, $sendHistory[$sendHistoryIndex]); - $sendEntry->icursor($cursorIndex) if $cursorIndex >= 0; + $sendHistoryIndex++; + $sendEntry->delete(0, 'end'); + $sendEntry->insert(0, $sendHistory[$sendHistoryIndex]); + $sendEntry->icursor($cursorIndex) if $cursorIndex >= 0; } } # end sendNextExpression @@ -1715,16 +1724,16 @@ sub sendPrevExpression { my $cursorIndex = $sendEntry->index('insert'); $cursorIndex = -1 if $sendEntry->index('end') == $cursorIndex; if ($sendHistoryIndex == 0 or @sendHistory <= 1) { - &warning1($sendEntry); + &warning1($sendEntry); } else { - if ($sendHistoryIndex == -1) { - $sendHistoryIndex = @sendHistory - 2; - } else { - $sendHistoryIndex--; - } - $sendEntry->delete(0, 'end'); - $sendEntry->insert(0, $sendHistory[$sendHistoryIndex]); - $sendEntry->icursor($cursorIndex) if $cursorIndex >= 0; + if ($sendHistoryIndex == -1) { + $sendHistoryIndex = @sendHistory - 2; + } else { + $sendHistoryIndex--; + } + $sendEntry->delete(0, 'end'); + $sendEntry->insert(0, $sendHistory[$sendHistoryIndex]); + $sendEntry->icursor($cursorIndex) if $cursorIndex >= 0; } } # end sendPrevExpression @@ -1733,8 +1742,8 @@ sub sendPrevExpression { sub addMsgToSend { my ($sender, $entry, $sendFlag) = @_; unless ($entry) { - $entry = $sendEntry->get; - return unless $entry; + $entry = $sendEntry->get; + return unless $entry; } &sendMsg($entry) if $sendFlag; &warning3($sendEntry); @@ -1745,8 +1754,8 @@ sub addMsgToSend { my $index = 0; my $i = 0; for (sort @content) { - $index = $i if $_ eq $entry; - $i++; + $index = $i if $_ eq $entry; + $i++; } $sendList->insert($index, $entry); &sendGenList; @@ -1785,13 +1794,13 @@ sub sendGenList { my $i = 0; my $found = 0; for (keys %msgToSendIndex) { - delete $msgToSendIndex{$_}; - delete $msgToSend{$_}; + delete $msgToSendIndex{$_}; + delete $msgToSend{$_}; } for ($sendList->get(0, 'end')) { - $found = 1; - $msgToSendIndex{$_} = $i++; - $msgToSend{$_} = 1 + $found = 1; + $msgToSendIndex{$_} = $i++; + $msgToSend{$_} = 1 } $msgToSendFlag = $found; @@ -1824,13 +1833,13 @@ sub clockstop { sub clockswitch { if ($clockbackwardflag == 1) { - &sendMsg("ClockBackward"); - $clockbackCheckbutton->configure(-foreground => 'maroon', - -activeforeground => 'maroon'); + &sendMsg("ClockBackward"); + $clockbackCheckbutton->configure(-foreground => 'maroon', + -activeforeground => 'maroon'); } else { - &sendMsg("ClockForward"); - $clockbackCheckbutton->configure(-foreground => 'black', - -activeforeground => 'black'); + &sendMsg("ClockForward"); + $clockbackCheckbutton->configure(-foreground => 'black', + -activeforeground => 'black'); } } # end clockswitch @@ -1843,13 +1852,13 @@ sub searchNextExpression { my $cursorIndex = $searchEntry->index('insert'); $cursorIndex = -1 if $searchEntry->index('end') == $cursorIndex; if ($searchHistoryIndex == -1 or $searchHistoryIndex == @searchHistory - 1 - or @searchHistory <= 1) { - &warning1($searchEntry); + or @searchHistory <= 1) { + &warning1($searchEntry); } else { - $searchHistoryIndex++; - $searchEntry->delete(0, 'end'); - $searchEntry->insert(0, $searchHistory[$searchHistoryIndex]); - $searchEntry->icursor($cursorIndex) if $cursorIndex >= 0; + $searchHistoryIndex++; + $searchEntry->delete(0, 'end'); + $searchEntry->insert(0, $searchHistory[$searchHistoryIndex]); + $searchEntry->icursor($cursorIndex) if $cursorIndex >= 0; } } # end searchNextExpression @@ -1859,16 +1868,16 @@ sub searchPrevExpression { my $cursorIndex = $searchEntry->index('insert'); $cursorIndex = -1 if $searchEntry->index('end') == $cursorIndex; if ($searchHistoryIndex == 0 or @searchHistory <= 1) { - &warning1($searchEntry); + &warning1($searchEntry); } else { - if ($searchHistoryIndex == -1) { - $searchHistoryIndex = @searchHistory - 2; - } else { - $searchHistoryIndex--; - } - $searchEntry->delete(0, 'end'); - $searchEntry->insert(0, $searchHistory[$searchHistoryIndex]); - $searchEntry->icursor($cursorIndex) if $cursorIndex >= 0; + if ($searchHistoryIndex == -1) { + $searchHistoryIndex = @searchHistory - 2; + } else { + $searchHistoryIndex--; + } + $searchEntry->delete(0, 'end'); + $searchEntry->insert(0, $searchHistory[$searchHistoryIndex]); + $searchEntry->icursor($cursorIndex) if $cursorIndex >= 0; } } # end searchPrevExpression @@ -1898,13 +1907,13 @@ sub searchOnTheFly { #print "string=$string\n"; my $index0; if ($searchString) { - if ($string ne $searchString) { - $index0 = $searchIndex; - } else { - return; - } + if ($string ne $searchString) { + $index0 = $searchIndex; + } else { + return; + } } else { - $index0 = '0.0'; + $index0 = '0.0'; } &highlightStringOff; my @searchopts = (-hidden, -count => \$strlen, -forwards); @@ -1913,13 +1922,13 @@ sub searchOnTheFly { my $index = $focusedtext->search(@searchopts, $string, $index0); #print "index=$index strlen=$strlen\n"; if ($index) { - &highlightStringOff if $searchString and $string eq $searchString; - $searchString = $focusedtext->get($index, "$index + $strlen chars"); - $searchIndex = $index; - &highlightString($index, "$index + $strlen chars"); - $focusedtext->see($index); + &highlightStringOff if $searchString and $string eq $searchString; + $searchString = $focusedtext->get($index, "$index + $strlen chars"); + $searchIndex = $index; + &highlightString($index, "$index + $strlen chars"); + $focusedtext->see($index); } else { - &warning2($focusedtext); + &warning2($focusedtext); } } # end searchOnTheFly @@ -1936,14 +1945,14 @@ sub searchNext { #print "index=$index searchIndex=$searchIndex strlen=$strlen\n"; &highlightStringOff; if ($index) { - &highlightString($index, "$index + $strlen chars"); - $focusedtext->see($index); - &warning1($focusedtext) if defined($searchIndex) and - $focusedtext->compare($index, "<=" ,$searchIndex); - $searchString = $focusedtext->get($index, "$index + $strlen chars"); - $searchIndex = $index; + &highlightString($index, "$index + $strlen chars"); + $focusedtext->see($index); + &warning1($focusedtext) if defined($searchIndex) and + $focusedtext->compare($index, "<=" ,$searchIndex); + $searchString = $focusedtext->get($index, "$index + $strlen chars"); + $searchIndex = $index; } else { - &warning2($focusedtext); + &warning2($focusedtext); } $searchHistoryIndex = -1; &searchHistoryGenList($string); @@ -1963,14 +1972,14 @@ sub searchPrev { my $index = $focusedtext->search(@searchopts, $string, $index0); &highlightStringOff; if ($index) { - &highlightString($index, "$index + $strlen chars"); - $focusedtext->see($index); - &warning1($focusedtext) if defined($searchIndex) and - $focusedtext->compare($index, ">=" ,$searchIndex); - $searchString = $focusedtext->get($index, "$index + $strlen chars"); - $searchIndex = $index; + &highlightString($index, "$index + $strlen chars"); + $focusedtext->see($index); + &warning1($focusedtext) if defined($searchIndex) and + $focusedtext->compare($index, ">=" ,$searchIndex); + $searchString = $focusedtext->get($index, "$index + $strlen chars"); + $searchIndex = $index; } else { - &warning2($focusedtext); + &warning2($focusedtext); } $searchHistoryIndex = -1; &searchHistoryGenList($string); @@ -1984,8 +1993,8 @@ sub searchAll { my $strlen; return unless $string; $focusedtext->tagConfigure('found', - -background => 'sienna', - -foreground => 'ivory'); + -background => 'sienna', + -foreground => 'ivory'); my $index = '0.0'; my $found = 0; my @searchopts = (-hidden, -count => \$strlen, -forwards); @@ -1993,11 +2002,11 @@ sub searchAll { push(@searchopts, -regexp) if ($regexpflag); while ($index) { - $index = $focusedtext->search(@searchopts, $string, $index, 'end'); - last unless $index; - $focusedtext->tagAdd('found', $index, "$index + $strlen chars"); - $index = "$index + 1 chars"; - $found++; + $index = $focusedtext->search(@searchopts, $string, $index, 'end'); + last unless $index; + $focusedtext->tagAdd('found', $index, "$index + $strlen chars"); + $index = "$index + 1 chars"; + $found++; } &warning2($focusedtext) unless ($found); $searchHistoryIndex = -1; @@ -2012,14 +2021,14 @@ sub searchAll { #---------------------------------------------------------------------------------- sub bye { if ($messagesNumber > 0) { - my $diag = $mw->Dialog(-text => - "Really quit Ivymon ?", - -default_button => 'OK', - -buttons => [qw(OK Cancel)]); - my $answer = $diag->Show; - if ($answer eq 'Cancel') { - return; - } + my $diag = $mw->Dialog(-text => + "Really quit Ivymon ?", + -default_button => 'OK', + -buttons => [qw(OK Cancel)]); + my $answer = $diag->Show; + if ($answer eq 'Cancel') { + return; + } } &quit; } @@ -2028,10 +2037,10 @@ sub jump { my @markers = $messagesText->markNames; my @markers2; for (@markers) { - push(@markers2, $_) if (/^ivymon/); + push(@markers2, $_) if (/^ivymon/); } if (@markers2 < $jump_cnt + 1) { - $jump_cnt = 0; + $jump_cnt = 0; } $messagesText->yview($markers2[$jump_cnt]); $jump_cnt++; @@ -2052,7 +2061,7 @@ sub stop { sub start { my $flag = shift; if ($messagesText->index('insert') !~ /\.0$/) { - $messagesText->insert('insert', "\n"); + $messagesText->insert('insert', "\n"); } # disable other buttons @@ -2068,8 +2077,8 @@ sub start { $noUpdateFlag = 1; &beforeUpdatingMessages; for my $msg (@messagesbuffer) { - &updateMessages($msg->[0], $msg->[1], $msg->[2]); - $bufNumber--; + &updateMessages($msg->[0], $msg->[1], $msg->[2]); + $bufNumber--; } &afterUpdatingMessages; $noUpdateFlag = 0; @@ -2087,14 +2096,14 @@ sub start { sub clear { if ($messagesNumber > 0) { - my $diag = $mw->Dialog(-text => - "Do you really want to remove displayed messages ?", - -default_button => 'OK', - -buttons => [qw(OK Cancel)]); - my $answer = $diag->Show; - if ($answer eq 'Cancel') { - return; - } + my $diag = $mw->Dialog(-text => + "Do you really want to remove displayed messages ?", + -default_button => 'OK', + -buttons => [qw(OK Cancel)]); + my $answer = $diag->Show; + if ($answer eq 'Cancel') { + return; + } } # disable other buttons @@ -2114,8 +2123,8 @@ sub clear { $recordedNumber = 0; #$messagesText->delete('1.0', 'end'); while ($messagesText->compare($messagesText->index('end'), ">", "2.0")) { - $messagesText->delete('1.0', '1000.0'); - my $index = $messagesText->index('end'); + $messagesText->delete('1.0', '1000.0'); + my $index = $messagesText->index('end'); } $messagesText->configure(-state => 'disabled'); @@ -2135,34 +2144,34 @@ sub clear { sub loadfile { my $file = $mw->getOpenFile(-filetypes => [['Ivy Files', '.ivy'], - ['All Files', '*']], - ); + ['All Files', '*']], + ); return unless $file; # open file unless (open(IN, "$file")) { - $mw->Tk::Error("$!\n"); - return; + $mw->Tk::Error("$!\n"); + return; } my $loadingmode = 'display'; &showProgressbar(); my ($step, $timefound) = &stepsnumber(); if ($timefound) { - $loadingmode = &selectLoadingMode(); - if ($loadingmode eq 'replay') { - &loadfileForReplay($step); - } else { - &loadfileForDisplay($step); - } + $loadingmode = &selectLoadingMode(); + if ($loadingmode eq 'replay') { + &loadfileForReplay($step); + } else { + &loadfileForDisplay($step); + } } else { - &loadfileForDisplay($step); + &loadfileForDisplay($step); } &hideProgressbar(); close(IN); } # end loadfile -#______ + sub stepsnumber { my $step = 0; @@ -2196,25 +2205,25 @@ sub loadfileForDisplay { my $step = shift; if ($messagesNumber > 0) { - my $diag = $mw->Dialog(-text => - "Some Ivy messages are already displayed. ". - "If you continue, loaded messages will ". - "be appended without distinction.\n", - -default_button => 'Continue', - -buttons => [qw(Continue Cancel)]); - my $answer = $diag->Show; - if ($answer eq 'Cancel') { - return; - } + my $diag = $mw->Dialog(-text => + "Some Ivy messages are already displayed. ". + "If you continue, loaded messages will ". + "be appended without distinction.\n", + -default_button => 'Continue', + -buttons => [qw(Continue Cancel)]); + my $answer = $diag->Show; + if ($answer eq 'Cancel') { + return; + } } # set load flags... $loadedFileFlag = 1; $loadingFlag = 1; $balloonhelp->attach($messagesMaxLabel, -balloonmsg => - "No history limit when file is loaded"); + "No history limit when file is loaded"); $balloonhelp->attach($messagesDeletedLabel, -balloonmsg => - "Messages deletion is deactivated when file is loaded"); + "Messages deletion is deactivated when file is loaded"); $messagesDeletedLabel->configure(-foreground => 'gray60'); $messagesDeletedValue->configure(-foreground => 'gray60'); @@ -2236,33 +2245,33 @@ sub loadfileForDisplay { $noUpdateFlag = 1; &beforeUpdatingMessages; while(<IN>) { - chomp; - if (/^applications=/ or /^messages_number=/) { - next; - } elsif (/^\s*$/) { - next; - $line++; - } elsif (/^(marker\d+)$/) { - my $index = $messagesText->index('current linestart'); - &addmarker($index, $1); - } else { - my ($sender, $message) = split(/ /, $_, 2); - my $time = undef; - if ($message =~ /^(\d+)\s+(.*)/) { - $time = $1; - $message = $2; - } - unless ($client{$sender}) { - $client{$sender} = 1; - $clientsListbox->insert('end', $sender); - } - $messagesNumber++; - $line++; - #$message =~ s/^\"(.*)\"$/$1/; - &loadMessage($sender, $message, $time); - #print "sender=$sender message=$message step=$step line=$line\n"; - &setProgressbar($line, $step); - } + chomp; + if (/^applications=/ or /^messages_number=/) { + next; + } elsif (/^\s*$/) { + next; + $line++; + } elsif (/^(marker\d+)$/) { + my $index = $messagesText->index('current linestart'); + &addmarker($index, $1); + } else { + my ($sender, $message) = split(/ /, $_, 2); + my $time = undef; + if ($message =~ /^(\d+)\s+(.*)/) { + $time = $1; + $message = $2; + } + unless ($client{$sender}) { + $client{$sender} = 1; + $clientsListbox->insert('end', $sender); + } + $messagesNumber++; + $line++; + #$message =~ s/^\"(.*)\"$/$1/; + &loadMessage($sender, $message, $time); + #print "sender=$sender message=$message step=$step line=$line\n"; + &setProgressbar($line, $step); + } } &afterUpdatingMessages; $noUpdateFlag = 0; @@ -2292,13 +2301,13 @@ sub loadfileForReplay { $replay_tpl->title("Replay mode"); my $ctrl_fm = $replay_tpl->Frame()->pack(-side => 'bottom', -pady => 5); $replay_text = $replay_tpl->Scrolled('Text', - -scrollbars => 'e', - -spacing1 => 2, - -spacing2 => 0, - -spacing3 => 2, - )->pack(-fill => 'both', - -expand => 1, - -side => 'bottom'); + -scrollbars => 'e', + -spacing1 => 2, + -spacing2 => 0, + -spacing3 => 2, + )->pack(-fill => 'both', + -expand => 1, + -side => 'bottom'); # colors $replay_bg_orig = $replay_text->cget(-background); $replay_fg_orig = $replay_text->cget(-foreground); @@ -2307,101 +2316,101 @@ sub loadfileForReplay { my $realspeedrate = 1; my $ctrl_fm1 = $ctrl_fm->Frame()->pack(-side => 'left', -padx => 10); $ctrl_fm1->Radiobutton(-text => "x0.1", -indicatoron => 0, - -height => 2, - -width => 4, - -value => 0.1, - -variable => \$replay_speed, - -command => sub { $realspeedrate = 0 }, - -selectcolor => 'white')->pack(-side => 'left'); + -height => 2, + -width => 4, + -value => 0.1, + -variable => \$replay_speed, + -command => sub { $realspeedrate = 0 }, + -selectcolor => 'white')->pack(-side => 'left'); $ctrl_fm1->Radiobutton(-text => "x0.5", -indicatoron => 0, - -height => 2, - -width => 4, - -value => 0.5, - -variable => \$replay_speed, - -command => sub { $realspeedrate = 0 }, - -selectcolor => 'white')->pack(-side => 'left'); + -height => 2, + -width => 4, + -value => 0.5, + -variable => \$replay_speed, + -command => sub { $realspeedrate = 0 }, + -selectcolor => 'white')->pack(-side => 'left'); $ctrl_fm1->Radiobutton(-text => "x1", -indicatoron => 0, - -height => 2, - -width => 4, - -value => 1, - -variable => \$replay_speed, - -command => sub { - return if $realspeedrate == 1; - $realspeedrate = 1; - $replay_data_t0 = $replay_time; - $replay_current_t0 = gettimeofday(); - if ($replay_running == 0) { - $replay_pause_t = $replay_current_t0; - } else { - $replay_pause_t = undef; - } - $replay_pause_duration = 0; - }, - -selectcolor => 'white')->pack(-side => 'left'); + -height => 2, + -width => 4, + -value => 1, + -variable => \$replay_speed, + -command => sub { + return if $realspeedrate == 1; + $realspeedrate = 1; + $replay_data_t0 = $replay_time; + $replay_current_t0 = gettimeofday(); + if ($replay_running == 0) { + $replay_pause_t = $replay_current_t0; + } else { + $replay_pause_t = undef; + } + $replay_pause_duration = 0; + }, + -selectcolor => 'white')->pack(-side => 'left'); $ctrl_fm1->Radiobutton(-text => "x2", -indicatoron => 0, - -height => 2, - -width => 4, - -value => 2, - -variable => \$replay_speed, - -command => sub { $realspeedrate = 0 }, - -selectcolor => 'white')->pack(-side => 'left'); + -height => 2, + -width => 4, + -value => 2, + -variable => \$replay_speed, + -command => sub { $realspeedrate = 0 }, + -selectcolor => 'white')->pack(-side => 'left'); $ctrl_fm1->Radiobutton(-text => "x5", -indicatoron => 0, - -height => 2, - -width => 4, - -value => 5, - -variable => \$replay_speed, - -command => sub { $realspeedrate = 0 }, - -selectcolor => 'white')->pack(-side => 'left'); + -height => 2, + -width => 4, + -value => 5, + -variable => \$replay_speed, + -command => sub { $realspeedrate = 0 }, + -selectcolor => 'white')->pack(-side => 'left'); $ctrl_fm1->Radiobutton(-text => "x10", -indicatoron => 0, - -height => 2, - -width => 4, - -value => 10, - -variable => \$replay_speed, - -command => sub { $realspeedrate = 0 }, - -selectcolor => 'white')->pack(-side => 'left'); + -height => 2, + -width => 4, + -value => 10, + -variable => \$replay_speed, + -command => sub { $realspeedrate = 0 }, + -selectcolor => 'white')->pack(-side => 'left'); # build hour label my $ctrl_fm2 = $ctrl_fm->Frame()->pack(-side => 'left', -padx => 10); my $hour_lab = $ctrl_fm2->Label(-borderwidth => 1, -relief => 'ridge', - -height => 2, - -width => ($replay_time_decimalplaces > 0) ? - 10 + $replay_time_decimalplaces : 9, - -textvariable => \$replay_hour, - )->pack(-side => 'left'); + -height => 2, + -width => ($replay_time_decimalplaces > 0) ? + 10 + $replay_time_decimalplaces : 9, + -textvariable => \$replay_hour, + )->pack(-side => 'left'); # build control buttons my $ctrl_fm3 = $ctrl_fm->Frame()->pack(-side => 'left', -padx => 10); $ctrl_fm3->Radiobutton(-text => "Play", -indicatoron => 0, - -width => 6, - -height => 2, - -value => 0, - -command => \&replayStart, - -variable => \$replay_runnable, - -selectcolor => 'white')->pack(-side => 'left'); + -width => 6, + -height => 2, + -value => 0, + -command => \&replayStart, + -variable => \$replay_runnable, + -selectcolor => 'white')->pack(-side => 'left'); $ctrl_fm3->Radiobutton(-text => "Pause", -indicatoron => 0, - -width => 6, - -height => 2, - -value => 1, - -command => \&replayStop, - -variable => \$replay_runnable, - -selectcolor => 'white')->pack(-side => 'left'); + -width => 6, + -height => 2, + -value => 1, + -command => \&replayStop, + -variable => \$replay_runnable, + -selectcolor => 'white')->pack(-side => 'left'); # build loop and step by step checkbuttons my $ctrl_fm4 = $ctrl_fm->Frame(-relief => 'ridge', -borderwidth => 1 - )->pack(-side => 'left', -padx => 10, -fill => 'y', - -expand => 1); + )->pack(-side => 'left', -padx => 10, -fill => 'y', + -expand => 1); $ctrl_fm4->Checkbutton(-text => "Repeat", - -variable => \$replay_repeat, - )->pack(-side => 'left'); + -variable => \$replay_repeat, + )->pack(-side => 'left'); $ctrl_fm4->Checkbutton(-text => "Step by\nstep", - -variable => \$replay_stepbystep, - -command => \&replayStop, - )->pack(-side => 'left', -padx => 10); + -variable => \$replay_stepbystep, + -command => \&replayStop, + )->pack(-side => 'left', -padx => 10); # build close button $ctrl_fm->Button(-text => "Close", - -command => \&replayClose, - -height => 1)->pack(-side => 'left', -padx => 10, -fill => 'y', - -expand => 1); + -command => \&replayClose, + -height => 1)->pack(-side => 'left', -padx => 10, -fill => 'y', + -expand => 1); $replay_tpl->update; $replay_tpl->minsize($replay_tpl->width, $replay_tpl->height); @@ -2409,52 +2418,52 @@ sub loadfileForReplay { # display messsages to replay my ($sender, $time, $message); while(<IN>) { - chomp; - next if /^\#/ or /^applications=/ or /^messages_number=/ - or /^\s*$/ or /^(marker\d+)$/; - ($sender, $time, $message) = split(/\s+/, $_, 3); - if ($replay_time_granularity >= 1) { - $time = int($time); - } else { - $time = sprintf("%.".$replay_time_decimalplaces."f", $time); - } - if (defined $replay_max_time) { - $replay_max_time = $time if $time > $replay_max_time; - } else { - $replay_max_time = $time; - } - if (defined $replay_min_time) { - $replay_min_time = $time if $time < $replay_min_time; - } else { - $replay_min_time = $time; - } - $line++; - $message =~ s/^\"//; - $message =~ s/\"$//; - push(@{$replay_msg{$time}}, $message); - $replay_text->insert('end', &replayTime($time)." ".$message."\n", $time); - # when user click on a message, the begin time changes. - $replay_text->tagBind($time, '<1>', [sub { - my $ti = $_[1]; - my $replay_was_running; - if ($replay_running) { - $replay_was_running = 1; - &replayStop; - } - my $fg = $replay_text->tagCget($ti, -foreground); - my $bg = $replay_text->tagCget($ti, -background); - $replay_text->tagConfigure($_[1], -foreground => 'white', - -background => 'gray50'); - $replay_hour = &replayTime($ti); - $replay_time = $ti; - $replay_text->after(100, [sub { - $replay_text->tagConfigure($_[0], - -foreground => $fg, - -background => $bg); - }, $ti]); - &replayStart if $replay_was_running; - }, $time]); - &setProgressbar($line, $step); + chomp; + next if /^\#/ or /^applications=/ or /^messages_number=/ + or /^\s*$/ or /^(marker\d+)$/; + ($sender, $time, $message) = split(/\s+/, $_, 3); + if ($replay_time_granularity >= 1) { + $time = int($time); + } else { + $time = sprintf("%.".$replay_time_decimalplaces."f", $time); + } + if (defined $replay_max_time) { + $replay_max_time = $time if $time > $replay_max_time; + } else { + $replay_max_time = $time; + } + if (defined $replay_min_time) { + $replay_min_time = $time if $time < $replay_min_time; + } else { + $replay_min_time = $time; + } + $line++; + $message =~ s/^\"//; + $message =~ s/\"$//; + push(@{$replay_msg{$time}}, $message); + $replay_text->insert('end', &replayTime($time)." ".$message."\n", $time); + # when user click on a message, the begin time changes. + $replay_text->tagBind($time, '<1>', [sub { + my $ti = $_[1]; + my $replay_was_running; + if ($replay_running) { + $replay_was_running = 1; + &replayStop; + } + my $fg = $replay_text->tagCget($ti, -foreground); + my $bg = $replay_text->tagCget($ti, -background); + $replay_text->tagConfigure($_[1], -foreground => 'white', + -background => 'gray50'); + $replay_hour = &replayTime($ti); + $replay_time = $ti; + $replay_text->after(100, [sub { + $replay_text->tagConfigure($_[0], + -foreground => $fg, + -background => $bg); + }, $ti]); + &replayStart if $replay_was_running; + }, $time]); + &setProgressbar($line, $step); } $replay_tpl->raise; $replay_time = $replay_min_time; @@ -2465,9 +2474,9 @@ sub loadfileForReplay { # baloon help $balloonhelp->attach($replay_text, -balloonmsg => - "Select an item in the list to\n". - "modify the begin time of replay" - ); + "Select an item in the list to\n". + "modify the begin time of replay" + ); } # end loadfileForReplay @@ -2475,16 +2484,16 @@ sub loadfileForReplay { sub selectLoadingMode { my $diag = $mw->Dialog(-text => - "The selected file contains time informations. ". - "Do you want to replay the recorded messages or ". - "just display them?", - -default_button => 'Just display', - -buttons => ['Replay', 'Just display']); + "The selected file contains time informations. ". + "Do you want to replay the recorded messages or ". + "just display them?", + -default_button => 'Just display', + -buttons => ['Replay', 'Just display']); my $answer = $diag->Show; if ($answer eq 'Replay') { - return 'replay'; + return 'replay'; } else { - return 'display'; + return 'display'; } } # end selectLoadingMode @@ -2495,11 +2504,11 @@ sub savefile { $y =~ s/^\d// if $y >= 100; $m++; my $default = (defined $outputfile) ? $outputfile : - sprintf("ivylog%02s%02s%02s_%02s:%02s.ivy", $d, $m, $y, $h, $M); + sprintf("ivylog%02s%02s%02s_%02s:%02s.ivy", $d, $m, $y, $h, $M); my $file = $mw->getSaveFile(-initialfile => $default, - -filetypes => [['Ivy Files', '.ivy'], - ['All Files', '*']], - ); + -filetypes => [['Ivy Files', '.ivy'], + ['All Files', '*']], + ); return unless $file; $outputfile = $file; &showProgressbar(); @@ -2516,21 +2525,21 @@ sub savefile { $mw->update; my $restorestate = sub { - &hideProgressbar(); - # restore other buttons state - $loadButton->configure(-state => 'normal'); - $saveButton->configure(-state => 'normal'); - $jumpButton->configure(-state => $jumpstate); - $clearButton->configure(-state => 'normal'); - $startButton->configure(-state => $startstate); - $stopButton->configure(-state => $stopstate); + &hideProgressbar(); + # restore other buttons state + $loadButton->configure(-state => 'normal'); + $saveButton->configure(-state => 'normal'); + $jumpButton->configure(-state => $jumpstate); + $clearButton->configure(-state => 'normal'); + $startButton->configure(-state => $startstate); + $stopButton->configure(-state => $stopstate); }; my $status = 0; if (&save < 0) { - $mw->Tk::Error("$!\n"); - &$restorestate; - return; + $mw->Tk::Error("$!\n"); + &$restorestate; + return; } close(OUT); &$restorestate; @@ -2544,22 +2553,22 @@ sub openfile { $file = $opt_out unless defined $file; return 0 unless defined $file; if (open(OUT, ">$file")) { - return 1; + return 1; } else { - close(OUT); - $mw->Tk::messageBox(-icon => "warning", - -message => - "Can't write to file $file ($!). ". - "Save data in ivymon-rescue.ivy", - -type => 'OK', - ); - if (open(OUT, ">ivymon-rescue.ivy")) { - return 1; - } else { - close(OUT); - $mw->Tk::Error("Can't write to output file ($!)"); - return -1; - } + close(OUT); + $mw->Tk::messageBox(-icon => "warning", + -message => + "Can't write to file $file ($!). ". + "Save data in ivymon-rescue.ivy", + -type => 'OK', + ); + if (open(OUT, ">ivymon-rescue.ivy")) { + return 1; + } else { + close(OUT); + $mw->Tk::Error("Can't write to output file ($!)"); + return -1; + } } } # sub openfile @@ -2590,17 +2599,17 @@ sub save { my $index = "1.0"; my $counter = 0; while(1) { - my $messages = $messagesText->get($index, "$index + 100 lines"); - $index = "$index + 100 lines"; - unless ($messages) { - &setProgressbar($nblines); - $progressbar->update; - last; - } - print OUT $messages or return -1; - &setProgressbar($counter); - $counter += 100; - $progressbar->update if ($step == 0 or $counter % $step == 0); + my $messages = $messagesText->get($index, "$index + 100 lines"); + $index = "$index + 100 lines"; + unless ($messages) { + &setProgressbar($nblines); + $progressbar->update; + last; + } + print OUT $messages or return -1; + &setProgressbar($counter); + $counter += 100; + $progressbar->update if ($step == 0 or $counter % $step == 0); } &setProgressbar(0); $mw->after(300, sub {$tpl->destroy;}); @@ -2707,19 +2716,22 @@ sub replayStart { # if speed rate != 1, time regulation is deactivated if ($replay_speed != 1) { $replay_current_factor = $replay_factor; - print "replay_speed=$replay_speed => time regulation deactivated\n" if $opt_debug; + print "replay_speed=$replay_speed => time regulation deactivated\n" + if $opt_debug; # if replay is running behind schedule - } elsif ($dt > $data_dt + $replay_maxgap and $replay_current_factor <= $replay_factor) { + } elsif ($dt > $data_dt + $replay_maxgap and + $replay_current_factor <= $replay_factor) { $replay_current_factor *= (1 - $replay_regulpct->[0]/100); - print "data_dt=$data_dt dt=$dt2 delay=$d [--] replay_factor=$replay_current_factor\n" - if $opt_debug; + print "data_dt=$data_dt dt=$dt2 delay=$d [--] ". + "replay_factor=$replay_current_factor\n" if $opt_debug; # if replay is getting ahead of schedule - } elsif ($dt < $data_dt - $replay_maxgap and $replay_current_factor >= $replay_factor) { + } elsif ($dt < $data_dt - $replay_maxgap and + $replay_current_factor >= $replay_factor) { $replay_current_factor *= (1 + $replay_regulpct->[1]/100); - print "data_dt=$data_dt dt=$dt2 delay=$d [++] replay_factor=$replay_current_factor\n" - if $opt_debug; + print "data_dt=$data_dt dt=$dt2 delay=$d [++] ". + "replay_factor=$replay_current_factor\n" if $opt_debug; # if replay is on time } else { @@ -2760,18 +2772,18 @@ sub replayTime { my $time = shift; if (defined $time) { - my ($s, $m, $h) = localtime($time); - if ($replay_time_decimalplaces > 0) { - my $dec = - substr($time, -$replay_time_decimalplaces, $replay_time_decimalplaces); - return sprintf("%02d:%02d:%02d.%s", $h, $m, $s, $dec); - } else { - return sprintf("%02d:%02d:%02d", $h, $m, $s); - } + my ($s, $m, $h) = localtime($time); + if ($replay_time_decimalplaces > 0) { + my $dec = + substr($time, -$replay_time_decimalplaces, $replay_time_decimalplaces); + return sprintf("%02d:%02d:%02d.%s", $h, $m, $s, $dec); + } else { + return sprintf("%02d:%02d:%02d", $h, $m, $s); + } } elsif ($replay_time_decimalplaces > 0) { - return "--:--:--."."-" x $replay_time_decimalplaces; + return "--:--:--."."-" x $replay_time_decimalplaces; } else { - return "--:--:--"; + return "--:--:--"; } } # end replayTime @@ -2828,79 +2840,79 @@ sub findExprInList { my @elems = $list->get(0, "end"); # if key is Tab if ($key eq 'Tab') { - my $index = 0; - my @found; - my $elem; - my $qmexpr = quotemeta($expr); - for $elem (sort @elems) { - #print "qmexpr=$qmexpr qmelem=",quotemeta($elem),"\n"; - if ($expr and $elem =~ /^$qmexpr/) { - push (@found, $index); - } - $index++; - } - # no expression found - if (@found == 0) { - &warning2($entry); - my @cursel = $list->curselection; - $list->selectionClear(@cursel) if @cursel > 0; - &findRvalue($entry, $expr); - # only one expression is found - } elsif (@found == 1) { - my @cursel = $list->curselection; - $list->selectionClear(@cursel) if @cursel > 0; - $list->selectionSet($found[0]); - $list->see($found[0]); - my $listexpr = $list->get($found[0]); - if ($listexpr ne $expr) { - $entry->delete(0, 'end'); - $entry->insert(0, scalar $list->get($found[0])); - } - &findRvalue($entry, $expr); - - # several expressions are found - } else { - &warning1($entry); - my $i = 0; - my $str = $list->get($found[0]); - my $commonstr; - for ($i=0; $i < length($str); $i++) { - my $char = substr($str, length($expr)+$i, 1); - my $j = 0; - while ($j < @found) { - last if substr(scalar $list->get($found[$j]), length($expr)+$i, 1) - ne $char; - $j++; - } - if ($j == @found) { - $commonstr = $commonstr.$char; - } else { - last; - } - } - $entry->insert('end', $commonstr); - } - - # if entry is empty and if key is not Tab (key is backspace) + my $index = 0; + my @found; + my $elem; + my $qmexpr = quotemeta($expr); + for $elem (sort @elems) { + #print "qmexpr=$qmexpr qmelem=",quotemeta($elem),"\n"; + if ($expr and $elem =~ /^$qmexpr/) { + push (@found, $index); + } + $index++; + } + # no expression found + if (@found == 0) { + &warning2($entry); + my @cursel = $list->curselection; + $list->selectionClear(@cursel) if @cursel > 0; + &findRvalue($entry, $expr); + # only one expression is found + } elsif (@found == 1) { + my @cursel = $list->curselection; + $list->selectionClear(@cursel) if @cursel > 0; + $list->selectionSet($found[0]); + $list->see($found[0]); + my $listexpr = $list->get($found[0]); + if ($listexpr ne $expr) { + $entry->delete(0, 'end'); + $entry->insert(0, scalar $list->get($found[0])); + } + &findRvalue($entry, $expr); + + # several expressions are found + } else { + &warning1($entry); + my $i = 0; + my $str = $list->get($found[0]); + my $commonstr; + for ($i=0; $i < length($str); $i++) { + my $char = substr($str, length($expr)+$i, 1); + my $j = 0; + while ($j < @found) { + last if substr(scalar $list->get($found[$j]), length($expr)+$i, 1) + ne $char; + $j++; + } + if ($j == @found) { + $commonstr = $commonstr.$char; + } else { + last; + } + } + $entry->insert('end', $commonstr); + } + + # if entry is empty and if key is not Tab (key is backspace) } elsif (not $expr) { - my @cursel = $list->curselection; - $list->selectionClear(@cursel) if @cursel > 0; - - # if entry is not empty and key is not Tab + my @cursel = $list->curselection; + $list->selectionClear(@cursel) if @cursel > 0; + + # if entry is not empty and key is not Tab } else { - my $index = 0; - for my $elem (sort @elems) { - my $qwexpr = quotemeta($expr); - if ($expr and $elem =~ /^$qwexpr/) { - my @cursel = $list->curselection; - $list->selectionClear(@cursel) if @cursel > 0; - $list->selectionSet($index); - $list->see($index); - #print "$elem\n"; - last; - } - $index++; - } + my $index = 0; + for my $elem (sort @elems) { + my $qwexpr = quotemeta($expr); + if ($expr and $elem =~ /^$qwexpr/) { + my @cursel = $list->curselection; + $list->selectionClear(@cursel) if @cursel > 0; + $list->selectionSet($index); + $list->see($index); + #print "$elem\n"; + last; + } + $index++; + } } } # end findExprInList @@ -2912,17 +2924,17 @@ sub findRvalue { my $cursorIndex = $entry->index('insert'); my $index = index($expr, '=', $cursorIndex); if ($index < 0) { - $index = index($expr, '='); + $index = index($expr, '='); } return if $index < 0; my $rvalue = substr($expr, $index+1); $entry->selectionClear; if ($rvalue =~ /(^\S+)/) { - $rvalue = $1; - # skip char ) at the end of string - $rvalue =~ s/\)$//; - $entry->selectionFrom($index+1); - $entry->selectionTo($index +1 + length($rvalue)); + $rvalue = $1; + # skip char ) at the end of string + $rvalue =~ s/\)$//; + $entry->selectionFrom($index+1); + $entry->selectionTo($index +1 + length($rvalue)); } $entry->icursor($index+1); $entry->xview($index-15); |