Dear POE programmers,
I am attempting to write a POE program that does two things:
1. construct and manage a POE::Component::XUL application;
2. follow a growing log file.
The idea is that the log file follower sends new lines in the log to the
XUL
application, to be displayed in a TextWindow XUL widget. As far as the
XUL
app is concerned - I got that figured out: it shows up in the browser
window, and the buttons (etc.) do what I mean for them to do. Likewise,
the
log follower does what it's supposed to do, at least in so far as writing
changes to the log to STDOUT. What doesn't seem to work is for those same
changes to show up in the textwindow.
Now, although I am a reasonable programmer, I must admit to a bit of
voodoo
programming in regards to POE - I'm reading the wiki, and trying to
get my
head around things, but it's a lot to take in. I assume things going
wrong
in my efforts have got something to do with the XUL app and the log
follower
doing their thing in their own space, but the reference to the textwindow
that I pushed onto the HEAP when constructing the XUL app has the same
memory address (refaddr) as the one that the log follower pulls off the
heap
when executing the log following callbacks, and still it's not working.
I hope you don't mind me posting some code, to clarify:
#######################################################
# snipped preambles...
POE::Session->create(
'inline_states' => {
'_start' => sub {
my ( $kernel, $heap, $session ) = @_[KERNEL, HEAP, SESSION];
# build XUL app
POE::Component::XUL->spawn( {
'port' => $PORT, # from @ARGV
'root' => $ROOT, # from @ARGV
'apps' => {
'Regman' => sub { # Regman = Registry Manager
# widget construction happens here
XUL::Node::Application::Regman->VERBOSE( $VERBOSE
);
my $regman =
XUL::Node::Application::Regman->_new;
# push logwindow onto heap
$heap->{'_logwindow'} = $regman->{'_logwindow'};
# return main window, this works, shows in
firefox
return $regman->_main;
}
},
} );
# the following is a blatant c&p from the wiki
$_[HEAP]->{'wheel'} = POE::Wheel::FollowTail->new(
'Filename' => $LOGFILE, # from @ARGV
'InputEvent' => 'got_line',
'ErrorEvent' => 'got_error',
'SeekBack' => 1024,
);
$_[HEAP]->{'first'} = 0;
},
'got_line' => sub {
# this is the same logwindow as when the xul app was
constructed
my $logwindow = $_[HEAP]->{'_logwindow'};
if ( $_[HEAP]->{'first'}++ && defined $logwindow ) {
# these messages show up when the log changes
print "MESSAGE FROM LOGWATCHER: " . $_[ARG0] . "\n";
# attempt to send msg to xul widget
$logwindow->value( $_[ARG0] );
# sure enough, the widget is modified, but not in
firefox?
# i.e. ->value() has changed, but the actual text widget
# shows nothing?
print "LISTENING TO LOGWINDOW: " . $logwindow->value() .
"\n";
}
elsif ( $_[HEAP]->{'first'}++ && ! defined $logwindow ) {
print "MESSAGE FROM LOGWATCHER: " . $_[ARG0] . "\n";
}
},
'got_error' => sub {
my $logwindow = $_[HEAP]->{'_logwindow'};
if ( $_[HEAP]->{'first'}++ && defined $logwindow ) {
my $current = $logwindow->value;
$logwindow->value( $current . "\n" . $_[ARG0] );
print "MESSAGE FROM LOGWATCHER: " . $_[ARG0] . "\n";
}
elsif ( $_[HEAP]->{'first'}++ && ! defined $logwindow ) {
print "MESSAGE FROM LOGWATCHER: " . $_[ARG0] . "\n";
}
},
},
);
#######################################################
Any hints as to what might be going on?
Thanks,
Rutger