You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/ksirc/puke/pbase.pm

266 lines
5.5 KiB

package PBase;
use Carp;
#use Data::Dumper;
use strict;
$PBase::NO_WIDGET = -1;
$::AlignLeft = 0x0001;
$::AlignRight = 0x0002;
$::AlignHCenter = 0x0004;
$::AlignTop = 0x0008;
$::AlignBottom = 0x0010;
$::AlignVCenter = 0x0020;
$::AlignCenter = $::AlignVCenter | $::AlignHCenter;
sub sendMessage {
my $self = shift;
my %ARG = @_;
$ARG{"iWinId"} = $self->{iWinId} if($ARG{"iWinId"} == undef);
return &::PukeSendMessage($ARG{"iCommand"},
$ARG{"iWinId"},
$ARG{"iArg"},
$ARG{"cArg"},
$ARG{"CallBack"},
$ARG{"WaitFor"}
);
}
sub rndchr {
my $string = "";
my $i;
for($i = 0; $i < 8; $i++){
$string .= chr(int(rand(93)) + 0x21); # 0x21 since we don't want spaces and 0x20 is space.
}
return $string;
}
sub new {
my $class = shift;
my $parent = $_[$#_];
my $self = {};
# print "Parent: $parent\n";
bless($self, $class);
$parent = 0 if($parent == undef);
$self->{iWinId} = -1;
$self->{Parent} = $parent if $parent != 0;
$self->{initId} = $self->rndchr();
$self->{widgetType} = $PBase::NO_WIDGET;
$self->{cmdQueue} = ();
if($::PUKE_FETCH_WIDGET == 1) {
$self->{Fetch} = 1;
}
# $self->installHandler($::PUKE_WIDGET_DELETE_ACK, sub{$self->DESTROY});
return $self;
}
sub create {
my $self = shift;
if($self->{widgetType} == undef ||
$self->{widgetType} == $PBase::NO_WIDGET) {
print("*E* PBase: Widget type was undefined, $self is really broken\n");
print("*E* PBase: Giving up\n");
return;
}
my $parent = $self->{Parent} ? $self->{Parent}->{iWinId} : 0;
# print "*I* Createing widget of type: " . $self->{widgetType} . " with parent " . $parent . "\n";
$self->{runable} = 1;
my $carg = $parent . "\t" . $self->{widgetType} . "\t" . $self->{initId};
my %REPLY = $self->sendMessage('iCommand' => $::PUKE_WIDGET_CREATE,
'iWinId' => $::PUKE_CONTROLLER,
'cArg' => $carg,
'CallBack' => sub { },
'WaitFor' => 1);
if($REPLY{iWinId} <= 0){
print "*E* Widget Create Failed!\n";
}
$self->ackWinId(%REPLY);
$self->clearQueue();
# $self->setRunable(0);
}
sub fetchWidget {
my $self = shift;
$self->{objName} = shift;
my $regex = shift;
# $self->sendMessage('iCommand' => $::PUKE_WIDGET_DELETE,
# 'CallBack' => sub { print "Deleted\n"; });
$regex = "0" if($regex eq '');
my $carg = $regex . "\t" . $self->{widgetType} . "\t" . $self->{initId} . "\t" . $self->{objName};
my %REPLY = $self->sendMessage('iCommand' => $::PUKE_FETCHWIDGET,
'iWinId' => $::PUKE_CONTROLLER,
'cArg' => $carg,
'CallBack' => sub { },
'WaitFor' => 1);
if($REPLY{iWinId} <= 0){
print "*E* Widget Fetch Failed!\n";
return -1;
}
my $winid;
my $cmd;
foreach $cmd (values %::PUKE_W_HANDLER){
next unless ref $cmd eq 'CODE';
foreach $winid (values %{$::PUKE_W_HANDLER{$cmd}}){
if($winid == $self->{'iWinId'}){
$::PUKE_W_HANDLER{$cmd}{$REPLY{iWinId}} = $::PUKE_W_HANDLER{$cmd}{$self->{iWinId}};
delete $::PUKE_W_HANDLER{$cmd}{$self->{iWinId}};
}
}
}
$self->ackWinId(%REPLY);
$self->{'Fetch'} = 1;
# $self->setRunable(0);
return 0;
}
sub releaseWidget {
my $self = shift;
$self->sendMessage('iCommand' => $::PUKE_RELEASEWIDGET,
'CallBack' => sub {});
}
sub treeInfo {
my $self = shift;
my %REPLY = $self->sendMessage('iCommand' => $::PUKE_DUMPTREE,
'iWinId' => $::PUKE_CONTROLLER,
'CallBack' => sub { },
'WaitFor' => 0);
}
sub DESTROY {
my $self = shift;
# print "*I* Widget Deleted\n";
eval{ $self->hide(); }; # Hide doesn't exist for all PBase's
# $self->setRunable(1);
delete($::PBASE_IMORTALS{$self->{IMMORTAL}});
if($self->{'Fetch'} != 1 && $self->{DESTROYED} != 1 && $self->{Parent} == 0){
$self->sendMessage('iCommand' => $::PUKE_WIDGET_DELETE,
'CallBack' => sub {});
}
if($self->{'Fetch'} == 1){
$self->sendMessage('iCommand' => $::PUKE_RELEASEWIDGET,
'CallBack' => sub {});
}
# $self->setRunable(0);
$self->{iWinId} = -1;
$self->{DESTROYED} = 1;
}
sub close {
my $self = shift;
$self->hide();
$self->DESTROY;
}
sub ackWinId {
my $self = shift;
my %ARG = @_;
if($ARG{'iWinId'} <= 1){
die("Failed on ack'ing Window ID, stopping!");
}
$self->{iWinId} = $ARG{'iWinId'};
}
sub installHandler {
my $self = shift;
my $command = shift;
my $handler = shift;
my $cmd =
sub {
$::PUKE_W_HANDLER{$command}{$self->{iWinId}} = $handler;
};
if($self->{iWinId} == -1){
$self->addQueue($cmd);
}
else{
&$cmd();
}
}
sub onNext {
my $self = shift;
my $cb = shift;
$self->sendMessage('iCommand' => $::PUKE_ECHO,
'iArg' => 0,
'iWinId' => $self->{iWinId},
'cArg' => "",
'CallBack' => $cb);
}
sub immortal {
my $self = shift;
$self->{IMMORTAL} = &rndchr;
$::PBASE_IMORTALS{$self->{IMMORTAL}} = $self;
return $self;
}
sub addQueue {
my $self = shift;
push(@{$self->{cmdQueue}}, shift());
}
sub clearQueue {
my $self = shift;
my $cmd;
while($cmd = pop(@{$self->{cmdQueue}})){
&$cmd;
}
}
package main;
1;