]> git.vpit.fr Git - perl/scripts/xchat.git/commitdiff
Pretend that the xchat functions in XPI are called from the script
authorVincent Pit <vince@profvince.com>
Fri, 20 Nov 2015 13:53:30 +0000 (11:53 -0200)
committerVincent Pit <vince@profvince.com>
Fri, 20 Nov 2015 13:53:30 +0000 (11:53 -0200)
This replaces 73947ac5.

Xchat/XPI.pm
Xchat/XPI/Events.pm
Xchat/XPI/Net.pm
Xchat/XPI/Utils.pm

index 6811e63b3bc0355bc355b7841b77eb343aa51f54..0733175382a71dde90c6e0d775e1af8a7d818fa6 100644 (file)
@@ -7,6 +7,9 @@ use Tie::RefHash;
 
 use Xchat;
 
+use lib Xchat::get_info('xchatdir');
+use Xchat::XPI::Utils qw<called_from_script>;
+
 our $VERSION = '0.05';
 
 use constant { COLOR_TAG => "\00307" };
@@ -23,7 +26,7 @@ sub new {
  $class    = ref($class) || $class;
  my %opts  = @_;
 
- my ($caller, $file) = (caller 0)[0, 1];
+ my $caller = (caller 0)[0];
 
  unless (defined $opts{tag}) {
   $opts{tag}     = ($caller =~ /([^:]*):*$/) ? $1 : 'UNKNOWN';
@@ -53,19 +56,17 @@ sub new {
  *$ph->{$_}  = $opts{$_} for @attributes;
  *$ph->{buf} = '';
 
- my $internal_pkg = Xchat::Embed::file2pkg($file);
- no warnings 'redefine';
- local *Xchat::Embed::find_pkg   = sub { $internal_pkg, $caller };
- local *HexChat::Embed::find_pkg = sub { $internal_pkg, $caller };
- Xchat::register(@opts{qw<name version banner>}, sub {
-  $ph->flush;
-  if (*$ph->{atexit_id}) {
-   my @callbacks = sort { *$ph->{atexit}{$b} <=> *$ph->{atexit}{$a} }
-                    keys %{*$ph->{atexit}};
-   $_->($ph) for @callbacks;
-  }
-  undef $ph;
- });
+ called_from_script {
+  Xchat::register(@opts{qw<name version banner>}, sub {
+   $ph->flush;
+   if (*$ph->{atexit_id}) {
+    my @callbacks = sort { *$ph->{atexit}{$b} <=> *$ph->{atexit}{$a} }
+                     keys %{*$ph->{atexit}};
+    $_->($ph) for @callbacks;
+   }
+   undef $ph;
+  })
+ };
  $ph->add_atexit($opts{unload}) if $opts{unload};
 
  $ph->print("\002", $ph->name, ' v', $ph->version,
index d851caaeb961d04e705cd3753527ff4d627cd006..0f120a543e5ed6ef38fe6f2344b530eafe99051d 100644 (file)
@@ -5,6 +5,9 @@ use warnings;
 
 use Xchat qw<:all>;
 
+use lib get_info 'xchatdir';
+use Xchat::XPI::Utils qw<called_from_script>;
+
 use constant DEFAULT_DELAY => 1000;
 
 our $VERSION = '0.04';
@@ -26,7 +29,9 @@ sub delay {
   $delay = DEFAULT_DELAY;
  }
 
- hook_timer $delay, \&_delay_cb, { data => \@_ };
+ called_from_script {
+  hook_timer $delay, \&_delay_cb, { data => \@_ }
+ }
 }
 
 sub _filter_cb {
@@ -44,7 +49,9 @@ sub _filter_cb {
 sub filter {
  my $from = shift;
 
- hook_print $from, \&_filter_cb, { data => \@_ };
+ called_from_script {
+  hook_print $from, \&_filter_cb, { data => \@_ }
+ }
 }
 
 use base qw<Exporter>;
index 96c4af30f71f4803986e8752adc3b4e0222ae828..d4823a82b622e01037ed6c0374e8f69f3d1a5999 100644 (file)
@@ -3,12 +3,15 @@ package Xchat::XPI::Net;
 use strict;
 use warnings;
 
+use Xchat qw<:all>;
+
+use lib get_info 'xchatdir';
+use Xchat::XPI::Utils qw<called_from_script>;
+
 use IO::Socket::INET;
 
 use Net::DNS;
 
-use Xchat qw<:all>;
-
 our $VERSION = '0.03';
 
 my $res;
@@ -32,10 +35,12 @@ sub resolve {
  return unless $sock;
  $sock->autoflush(1);
 
- return Xchat::hook_fd($sock, \&_dns_recv, {
-  flags => FD_READ,
-  data  => [ $callback, $args ],
- });
+ return called_from_script {
+  Xchat::hook_fd($sock, \&_dns_recv, {
+   flags => FD_READ,
+   data  => [ $callback, $args ],
+  });
+ }
 }
 
 sub _dns_recv {
@@ -107,10 +112,12 @@ sub whois {
  print $sock "$host\x0D\x0A";
  $sock->shutdown(1); # stop writing
 
- return Xchat::hook_fd($sock, \&_whois_recv, {
-  flags => FD_READ,
-  data  => [ $callback, $args ],
- });
+ return called_from_script {
+  Xchat::hook_fd($sock, \&_whois_recv, {
+   flags => FD_READ,
+   data  => [ $callback, $args ],
+  });
+ }
 }
 
 sub _whois_recv {
index ad99f0ff0162b140e40634d560a0c4a1d7fc49df..8fab3c469aae892395cf1ceec3f48bd49e1df141 100644 (file)
@@ -45,12 +45,36 @@ sub Xchat::XPI::Utils::ContextGuard::DESTROY {
  set_context ${$_[0]};
 }
 
+sub called_from_script (&) {
+ my $code  = shift;
+ my $level = 0;
+ my ($package, $filename);
+ while (1) {
+  my @frame = caller $level;
+  last unless @frame;
+  if ($frame[0] !~ /^(?:Xchat|HexChat)::XPI\b/) {
+   ($package, $filename) = @frame[0, 1];
+   last;
+  }
+  ++$level;
+ }
+ if (defined $filename) {
+  my $internal_package = Xchat::Embed::file2pkg($filename);
+  my $mock = sub { $internal_package, $package };
+  no warnings 'redefine';
+  local *Xchat::Embed::find_pkg   = $mock;
+  local *HexChat::Embed::find_pkg = $mock;
+  $code->();
+ }
+}
+
 use base qw<Exporter>;
 
 our @EXPORT         = ();
 our %EXPORT_TAGS    = ('funcs' => [ qw<
  dye_nick
  save_context local_context
+ called_from_script
 > ]);
 our @EXPORT_OK      = map { @$_ } values %EXPORT_TAGS;
 $EXPORT_TAGS{'all'} = [ @EXPORT_OK ];