ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
(Generate patch)

Comparing rxvt-unicode/src/urxvt.pm (file contents):
Revision 1.232 by sf-exg, Fri May 2 20:33:56 2014 UTC vs.
Revision 1.236 by root, Sat May 17 17:12:29 2014 UTC

288Called whenever a user-configured event is being activated (e.g. via 288Called whenever a user-configured event is being activated (e.g. via
289a C<perl:string> action bound to a key, see description of the B<keysym> 289a C<perl:string> action bound to a key, see description of the B<keysym>
290resource in the urxvt(1) manpage). 290resource in the urxvt(1) manpage).
291 291
292The event is simply the action string. This interface is going away in 292The event is simply the action string. This interface is going away in
293preference to the C<< ->register_keysym_action >> method. 293preference to the C<on_action> hook.
294 294
295=item on_resize_all_windows $term, $new_width, $new_height 295=item on_resize_all_windows $term, $new_width, $new_height
296 296
297Called just after the new window size has been calculated, but before 297Called just after the new window size has been calculated, but before
298windows are actually being resized or hints are being set. If this hook 298windows are actually being resized or hints are being set. If this hook
557sub parse_resource { 557sub parse_resource {
558 my ($term, $name, $isarg, $longopt, $flag, $value) = @_; 558 my ($term, $name, $isarg, $longopt, $flag, $value) = @_;
559 559
560 $name =~ y/-/./ if $isarg; 560 $name =~ y/-/./ if $isarg;
561 561
562 $term->scan_meta; 562 $term->scan_extensions;
563 563
564 my $r = $term->{meta}{resource}; 564 my $r = $term->{meta}{resource};
565 keys %$r; # reset iterator 565 keys %$r; # reset iterator
566 while (my ($pattern, $v) = each %$r) { 566 while (my ($pattern, $v) = each %$r) {
567 if ( 567 if (
587} 587}
588 588
589sub usage { 589sub usage {
590 my ($term, $usage_type) = @_; 590 my ($term, $usage_type) = @_;
591 591
592 $term->scan_meta; 592 $term->scan_extensions;
593 593
594 my $r = $term->{meta}{resource}; 594 my $r = $term->{meta}{resource};
595 595
596 for my $pattern (sort keys %$r) { 596 for my $pattern (sort keys %$r) {
597 my ($ext, $type, $desc) = @{ $r->{$pattern} }; 597 my ($ext, $type, $desc) = @{ $r->{$pattern} };
661 my $htype = shift; 661 my $htype = shift;
662 662
663 if ($htype == HOOK_INIT) { 663 if ($htype == HOOK_INIT) {
664 my @dirs = $TERM->perl_libdirs; 664 my @dirs = $TERM->perl_libdirs;
665 665
666 $TERM->scan_extensions;
667
666 my %ext_arg; 668 my %ext_arg;
667 669
668 { 670 {
669 my @init = @TERM_INIT; 671 my @init = @TERM_INIT;
670 @TERM_INIT = (); 672 @TERM_INIT = ();
677 for ( 679 for (
678 @{ delete $TERM->{perl_ext_3} }, 680 @{ delete $TERM->{perl_ext_3} },
679 grep $_, map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2 681 grep $_, map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2
680 ) { 682 ) {
681 if ($_ eq "default") { 683 if ($_ eq "default") {
682 $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup searchable-scrollback readline); 684
685 $ext_arg{$_} ||= []
686 for
687 qw(selection option-popup selection-popup readline),
688 map $_->[0], values %{ $TERM->{meta}{binding} };
689
683 } elsif (/^-(.*)$/) { 690 } elsif (/^-(.*)$/) {
684 delete $ext_arg{$1}; 691 delete $ext_arg{$1};
692
685 } elsif (/^([^<]+)<(.*)>$/) { 693 } elsif (/^([^<]+)<(.*)>$/) {
686 push @{ $ext_arg{$1} }, $2; 694 push @{ $ext_arg{$1} }, $2;
695
687 } else { 696 } else {
688 $ext_arg{$_} ||= []; 697 $ext_arg{$_} ||= [];
689 } 698 }
699 }
700
701 # now register default key bindings
702 while (my ($k, $v) = each %{ $TERM->{meta}{binding} }) {
703 $TERM->bind_action ($k, "$v->[0]:$v->[1]");
690 } 704 }
691 705
692 for my $ext (sort keys %ext_arg) { 706 for my $ext (sort keys %ext_arg) {
693 my @files = grep -f $_, map "$_/$ext", @dirs; 707 my @files = grep -f $_, map "$_/$ext", @dirs;
694 708
707 721
708 if (my $cb = $TERM->{_hook}[$htype]) { 722 if (my $cb = $TERM->{_hook}[$htype]) {
709 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")" 723 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")"
710 if $verbosity >= 10; 724 if $verbosity >= 10;
711 725
712 for my $pkg ( 726 if ($htype == HOOK_ACTION) {
713 # this hook is only sent to the extension with the name 727 # this hook is only sent to the extension with the name
714 # matching the first arg 728 # matching the first arg
715 $htype == HOOK_KEYBOARD_DISPATCH 729 my $pkg = shift;
716 ? exists $cb->{"urxvt::ext::$_[0]"} ? "urxvt::ext::" . shift : return undef 730 $pkg =~ y/-/_/;
717 : keys %$cb 731 $pkg = "urxvt::ext::$pkg";
732
733 $cb = $cb->{$pkg}
734 or return undef; #TODO: maybe warn user?
735
736 $cb = { $pkg => $cb };
718 ) { 737 }
738
739 for my $pkg (keys %$cb) {
719 my $retval_ = eval { $cb->{$pkg}->($TERM->{_pkg}{$pkg} || $TERM, @_) }; 740 my $retval_ = eval { $cb->{$pkg}->($TERM->{_pkg}{$pkg} || $TERM, @_) };
720 $retval ||= $retval_; 741 $retval ||= $retval_;
721 742
722 if ($@) { 743 if ($@) {
723 $TERM->ungrab; # better to lose the grab than the session 744 $TERM->ungrab; # better to lose the grab than the session
1062 $ENV{URXVT_PERL_LIB}, 1083 $ENV{URXVT_PERL_LIB},
1063 "$ENV{HOME}/.urxvt/ext", 1084 "$ENV{HOME}/.urxvt/ext",
1064 "$LIBDIR/perl" 1085 "$LIBDIR/perl"
1065} 1086}
1066 1087
1067sub scan_meta { 1088# scan for available extensions and collect their metadata
1089sub scan_extensions {
1068 my ($self) = @_; 1090 my ($self) = @_;
1091
1092 return if exists $self->{meta};
1093
1069 my @libdirs = perl_libdirs $self; 1094 my @libdirs = perl_libdirs $self;
1070 1095
1071 return if $self->{meta_libdirs} eq join "\x00", @libdirs; 1096# return if $self->{meta_libdirs} eq join "\x00", @libdirs;#d#
1072 1097
1073 my %meta;
1074
1075 $self->{meta_libdirs} = join "\x00", @libdirs; 1098# $self->{meta_libdirs} = join "\x00", @libdirs;#d#
1076 $self->{meta} = \%meta; 1099 $self->{meta} = \my %meta;
1077 1100
1101 # first gather extensions
1078 for my $dir (reverse @libdirs) { 1102 for my $dir (reverse @libdirs) {
1079 opendir my $fh, $dir 1103 opendir my $fh, $dir
1080 or next; 1104 or next;
1081 for my $ext (readdir $fh) { 1105 for my $ext (readdir $fh) {
1082 $ext !~ /^\./ 1106 $ext !~ /^\./
1083 and open my $fh, "<", "$dir/$ext" 1107 and open my $fh, "<", "$dir/$ext"
1084 or next; 1108 or next;
1085 1109
1110 my %ext = (dir => $dir);
1111
1086 while (<$fh>) { 1112 while (<$fh>) {
1087 if (/^#:META:X_RESOURCE:(.*)/) { 1113 if (/^#:META:(?:X_)?RESOURCE:(.*)/) {
1088 my ($pattern, $type, $desc) = split /:/, $1; 1114 my ($pattern, $type, $desc) = split /:/, $1;
1089 $pattern =~ s/^%(\.|$)/$ext$1/g; # % in pattern == extension name 1115 $pattern =~ s/^%(\.|$)/$ext$1/g; # % in pattern == extension name
1090 if ($pattern =~ /[^a-zA-Z0-9\-\.]/) { 1116 if ($pattern =~ /[^a-zA-Z0-9\-\.]/) {
1091 warn "$dir/$ext: meta resource '$pattern' contains illegal characters (not alphanumeric nor . nor *)\n"; 1117 warn "$dir/$ext: meta resource '$pattern' contains illegal characters (not alphanumeric nor . nor *)\n";
1092 } else { 1118 } else {
1093 $meta{resource}{$pattern} = [$ext, $type, $desc]; 1119 $ext{resource}{$pattern} = [$ext, $type, $desc];
1094 } 1120 }
1121 } elsif (/^#:META:BINDING:(.*)/) {
1122 my ($keysym, $action) = split /:/, $1;
1123 $ext{binding}{$keysym} = [$ext, $action];
1095 } elsif (/^\s*(?:#|$)/) { 1124 } elsif (/^\s*(?:#|$)/) {
1096 # skip other comments and empty lines 1125 # skip other comments and empty lines
1097 } else { 1126 } else {
1098 last; # stop parsing on first non-empty non-comment line 1127 last; # stop parsing on first non-empty non-comment line
1099 } 1128 }
1100 } 1129 }
1130
1131 $meta{ext}{$ext} = \%ext;
1101 } 1132 }
1133 }
1134
1135 # and now merge resources and bindings
1136 while (my ($k, $v) = each %{ $meta{ext} }) {
1137 #TODO: should check for extensions overriding each other
1138 %{ $meta{resource} } = (%{ $meta{resource} }, %{ $v->{resource} });
1139 %{ $meta{binding} } = (%{ $meta{binding} }, %{ $v->{binding} });
1102 } 1140 }
1103} 1141}
1104 1142
1105=item $term = new urxvt::term $envhashref, $rxvtname, [arg...] 1143=item $term = new urxvt::term $envhashref, $rxvtname, [arg...]
1106 1144
1252 my $res = &x_resource; 1290 my $res = &x_resource;
1253 1291
1254 $res =~ /^\s*(?:true|yes|on|1)\s*$/i ? 1 : defined $res && 0 1292 $res =~ /^\s*(?:true|yes|on|1)\s*$/i ? 1 : defined $res && 0
1255} 1293}
1256 1294
1257=item $success = $term->parse_keysym ($key, $octets) 1295=item $success = $term->bind_action ($key, $octets)
1258 1296
1259Adds a key binding exactly as specified via a resource. See the 1297Adds a key binding exactly as specified via a C<keysym> resource. See the
1260C<keysym> resource in the urxvt(1) manpage. 1298C<keysym> resource in the urxvt(1) manpage.
1261 1299
1262=item $rend = $term->rstyle ([$new_rstyle]) 1300=item $rend = $term->rstyle ([$new_rstyle])
1263 1301
1264Return and optionally change the current rendition. Text that is output by 1302Return and optionally change the current rendition. Text that is output by
1445=item $term->tt_write ($octets) 1483=item $term->tt_write ($octets)
1446 1484
1447Write the octets given in C<$octets> to the tty (i.e. as program input). To 1485Write the octets given in C<$octets> to the tty (i.e. as program input). To
1448pass characters instead of octets, you should convert your strings first 1486pass characters instead of octets, you should convert your strings first
1449to the locale-specific encoding using C<< $term->locale_encode >>. 1487to the locale-specific encoding using C<< $term->locale_encode >>.
1488
1489=item $term->tt_write_user_input ($octets)
1490
1491Like C<tt_write>, but should be used when writing strings in response to
1492the user pressing a key, to invokes the additional actions requested by
1493the user for that case (C<tt_write> doesn't do that).
1494
1495The typical use case would be inside C<on_action> hooks.
1450 1496
1451=item $term->tt_paste ($octets) 1497=item $term->tt_paste ($octets)
1452 1498
1453Write the octets given in C<$octets> to the tty as a paste, converting NL to 1499Write the octets given in C<$octets> to the tty as a paste, converting NL to
1454CR and bracketing the data with control sequences if bracketed paste mode 1500CR and bracketing the data with control sequences if bracketed paste mode

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines