package Newt;
use strict qw(vars);
use Carp;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @TOP);
use AutoLoader;
require Exporter;
require DynaLoader;
*Newt::Form::AUTOLOAD = \&Newt::AUTOLOAD;
@ISA = qw(Exporter DynaLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
@EXPORT_OK = qw(
H_NEWT
NEWT_ANCHOR_BOTTOM
NEWT_ANCHOR_LEFT
NEWT_ANCHOR_RIGHT
NEWT_ANCHOR_TOP
NEWT_ARG_APPEND
NEWT_ARG_LAST
NEWT_COLORSET_ACTBUTTON
NEWT_COLORSET_ACTCHECKBOX
NEWT_COLORSET_ACTLISTBOX
NEWT_COLORSET_ACTSELLISTBOX
NEWT_COLORSET_ACTTEXTBOX
NEWT_COLORSET_BORDER
NEWT_COLORSET_BUTTON
NEWT_COLORSET_CHECKBOX
NEWT_COLORSET_COMPACTBUTTON
NEWT_COLORSET_DISENTRY
NEWT_COLORSET_EMPTYSCALE
NEWT_COLORSET_ENTRY
NEWT_COLORSET_FULLSCALE
NEWT_COLORSET_HELPLINE
NEWT_COLORSET_LABEL
NEWT_COLORSET_LISTBOX
NEWT_COLORSET_ROOT
NEWT_COLORSET_ROOTTEXT
NEWT_COLORSET_SELLISTBOX
NEWT_COLORSET_SHADOW
NEWT_COLORSET_TEXTBOX
NEWT_COLORSET_THREEDBOX
NEWT_COLORSET_TITLE
NEWT_COLORSET_WINDOW
NEWT_ENTRY_DISABLED
NEWT_ENTRY_HIDDEN
NEWT_ENTRY_RETURNEXIT
NEWT_ENTRY_SCROLL
NEWT_FD_READ
NEWT_FD_WRITE
NEWT_FLAG_BORDER
NEWT_FLAG_CHECKBOX
NEWT_FLAG_DISABLED
NEWT_FLAG_HIDDEN
NEWT_FLAG_MULTIPLE
NEWT_FLAG_NOF12
NEWT_FLAG_RETURNEXIT
NEWT_FLAG_SCROLL
NEWT_FLAG_SELECTED
NEWT_FLAG_WRAP
NEWT_FORM_NOF12
NEWT_GRID_FLAG_GROWX
NEWT_GRID_FLAG_GROWY
NEWT_KEY_BKSPC
NEWT_KEY_DELETE
NEWT_KEY_DOWN
NEWT_KEY_END
NEWT_KEY_ENTER
NEWT_KEY_ESCAPE
NEWT_KEY_EXTRA_BASE
NEWT_KEY_F1
NEWT_KEY_F10
NEWT_KEY_F11
NEWT_KEY_F12
NEWT_KEY_F2
NEWT_KEY_F3
NEWT_KEY_F4
NEWT_KEY_F5
NEWT_KEY_F6
NEWT_KEY_F7
NEWT_KEY_F8
NEWT_KEY_F9
NEWT_KEY_HOME
NEWT_KEY_INSERT
NEWT_KEY_LEFT
NEWT_KEY_PGDN
NEWT_KEY_PGUP
NEWT_KEY_RESIZE
NEWT_KEY_RETURN
NEWT_KEY_RIGHT
NEWT_KEY_SUSPEND
NEWT_KEY_TAB
NEWT_KEY_UNTAB
NEWT_KEY_UP
NEWT_LISTBOX_RETURNEXIT
NEWT_TEXTBOX_SCROLL
NEWT_TEXTBOX_WRAP
NEWT_EXIT_HOTKEY
NEWT_EXIT_COMPONENT
NEWT_EXIT_FOREADY
OK_BUTTON
CANCEL_BUTTON
QUIT_BUTTON
BACK_BUTTON
OK_CANCEL_PANEL
OK_BACK_PANEL
newtGridDestroy
newtListboxAddEntry
);
%EXPORT_TAGS = (exits => [qw(NEWT_EXIT_HOTKEY
NEWT_EXIT_COMPONENT
NEWT_EXIT_FOREADY)],
keys => [qw(NEWT_KEY_BKSPC
NEWT_KEY_DELETE
NEWT_KEY_DOWN
NEWT_KEY_END
NEWT_KEY_ENTER
NEWT_KEY_ESCAPE
NEWT_KEY_EXTRA_BASE
NEWT_KEY_F1
NEWT_KEY_F10
NEWT_KEY_F11
NEWT_KEY_F12
NEWT_KEY_F2
NEWT_KEY_F3
NEWT_KEY_F4
NEWT_KEY_F5
NEWT_KEY_F6
NEWT_KEY_F7
NEWT_KEY_F8
NEWT_KEY_F9
NEWT_KEY_HOME
NEWT_KEY_INSERT
NEWT_KEY_LEFT
NEWT_KEY_PGDN
NEWT_KEY_PGUP
NEWT_KEY_RESIZE
NEWT_KEY_RETURN
NEWT_KEY_RIGHT
NEWT_KEY_SUSPEND
NEWT_KEY_TAB
NEWT_KEY_UNTAB
NEWT_KEY_UP)],
anchors => [qw( NEWT_ANCHOR_BOTTOM
NEWT_ANCHOR_LEFT
NEWT_ANCHOR_RIGHT
NEWT_ANCHOR_TOP)],
argss => [qw(NEWT_ARG_APPEND
NEWT_ARG_LAST)],
colorsets => [qw(NEWT_COLORSET_ACTBUTTON
NEWT_COLORSET_ACTCHECKBOX
NEWT_COLORSET_ACTLISTBOX
NEWT_COLORSET_ACTSELLISTBOX
NEWT_COLORSET_ACTTEXTBOX
NEWT_COLORSET_BORDER
NEWT_COLORSET_BUTTON
NEWT_COLORSET_CHECKBOX
NEWT_COLORSET_COMPACTBUTTON
NEWT_COLORSET_DISENTRY
NEWT_COLORSET_EMPTYSCALE
NEWT_COLORSET_ENTRY
NEWT_COLORSET_FULLSCALE
NEWT_COLORSET_HELPLINE
NEWT_COLORSET_LABEL
NEWT_COLORSET_LISTBOX
NEWT_COLORSET_ROOT
NEWT_COLORSET_ROOTTEXT
NEWT_COLORSET_SELLISTBOX
NEWT_COLORSET_SHADOW
NEWT_COLORSET_TEXTBOX
NEWT_COLORSET_THREEDBOX
NEWT_COLORSET_TITLE
NEWT_COLORSET_WINDOW)],
flags => [qw(NEWT_FLAG_DISABLED
NEWT_FLAG_BORDER
NEWT_FLAG_CHECKBOX
NEWT_FLAG_HIDDEN
NEWT_FLAG_MULTIPLE
NEWT_FLAG_NOF12
NEWT_FLAG_RETURNEXIT
NEWT_FLAG_SCROLL
NEWT_FLAG_SELECTED
NEWT_FLAG_WRAP)],
entry => [qw(NEWT_ENTRY_DISABLED
NEWT_ENTRY_HIDDEN
NEWT_ENTRY_RETURNEXIT
NEWT_ENTRY_SCROLL)],
fd => [qw(NEWT_FD_READ
NEWT_FD_WRITE)],
grid => [qw(NEWT_GRID_FLAG_GROWX
NEWT_GRID_FLAG_GROWY)],
other => [qw(NEWT_FORM_NOF12
NEWT_LISTBOX_RETURNEXIT)],
textbox => [qw(NEWT_TEXTBOX_SCROLL
NEWT_TEXTBOX_WRAP)],
macros => [qw(OK_BUTTON
CANCEL_BUTTON
QUIT_BUTTON
BACK_BUTTON
OK_CANCEL_PANEL
OK_BACK_PANEL)],
);
$VERSION = do { my @r=(q$Revision: 1.8 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r };
@TOP = (); # Window stack;
sub AUTOLOAD {
# This AUTOLOAD is used to 'autoload' constants from the constant()
# XS function. If a constant is not found then control is passed
# to the AUTOLOAD in AutoLoader.
my $constname;
($constname = $AUTOLOAD) =~ s/.*:://;
croak "& not defined" if $constname eq 'constant';
my $val = constant($constname, @_ ? $_[0] : 0);
if ($! != 0) {
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
*$AUTOLOAD = sub { $val };
goto &$AUTOLOAD;
}
bootstrap Newt $VERSION;
# Preloaded methods go here.
sub NEWT_EXIT_HOTKEY () {
0;
}
sub NEWT_EXIT_COMPONENT () {
1;
}
sub NEWT_EXIT_FOREADY () {
2;
}
sub Newt::Form {
my $self = {};
$self->{co} = newtForm();
bless $self, "Newt::Form";
}
sub Newt::Button {
my ($caption, $compact) = @_;
my $self = {};
if($compact) {
$self->{co} = newtCompactButton(-1, -1, $caption);
} else {
$self->{co} = newtButton(-1, -1, $caption);
}
bless $self, "Newt::Button";
}
sub Newt::Label {
my $caption = "@_";
my $self = {};
$self->{co} = newtLabel(-1, -1, $caption);
bless $self, "Newt::Label";
}
sub Newt::Entry {
my ($width, $flags, $default) = @_;
my $self = {};
$self->{co} = newtEntry(-1, -1, $default ? $default : '', $width, $flags);
bless $self, "Newt::Entry";
}
sub Newt::Checkbox {
my ($caption, $default, $valid) = @_;
my $self = {};
$self->{co} = newtCheckbox(-1,
-1,
$caption,
$default ? $default : ' ',
$valid ? $valid : ' *');
bless $self, "Newt::Checkbox";
}
sub Newt::Listbox {
my ($height, $flags) = @_;
my $self = {};
$self->{flags} = $flags ? $flags : 0;
$self->{co} = newtListbox(-1, -1, $height, $self->{flags});
$self->{items} = {};
bless $self, "Newt::Listbox";
}
sub Newt::Scale {
my ($width, $fullvalue) = @_;
my $self = {};
$self->{co} = newtScale(-1, -1, $width, $fullvalue);
bless $self, "Newt::Scale";
}
sub Newt::Textbox {
my ($width, $height, $flags, @rest) = @_;
my $self = {};
$self->{co} = newtTextbox(-1, -1, $width, $height, $flags ? $flags : 0);
bless $self, "Newt::Textbox";
$self->Set(@rest) if @rest;
$self;
}
sub Newt::TextboxReflowed {
my ($width, $flexdown, $flexup, $flags, @text) = @_;
my $text = "@text";
my $self = {};
$self->{co} = newtTextboxReflowed(-1, -1, $text, $width, $flexdown, $flexup,
$flags ? $flags : 0);
bless $self, "Newt::Textbox";
}
sub Newt::VScrollbar {
my ($height, $normalColorset, $thumbColorset) = @_;
my $self = {};
$self->{co} = newtVerticalScrollbar(-1, -1, $height, $normalColorset, $thumbColorset);
}
sub Newt::Panel {
my ($cols, $rows, $title) = @_;
my $self = Newt::Form();
$self->{g} = newtCreateGrid($cols, $rows);
$self->{refs} = {};
$self->{title} = $title if $title;
bless $self, "Newt::Panel";
}
sub Newt::HRadiogroup {
my $self = {};
my $radio;
my $pos = 0;
$self = {};
$self->{g} = newtCreateGrid(scalar(@_), 1);
foreach(@_) {
if ($radio) {
$radio = newtRadiobutton(-1, -1, $_, 0, $radio);
} else {
$radio = newtRadiobutton(-1, -1, $_, 1);
}
push @{$self->{'components'}}, $radio;
Newt::newtGridSetField($self->{g}, $pos, 0, 1, $radio, 1, 0, 0, 0,0, 0);
$pos++;
}
Newt::newtGridPlace($self->{g}, 1, 1);
bless $self, "Newt::Radiogroup";
}
sub Newt::VRadiogroup {
my $self = {};
my $radio;
my $pos = 0;
$self = {};
$self->{g} = newtCreateGrid(1, scalar(@_));
foreach(@_) {
if ($radio) {
$radio = newtRadiobutton(-1, -1, $_, 0, $radio);
} else {
$radio = newtRadiobutton(-1, -1, $_, 1);
}
push @{$self->{'components'}}, $radio;
Newt::newtGridSetField($self->{g}, 0, $pos, 1, $radio, 0, 0, 0, 0,0, 0);
$pos++;
}
Newt::newtGridPlace($self->{g}, 1, 1);
bless $self, "Newt::Radiogroup";
}
# Macro facilities
sub Newt::OK_BUTTON () {
Newt::Button('OK')->Tag('OK');
}
sub Newt::CANCEL_BUTTON () {
Newt::Button('Cancel')->Tag('CANCEL');
}
sub Newt::QUIT_BUTTON () {
Newt::Button('Quit')->Tag('QUIT');
}
sub Newt::BACK_BUTTON () {
Newt::Button('Back')->Tag('BACK');
}
sub Newt::OK_CANCEL_PANEL () {
Newt::Panel(2, 1)
->Add(0, 0, OK_BUTTON(), NEWT_ANCHOR_RIGHT(), 0, 1, 1, 0)
->Add(1, 0, CANCEL_BUTTON(), NEWT_ANCHOR_LEFT(), 1, 1, 0, 0);
}
sub Newt::OK_BACK_PANEL () {
Newt::Panel(2, 1)
->Add(0, 0, OK_BUTTON, NEWT_ANCHOR_RIGHT, 0, 0, 1, 0)
->Add(1, 0, BACK_BUTTON, NEWT_ANCHOR_LEFT, 1, 0, 0, 0);
}
@Newt::Component::ISA = qw(Newt);
@Newt::Form::ISA = qw(Newt::Component);
@Newt::Button::ISA = qw(Newt::Component);
@Newt::Entry::ISA = qw(Newt::Component);
@Newt::Label::ISA = qw(Newt::Component);
@Newt::Checkbox::ISA = qw(Newt::Component);
@Newt::Scale::ISA = qw(Newt::Component);
@Newt::Textbox::ISA = qw(Newt::Component);
@Newt::VScrollbar::ISA = qw(Newt::Component);
@Newt::Listbox::ISA = qw(Newt::Component);
@Newt::Panel::ISA = qw(Newt::Form);
@Newt::Radiogroup::ISA = qw(Newt::Component);
# Autoload methods go after =cut, and are processed by the autosplit program.
1;
__END__
########################### Newt::Component
sub Newt::Component::AddCallback {
my ($self, $cb) = @_;
Newt::newtComponentAddCallback($self->{co}, $cb);
$self;
}
sub Newt::Component::TakesFocus {
my ($self, $yesorno) = @_;
Newt::newtComponentTakesFocus($self->{co}, $yesorno);
$self;
}
sub Newt::Component::GetComponent {
my $self = shift;
return (1, $self->{co});
}
sub Newt::Component::Tag {
my ($self, $tag) = @_;
if ($tag) {
$self->{tag} = $tag;
return $self;
} else {
return $self->{tag};
}
}
########################### Newt::Form
sub Newt::Form::AddHotKey {
my ($self, $key) = @_;
Newt::newtFormAddHotKey($self->{co}, $key);
$self;
}
sub Newt::Form::Add {
my $self = shift;
foreach (@_) {
Newt::newtFormAddComponent($self->{co}, $_->{co});
}
$self;
}
sub Newt::Form::SetBackground {
my ($self, $color) = @_;
Newt::newtFormSetBackground($self->{co}, $color);
$self;
}
sub Newt::Form::SetHeight {
my ($self, $height) = @_;
Newt::newtFormSetHeight($self->{co}, $height);
$self;
}
sub Newt::Form::Draw {
my $self = shift;
Newt::newtDrawForm($self->{co});
$self;
}
sub Newt::Form::Focus {
my ($self, $comp) = @_;
Newt::newtFormSetCurrent($self->{co}, $comp->{co});
$self;
}
sub Newt::Form::Run {
my $self = shift;
return Newt::newtFormRun($self->{co});
}
sub Newt::Form::GetCurrent {
my $self = shift;
return Newt::newtFormGetCurrent($self->{co});
}
########################### Newt::Label
sub Newt::Label::Set {
my ($self, @text) = @_;
Newt::newtLabelSetText($self->{co}, "@text");
$self;
}
########################### Newt::Entry
sub Newt::Entry::Get {
my $self = shift;
return Newt::newtEntryGetValue($self->{co});
}
sub Newt::Entry::Set {
my ($self, $text, $atEnd) = @_;
Newt::newtEntrySet($self->{co},
$text || "",
$atEnd ? $atEnd : 0);
$self;
}
sub Newt::Entry::SetFilter {
my ($self, $filter) = @_;
Newt::newtEntrySetFilter($self->{co}, $filter);
$self;
}
########################### Newt::Checkbox
sub Newt::Checkbox::Get {
my $self = shift;
return Newt::newtCheckboxGetValue($self->{co});
}
sub Newt::Checkbox::Checked {
my $self = shift;
return $self->Get() ne " ";
}
########################### Newt::Radiogroup
sub Newt::Radiogroup::Get {
my $self = shift;
my $index = 0;
foreach (@{$self->{components}}) {
return $index if ${Newt::newtRadioGetCurrent($_)} eq ${$_};
$index++;
}
}
sub Newt::Radiogroup::GetComponent {
my $self = shift;
return (2, $self->{g});
}
########################### Newt::Listbox
sub Newt::Listbox::Append {
my $self = shift;
foreach (@_) {
$self->{items}{$_} = $_;
Newt::newtListboxAppendEntry($self->{co}, $_, $self->{items}{$_});
}
$self;
}
sub Newt::Listbox::Insert {
my $self = shift;
my $before = shift;
foreach (@_) {
$self->{items}{$_} = $_;
Newt::newtListboxInsertEntry($self->{co}, $_,
$self->{items}{$_},
$self->{items}{$before});
}
$self;
}
sub Newt::Listbox::Delete {
my $self = shift;
foreach (@_) {
Newt::newtListboxDeleteEntry($self->{co}, $self->{items}{$_});
}
$self;
}
sub Newt::Listbox::Clear {
my $self = shift;
Newt::newtListboxClear($self->{co});
$self;
}
sub Newt::Listbox::Select {
my $self = shift;
foreach (@_) {
Newt::newtListboxSelectItem($self->{co}, $self->{items}{$_}, 0)
}
$self;
}
sub Newt::Listbox::Unselect {
my $self = shift;
foreach (@_) {
Newt::newtListboxSelectItem($self->{co}, $self->{items}{$_}, 1)
}
$self;
}
sub Newt::Listbox::Get {
my $self = shift;
if ($self->{flags} & Newt::constant(NEWT_FLAG_MULTIPLE, 0)) {
return Newt::newtListboxGetSelection($self->{co});
} else {
return Newt::newtListboxGetCurrent($self->{co});
}
}
########################### Newt::Scale
sub Newt::Scale::Set {
my ($self, $amount) = @_;
Newt::newtScaleSet($self->{co}, $amount || 0);
$self;
}
########################### Newt::Textbox
sub Newt::Textbox::Set {
my $self = shift;
Newt::newtTextboxSetText($self->{co}, "@_");
$self;
}
########################### Newt::Panel
sub Newt::Panel::Move {
my ($self, $left, $top) = @_;
$self->{left} = $left;
$self->{top} = $top;
if($self->{drawed}) {
$self->Hide;
$self->Draw;
}
$self;
}
sub Newt::Panel::Add {
my ($self, $col, $row, $comp, $anchor, $padLeft, $padTop,
$padRight, $padBottom, $flags) = @_;
Carp::croak "Can only add components!" if ! UNIVERSAL::isa($comp, 'Newt::Component');
Newt::newtGridSetField($self->{g},
$col,
$row,
($comp->GetComponent()),
$padLeft ? $padLeft : 0,
$padTop ? $padTop : 0,
$padRight ? $padRight : 0,
$padBottom ? $padBottom : 0,
$anchor ? $anchor : 0,
$flags ? $flags : 0);
$self->{refs}{${$comp->{co}}} = $comp if exists $comp->{co};
$self;
}
sub Newt::Panel::GetComponent {
my $self = shift;
return (2, $self->{g});
}
sub Newt::Panel::Pack {
my $self = shift;
Newt::newtGridAddComponentsToForm($self->{g}, $self->{co}, 1) if ! $self->{packed};
$self->{packed} = 1;
}
sub Newt::Panel::Draw {
my ($self) = @_;
$self->Pack();
$self->Hide if(@TOP && $TOP[-1] ne $self);
if(!$self->{drawed}) {
if(exists($self->{left}) and exists($self->{top})) {
Newt::newtGridWrappedWindowAt($self->{g}, $self->{title},
$self->{left}, $self->{top});
} else {
Newt::newtGridWrappedWindow($self->{g}, $self->{title});
}
$self->SUPER::Draw();
$self->{drawed} = 1;
push(@TOP,$self);
}
$self;
}
sub Newt::Panel::_upgrade {
my $self = shift;
my @upgraded = ();
for my $k (keys(%{$self->{refs}})) {
my $comp = $self->{refs}{$k};
if(UNIVERSAL::isa($comp,'Newt::Panel')) {
push(@upgraded,$comp->_upgrade);
%{$comp->{refs}} = ();
} else {
push(@upgraded,($k=>$comp));
}
}
return @upgraded;
}
sub Newt::Panel::upgrade {
my $self = shift;
%{$self->{refs}} = $self->_upgrade;
}
sub Newt::Panel::Run {
my ($self,$tr) = @_;
my ($reason, $data);
$self->Draw;
$self->upgrade;
($reason, $data) = $self->SUPER::Run();
$self->Hide if($tr);
if (ref($data)) {
$data = $self->{refs}{$$data};
}
return wantarray ? ($reason, $data) : $data;
}
sub Newt::Panel::Hide {
my $self = shift;
my @tops = ();
return unless $self->{drawed};
while(my $top = pop(@TOP)) {
Newt::PopWindow();
$top->{drawed} = 0;
last if($top eq $self);
unshift @tops,$top;
}
for(@tops) {
$_->Draw;
}
$self;
}
# Below is the stub of documentation for your module. You better edit it!
=head1 NAME
Newt - Perl bindings for Red Hat newt library
=head1 SYNOPSIS
use Newt;
Newt::Init();
Newt::Cls();
#A lot of Newt operations...
Newt::Finished();
=head1 DESCRIPTION
The Newt module implements perl bindings for the Red Hat newt windowing
system, a terminal-based window and widget library for writing
applications with a simple, but user-friendly, interface.
=head1 Basic Newt functions
=over
=item C