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.58 by root, Sun Jan 8 22:58:13 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;
538 }; 526
539 if ($@) { 527 if ($@) {
540 $TERM->ungrab; # better to lose the grab than the session 528 $TERM->ungrab; # better to lose the grab than the session
541 warn $@; 529 warn $@;
542 } 530 }
543 } 531 }
664package urxvt::term; 652package urxvt::term;
665 653
666=head2 The C<urxvt::term> Class 654=head2 The C<urxvt::term> Class
667 655
668=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}
669 681
670=item $term->destroy 682=item $term->destroy
671 683
672Destroy the terminal object (close the window, free resources etc.). 684Destroy the terminal object (close the window, free resources etc.).
673 685
907 919
908=item $lines_in_scrollback = $term->nsaved 920=item $lines_in_scrollback = $term->nsaved
909 921
910Return various integers describing terminal characteristics. 922Return various integers describing terminal characteristics.
911 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
912=item $modifiermask = $term->ModLevel3Mask 932=item $modifiermask = $term->ModLevel3Mask
913 933
914=item $modifiermask = $term->ModMetaMask 934=item $modifiermask = $term->ModMetaMask
915 935
916=item $modifiermask = $term->ModNumLockMask 936=item $modifiermask = $term->ModNumLockMask
1092 $offset / $self->{ncol} + $self->{beg}, 1112 $offset / $self->{ncol} + $self->{beg},
1093 $offset % $self->{ncol} 1113 $offset % $self->{ncol}
1094 ) 1114 )
1095} 1115}
1096 1116
1097=item ($row, $col) = $line->coord_of ($offset)
1098=item $text = $term->special_encode $string 1117=item $text = $term->special_encode $string
1099 1118
1100Converts a perl string into the special encoding used by rxvt-unicode, 1119Converts a perl string into the special encoding used by rxvt-unicode,
1101where one character corresponds to one screen cell. See 1120where one character corresponds to one screen cell. See
1102C<< $term->ROW_t >> for details. 1121C<< $term->ROW_t >> for details.
1104=item $string = $term->special_decode $text 1123=item $string = $term->special_decode $text
1105 1124
1106Converts rxvt-unicodes text reprsentation into a perl string. See 1125Converts rxvt-unicodes text reprsentation into a perl string. See
1107C<< $term->ROW_t >> for details. 1126C<< $term->ROW_t >> for details.
1108 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
1109=back 1156=back
1110 1157
1111=cut 1158=cut
1112 1159
1113package urxvt::popup; 1160package urxvt::popup;
1131} 1178}
1132 1179
1133sub add_separator { 1180sub add_separator {
1134 my ($self, $sep) = @_; 1181 my ($self, $sep) = @_;
1135 1182
1136 $sep ||= ""; 1183 $sep ||= "=";
1137 1184
1138 $self->add_item ({ 1185 $self->add_item ({
1139 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" },
1140 text => "", 1187 text => "",
1141 render => sub { $sep x $urxvt::TERM->ncol }, 1188 render => sub { $sep x $self->{term}->ncol },
1142 activate => sub { }, 1189 activate => sub { },
1143 }); 1190 });
1144} 1191}
1145 1192
1146sub add_title { 1193sub add_title {
1154} 1201}
1155 1202
1156sub add_button { 1203sub add_button {
1157 my ($self, $text, $cb) = @_; 1204 my ($self, $text, $cb) = @_;
1158 1205
1159 $self->add_item ({ type => "button", text => "[ $text ]", activate => $cb}); 1206 $self->add_item ({ type => "button", text => $text, activate => $cb});
1160} 1207}
1161 1208
1162sub add_toggle { 1209sub add_toggle {
1163 my ($self, $text, $cb, $value) = @_; 1210 my ($self, $text, $cb, $value) = @_;
1164 1211
1176sub show { 1223sub show {
1177 my ($self) = @_; 1224 my ($self) = @_;
1178 1225
1179 local $urxvt::popup::self = $self; 1226 local $urxvt::popup::self = $self;
1180 1227
1228 local $ENV{LC_ALL} = $self->{term}->locale;
1229
1181 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,
1182 "--transient-for" => $self->{term}->parent, 1231 "--transient-for" => $self->{term}->parent,
1232 "-display" => $self->{term}->display_id,
1183 "-pe" => "urxvt-popup") 1233 "-pe" => "urxvt-popup")
1184 or die "unable to create popup window\n"; 1234 or die "unable to create popup window\n";
1185} 1235}
1186 1236
1187sub DESTROY { 1237sub DESTROY {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines