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.55 by root, Sun Jan 8 05:50:27 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
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;
575} 568}
576 569
570sub urxvt::term::proxy::DESTROY {
571 # nop
572}
573
577# urxvt::destroy_hook 574# urxvt::destroy_hook
578 575
579sub urxvt::destroy_hook::DESTROY { 576sub urxvt::destroy_hook::DESTROY {
580 ${$_[0]}->(); 577 ${$_[0]}->();
581} 578}
582 579
583sub urxvt::destroy_hook(&) { 580sub urxvt::destroy_hook(&) {
584 bless \shift, urxvt::destroy_hook:: 581 bless \shift, urxvt::destroy_hook::
585} 582}
586 583
587# urxvt::anyevent
588
589package urxvt::anyevent; 584package urxvt::anyevent;
585
586=head2 The C<urxvt::anyevent> Class
587
588The sole purpose of this class is to deliver an interface to the
589C<AnyEvent> module - any module using it will work inside urxvt without
590further work. The only exception is that you cannot wait on condition
591variables, but non-blocking condvar use is ok. What this means is that you
592cannot use blocking APIs, but the non-blocking variant should work.
593
594=cut
590 595
591our $VERSION = 1; 596our $VERSION = 1;
592 597
593$INC{"urxvt/anyevent.pm"} = 1; # mark us as there 598$INC{"urxvt/anyevent.pm"} = 1; # mark us as there
594push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::]; 599push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
647package urxvt::term; 652package urxvt::term;
648 653
649=head2 The C<urxvt::term> Class 654=head2 The C<urxvt::term> Class
650 655
651=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}
652 681
653=item $term->destroy 682=item $term->destroy
654 683
655Destroy the terminal object (close the window, free resources etc.). 684Destroy the terminal object (close the window, free resources etc.).
656 685
890 919
891=item $lines_in_scrollback = $term->nsaved 920=item $lines_in_scrollback = $term->nsaved
892 921
893Return various integers describing terminal characteristics. 922Return various integers describing terminal characteristics.
894 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
895=item $modifiermask = $term->ModLevel3Mask 932=item $modifiermask = $term->ModLevel3Mask
896 933
897=item $modifiermask = $term->ModMetaMask 934=item $modifiermask = $term->ModMetaMask
898 935
899=item $modifiermask = $term->ModNumLockMask 936=item $modifiermask = $term->ModNumLockMask
1075 $offset / $self->{ncol} + $self->{beg}, 1112 $offset / $self->{ncol} + $self->{beg},
1076 $offset % $self->{ncol} 1113 $offset % $self->{ncol}
1077 ) 1114 )
1078} 1115}
1079 1116
1080=item ($row, $col) = $line->coord_of ($offset)
1081=item $text = $term->special_encode $string 1117=item $text = $term->special_encode $string
1082 1118
1083Converts a perl string into the special encoding used by rxvt-unicode, 1119Converts a perl string into the special encoding used by rxvt-unicode,
1084where one character corresponds to one screen cell. See 1120where one character corresponds to one screen cell. See
1085C<< $term->ROW_t >> for details. 1121C<< $term->ROW_t >> for details.
1087=item $string = $term->special_decode $text 1123=item $string = $term->special_decode $text
1088 1124
1089Converts rxvt-unicodes text reprsentation into a perl string. See 1125Converts rxvt-unicodes text reprsentation into a perl string. See
1090C<< $term->ROW_t >> for details. 1126C<< $term->ROW_t >> for details.
1091 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
1092=back 1156=back
1093 1157
1094=cut 1158=cut
1095 1159
1096package urxvt::popup; 1160package urxvt::popup;
1114} 1178}
1115 1179
1116sub add_separator { 1180sub add_separator {
1117 my ($self, $sep) = @_; 1181 my ($self, $sep) = @_;
1118 1182
1119 $sep ||= ""; 1183 $sep ||= "=";
1120 1184
1121 $self->add_item ({ 1185 $self->add_item ({
1122 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" },
1123 text => "", 1187 text => "",
1124 render => sub { $sep x $urxvt::TERM->ncol }, 1188 render => sub { $sep x $self->{term}->ncol },
1125 activate => sub { }, 1189 activate => sub { },
1126 }); 1190 });
1127} 1191}
1128 1192
1129sub add_title { 1193sub add_title {
1137} 1201}
1138 1202
1139sub add_button { 1203sub add_button {
1140 my ($self, $text, $cb) = @_; 1204 my ($self, $text, $cb) = @_;
1141 1205
1142 $self->add_item ({ type => "button", text => "[ $text ]", activate => $cb}); 1206 $self->add_item ({ type => "button", text => $text, activate => $cb});
1143} 1207}
1144 1208
1145sub add_toggle { 1209sub add_toggle {
1146 my ($self, $text, $cb, $value) = @_; 1210 my ($self, $text, $cb, $value) = @_;
1147 1211
1148 my $item; $item = { 1212 my $item; $item = {
1149 type => "button", 1213 type => "button",
1150 text => " $text", 1214 text => " $text",
1151 value => $value, 1215 value => $value,
1152 render => sub { ($item->{value} ? "* " : " ") . $text }, 1216 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1153 activate => sub { $cb->($item->{value} = !$item->{value}); }, 1217 activate => sub { $cb->($_[0]{value} = !$_[0]{value}); },
1154 }; 1218 };
1155 1219
1156 $self->add_item ($item); 1220 $self->add_item ($item);
1157} 1221}
1158 1222
1159sub show { 1223sub show {
1160 my ($self) = @_; 1224 my ($self) = @_;
1161 1225
1162 local $urxvt::popup::self = $self; 1226 local $urxvt::popup::self = $self;
1163 1227
1228 local $ENV{LC_ALL} = $self->{term}->locale;
1229
1164 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,
1165 "--transient-for" => $self->{term}->parent, 1231 "--transient-for" => $self->{term}->parent,
1232 "-display" => $self->{term}->display_id,
1166 "-pe" => "urxvt-popup") 1233 "-pe" => "urxvt-popup")
1167 or die "unable to create popup window\n"; 1234 or die "unable to create popup window\n";
1168} 1235}
1169 1236
1170sub DESTROY { 1237sub DESTROY {
1171 my ($self) = @_; 1238 my ($self) = @_;
1172 1239
1240 delete $self->{term}{_destroy}{$self};
1173 $self->{term}->ungrab; 1241 $self->{term}->ungrab;
1174} 1242}
1175 1243
1176=head2 The C<urxvt::timer> Class 1244=head2 The C<urxvt::timer> Class
1177 1245
1281This variable controls the verbosity level of the perl extension. Higher 1349This variable controls the verbosity level of the perl extension. Higher
1282numbers indicate more verbose output. 1350numbers indicate more verbose output.
1283 1351
1284=over 4 1352=over 4
1285 1353
1286=item =0 - only fatal messages 1354=item == 0 - fatal messages
1287 1355
1288=item =3 - script loading and management 1356=item >= 3 - script loading and management
1289 1357
1290=item =10 - all events received 1358=item >=10 - all events received
1291 1359
1292=back 1360=back
1293 1361
1294=head1 AUTHOR 1362=head1 AUTHOR
1295 1363

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines