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.222 by root, Sat Jul 7 07:00:17 2012 UTC vs.
Revision 1.243 by sf-exg, Sat Oct 11 22:02:50 2014 UTC

1=encoding utf8 1=encoding utf8
2 2
3=head1 NAME 3=head1 NAME
4 4
5@@RXVT_NAME@@perl - rxvt-unicode's embedded perl interpreter 5urxvtperl - rxvt-unicode's embedded perl interpreter
6 6
7=head1 SYNOPSIS 7=head1 SYNOPSIS
8 8
9 # create a file grab_test in $HOME: 9 # create a file grab_test in $HOME:
10 10
11 sub on_sel_grab { 11 sub on_sel_grab {
12 warn "you selected ", $_[0]->selection; 12 warn "you selected ", $_[0]->selection;
13 () 13 ()
14 } 14 }
15 15
16 # start a @@RXVT_NAME@@ using it: 16 # start a urxvt using it:
17 17
18 @@RXVT_NAME@@ --perl-lib $HOME -pe grab_test 18 urxvt --perl-lib $HOME -pe grab_test
19 19
20=head1 DESCRIPTION 20=head1 DESCRIPTION
21 21
22Every time a terminal object gets created, extension scripts specified via 22Every time a terminal object gets created, extension scripts specified via
23the C<perl> resource are loaded and associated with it. 23the C<perl> resource are loaded and associated with it.
24 24
25Scripts are compiled in a 'use strict "vars"' and 'use utf8' environment, and 25Scripts are compiled in a 'use strict "vars"' and 'use utf8' environment, and
26thus must be encoded as UTF-8. 26thus must be encoded as UTF-8.
27 27
28Each script will only ever be loaded once, even in @@RXVT_NAME@@d, where 28Each script will only ever be loaded once, even in urxvtd, where
29scripts will be shared (but not enabled) for all terminals. 29scripts will be shared (but not enabled) for all terminals.
30 30
31You can disable the embedded perl interpreter by setting both "perl-ext" 31You can disable the embedded perl interpreter by setting both "perl-ext"
32and "perl-ext-common" resources to the empty string. 32and "perl-ext-common" resources to the empty string.
33 33
34=head1 PREPACKAGED EXTENSIONS 34=head1 PREPACKAGED EXTENSIONS
35 35
36A number of extensions are delivered with this release. You can find them 36A number of extensions are delivered with this release. You can find them
37in F<@@RXVT_LIBDIR@@/urxvt/perl/>, and the documentation can be viewed 37in F<< <libdir>/urxvt/perl/ >>, and the documentation can be viewed using
38using F<< man urxvt-<EXTENSIONNAME> >>. 38F<< man urxvt-<EXTENSIONNAME> >>.
39 39
40You can activate them like this: 40You can activate them like this:
41 41
42 @@RXVT_NAME@@ -pe <extensionname> 42 urxvt -pe <extensionname>
43 43
44Or by adding them to the resource for extensions loaded by default: 44Or by adding them to the resource for extensions loaded by default:
45 45
46 URxvt.perl-ext-common: default,selection-autotransform 46 URxvt.perl-ext-common: default,selection-autotransform
47 47
48Extensions that add command line parameters or resources on their own are 48Extensions may add resources on their own. Similarly to builtin
49loaded automatically when used. 49resources, these resources can also be specified on the command line
50as long options (with '.' replaced by '-'), in which case the
51corresponding extension is loaded automatically.
50 52
51=head1 API DOCUMENTATION 53=head1 API DOCUMENTATION
52 54
53=head2 General API Considerations 55=head2 General API Considerations
54 56
281 283
282=item on_refresh_end $term 284=item on_refresh_end $term
283 285
284Called just after the screen gets redrawn. See C<on_refresh_begin>. 286Called just after the screen gets redrawn. See C<on_refresh_begin>.
285 287
286=item on_user_command $term, $string 288=item on_user_command $term, $string *DEPRECATED*
287 289
288Called whenever a user-configured event is being activated (e.g. via 290Called 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> 291a C<perl:string> action bound to a key, see description of the B<keysym>
290resource in the @@RXVT_NAME@@(1) manpage). 292resource in the urxvt(1) manpage).
291 293
292The event is simply the action string. This interface is assumed to change 294The event is simply the action string. This interface is going away in
293slightly in the future. 295preference to the C<on_action> hook.
294
295=item on_register_command $term, $keysym, $modifiermask, $string
296
297Called after parsing a keysym resource but before registering the
298associated binding. If this hook returns TRUE the binding is not
299registered. It can be used to modify a binding by calling
300C<register_command>.
301 296
302=item on_resize_all_windows $term, $new_width, $new_height 297=item on_resize_all_windows $term, $new_width, $new_height
303 298
304Called just after the new window size has been calculated, but before 299Called just after the new window size has been calculated, but before
305windows are actually being resized or hints are being set. If this hook 300windows are actually being resized or hints are being set. If this hook
306returns TRUE, setting of the window hints is being skipped. 301returns a true value, setting of the window hints is being skipped.
307 302
308=item on_x_event $term, $event 303=item on_x_event $term, $event
309 304
310Called on every X event received on the vt window (and possibly other 305Called on every X event received on the vt window (and possibly other
311windows). Should only be used as a last resort. Most event structure 306windows). Should only be used as a last resort. Most event structure
350manpage), with the additional members C<row> and C<col>, which are the 345manpage), with the additional members C<row> and C<col>, which are the
351(real, not screen-based) row and column under the mouse cursor. 346(real, not screen-based) row and column under the mouse cursor.
352 347
353C<on_key_press> additionally receives the string rxvt-unicode would 348C<on_key_press> additionally receives the string rxvt-unicode would
354output, if any, in locale-specific encoding. 349output, if any, in locale-specific encoding.
355
356subwindow.
357 350
358=item on_client_message $term, $event 351=item on_client_message $term, $event
359 352
360=item on_wm_protocols $term, $event 353=item on_wm_protocols $term, $event
361 354
564no warnings 'utf8'; 557no warnings 'utf8';
565 558
566sub parse_resource { 559sub parse_resource {
567 my ($term, $name, $isarg, $longopt, $flag, $value) = @_; 560 my ($term, $name, $isarg, $longopt, $flag, $value) = @_;
568 561
569 $name =~ y/-/./ if $isarg;
570
571 $term->scan_meta; 562 $term->scan_extensions;
572 563
573 my $r = $term->{meta}{resource}; 564 my $r = $term->{meta}{resource};
574 keys %$r; # reste iterator 565 keys %$r; # reset iterator
575 while (my ($pattern, $v) = each %$r) { 566 while (my ($k, $v) = each %$r) {
576 if ( 567 my $pattern = $k;
568 $pattern =~ y/./-/ if $isarg;
569 my $prefix = $name;
570 my $suffix;
577 $pattern =~ /\.$/ 571 if ($pattern =~ /\-$/) {
578 ? $pattern eq substr $name, 0, length $pattern 572 $prefix = substr $name, 0, length $pattern;
579 : $pattern eq $name 573 $suffix = substr $name, length $pattern;
580 ) { 574 }
575 if ($pattern eq $prefix) {
581 $name = "$urxvt::RESCLASS.$name"; 576 $name = "$urxvt::RESCLASS.$k$suffix";
582 577
583 push @{ $term->{perl_ext_3} }, $v->[0]; 578 push @{ $term->{perl_ext_3} }, $v->[0];
584 579
585 if ($v->[1] eq "boolean") { 580 if ($v->[1] eq "boolean") {
586 $term->put_option_db ($name, $flag ? "true" : "false"); 581 $term->put_option_db ($name, $flag ? "true" : "false");
596} 591}
597 592
598sub usage { 593sub usage {
599 my ($term, $usage_type) = @_; 594 my ($term, $usage_type) = @_;
600 595
601 $term->scan_meta; 596 $term->scan_extensions;
602 597
603 my $r = $term->{meta}{resource}; 598 my $r = $term->{meta}{resource};
604 599
605 for my $pattern (sort keys %$r) { 600 for my $pattern (sort keys %$r) {
606 my ($ext, $type, $desc) = @{ $r->{$pattern} }; 601 my ($ext, $type, $desc) = @{ $r->{$pattern} };
667# called by the rxvt core 662# called by the rxvt core
668sub invoke { 663sub invoke {
669 local $TERM = shift; 664 local $TERM = shift;
670 my $htype = shift; 665 my $htype = shift;
671 666
672 if ($htype == 0) { # INIT 667 if ($htype == HOOK_INIT) {
673 my @dirs = $TERM->perl_libdirs; 668 my @dirs = $TERM->perl_libdirs;
669
670 $TERM->scan_extensions;
674 671
675 my %ext_arg; 672 my %ext_arg;
676 673
677 { 674 {
678 my @init = @TERM_INIT; 675 my @init = @TERM_INIT;
682 @TERM_EXT = (); 679 @TERM_EXT = ();
683 $TERM->register_package ($_) for @pkg; 680 $TERM->register_package ($_) for @pkg;
684 } 681 }
685 682
686 for ( 683 for (
684 (grep $_, map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2),
687 @{ delete $TERM->{perl_ext_3} }, 685 @{ delete $TERM->{perl_ext_3} }
688 grep $_, map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2
689 ) { 686 ) {
690 if ($_ eq "default") { 687 if ($_ eq "default") {
691 $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup searchable-scrollback readline); 688
689 $ext_arg{$_} = []
690 for
691 qw(selection option-popup selection-popup readline),
692 map $_->[0], values %{ $TERM->{meta}{binding} };
693
694 for ($TERM->_keysym_resources) {
695 next if /^(?:string|command|builtin|builtin-string|perl)/;
696 next unless /^([A-Za-z0-9_\-]+):/;
697
698 my $ext = $1;
699
700 $ext_arg{$ext} = [];
701 }
702
692 } elsif (/^-(.*)$/) { 703 } elsif (/^-(.*)$/) {
693 delete $ext_arg{$1}; 704 delete $ext_arg{$1};
705
694 } elsif (/^([^<]+)<(.*)>$/) { 706 } elsif (/^([^<]+)<(.*)>$/) {
695 push @{ $ext_arg{$1} }, $2; 707 push @{ $ext_arg{$1} }, $2;
708
696 } else { 709 } else {
697 $ext_arg{$_} ||= []; 710 $ext_arg{$_} ||= [];
711 }
712 }
713
714 # now register default key bindings
715 for my $ext (sort keys %ext_arg) {
716 while (my ($k, $v) = each %{ $TERM->{meta}{ext}{$ext}{binding} }) {
717 $TERM->bind_action ($k, "$v->[0]:$v->[1]");
698 } 718 }
699 } 719 }
700 720
701 for my $ext (sort keys %ext_arg) { 721 for my $ext (sort keys %ext_arg) {
702 my @files = grep -f $_, map "$_/$ext", @dirs; 722 my @files = grep -f $_, map "$_/$ext", @dirs;
716 736
717 if (my $cb = $TERM->{_hook}[$htype]) { 737 if (my $cb = $TERM->{_hook}[$htype]) {
718 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")" 738 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")"
719 if $verbosity >= 10; 739 if $verbosity >= 10;
720 740
741 if ($htype == HOOK_ACTION) {
742 # this hook is only sent to the extension with the name
743 # matching the first arg
744 my $pkg = shift;
745 $pkg =~ y/-/_/;
746 $pkg = "urxvt::ext::$pkg";
747
748 $cb = $cb->{$pkg}
749 or return undef; #TODO: maybe warn user?
750
751 $cb = { $pkg => $cb };
752 }
753
721 for my $pkg (keys %$cb) { 754 for my $pkg (keys %$cb) {
722 my $retval_ = eval { $cb->{$pkg}->($TERM->{_pkg}{$pkg} || $TERM, @_) }; 755 my $retval_ = eval { $cb->{$pkg}->($TERM->{_pkg}{$pkg} || $TERM, @_) };
723 $retval ||= $retval_; 756 $retval ||= $retval_;
724 757
725 if ($@) { 758 if ($@) {
730 763
731 verbose 11, "$HOOKNAME[$htype] returning <$retval>" 764 verbose 11, "$HOOKNAME[$htype] returning <$retval>"
732 if $verbosity >= 11; 765 if $verbosity >= 11;
733 } 766 }
734 767
735 if ($htype == 1) { # DESTROY 768 if ($htype == HOOK_DESTROY) {
736 # clear package objects 769 # clear package objects
737 %$_ = () for values %{ $TERM->{_pkg} }; 770 %$_ = () for values %{ $TERM->{_pkg} };
738 771
739 # clear package 772 # clear package
740 %$TERM = (); 773 %$TERM = ();
827} 860}
828 861
829=item $self->enable ($hook_name => $cb[, $hook_name => $cb..]) 862=item $self->enable ($hook_name => $cb[, $hook_name => $cb..])
830 863
831Dynamically enable the given hooks (named without the C<on_> prefix) for 864Dynamically enable the given hooks (named without the C<on_> prefix) for
832this extension, replacing any previous hook. This is useful when you want 865this extension, replacing any hook previously installed via C<enable> in
833to overwrite time-critical hooks only temporarily. 866this extension.
867
868This is useful when you want to overwrite time-critical hooks only
869temporarily.
834 870
835To install additional callbacks for the same hook, you can use the C<on> 871To install additional callbacks for the same hook, you can use the C<on>
836method of the C<urxvt::term> class. 872method of the C<urxvt::term> class.
837 873
838=item $self->disable ($hook_name[, $hook_name..]) 874=item $self->disable ($hook_name[, $hook_name..])
881=cut 917=cut
882 918
883sub urxvt::extension::on_disable::DESTROY { 919sub urxvt::extension::on_disable::DESTROY {
884 my $disable = shift; 920 my $disable = shift;
885 921
886 my $self = delete $disable->{""}; 922 my $term = delete $disable->{""};
887 923
888 while (my ($htype, $id) = each %$disable) { 924 while (my ($htype, $id) = each %$disable) {
889 delete $self->{_hook}[$htype]{$id}; 925 delete $term->{_hook}[$htype]{$id};
890 $self->set_should_invoke ($htype, -1); 926 $term->set_should_invoke ($htype, -1);
891 } 927 }
892} 928}
893 929
894sub on { 930sub on {
895 my ($self, %hook) = @_; 931 my ($self, %hook) = @_;
896 932
933 my $term = $self->{term};
934
897 my %disable = ( "" => $self ); 935 my %disable = ( "" => $term );
898 936
899 while (my ($name, $cb) = each %hook) { 937 while (my ($name, $cb) = each %hook) {
900 my $htype = $HOOKTYPE{uc $name}; 938 my $htype = $HOOKTYPE{uc $name};
901 defined $htype 939 defined $htype
902 or Carp::croak "unsupported hook type '$name'"; 940 or Carp::croak "unsupported hook type '$name'";
903 941
904 my $id = $cb+0;
905
906 $self->set_should_invoke ($htype, +1); 942 $term->set_should_invoke ($htype, +1);
907 $disable{$htype} = $id; 943 $term->{_hook}[$htype]{ $disable{$htype} = $cb+0 }
908 $self->{_hook}[$htype]{$id} = sub { shift; $cb->($self, @_) }; # very ugly indeed 944 = sub { shift; $cb->($self, @_) }; # very ugly indeed
909 } 945 }
910 946
911 bless \%disable, "urxvt::extension::on_disable" 947 bless \%disable, "urxvt::extension::on_disable"
912} 948}
913 949
1062 $ENV{URXVT_PERL_LIB}, 1098 $ENV{URXVT_PERL_LIB},
1063 "$ENV{HOME}/.urxvt/ext", 1099 "$ENV{HOME}/.urxvt/ext",
1064 "$LIBDIR/perl" 1100 "$LIBDIR/perl"
1065} 1101}
1066 1102
1067sub scan_meta { 1103# scan for available extensions and collect their metadata
1104sub scan_extensions {
1068 my ($self) = @_; 1105 my ($self) = @_;
1106
1107 return if exists $self->{meta};
1108
1069 my @libdirs = perl_libdirs $self; 1109 my @libdirs = perl_libdirs $self;
1070 1110
1071 return if $self->{meta_libdirs} eq join "\x00", @libdirs; 1111# return if $self->{meta_libdirs} eq join "\x00", @libdirs;#d#
1072 1112
1073 my %meta;
1074
1075 $self->{meta_libdirs} = join "\x00", @libdirs; 1113# $self->{meta_libdirs} = join "\x00", @libdirs;#d#
1076 $self->{meta} = \%meta; 1114 $self->{meta} = \my %meta;
1077 1115
1116 # first gather extensions
1078 for my $dir (reverse @libdirs) { 1117 for my $dir (reverse @libdirs) {
1079 opendir my $fh, $dir 1118 opendir my $fh, $dir
1080 or next; 1119 or next;
1081 for my $ext (readdir $fh) { 1120 for my $ext (readdir $fh) {
1082 $ext ne "." 1121 $ext !~ /^\./
1083 and $ext ne ".."
1084 and open my $fh, "<", "$dir/$ext" 1122 and open my $fh, "<", "$dir/$ext"
1085 or next; 1123 or next;
1086 1124
1125 my %ext = (dir => $dir);
1126
1087 while (<$fh>) { 1127 while (<$fh>) {
1088 if (/^#:META:X_RESOURCE:(.*)/) { 1128 if (/^#:META:(?:X_)?RESOURCE:(.*)/) {
1089 my ($pattern, $type, $desc) = split /:/, $1; 1129 my ($pattern, $type, $desc) = split /:/, $1;
1090 $pattern =~ s/^%(\.|$)/$ext$1/g; # % in pattern == extension name 1130 $pattern =~ s/^%(\.|$)/$ext$1/g; # % in pattern == extension name
1091 if ($pattern =~ /[^a-zA-Z0-9\-\.]/) { 1131 if ($pattern =~ /[^a-zA-Z0-9\-\.]/) {
1092 warn "$dir/$ext: meta resource '$pattern' contains illegal characters (not alphanumeric nor . nor *)\n"; 1132 warn "$dir/$ext: meta resource '$pattern' contains illegal characters (not alphanumeric nor . nor *)\n";
1093 } else { 1133 } else {
1094 $meta{resource}{$pattern} = [$ext, $type, $desc]; 1134 $ext{resource}{$pattern} = [$ext, $type, $desc];
1095 } 1135 }
1136 } elsif (/^#:META:BINDING:(.*)/) {
1137 my ($keysym, $action) = split /:/, $1;
1138 $ext{binding}{$keysym} = [$ext, $action];
1096 } elsif (/^\s*(?:#|$)/) { 1139 } elsif (/^\s*(?:#|$)/) {
1097 # skip other comments and empty lines 1140 # skip other comments and empty lines
1098 } else { 1141 } else {
1099 last; # stop parsing on first non-empty non-comment line 1142 last; # stop parsing on first non-empty non-comment line
1100 } 1143 }
1101 } 1144 }
1145
1146 $meta{ext}{$ext} = \%ext;
1102 } 1147 }
1148 }
1149
1150 # and now merge resources and bindings
1151 while (my ($k, $v) = each %{ $meta{ext} }) {
1152 #TODO: should check for extensions overriding each other
1153 %{ $meta{resource} } = (%{ $meta{resource} }, %{ $v->{resource} });
1154 %{ $meta{binding} } = (%{ $meta{binding} }, %{ $v->{binding} });
1103 } 1155 }
1104} 1156}
1105 1157
1106=item $term = new urxvt::term $envhashref, $rxvtname, [arg...] 1158=item $term = new urxvt::term $envhashref, $rxvtname, [arg...]
1107 1159
1127} 1179}
1128 1180
1129=item $term->destroy 1181=item $term->destroy
1130 1182
1131Destroy the terminal object (close the window, free resources 1183Destroy the terminal object (close the window, free resources
1132etc.). Please note that @@RXVT_NAME@@ will not exit as long as any event 1184etc.). Please note that urxvt will not exit as long as any event
1133watchers (timers, io watchers) are still active. 1185watchers (timers, io watchers) are still active.
1134 1186
1135=item $term->exec_async ($cmd[, @args]) 1187=item $term->exec_async ($cmd[, @args])
1136 1188
1137Works like the combination of the C<fork>/C<exec> builtins, which executes 1189Works like the combination of the C<fork>/C<exec> builtins, which executes
1223Returns the X-Resource for the given pattern, excluding the program or 1275Returns the X-Resource for the given pattern, excluding the program or
1224class name, i.e. C<< $term->x_resource ("boldFont") >> should return the 1276class name, i.e. C<< $term->x_resource ("boldFont") >> should return the
1225same value as used by this instance of rxvt-unicode. Returns C<undef> if no 1277same value as used by this instance of rxvt-unicode. Returns C<undef> if no
1226resource with that pattern exists. 1278resource with that pattern exists.
1227 1279
1228Extensions that define extra resource or command line arguments also need 1280Extensions that define extra resources also need to call this method
1229to call this method to access their values. 1281to access their values.
1230 1282
1231If the method is called on an extension object (basically, from an 1283If the method is called on an extension object (basically, from an
1232extension), then the special prefix C<%.> will be replaced by the name of 1284extension), then the special prefix C<%.> will be replaced by the name of
1233the extension and a dot, and the lone string C<%> will be replaced by the 1285the extension and a dot, and the lone string C<%> will be replaced by the
1234extension name itself. This makes it possible to code extensions so you 1286extension name itself. This makes it possible to code extensions so you
1253 my $res = &x_resource; 1305 my $res = &x_resource;
1254 1306
1255 $res =~ /^\s*(?:true|yes|on|1)\s*$/i ? 1 : defined $res && 0 1307 $res =~ /^\s*(?:true|yes|on|1)\s*$/i ? 1 : defined $res && 0
1256} 1308}
1257 1309
1258=item $success = $term->parse_keysym ($key, $octets) 1310=item $success = $term->bind_action ($key, $octets)
1259 1311
1260Adds a key binding exactly as specified via a resource. See the 1312Adds a key binding exactly as specified via a C<keysym> resource. See the
1261C<keysym> resource in the @@RXVT_NAME@@(1) manpage. 1313C<keysym> resource in the urxvt(1) manpage.
1262
1263=item $term->register_command ($keysym, $modifiermask, $string)
1264
1265Adds a key binding. This is a lower level api compared to
1266C<parse_keysym>, as it expects a parsed key description, and can be
1267used only inside either the C<on_init> hook, to add a binding, or the
1268C<on_register_command> hook, to modify a parsed binding.
1269 1314
1270=item $rend = $term->rstyle ([$new_rstyle]) 1315=item $rend = $term->rstyle ([$new_rstyle])
1271 1316
1272Return and optionally change the current rendition. Text that is output by 1317Return and optionally change the current rendition. Text that is output by
1273the terminal application will use this style. 1318the terminal application will use this style.
1453=item $term->tt_write ($octets) 1498=item $term->tt_write ($octets)
1454 1499
1455Write the octets given in C<$octets> to the tty (i.e. as program input). To 1500Write the octets given in C<$octets> to the tty (i.e. as program input). To
1456pass characters instead of octets, you should convert your strings first 1501pass characters instead of octets, you should convert your strings first
1457to the locale-specific encoding using C<< $term->locale_encode >>. 1502to the locale-specific encoding using C<< $term->locale_encode >>.
1503
1504=item $term->tt_write_user_input ($octets)
1505
1506Like C<tt_write>, but should be used when writing strings in response to
1507the user pressing a key, to invoke the additional actions requested by
1508the user for that case (C<tt_write> doesn't do that).
1509
1510The typical use case would be inside C<on_action> hooks.
1458 1511
1459=item $term->tt_paste ($octets) 1512=item $term->tt_paste ($octets)
1460 1513
1461Write the octets given in C<$octets> to the tty as a paste, converting NL to 1514Write the octets given in C<$octets> to the tty as a paste, converting NL to
1462CR and bracketing the data with control sequences if bracketed paste mode 1515CR and bracketing the data with control sequences if bracketed paste mode
1696} 1749}
1697 1750
1698sub urxvt::line::t { 1751sub urxvt::line::t {
1699 my ($self) = @_; 1752 my ($self) = @_;
1700 1753
1701 if (@_ > 1) 1754 if (@_ > 1) {
1702 {
1703 $self->{term}->ROW_t ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol}) 1755 $self->{term}->ROW_t ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1704 for $self->{beg} .. $self->{end}; 1756 for $self->{beg} .. $self->{end};
1705 } 1757 }
1706 1758
1707 defined wantarray && 1759 defined wantarray &&
1708 substr +(join "", map $self->{term}->ROW_t ($_), $self->{beg} .. $self->{end}), 1760 substr +(join "", map $self->{term}->ROW_t ($_), $self->{beg} .. $self->{end}),
1709 0, $self->{len} 1761 0, $self->{len}
1710} 1762}
1711 1763
1712sub urxvt::line::r { 1764sub urxvt::line::r {
1713 my ($self) = @_; 1765 my ($self) = @_;
1714 1766
1715 if (@_ > 1) 1767 if (@_ > 1) {
1716 {
1717 $self->{term}->ROW_r ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol}) 1768 $self->{term}->ROW_r ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1718 for $self->{beg} .. $self->{end}; 1769 for $self->{beg} .. $self->{end};
1719 } 1770 }
1720 1771
1721 if (defined wantarray) { 1772 if (defined wantarray) {
1722 my $rend = [ 1773 my $rend = [
1723 map @{ $self->{term}->ROW_r ($_) }, $self->{beg} .. $self->{end} 1774 map @{ $self->{term}->ROW_r ($_) }, $self->{beg} .. $self->{end}
1724 ]; 1775 ];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines