Curses-UI-POE
view release on metacpan or search on metacpan
}
# Wait until the kernel actually starts before we muck with things.
sub _start { $_[KERNEL]->yield("init") }
sub init {
my ($self, $kernel) = @_[ OBJECT, KERNEL ];
$kernel->select(\*STDIN, "keyin");
# Turn blocking back on for STDIN. Some Curses
# implementations don't deal well with non-blocking STDIN.
my $flags = fcntl STDIN, F_GETFL, 0 or die $!;
fcntl STDIN, F_SETFL, $flags & ~O_NONBLOCK or die $!;
# If we're in a dialog, then the TOP modal object is more appropriate than
# $self, although if we're not in a dialog $self is what this actually is.
set_read_timeout($modal_objects[TOP]);
# When gpm_mouse isn't enabled, sometimes there is extra garbage during
# startup. We ignore that garbage during construction, assuming that since
# the UI isn't rendered yet (we're still creating the root object!) the
# input must not matter.
$self->flushkeys;
# Unmask...
$self->{__start_callback}(@_)
if defined $self->{__start_callback};
}
sub _clear_modal_callback {
my ($self) = @_;
my $top = pop @modal_objects;
# Reset focus
$top->{-focus} = 0;
# Dispatch callback.
my $args = pop @modal_callbacks;
my $sub = shift @$args;
&{$sub}(@$args);
}
sub keyin {
my ($self, $kernel) = @_[ OBJECT, KERNEL ];
until ((my $key = $self->get_key(0)) eq -1) {
$self->feedkey($key);
unless ($#modal_objects) {
$self->do_one_event;
}
else {
# dispatch the event to the top-most modal object, or the root.
$self->do_one_event($modal_objects[TOP]);
}
}
# Set the root cursor mode
unless ($self->{-no_output}) {
Curses::curs_set($self->{-cursor_mode});
}
}
sub timer {
my ($self) = @_;
# dispatch the event to the top-most modal object, or the root.
my $top_object = $modal_objects[TOP];
$top_object->do_timer;
# Set the root cursor mode.
unless ($self->{-no_output}) {
Curses::curs_set($self->{-cursor_mode});
}
set_read_timeout($top_object);
}
sub shutdown {
my ($kernel) = $_[ KERNEL ];
# Unselect stdin
$kernel->select(\*STDIN);
}
sub mainloop {
my ($this) = @_;
unless ($this->{-no_output}) {
$this->focus(undef, 1);
$this->draw;
Curses::doupdate;
}
no warnings "redefine";
my $modalfocus = \&Curses::UI::Widget::modalfocus;
# Let modalfocus() be a reentrant into the POE Kernel. This is stackable,
# so it should not impact other behaviors, and POE keeps chugging along
# uneffected. This is a modal focus without a callback, this method does
# not return until the modal widget get's cleared out.
#
# This is done here so that ->dailog will still work as it did previously.
# until this is run. And just in case, we save the old modalfocus
# definition and redefine it later.
sub Curses::UI::Widget::modalfocus () {
my ($this) = @_;
# "Fake" focus for this object.
$this->{-has_modal_focus} = 1;
$this->focus;
$this->draw;
push @modal_objects, $this;
push @modal_callbacks, undef;
# This is reentrant into the POE::Kernel
while ( $this->{-has_modal_focus} ) {
$poe_kernel->loop_do_timeslice;
}
$this->{-focus} = 0;
pop @modal_callbacks;
pop @modal_objects;
return $this;
}
( run in 0.656 second using v1.01-cache-2.11-cpan-39bf76dae61 )