--- rxvt-unicode/src/urxvt.pm 2006/01/03 19:42:53 1.23 +++ rxvt-unicode/src/urxvt.pm 2006/01/06 03:40:19 1.37 @@ -41,8 +41,10 @@ =item selection -Intelligent selection. This etxension tries to be more intelligent when the user -extends selections (double-click). +Intelligent selection. This extension tries to be more intelligent when +the user extends selections (double-click). Right now, it tries to select +urls and complete shell-quoted arguments, which is very convenient, too, +if your F supports C<--quoting-style=shell>. It also offers the following bindable event: @@ -60,12 +62,23 @@ Displays a digital clock using the built-in overlay. +=item mark-urls + +Uses per-line filtering (C) to underline urls. + =item example-refresh-hooks Displays a very simple digital clock in the upper right corner of the window. Illustrates overwriting the refresh callbacks to create your own overlays or changes. +=item example-filter-input + +A not very useful example of filtering all text output to the terminal, by +underlining all urls that matches a certain regex (i.e. some urls :). It +is not very useful because urls that are output in multiple steps (e.g. +when typing them) do not get marked. + =back =head2 General API Considerations @@ -81,6 +94,29 @@ the like inside the terminal object so they get destroyed as soon as the terminal is destroyed. +Argument names also often indicate the type of a parameter. Here are some +hints on what they mean: + +=over 4 + +=item $text + +Rxvt-unicodes special way of encoding text, where one "unicode" character +always represents one screen cell. See L for a discussion of this format. + +=item $string + +A perl text string, with an emphasis on I. It can store all unicode +characters and is to be distinguished with text encoded in a specific +encoding (often locale-specific) and binary data. + +=item $octets + +Either binary data or - more common - a text string encoded in a +locale-specific way. + +=back + =head2 Hooks The following subroutines can be declared in loaded scripts, and will be @@ -103,7 +139,10 @@ =item on_init $term Called after a new terminal object has been initialized, but before -windows are created or the command gets run. +windows are created or the command gets run. Most methods are unsafe to +call or deliver senseless data, as terminal size and other characteristics +have not yet been determined. You can safely query and change resources, +though. =item on_reset $term @@ -172,6 +211,41 @@ Called whenever the program(s) running in the urxvt window send output. +=item on_osc_seq $term, $string + +Called whenever the B command sequence (OSC = +operating system command) is processed. Cursor position and other state +information is up-to-date when this happens. For interoperability, the +string should start with the extension name and a colon, to distinguish +it from commands for other extensions, and this might be enforced in the +future. + +Be careful not ever to trust (in a security sense) the data you receive, +as its source can not easily be controleld (e-mail content, messages from +other users on the same system etc.). + +=item on_add_lines $term, $string + +Called whenever text is about to be output, with the text as argument. You +can filter/change and output the text yourself by returning a true value +and calling C<< $term->scr_add_lines >> yourself. Please note that this +might be very slow, however, as your hook is called for B text being +output. + +=item on_line_update $term, $row + +Called whenever a line was updated or changed. Can be used to filter +screen output (e.g. underline urls or other useless stuff). Only lines +that are being shown will be filtered, and, due to performance reasons, +not always immediately. + +The row number is always the topmost row of the line if the line spans +multiple rows. + +Please note that, if you change the line, then the hook might get called +later with the already-modified line (e.g. if unrelated parts change), so +you cannot just toggle rendition bits, but only set them. + =item on_refresh_begin $term Called just before the screen gets redrawn. Can be used for overlay @@ -189,6 +263,21 @@ C action bound to it (see description of the B resource in the @@RXVT_NAME@@(1) manpage). +=item on_key_press $term, $event + +=item on_key_release $term, $event + +=item on_button_press $term, $event + +=item on_button_release $term, $event + +=item on_motion_notify $term, $event + +Called whenever the corresponding X event is received for the terminal. If +the hook returns true, then the even will be ignored by rxvt-unicode. + +subwindow. + =back =head2 Variables in the C Package @@ -206,6 +295,14 @@ =over 4 +=item $term = new urxvt [arg...] + +Creates a new terminal, very similar as if you had started it with +C. Croaks (and probably outputs an error message) +if the new instance couldn't be created. Returns C if the new +instance didn't initialise perl, and the terminal object otherwise. The +C and C hooks will be called during the call. + =item urxvt::fatal $errormessage Fatally aborts execution with the given error message. Avoid at all @@ -353,6 +450,8 @@ } } +our $retval; # return value for urxvt + # called by the rxvt core sub invoke { local $TERM = shift; @@ -361,7 +460,7 @@ if ($htype == 0) { # INIT my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl"); - for my $ext (split /:/, $TERM->resource ("perl_ext")) { + for my $ext (map { split /:/, $TERM->resource ("perl_ext_$_") } 1, 2) { my @files = grep -f $_, map "$_/$ext", @dirs; if (@files) { @@ -370,35 +469,45 @@ warn "perl extension '$ext' not found in perl library search path\n"; } } + } + + $retval = undef; + + if (my $cb = $TERM->{_hook}[$htype]) { + verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")" + if $verbosity >= 10; + + keys %$cb; + + while (my ($pkg, $cb) = each %$cb) { + $retval = $cb->( + $TERM->{_pkg}{$pkg} ||= do { + my $proxy = bless { }, urxvt::term::proxy::; + Scalar::Util::weaken ($proxy->{term} = $TERM); + $proxy + }, + @_, + ) and last; + } + } - } elsif ($htype == 1) { # DESTROY + if ($htype == 1) { # DESTROY + # remove hooks if unused if (my $hook = $TERM->{_hook}) { for my $htype (0..$#$hook) { $hook_count[$htype] -= scalar keys %{ $hook->[$htype] || {} } or set_should_invoke $htype, 0; } } - } - - my $cb = $TERM->{_hook}[$htype] - or return; - verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")" - if $verbosity >= 10; + # clear package objects + %$_ = () for values %{ $TERM->{_pkg} }; - while (my ($pkg, $cb) = each %$cb) { - return 1 - if $cb->( - $TERM->{$pkg} ||= do { - my $proxy = bless { }, urxvt::term::proxy::; - Scalar::Util::weaken ($proxy->{term} = $TERM); - $proxy - }, - @_, - ); + # clear package + %$TERM = (); } - 0 + $retval } sub urxvt::term::proxy::AUTOLOAD { @@ -407,8 +516,8 @@ eval qq{ sub $urxvt::term::proxy::AUTOLOAD { - unshift \@_, shift->{term}; - goto &urxvt::term::$1; + my \$proxy = shift; + \$proxy->{term}->$1 (\@_) } 1 } or die "FATAL: unable to compile method forwarder: $@"; @@ -420,6 +529,10 @@ =over 4 +=item $term->destroy + +Destroy the terminal object (close the window, free resources etc.). + =item $value = $term->resource ($name[, $newval]) Returns the current resource value associated with a given name and @@ -446,7 +559,7 @@ display_name embed ext_bwidth fade font geometry hold iconName imFont imLocale inputMethod insecure int_bwidth intensityStyles italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier - mouseWheelScrollPage name pastableTabs path perl_eval perl_ext + mouseWheelScrollPage name pastableTabs path perl_eval perl_ext_1 perl_ext_2 perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput @@ -462,6 +575,16 @@ goto &urxvt::term::_resource; } +=item $rend = $term->rstyle ([$new_rstyle]) + +Return and optionally change the current rendition. Text that is output by +the terminal application will use this style. + +=item ($row, $col) = $term->screen_cur ([$row, $col]) + +Return the current coordinates of the text cursor position and optionally +set it (which is usually bad as applications don't expect that). + =item ($row, $col) = $term->selection_mark ([$row, $col]) =item ($row, $col) = $term->selection_beg ([$row, $col]) @@ -485,21 +608,20 @@ #Create a simple multi-line overlay box. See the next method for details. # #=cut - -sub urxvt::term::scr_overlay { -die; - my ($self, $x, $y, $text) = @_; - - my @lines = split /\n/, $text; - - my $w = 0; - for (map $self->strwidth ($_), @lines) { - $w = $_ if $w < $_; - } - - $self->scr_overlay_new ($x, $y, $w, scalar @lines); - $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines; -} +# +#sub urxvt::term::scr_overlay { +# my ($self, $x, $y, $text) = @_; +# +# my @lines = split /\n/, $text; +# +# my $w = 0; +# for (map $self->strwidth ($_), @lines) { +# $w = $_ if $w < $_; +# } +# +# $self->scr_overlay_new ($x, $y, $w, scalar @lines); +# $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines; +#} =item $term->overlay ($x, $y, $width, $height[, $rstyle[, $border]]) @@ -549,22 +671,54 @@ Convert the given locale-encoded octets into a perl string. +=item $term->scr_add_lines ($string) + +Write the given text string to the screen, as if output by the application +running inside the terminal. It may not contain command sequences (escape +codes), but is free to use line feeds, carriage returns and tabs. The +string is a normal text string, not in locale-dependent encoding. + +Normally its not a good idea to use this function, as programs might be +confused by changes in cursor position or scrolling. Its useful inside a +C hook, though. + +=item $term->cmd_parse ($octets) + +Similar to C, but the argument must be in the +locale-specific encoding of the terminal and can contain command sequences +(escape codes) that will be interpreted. + =item $term->tt_write ($octets) Write the octets given in C<$data> to the tty (i.e. as program input). To pass characters instead of octets, you should convert your strings first to the locale-specific encoding using C<< $term->locale_encode >>. -=item $nrow = $term->nrow +=item $window_width = $term->width + +=item $window_height = $term->height + +=item $font_width = $term->fwidth + +=item $font_height = $term->fheight + +=item $font_ascent = $term->fbase + +=item $terminal_rows = $term->nrow + +=item $terminal_columns = $term->ncol -=item $ncol = $term->ncol +=item $has_focus = $term->focus -Return the number of rows/columns of the terminal window (i.e. as -specified by C<-geometry>, excluding any scrollback). +=item $is_mapped = $term->mapped -=item $nsaved = $term->nsaved +=item $max_scrollback = $term->saveLines -Returns the number of lines in the scrollback buffer. +=item $nrow_plus_saveLines = $term->total_rows + +=item $lines_in_scrollback = $term->nsaved + +Return various integers describing terminal characteristics. =item $view_start = $term->view_start ([$newvalue]) @@ -585,7 +739,8 @@ Returns the text of the entire row with number C<$row_number>. Row C<0> is the topmost terminal line, row C<< $term->$ncol-1 >> is the bottommost terminal line. The scrollback buffer starts at line C<-1> and extends to -line C<< -$term->nsaved >>. +line C<< -$term->nsaved >>. Nothing will be returned if a nonexistent line +is requested. If C<$new_text> is specified, it will replace characters in the current line, starting at column C<$start_col> (default C<0>), which is useful @@ -617,10 +772,131 @@ =item $length = $term->ROW_l ($row_number[, $new_length]) -Returns the number of screen cells that are in use ("the line length"). If -it is C<-1>, then the line is part of a multiple-row logical "line", which -means all characters are in use and it is continued on the next row. +Returns the number of screen cells that are in use ("the line +length"). Unlike the urxvt core, this returns C<< $term->ncol >> if the +line is joined with the following one. + +=item $bool = $term->is_longer ($row_number) + +Returns true if the row is part of a multiple-row logical "line" (i.e. +joined with the following row), which means all characters are in use +and it is continued on the next row (and possibly a continuation of the +previous row(s)). + +=item $line = $term->line ($row_number) + +Create and return a new C object that stores information +about the logical line that row C<$row_number> is part of. It supports the +following methods: + +=over 4 + +=item $text = $line->t ([$new_text]) + +Returns or replaces the full text of the line, similar to C + +=item $rend = $line->r ([$new_rend]) + +Returns or replaces the full rendition array of the line, similar to C + +=item $length = $line->l + +Returns the length of the line in cells, similar to C. + +=item $rownum = $line->beg + +=item $rownum = $line->end + +Return the row number of the first/last row of the line, respectively. + +=item $offset = $line->offset_of ($row, $col) + +Returns the character offset of the given row|col pair within the logical +line. + +=item ($row, $col) = $line->coord_of ($offset) + +Translates a string offset into terminal coordinates again. + +=back + +=cut + +sub urxvt::term::line { + my ($self, $row) = @_; + + my $maxrow = $self->nrow - 1; + + my ($beg, $end) = ($row, $row); + + --$beg while $self->ROW_is_longer ($beg - 1); + ++$end while $self->ROW_is_longer ($end) && $end < $maxrow; + + bless { + term => $self, + beg => $beg, + end => $end, + ncol => $self->ncol, + len => ($end - $beg) * $self->ncol + $self->ROW_l ($end), + }, urxvt::line:: +} + +sub urxvt::line::t { + my ($self) = @_; + + if (@_ > 1) + { + $self->{term}->ROW_t ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol}) + for $self->{beg} .. $self->{end}; + } + + defined wantarray && + substr +(join "", map $self->{term}->ROW_t ($_), $self->{beg} .. $self->{end}), + 0, $self->{len} +} + +sub urxvt::line::r { + my ($self) = @_; + + if (@_ > 1) + { + $self->{term}->ROW_r ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol}) + for $self->{beg} .. $self->{end}; + } + + if (defined wantarray) { + my $rend = [ + map @{ $self->{term}->ROW_r ($_) }, $self->{beg} .. $self->{end} + ]; + $#$rend = $self->{len} - 1; + return $rend; + } + + () +} + +sub urxvt::line::beg { $_[0]{beg} } +sub urxvt::line::end { $_[0]{end} } +sub urxvt::line::l { $_[0]{len} } + +sub urxvt::line::offset_of { + my ($self, $row, $col) = @_; + + ($row - $self->{beg}) * $self->{ncol} + $col +} + +sub urxvt::line::coord_of { + my ($self, $offset) = @_; + + use integer; + + ( + $offset / $self->{ncol} + $self->{beg}, + $offset % $self->{ncol} + ) +} +=item ($row, $col) = $line->coord_of ($offset) =item $text = $term->special_encode $string Converts a perl string into the special encoding used by rxvt-unicode, @@ -744,11 +1020,11 @@ =over 4 -=item 0 - only fatal messages +=item =0 - only fatal messages -=item 3 - script loading and management +=item =3 - script loading and management -=item 10 - all events received +=item =10 - all events received =back