That helped my understanding of postbacks a lot. Thanks again Rocco and well done on creating POE - it's an incredible addition to Perl.

Cheers,

James.

Rocco Caputo wrote:
On Fri, Jan 02, 2004 at 02:57:38PM +0000, James Brown wrote:

Thank you for the advice Rocco, I've done what you suggested and 'hidden' the blessed postback in an unblessed one.

The one thing I'm still not sure about is do you how I can access the keysym information once the "ev_key" event has fired? I have tried using $_[ARG0] and $_[ARG1], but without success.

An idea I had was to put Ev('K') in the callback (as in 1. below) but I couldn't get it to work with postback() because the entire callback needed to be surrounded with [] (according to http://search.cpan.org/~ni-s/Tk-804.025_beta13/pod/callbacks.pod).


[...]


sub ui_keypress {

        my ($c) = $_[ARG1];
        my $event_obj = $c->XEvent; #Get Event Object - line 82
        my $keysym= $event_obj->K;
        print "The $keysym key was pressed\n";

}

The above script (2.) gives me this error on pressing a key:

Tk::Error: Can't call method "XEvent" on unblessed reference at lingo.pl line 82.
Tk::After::once at D:/perl/site/lib/Tk/After.pm line 83
[once,[{},after#62,0,once,[\&POE::Kernel::_loop_event_callback]]]
("after" script)


The unblessed reference is an ARRAY reference.  You can verify it by
adding

warn $c;

just after you create $c.  Then it's an easy matter of checking what's
inside it with

warn "@$c";

which would show you what you need to know.

Now, a mini tutorial on postbacks:

There are two times where postbacks are "called".  The first is when the
postback is created

my $postback = $ssesion->postback("event", "a", "b", "c");

and the second is when it's used

$postback->(1, 2, 3);

Therefore there are two sets of parameters a postback can return: The
ones given to it at creation time, and the ones it's called with at
runtime.

The creation-time information is useful for reminding you what the
postback is attached to.  They're a form of magic cookie.  The
creation-time information is passed back as a list reference in ARG0.
In the context of the previous example

  my @cookies = @{$_[ARG0]};
  print "@cookies\n";

would print "a b c".

The runtime information lets you know what the other system (Tk in this
case) wanted to call you back with.  The runtime callback parameters are
also passed in a list reference, in ARG1.

  my @returns = @{$_[ARG1]};
  print "@returns\n";

would print "1 2 3".

Therefore, the parameter you're looking for is

my $c = $_[ARG1]->[0];

which turns out to be a Tk::MainWindow object.






Reply via email to