On Wed, 31 Dec 2003 00:36, James Brown wrote;

  > I'm relatively new to Perl and POE in particular, but I have a
  > University final year project to develop a small web browser for
  > the blind. The browser only needs to retrieve very simple web
  > pages (similar to a WAP browser on a mobile phone) and have a
  > simple keyboard input (only a couple of buttons with no GUI -
  > we're going to use a speech synthesiser instead).

Nice.  Are you using festival, or something better?  Going to make a
nice, re-usable POE component for it and release it to CPAN ?  ;-)

  > I've successfully used POE::Component::Client::UserAgent to
  > retrieve the web pages, but I would really appreciate some advice
  > on getting keyboard input. Which module should I use? Does anyone
  > have experience in taking keyboard input for a POE app?

See the attached, it's probably just enough to set you moving.  From
my early POE days :)
-- 
Sam Vilain, [EMAIL PROTECTED]

Real Programmers never "write" memos.  They "send" memos via the
network.


#!/usr/bin/perl -w
#
#  This script is mainly a test of POE::Wheel::Curses

use strict;

use POE;
use Curses;		# for unctrl, etc
use POE::Wheel::Curses;

my $LOG;
sub logger { $LOG .= (shift @_)."\n" };
sub flushlog { print $LOG; $LOG="" };

sub _start {
    my $heap = $_[HEAP];

    logger ("_start(". join (", ", map { "\"$_\"" } @_[ARG0..$#_]).")");
    $heap->{console} = POE::Wheel::Curses->new
	( InputEvent => 'keystroke_handler', );
}

# Generate events from console input.  Sets up Curses, too.

# A keystroke handler.  This is the body of the program's main input
# loop.
sub keystroke_handler {
    my ($keystroke, $wheel_id, $heap) = @_[ARG0, ARG1, HEAP];

    logger ("keystroke_handler(".
	 join (", ", map { "\"$_\"" } @_[ARG0..$#_]).")");

    $|=1;
    # Control characters.  Change them into something printable via
    # Curses' unctrl function.

    if ($keystroke lt ' ') {
	$keystroke = '<' . uc(unctrl($keystroke)) . '>';
    }

    # Extended keys get translated into their names via Curses'
    # keyname function.

    elsif ($keystroke =~ /^\d{2,}$/) {
	$keystroke = '<' . uc(keyname($keystroke)) . '>';
    }

    # Just display it.
    #addstr( $heap->{console}, $keystroke );
    addstr( 0, 0, "You pressed $keystroke" );
    #noutrefresh( $heap->{console} );

    refresh();

    # this won't block unless we hit pipe buffers (user presses
    # Ctrl+S, etc)
    #doupdate;
    if ( $keystroke eq "q" ) {
	$_[KERNEL]->yield("_stop");
    }
}

sub _stop {

    logger ("keystroke_handler(".
	 join (", ", map { "\"$_\"" } @_[ARG0..$#_]).")");

    my ($heap) = $_[HEAP];
    # This will close the console
    delete $heap->{console};
}

flushlog();

my $session = POE::Session->create
    (
     inline_states =>
     {
      _start => \&_start,
      "keystroke_handler" => \&keystroke_handler,
      _stop => \&_stop,
     },
    );

$poe_kernel->run();

flushlog();

Reply via email to