--- rxvt-unicode/src/urxvt.pm 2006/01/19 21:02:06 1.112 +++ rxvt-unicode/src/urxvt.pm 2006/01/20 10:27:08 1.113 @@ -325,7 +325,13 @@ =item on_start $term Called at the very end of initialisation of a new terminal, just before -returning to the mainloop. +trying to map (display) the toplevel and returning to the mainloop. + +=item on_destroy $term + +Called whenever something tries to destroy terminal, before doing anything +yet. If this hook returns true, then destruction is skipped, but this is +rarely a good idea. =item on_reset $term @@ -501,6 +507,8 @@ our $VERSION = 1; our $TERM; +our @TERM_INIT; +our @TERM_EXT; our @HOOKNAME; our %HOOKTYPE = map +($HOOKNAME[$_] => $_), 0..$#HOOKNAME; our %OPTION; @@ -532,6 +540,22 @@ The current terminal. This variable stores the current C object, whenever a callback/hook is executing. +=item @urxvt::TERM_INIT + +All coderefs in this array will be called as methods of the next newly +created C object (during the C phase). The array +gets cleared before the codereferences that were in it are being executed, +so coderefs can push themselves onto it again if they so desire. + +This complements to the perl-eval commandline option, but gets executed +first. + +=item @urxvt::TERM_EXT + +Works similar to C<@TERM_INIT>, but contains perl package/class names, which +get registered as normal extensions after calling the hooks in C<@TERM_INIT> +but before other extensions. Gets cleared just like C<@TERM_INIT>. + =back =head2 Functions in the C Package @@ -662,8 +686,6 @@ sub extension_package($) { my ($path) = @_; - no strict 'refs'; - $extension_pkg{$path} ||= do { $path =~ /([^\/\\]+)$/; my $pkg = $1; @@ -675,8 +697,6 @@ open my $fh, "<:raw", $path or die "$path: $!"; - @{"$pkg\::ISA"} = urxvt::term::extension::; - my $source = "package $pkg; use strict; use utf8;\n" . "#line 1 \"$path\"\n{\n" @@ -702,7 +722,16 @@ my %ext_arg; - for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) { + { + my @init = @TERM_INIT; + @TERM_INIT = (); + $_->($TERM) for @init; + my @pkg = @TERM_EXT; + @TERM_EXT = (); + $TERM->register_package ($_) for @pkg; + } + + for (grep $_, map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) { if ($_ eq "default") { $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup searchable-scrollback); } elsif (/^-(.*)$/) { @@ -737,7 +766,8 @@ keys %$cb; while (my ($pkg, $cb) = each %$cb) { - $retval ||= eval { $cb->($TERM->{_pkg}{$pkg}, @_) }; + my $retval_ = eval { $cb->($TERM->{_pkg}{$pkg}, @_) }; + $retval ||= $retval_; if ($@) { $TERM->ungrab; # better to lose the grab than the session @@ -906,6 +936,12 @@ sub register_package { my ($self, $pkg, $argv) = @_; + no strict 'refs'; + + urxvt::verbose 6, "register package $pkg to $self"; + + @{"$pkg\::ISA"} = urxvt::term::extension::; + my $proxy = bless { _pkg => $pkg, argv => $argv, @@ -1641,6 +1677,15 @@ =back +=cut + +package urxvt::watcher; + +@urxvt::timer::ISA = __PACKAGE__; +@urxvt::iow::ISA = __PACKAGE__; +@urxvt::pw::ISA = __PACKAGE__; +@urxvt::iw::ISA = __PACKAGE__; + =head2 The C Class This class implements timer watchers/events. Time is represented as a