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.56 by root, Sun Jan 8 05:52:42 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
487 my $htype = shift; 482 my $htype = shift;
488 483
489 if ($htype == 0) { # INIT 484 if ($htype == 0) { # INIT
490 my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl"); 485 my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl");
491 486
492 my %want_ext; 487 my %ext_arg;
493 488
494 for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) { 489 for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) {
495 if ($_ eq "default") { 490 if ($_ eq "default") {
496 $want_ext{$_}++ for qw(selection option-popup); 491 $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup);
497 } elsif (/^-(.*)$/) { 492 } elsif (/^-(.*)$/) {
498 delete $want_ext{$1}; 493 delete $ext_arg{$1};
494 } elsif (/^([^<]+)<(.*)>$/) {
495 push @{ $ext_arg{$1} }, $2;
499 } else { 496 } else {
500 $want_ext{$_}++; 497 $ext_arg{$_} ||= [];
501 } 498 }
502 } 499 }
503 500
504 for my $ext (keys %want_ext) { 501 while (my ($ext, $argv) = each %ext_arg) {
505 my @files = grep -f $_, map "$_/$ext", @dirs; 502 my @files = grep -f $_, map "$_/$ext", @dirs;
506 503
507 if (@files) { 504 if (@files) {
508 register_package extension_package $files[0]; 505 $TERM->register_package (extension_package $files[0], $argv);
509 } else { 506 } else {
510 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";
511 } 508 }
512 } 509 }
513 510
522 if $verbosity >= 10; 519 if $verbosity >= 10;
523 520
524 keys %$cb; 521 keys %$cb;
525 522
526 while (my ($pkg, $cb) = each %$cb) { 523 while (my ($pkg, $cb) = each %$cb) {
527 eval { 524 $retval = eval { $cb->($TERM->{_pkg}{$pkg}, @_) }
528 $retval = $cb->(
529 $TERM->{_pkg}{$pkg} ||= do {
530 my $proxy = bless { }, $pkg;
531 Scalar::Util::weaken ($proxy->{term} = $TERM);
532 $proxy
533 },
534 @_,
535 ) and last; 525 and last;
526
527 if ($@) {
528 $TERM->ungrab; # better to lose the grab than the session
529 warn $@;
536 }; 530 }
537 warn $@ if $@;#d#
538 } 531 }
539 } 532 }
540 533
541 if ($htype == 1) { # DESTROY 534 if ($htype == 1) { # DESTROY
542 # remove hooks if unused 535 # remove hooks if unused
570 } 563 }
571 1 564 1
572 } or die "FATAL: unable to compile method forwarder: $@"; 565 } or die "FATAL: unable to compile method forwarder: $@";
573 566
574 goto &$urxvt::term::proxy::AUTOLOAD; 567 goto &$urxvt::term::proxy::AUTOLOAD;
568}
569
570sub urxvt::term::proxy::DESTROY {
571 # nop
575} 572}
576 573
577# urxvt::destroy_hook 574# urxvt::destroy_hook
578 575
579sub urxvt::destroy_hook::DESTROY { 576sub urxvt::destroy_hook::DESTROY {
655package urxvt::term; 652package urxvt::term;
656 653
657=head2 The C<urxvt::term> Class 654=head2 The C<urxvt::term> Class
658 655
659=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}
660 681
661=item $term->destroy 682=item $term->destroy
662 683
663Destroy the terminal object (close the window, free resources etc.). 684Destroy the terminal object (close the window, free resources etc.).
664 685
898 919
899=item $lines_in_scrollback = $term->nsaved 920=item $lines_in_scrollback = $term->nsaved
900 921
901Return various integers describing terminal characteristics. 922Return various integers describing terminal characteristics.
902 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
903=item $modifiermask = $term->ModLevel3Mask 932=item $modifiermask = $term->ModLevel3Mask
904 933
905=item $modifiermask = $term->ModMetaMask 934=item $modifiermask = $term->ModMetaMask
906 935
907=item $modifiermask = $term->ModNumLockMask 936=item $modifiermask = $term->ModNumLockMask
1083 $offset / $self->{ncol} + $self->{beg}, 1112 $offset / $self->{ncol} + $self->{beg},
1084 $offset % $self->{ncol} 1113 $offset % $self->{ncol}
1085 ) 1114 )
1086} 1115}
1087 1116
1088=item ($row, $col) = $line->coord_of ($offset)
1089=item $text = $term->special_encode $string 1117=item $text = $term->special_encode $string
1090 1118
1091Converts a perl string into the special encoding used by rxvt-unicode, 1119Converts a perl string into the special encoding used by rxvt-unicode,
1092where one character corresponds to one screen cell. See 1120where one character corresponds to one screen cell. See
1093C<< $term->ROW_t >> for details. 1121C<< $term->ROW_t >> for details.
1095=item $string = $term->special_decode $text 1123=item $string = $term->special_decode $text
1096 1124
1097Converts rxvt-unicodes text reprsentation into a perl string. See 1125Converts rxvt-unicodes text reprsentation into a perl string. See
1098C<< $term->ROW_t >> for details. 1126C<< $term->ROW_t >> for details.
1099 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
1100=back 1156=back
1101 1157
1102=cut 1158=cut
1103 1159
1104package urxvt::popup; 1160package urxvt::popup;
1122} 1178}
1123 1179
1124sub add_separator { 1180sub add_separator {
1125 my ($self, $sep) = @_; 1181 my ($self, $sep) = @_;
1126 1182
1127 $sep ||= ""; 1183 $sep ||= "=";
1128 1184
1129 $self->add_item ({ 1185 $self->add_item ({
1130 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" },
1131 text => "", 1187 text => "",
1132 render => sub { $sep x $urxvt::TERM->ncol }, 1188 render => sub { $sep x $self->{term}->ncol },
1133 activate => sub { }, 1189 activate => sub { },
1134 }); 1190 });
1135} 1191}
1136 1192
1137sub add_title { 1193sub add_title {
1145} 1201}
1146 1202
1147sub add_button { 1203sub add_button {
1148 my ($self, $text, $cb) = @_; 1204 my ($self, $text, $cb) = @_;
1149 1205
1150 $self->add_item ({ type => "button", text => "[ $text ]", activate => $cb}); 1206 $self->add_item ({ type => "button", text => $text, activate => $cb});
1151} 1207}
1152 1208
1153sub add_toggle { 1209sub add_toggle {
1154 my ($self, $text, $cb, $value) = @_; 1210 my ($self, $text, $cb, $value) = @_;
1155 1211
1156 my $item; $item = { 1212 my $item; $item = {
1157 type => "button", 1213 type => "button",
1158 text => " $text", 1214 text => " $text",
1159 value => $value, 1215 value => $value,
1160 render => sub { ($item->{value} ? "* " : " ") . $text }, 1216 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1161 activate => sub { $cb->($item->{value} = !$item->{value}); }, 1217 activate => sub { $cb->($_[0]{value} = !$_[0]{value}); },
1162 }; 1218 };
1163 1219
1164 $self->add_item ($item); 1220 $self->add_item ($item);
1165} 1221}
1166 1222
1167sub show { 1223sub show {
1168 my ($self) = @_; 1224 my ($self) = @_;
1169 1225
1170 local $urxvt::popup::self = $self; 1226 local $urxvt::popup::self = $self;
1171 1227
1228 local $ENV{LC_ALL} = $self->{term}->locale;
1229
1172 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,
1173 "--transient-for" => $self->{term}->parent, 1231 "--transient-for" => $self->{term}->parent,
1232 "-display" => $self->{term}->display_id,
1174 "-pe" => "urxvt-popup") 1233 "-pe" => "urxvt-popup")
1175 or die "unable to create popup window\n"; 1234 or die "unable to create popup window\n";
1176} 1235}
1177 1236
1178sub DESTROY { 1237sub DESTROY {
1179 my ($self) = @_; 1238 my ($self) = @_;
1180 1239
1240 delete $self->{term}{_destroy}{$self};
1181 $self->{term}->ungrab; 1241 $self->{term}->ungrab;
1182} 1242}
1183 1243
1184=head2 The C<urxvt::timer> Class 1244=head2 The C<urxvt::timer> Class
1185 1245
1289This variable controls the verbosity level of the perl extension. Higher 1349This variable controls the verbosity level of the perl extension. Higher
1290numbers indicate more verbose output. 1350numbers indicate more verbose output.
1291 1351
1292=over 4 1352=over 4
1293 1353
1294=item =0 - only fatal messages 1354=item == 0 - fatal messages
1295 1355
1296=item =3 - script loading and management 1356=item >= 3 - script loading and management
1297 1357
1298=item =10 - all events received 1358=item >=10 - all events received
1299 1359
1300=back 1360=back
1301 1361
1302=head1 AUTHOR 1362=head1 AUTHOR
1303 1363

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines