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.57 by root, Sun Jan 8 08:43:11 2006 UTC vs.
Revision 1.68 by root, Mon Jan 9 20:00:31 2006 UTC

58 58
59=back 59=back
60 60
61=item option-popup (enabled by default) 61=item option-popup (enabled by default)
62 62
63Binds a popup menu to Ctrl-Button3 that lets you toggle (some) options at 63Binds a popup menu to Ctrl-Button2 that lets you toggle (some) options at
64runtime. 64runtime.
65
66=item selection-popup (enabled by default)
67
68Binds a popup menu to Ctrl-Button3 that lets you convert the selection
69text into various other formats/action.
65 70
66=item digital-clock 71=item digital-clock
67 72
68Displays a digital clock using the built-in overlay. 73Displays a digital clock using the built-in overlay.
69 74
200 205
201It is called before lines are scrolled out (so rows 0 .. min ($lines - 1, 206It is called before lines are scrolled out (so rows 0 .. min ($lines - 1,
202$nrow - 1) represent the lines to be scrolled out). C<$saved> is the total 207$nrow - 1) represent the lines to be scrolled out). C<$saved> is the total
203number of lines that will be in the scrollback buffer. 208number of lines that will be in the scrollback buffer.
204 209
205=item on_tty_activity $term *NYI*
206
207Called whenever the program(s) running in the urxvt window send output.
208
209=item on_osc_seq $term, $string 210=item on_osc_seq $term, $string
210 211
211Called whenever the B<ESC ] 777 ; string ST> command sequence (OSC = 212Called whenever the B<ESC ] 777 ; string ST> command sequence (OSC =
212operating system command) is processed. Cursor position and other state 213operating system command) is processed. Cursor position and other state
213information is up-to-date when this happens. For interoperability, the 214information is up-to-date when this happens. For interoperability, the
331newline. The module also overwrites the C<warn> builtin with a function 332newline. The module also overwrites the C<warn> builtin with a function
332that calls this function. 333that calls this function.
333 334
334Using this function has the advantage that its output ends up in the 335Using this function has the advantage that its output ends up in the
335correct place, e.g. on stderr of the connecting urxvtc client. 336correct place, e.g. on stderr of the connecting urxvtc client.
337
338=item $is_safe = urxvt::safe
339
340Returns true when it is safe to do potentially unsafe things, such as
341evaluating perl code specified by the user. This is true when urxvt was
342started setuid or setgid.
336 343
337=item $time = urxvt::NOW 344=item $time = urxvt::NOW
338 345
339Returns the "current time" (as per the event loop). 346Returns the "current time" (as per the event loop).
340 347
423 my $msg = join "", @_; 430 my $msg = join "", @_;
424 $msg .= "\n" 431 $msg .= "\n"
425 unless $msg =~ /\n$/; 432 unless $msg =~ /\n$/;
426 urxvt::warn ($msg); 433 urxvt::warn ($msg);
427 }; 434 };
435
436 delete $ENV{IFS};
437 delete $ENV{CDPATH};
438 delete $ENV{BASH_ENV};
439 $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin";
428} 440}
429 441
430my @hook_count; 442my @hook_count;
431my $verbosity = $ENV{URXVT_PERL_VERBOSITY}; 443my $verbosity = $ENV{URXVT_PERL_VERBOSITY};
432 444
433sub verbose { 445sub verbose {
434 my ($level, $msg) = @_; 446 my ($level, $msg) = @_;
435 warn "$msg\n" if $level <= $verbosity; 447 warn "$msg\n" if $level <= $verbosity;
436} 448}
437 449
438# find on_xxx subs in the package and register them
439# as hooks
440sub register_package($) {
441 my ($pkg) = @_;
442
443 for my $htype (0.. $#HOOKNAME) {
444 my $name = $HOOKNAME[$htype];
445
446 my $ref = $pkg->can ("on_" . lc $name)
447 or next;
448
449 $TERM->{_hook}[$htype]{$pkg} = $ref;
450 $hook_count[$htype]++
451 or set_should_invoke $htype, 1;
452 }
453}
454
455my $extension_pkg = "extension0000"; 450my $extension_pkg = "extension0000";
456my %extension_pkg; 451my %extension_pkg;
457 452
458# load a single script into its own package, once only 453# load a single script into its own package, once only
459sub extension_package($) { 454sub extension_package($) {
465 verbose 3, "loading extension '$path' into package '$pkg'"; 460 verbose 3, "loading extension '$path' into package '$pkg'";
466 461
467 open my $fh, "<:raw", $path 462 open my $fh, "<:raw", $path
468 or die "$path: $!"; 463 or die "$path: $!";
469 464
470 my $source = "package $pkg; use strict; use utf8;\n" 465 my $source = untaint "package $pkg; use strict; use utf8;\n"
471 . "use base urxvt::term::proxy::;\n" 466 . "use base urxvt::term::proxy::;\n"
472 . "#line 1 \"$path\"\n{\n" 467 . "#line 1 \"$path\"\n{\n"
473 . (do { local $/; <$fh> }) 468 . (do { local $/; <$fh> })
474 . "\n};\n1"; 469 . "\n};\n1";
475 470
476 $source =~ /(.*)/s and $source = $1; # untaint
477
478 eval $source or die "$path: $@"; 471 eval $source or die "$path: $@";
479 472
480 $pkg 473 $pkg
481 } 474 }
482} 475}
489 my $htype = shift; 482 my $htype = shift;
490 483
491 if ($htype == 0) { # INIT 484 if ($htype == 0) { # INIT
492 my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl"); 485 my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl");
493 486
494 my %want_ext; 487 my %ext_arg;
495 488
496 for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) { 489 for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) {
497 if ($_ eq "default") { 490 if ($_ eq "default") {
498 $want_ext{$_}++ for qw(selection option-popup); 491 $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup);
499 } elsif (/^-(.*)$/) { 492 } elsif (/^-(.*)$/) {
500 delete $want_ext{$1}; 493 delete $ext_arg{$1};
494 } elsif (/^([^<]+)<(.*)>$/) {
495 push @{ $ext_arg{$1} }, $2;
501 } else { 496 } else {
502 $want_ext{$_}++; 497 $ext_arg{$_} ||= [];
503 } 498 }
504 } 499 }
505 500
506 for my $ext (keys %want_ext) { 501 while (my ($ext, $argv) = each %ext_arg) {
507 my @files = grep -f $_, map "$_/$ext", @dirs; 502 my @files = grep -f $_, map "$_/$ext", @dirs;
508 503
509 if (@files) { 504 if (@files) {
510 register_package extension_package $files[0]; 505 $TERM->register_package (extension_package $files[0], $argv);
511 } else { 506 } else {
512 warn "perl extension '$ext' not found in perl library search path\n"; 507 warn "perl extension '$ext' not found in perl library search path\n";
513 } 508 }
514 } 509 }
515 510
524 if $verbosity >= 10; 519 if $verbosity >= 10;
525 520
526 keys %$cb; 521 keys %$cb;
527 522
528 while (my ($pkg, $cb) = each %$cb) { 523 while (my ($pkg, $cb) = each %$cb) {
529 eval { 524 $retval = eval { $cb->($TERM->{_pkg}{$pkg}, @_) }
530 $retval = $cb->(
531 $TERM->{_pkg}{$pkg} ||= do {
532 my $proxy = bless { }, $pkg;
533 Scalar::Util::weaken ($proxy->{term} = $TERM);
534 $proxy
535 },
536 @_,
537 ) and last; 525 and last;
526
527 if ($@) {
528 $TERM->ungrab; # better to lose the grab than the session
529 warn $@;
538 }; 530 }
539 warn $@ if $@;#d#
540 } 531 }
541 } 532 }
542 533
543 if ($htype == 1) { # DESTROY 534 if ($htype == 1) { # DESTROY
544 # remove hooks if unused 535 # remove hooks if unused
572 } 563 }
573 1 564 1
574 } or die "FATAL: unable to compile method forwarder: $@"; 565 } or die "FATAL: unable to compile method forwarder: $@";
575 566
576 goto &$urxvt::term::proxy::AUTOLOAD; 567 goto &$urxvt::term::proxy::AUTOLOAD;
568}
569
570sub urxvt::term::proxy::DESTROY {
571 # nop
577} 572}
578 573
579# urxvt::destroy_hook 574# urxvt::destroy_hook
580 575
581sub urxvt::destroy_hook::DESTROY { 576sub urxvt::destroy_hook::DESTROY {
657package urxvt::term; 652package urxvt::term;
658 653
659=head2 The C<urxvt::term> Class 654=head2 The C<urxvt::term> Class
660 655
661=over 4 656=over 4
657
658=cut
659
660# find on_xxx subs in the package and register them
661# as hooks
662sub register_package {
663 my ($self, $pkg, $argv) = @_;
664
665 my $proxy = bless { argv => $argv }, $pkg;
666 Scalar::Util::weaken ($proxy->{term} = $TERM);
667
668 $self->{_pkg}{$pkg} = $proxy;
669
670 for my $htype (0.. $#HOOKNAME) {
671 my $name = $HOOKNAME[$htype];
672
673 my $ref = $pkg->can ("on_" . lc $name)
674 or next;
675
676 $self->{_hook}[$htype]{$pkg} = $ref;
677 $hook_count[$htype]++
678 or urxvt::set_should_invoke $htype, 1;
679 }
680}
662 681
663=item $term->destroy 682=item $term->destroy
664 683
665Destroy the terminal object (close the window, free resources etc.). 684Destroy the terminal object (close the window, free resources etc.).
666 685
900 919
901=item $lines_in_scrollback = $term->nsaved 920=item $lines_in_scrollback = $term->nsaved
902 921
903Return various integers describing terminal characteristics. 922Return various integers describing terminal characteristics.
904 923
924=item $lc_ctype = $term->locale
925
926Returns the LC_CTYPE category string used by this rxvt-unicode.
927
928=item $x_display = $term->display_id
929
930Return the DISPLAY used by rxvt-unicode.
931
905=item $modifiermask = $term->ModLevel3Mask 932=item $modifiermask = $term->ModLevel3Mask
906 933
907=item $modifiermask = $term->ModMetaMask 934=item $modifiermask = $term->ModMetaMask
908 935
909=item $modifiermask = $term->ModNumLockMask 936=item $modifiermask = $term->ModNumLockMask
1085 $offset / $self->{ncol} + $self->{beg}, 1112 $offset / $self->{ncol} + $self->{beg},
1086 $offset % $self->{ncol} 1113 $offset % $self->{ncol}
1087 ) 1114 )
1088} 1115}
1089 1116
1090=item ($row, $col) = $line->coord_of ($offset)
1091=item $text = $term->special_encode $string 1117=item $text = $term->special_encode $string
1092 1118
1093Converts a perl string into the special encoding used by rxvt-unicode, 1119Converts a perl string into the special encoding used by rxvt-unicode,
1094where one character corresponds to one screen cell. See 1120where one character corresponds to one screen cell. See
1095C<< $term->ROW_t >> for details. 1121C<< $term->ROW_t >> for details.
1097=item $string = $term->special_decode $text 1123=item $string = $term->special_decode $text
1098 1124
1099Converts rxvt-unicodes text reprsentation into a perl string. See 1125Converts rxvt-unicodes text reprsentation into a perl string. See
1100C<< $term->ROW_t >> for details. 1126C<< $term->ROW_t >> for details.
1101 1127
1128=item $success = $term->grab_button ($button, $modifiermask)
1129
1130Registers a synchronous button grab. See the XGrabButton manpage.
1131
1132=item $success = $term->grab ($eventtime[, $sync])
1133
1134Calls XGrabPointer and XGrabKeyboard in asynchronous (default) or
1135synchronous (C<$sync> is true). Also remembers the grab timestampe.
1136
1137=item $term->allow_events_async
1138
1139Calls XAllowEvents with AsyncBoth for the most recent grab.
1140
1141=item $term->allow_events_sync
1142
1143Calls XAllowEvents with SyncBoth for the most recent grab.
1144
1145=item $term->allow_events_replay
1146
1147Calls XAllowEvents with both ReplayPointer and ReplayKeyboard for the most
1148recent grab.
1149
1150=item $term->ungrab
1151
1152Calls XUngrab for the most recent grab. Is called automatically on
1153evaluation errors, as it is better to lose the grab in the error case as
1154the session.
1155
1102=back 1156=back
1103 1157
1104=cut 1158=cut
1105 1159
1106package urxvt::popup; 1160package urxvt::popup;
1124} 1178}
1125 1179
1126sub add_separator { 1180sub add_separator {
1127 my ($self, $sep) = @_; 1181 my ($self, $sep) = @_;
1128 1182
1129 $sep ||= ""; 1183 $sep ||= "=";
1130 1184
1131 $self->add_item ({ 1185 $self->add_item ({
1132 rend => { normal => "\x1b[0;30;47m", hover => "\x1b[0;30;47m", active => "\x1b[0;30;47m" }, 1186 rend => { normal => "\x1b[0;30;47m", hover => "\x1b[0;30;47m", active => "\x1b[0;30;47m" },
1133 text => "", 1187 text => "",
1134 render => sub { $sep x $urxvt::TERM->ncol }, 1188 render => sub { $sep x $self->{term}->ncol },
1135 activate => sub { }, 1189 activate => sub { },
1136 }); 1190 });
1137} 1191}
1138 1192
1139sub add_title { 1193sub add_title {
1147} 1201}
1148 1202
1149sub add_button { 1203sub add_button {
1150 my ($self, $text, $cb) = @_; 1204 my ($self, $text, $cb) = @_;
1151 1205
1152 $self->add_item ({ type => "button", text => "[ $text ]", activate => $cb}); 1206 $self->add_item ({ type => "button", text => $text, activate => $cb});
1153} 1207}
1154 1208
1155sub add_toggle { 1209sub add_toggle {
1156 my ($self, $text, $cb, $value) = @_; 1210 my ($self, $text, $cb, $value) = @_;
1157 1211
1158 my $item; $item = { 1212 my $item; $item = {
1159 type => "button", 1213 type => "button",
1160 text => " $text", 1214 text => " $text",
1161 value => $value, 1215 value => $value,
1162 render => sub { ($item->{value} ? "* " : " ") . $text }, 1216 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1163 activate => sub { $cb->($item->{value} = !$item->{value}); }, 1217 activate => sub { $cb->($_[0]{value} = !$_[0]{value}); },
1164 }; 1218 };
1165 1219
1166 $self->add_item ($item); 1220 $self->add_item ($item);
1167} 1221}
1168 1222
1169sub show { 1223sub show {
1170 my ($self) = @_; 1224 my ($self) = @_;
1171 1225
1172 local $urxvt::popup::self = $self; 1226 local $urxvt::popup::self = $self;
1173 1227
1228 local $ENV{LC_ALL} = $self->{term}->locale;
1229
1174 urxvt->new ("--perl-lib" => "", "--perl-ext-common" => "", "-pty-fd" => -1, "-sl" => 0, "-b" => 0, 1230 urxvt->new ("--perl-lib" => "", "--perl-ext-common" => "", "-pty-fd" => -1, "-sl" => 0, "-b" => 0,
1175 "--transient-for" => $self->{term}->parent, 1231 "--transient-for" => $self->{term}->parent,
1232 "-display" => $self->{term}->display_id,
1176 "-pe" => "urxvt-popup") 1233 "-pe" => "urxvt-popup")
1177 or die "unable to create popup window\n"; 1234 or die "unable to create popup window\n";
1178} 1235}
1179 1236
1180sub DESTROY { 1237sub DESTROY {
1181 my ($self) = @_; 1238 my ($self) = @_;
1182 1239
1240 delete $self->{term}{_destroy}{$self};
1183 $self->{term}->ungrab; 1241 $self->{term}->ungrab;
1184} 1242}
1185 1243
1186=head2 The C<urxvt::timer> Class 1244=head2 The C<urxvt::timer> Class
1187 1245
1291This variable controls the verbosity level of the perl extension. Higher 1349This variable controls the verbosity level of the perl extension. Higher
1292numbers indicate more verbose output. 1350numbers indicate more verbose output.
1293 1351
1294=over 4 1352=over 4
1295 1353
1296=item =0 - only fatal messages 1354=item == 0 - fatal messages
1297 1355
1298=item =3 - script loading and management 1356=item >= 3 - script loading and management
1299 1357
1300=item =10 - all events received 1358=item >=10 - all events received
1301 1359
1302=back 1360=back
1303 1361
1304=head1 AUTHOR 1362=head1 AUTHOR
1305 1363

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines