# Confederate Program # NOTE CHANGE FORMAT TIME TO AVOID TRUCATION at lines 345 and 346 # updated 2005.09.13 @ 10:11:04 AM use strict ; $, ='<-->' ; $\ ="\n" ; use Tk ; use Time::HiRes qw( gettimeofday usleep ); my ($directory_name, @received_characters, $num_recvd_chars, %stored_characters, $foldername, $insert_letter, $time ) ; my $version = '2.0.0' ; my ($mw, $Frame, $TopFrame, $BottomFrame, $logw) ; my $temp_char ; $mw = MainWindow -> new(-title => "Loebner Prize Comm Program version $version") ; $mw -> bind('' => sub{exit}) ; # my $mwX = $mw -> Toplevel ; my $foldername = $mw -> Tk::chooseDirectory(-title => "Choose Directory") ; # $mwX -> destroy ; $mw -> update ; chdir $foldername ; my $scrheight = $mw -> screenheight ; my $scrwidth = $mw -> screenwidth ; $scrwidth = $scrwidth/2 ; my $screensize = ($scrwidth).'x'.($scrheight-200). "+$scrwidth+0" ; $mw -> geometry($screensize) ; my %special_chars = ( braceleft => '{', braceright => '}', bracketleft => '[', bracketright => ']', parenleft => '(', parenright => ')', space => ' ', comma => ',', period => '.', greater => '>', less => '<', slash => '/', backslash => '\\', bar => '|', quotedbl => '"', quoteright => "'", Tab => "\t", equal => '=', underscore => '_', plus => '+', minus => '-', exclam => '!', at => '@', numbersign => '#', dollar => '$', percent => '%', asterisk => '*', asciicircum => '^', asciitilde => '~', quoteleft => '`', ampersand => '&', Return => "\n", colon => ":", semicolon => ";", question => "?", ) ; $TopFrame = $mw -> Frame( -background => 'white', -borderwidth => 4, -relief => 'groove', ) -> form(-t => '%0', -l => '%0', -b => '%50', -r => '%100') ; my $TLabel = $TopFrame -> Label( -text =>"OTHER", -font => ['Times',18,'bold'], -justify => 'center', -background => 'pink', -borderwidth => 4, -relief => 'groove', ) -> form(-t =>'%0 ', -l => '%0 ', -r => '%100 ') ; my $tText = $TopFrame -> Scrolled('ROText', -font => ['Times',12,], -borderwidth => 4, -background => 'white', -relief => 'groove', -wrap => 'char', ) -> form(-t => $TLabel, -l => '%0 ', -r => '%100 ', -b => '%100') ; $BottomFrame = $mw -> Frame( -background => 'white', -borderwidth => 4, -relief => 'groove', ) -> form(-t => '%50', -l => '%0', -b => '%90', -r => '%100') ; my $bLabel = $BottomFrame -> Label(-text =>"ME", -font => ['Times',18,'bold'], -justify => 'center', -background => 'pink', -borderwidth => 4, -relief => 'groove', ) -> form(-t => '%0 ', -l => '%0 ', -r => '%100 ') ; my $bText = $BottomFrame -> Scrolled('ROText',-font => ['Times',12,], -borderwidth => 4, -background => 'white', -relief => 'groove', -wrap => 'char', ) -> form(-t => $bLabel, -l => '%0 ', -r => '%100 ', -b => '%100') ; my $clearBut = $mw -> Button( -text => "Change Session", -background => 'white', -font => ['Times',18,'bold'], -command => sub{ $bText -> delete('0.0','end') ; $tText -> delete('0.0','end') } ) -> form( -t => '%90', -l => '%0', -b => '%100', -r => '%100') ; $bText -> bind('<1>' => \&freeleft ); $bText -> bind('' => [\&capture_send_keypress,'left']); sub freeleft{ $bText -> configure( -takefocus => 1 ); $bText -> markSet( 'insert', "end") } ; minor_loop() ; MainLoop ; sub minor_loop{ while(1){ get_remote_char() ; if( Exists $mw ){ $mw-> update }; }; } sub get_remote_char{ @received_characters = glob("*.judge") ; $num_recvd_chars = scalar @received_characters ; if( $num_recvd_chars ){ foreach $temp_char (@received_characters){ rmdir $temp_char ; ( $time, $insert_letter, undef )= split '\.', $temp_char ; unless(exists $stored_characters{ $time } ){ $stored_characters{ $time } = $insert_letter ; insert_char(data => $insert_letter, source => 'remote') ; } } ; @received_characters = () ; } } sub capture_send_keypress{ $, ='<-->' ; $\ ="\n" ; my $bwhere = $bText -> index( 'insert') ; # print $bwhere ; # this subroutine creates a file whose name is the character pressed my $widget = shift; # boilerplate to capture key events my $side = shift ; my $e = $widget->XEvent ; # more boilerplate my ($keysym_text, $keysym_decimal) = ($e->K, $e-> N); my ($lo, $hi)= gettimeofday ; $hi = sprintf '%07u', $hi ; $lo = sprintf '%011u', $lo ; my $send_char = "$lo$hi.$keysym_text.other" ; mkdir $send_char ; insert_char( data => $keysym_text, side => $side, source => 'local', where => $bwhere ) ; minor_loop() ; } ; sub insert_char{ my %arguments = @_ ; my $what_to_insert = $arguments{data} ; # Now, deal with special characters if (length $what_to_insert > 1){ # a special character, make null $what_to_insert = '' ; } if( $special_chars{$arguments{data} } ){ # If there is an entry in the hash table, replace null with value $what_to_insert = $special_chars{$arguments{data}} ; } if($arguments{source} eq 'local'){ unless( $arguments{data} eq 'BackSpace'){ # Check for special case of "BackSpace" $bText -> insert( 'end',$what_to_insert ) ; # No, insert character null or otherwise $bText -> see( 'end') ; # Insure view inserted character } else{ $bText -> delete( "end -2 chars", "end - 1 chars" ) ; # Yes, delete last character $bText -> see( 'end') ; # Insure view inserted character $bText -> markSet( "insert","end" ) ; } ; $bText -> markSet( "insert" , "end" ) ; } ; if($arguments{source} eq 'remote'){ unless( $arguments{data} eq 'BackSpace'){ $tText -> insert( 'end',$what_to_insert ) ; $tText -> see( 'end') ; # Insure view inserted character } else{ $tText -> delete( "end -2 chars", "end - 1 chars" ) ; $tText -> see( 'end') ; # Insure view inserted character } } minor_loop() ; } ;