ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.13
Committed: Tue Jan 3 00:06:57 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.12: +47 -4 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.11 @@RXVT_NAME@@perl - rxvt-unicode's embedded perl interpreter
4 root 1.1
5     =head1 SYNOPSIS
6    
7 root 1.10 # create a file grab_test in $HOME:
8 root 1.1
9     sub on_sel_grab {
10     warn "you selected ", $_[0]->selection;
11 root 1.3 ()
12 root 1.1 }
13    
14 root 1.10 # start a @@RXVT_NAME@@ using it:
15    
16     @@RXVT_NAME@@ --perl-lib $HOME -pe grab_test
17 root 1.1
18     =head1 DESCRIPTION
19    
20 root 1.8 Everytime a terminal object gets created, scripts specified via the
21 root 1.10 C<perl> resource are loaded and associated with it.
22    
23     Scripts are compiled in a 'use strict' and 'use utf8' environment, and
24     thus must be encoded as UTF-8.
25 root 1.6
26     Each script will only ever be loaded once, even in @@RXVT_NAME@@d, where
27 root 1.8 scripts will be shared (But not enabled) for all terminals.
28 root 1.6
29     =head2 General API Considerations
30    
31     All objects (such as terminals, time watchers etc.) are typical
32     reference-to-hash objects. The hash can be used to store anything you
33 root 1.7 like. All members starting with an underscore (such as C<_ptr> or
34     C<_hook>) are reserved for internal uses and must not be accessed or
35     modified).
36 root 1.6
37     When objects are destroyed on the C++ side, the perl object hashes are
38     emptied, so its best to store related objects such as time watchers and
39     the like inside the terminal object so they get destroyed as soon as the
40     terminal is destroyed.
41    
42 root 1.1 =head2 Hooks
43    
44     The following subroutines can be declared in loaded scripts, and will be called
45     whenever the relevant event happens.
46    
47     All of them must return a boolean value. If it is true, then the event
48     counts as being I<consumed>, and the invocation of other hooks is skipped,
49     and the relevant action might not be carried out by the C++ code.
50    
51     When in doubt, return a false value (preferably C<()>).
52    
53     =over 4
54    
55     =item on_init $term
56    
57     Called after a new terminal object has been initialized, but before
58     windows are created or the command gets run.
59    
60     =item on_reset $term
61    
62     Called after the screen is "reset" for any reason, such as resizing or
63     control sequences. Here is where you can react on changes to size-related
64     variables.
65    
66     =item on_start $term
67    
68     Called at the very end of initialisation of a new terminal, just before
69     returning to the mainloop.
70    
71     =item on_sel_make $term, $eventtime
72    
73     Called whenever a selection has been made by the user, but before the
74     selection text is copied, so changes to the beginning, end or type of the
75     selection will be honored.
76    
77     Returning a true value aborts selection making by urxvt, in which case you
78     have to make a selection yourself by calling C<< $term->selection_grab >>.
79    
80     =item on_sel_grab $term, $eventtime
81    
82     Called whenever a selection has been copied, but before the selection is
83     requested from the server. The selection text can be queried and changed
84     by calling C<< $term->selection >>.
85    
86     Returning a true value aborts selection grabbing. It will still be hilighted.
87    
88     =item on_focus_in $term
89    
90     Called whenever the window gets the keyboard focus, before urxvt does
91     focus in processing.
92    
93     =item on_focus_out $term
94    
95     Called wheneever the window loses keyboard focus, before urxvt does focus
96     out processing.
97    
98     =item on_view_change $term, $offset
99    
100     Called whenever the view offset changes, i..e the user or program
101     scrolls. Offset C<0> means display the normal terminal, positive values
102     show this many lines of scrollback.
103    
104     =item on_scroll_back $term, $lines, $saved
105    
106     Called whenever lines scroll out of the terminal area into the scrollback
107     buffer. C<$lines> is the number of lines scrolled out and may be larger
108     than the scroll back buffer or the terminal.
109    
110     It is called before lines are scrolled out (so rows 0 .. min ($lines - 1,
111     $nrow - 1) represent the lines to be scrolled out). C<$saved> is the total
112     number of lines that will be in the scrollback buffer.
113    
114     =item on_tty_activity $term *NYI*
115    
116     Called whenever the program(s) running in the urxvt window send output.
117    
118     =item on_refresh_begin $term
119    
120     Called just before the screen gets redrawn. Can be used for overlay
121     or similar effects by modify terminal contents in refresh_begin, and
122     restoring them in refresh_end. The built-in overlay and selection display
123     code is run after this hook, and takes precedence.
124    
125     =item on_refresh_end $term
126    
127     Called just after the screen gets redrawn. See C<on_refresh_begin>.
128    
129 root 1.11 =item on_keyboard_command $term, $string
130    
131     Called whenever the user presses a key combination that has a
132     C<perl:string> action bound to it (see description of the B<keysym>
133     resource in the @@RXVT_NAME@@(1) manpage).
134    
135 root 1.1 =back
136    
137     =head2 Functions in the C<urxvt> Package
138    
139     =over 4
140    
141     =item urxvt::fatal $errormessage
142    
143     Fatally aborts execution with the given error message. Avoid at all
144     costs! The only time this is acceptable is when the terminal process
145     starts up.
146    
147     =item urxvt::warn $string
148    
149 root 1.6 Calls C<rxvt_warn> with the given string which should not include a
150 root 1.1 newline. The module also overwrites the C<warn> builtin with a function
151     that calls this function.
152    
153     Using this function has the advantage that its output ends up in the
154     correct place, e.g. on stderr of the connecting urxvtc client.
155    
156     =item $time = urxvt::NOW
157    
158     Returns the "current time" (as per the event loop).
159    
160     =cut
161    
162     package urxvt;
163    
164     use strict;
165    
166     our $term;
167     our @HOOKNAME;
168     our $LIBDIR;
169    
170     BEGIN {
171     urxvt->bootstrap;
172    
173     # overwrite perl's warn
174     *CORE::GLOBAL::warn = sub {
175     my $msg = join "", @_;
176     $msg .= "\n"
177     unless $msg =~ /\n$/;
178     urxvt::warn ($msg);
179     };
180     }
181    
182 root 1.8 my @hook_count;
183 root 1.7 my $verbosity = $ENV{URXVT_PERL_VERBOSITY};
184 root 1.1
185     sub verbose {
186     my ($level, $msg) = @_;
187 root 1.8 warn "$msg\n" if $level <= $verbosity;
188 root 1.1 }
189    
190     # find on_xxx subs in the package and register them
191     # as hooks
192     sub register_package($) {
193     my ($pkg) = @_;
194    
195 root 1.7 for my $htype (0.. $#HOOKNAME) {
196     my $name = $HOOKNAME[$htype];
197 root 1.1
198     my $ref = $pkg->can ("on_" . lc $name)
199     or next;
200    
201 root 1.7 $term->{_hook}[$htype]{$ref*1} = $ref;
202     $hook_count[$htype]++
203     or set_should_invoke $htype, 1;
204 root 1.1 }
205     }
206    
207     my $script_pkg = "script0000";
208     my %script_pkg;
209    
210     # load a single script into its own package, once only
211 root 1.7 sub script_package($) {
212 root 1.1 my ($path) = @_;
213    
214     $script_pkg{$path} ||= do {
215 root 1.8 my $pkg = "urxvt::" . ($script_pkg++);
216    
217 root 1.1 verbose 3, "loading script '$path' into package '$pkg'";
218    
219     open my $fh, "<:raw", $path
220     or die "$path: $!";
221    
222 root 1.8 my $source = "package $pkg; use strict; use utf8;\n"
223     . "#line 1 \"$path\"\n{\n"
224     . (do { local $/; <$fh> })
225     . "\n};\n1";
226    
227     eval $source or die "$path: $@";
228 root 1.1
229     $pkg
230 root 1.7 }
231 root 1.1 }
232    
233 root 1.8 # called by the rxvt core
234     sub invoke {
235     local $term = shift;
236     my $htype = shift;
237 root 1.6
238 root 1.8 if ($htype == 0) { # INIT
239 root 1.9 my @dirs = ((split /:/, $term->resource ("perl_lib")), "$LIBDIR/perl");
240 root 1.6
241 root 1.8 for my $ext (split /:/, $term->resource ("perl_ext")) {
242     my @files = grep -f $_, map "$_/$ext", @dirs;
243 root 1.6
244 root 1.8 if (@files) {
245     register_package script_package $files[0];
246     } else {
247     warn "perl extension '$ext' not found in perl library search path\n";
248     }
249     }
250 root 1.6
251 root 1.8 } elsif ($htype == 1) { # DESTROY
252     if (my $hook = $term->{_hook}) {
253     for my $htype (0..$#$hook) {
254     $hook_count[$htype] -= scalar keys %{ $hook->[$htype] || {} }
255     or set_should_invoke $htype, 0;
256     }
257     }
258     }
259 root 1.6
260 root 1.8 my $cb = $term->{_hook}[$htype]
261     or return;
262 root 1.6
263 root 1.8 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $term, @_) . ")"
264     if $verbosity >= 10;
265 root 1.7
266 root 1.8 while (my ($k, $v) = each %$cb) {
267     return 1 if $v->($term, @_);
268 root 1.7 }
269    
270 root 1.8 0
271 root 1.7 }
272 root 1.1
273     =back
274    
275     =head2 The C<urxvt::term> Class
276    
277     =over 4
278    
279 root 1.4 =item $value = $term->resource ($name[, $newval])
280    
281     Returns the current resource value associated with a given name and
282     optionally sets a new value. Setting values is most useful in the C<init>
283     hook. Unset resources are returned and accepted as C<undef>.
284    
285     The new value must be properly encoded to a suitable character encoding
286     before passing it to this method. Similarly, the returned value may need
287     to be converted from the used encoding to text.
288    
289     Resource names are as defined in F<src/rsinc.h>. Colours can be specified
290     as resource names of the form C<< color+<index> >>, e.g. C<color+5>. (will
291     likely change).
292    
293     Please note that resource strings will currently only be freed when the
294     terminal is destroyed, so changing options frequently will eat memory.
295    
296 root 1.5 Here is a a likely non-exhaustive list of resource names, not all of which
297     are supported in every build, please see the source to see the actual
298     list:
299    
300     answerbackstring backgroundPixmap backspace_key boldFont boldItalicFont
301     borderLess color cursorBlink cursorUnderline cutchars delete_key
302     display_name embed ext_bwidth fade font geometry hold iconName
303     imFont imLocale inputMethod insecure int_bwidth intensityStyles
304 root 1.8 italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier
305     mouseWheelScrollPage name pastableTabs path perl_eval perl_ext
306 root 1.6 perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd
307     reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating
308     scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput
309     scrollWithBuffer scrollstyle secondaryScreen secondaryScroll selectstyle
310     shade term_name title transparent transparent_all tripleclickwords
311     utmpInhibit visualBell
312 root 1.5
313 root 1.4 =cut
314    
315     sub urxvt::term::resource($$;$) {
316     my ($self, $name) = (shift, shift);
317     unshift @_, $self, $name, ($name =~ s/\s*\+\s*(\d+)$// ? $1 : 0);
318     goto &urxvt::term::_resource;
319     }
320    
321 root 1.1 =item ($row, $col) = $term->selection_mark ([$row, $col])
322    
323     =item ($row, $col) = $term->selection_beg ([$row, $col])
324    
325     =item ($row, $col) = $term->selection_end ([$row, $col])
326    
327     Return the current values of the selection mark, begin or end positions,
328     and optionally set them to new values.
329    
330     =item $success = $term->selection_grab ($eventtime)
331    
332     Try to request the primary selection from the server (for example, as set
333     by the next method).
334    
335     =item $oldtext = $term->selection ([$newtext])
336    
337     Return the current selection text and optionally replace it by C<$newtext>.
338    
339     =item $term->scr_overlay ($x, $y, $text)
340    
341     Create a simple multi-line overlay box. See the next method for details.
342    
343     =cut
344    
345     sub urxvt::term::scr_overlay {
346     my ($self, $x, $y, $text) = @_;
347    
348     my @lines = split /\n/, $text;
349    
350     my $w = 0;
351 root 1.6 for (map $self->strwidth ($_), @lines) {
352 root 1.1 $w = $_ if $w < $_;
353     }
354    
355     $self->scr_overlay_new ($x, $y, $w, scalar @lines);
356     $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines;
357     }
358    
359     =item $term->scr_overlay_new ($x, $y, $width, $height)
360    
361     Create a new (empty) overlay at the given position with the given
362     width/height. A border will be put around the box. If either C<$x> or
363     C<$y> is negative, then this is counted from the right/bottom side,
364     respectively.
365    
366     =item $term->scr_overlay_off
367    
368     Switch the overlay off again.
369    
370     =item $term->scr_overlay_set_char ($x, $y, $char, $rend = OVERLAY_RSTYLE)
371    
372     Put a single character (specified numerically) at the given overlay
373     position.
374    
375     =item $term->scr_overlay_set ($x, $y, $text)
376    
377     Write a string at the given position into the overlay.
378    
379 root 1.6 =item $cellwidth = $term->strwidth $string
380    
381     Returns the number of screen-cells this string would need. Correctly
382     accounts for wide and combining characters.
383    
384     =item $octets = $term->locale_encode $string
385    
386     Convert the given text string into the corresponding locale encoding.
387    
388     =item $string = $term->locale_decode $octets
389    
390     Convert the given locale-encoded octets into a perl string.
391    
392     =item $term->tt_write ($octets)
393    
394     Write the octets given in C<$data> to the tty (i.e. as program input). To
395 root 1.12 pass characters instead of octets, you should convert your strings first
396     to the locale-specific encoding using C<< $term->locale_encode >>.
397    
398 root 1.13 =item $nrow = $term->nrow
399    
400     =item $ncol = $term->ncol
401    
402     Return the number of rows/columns of the terminal window (i.e. as
403     specified by C<-geometry>, excluding any scrollback).
404    
405 root 1.12 =item $nsaved = $term->nsaved
406    
407     Returns the number of lines in the scrollback buffer.
408    
409     =item $view_start = $term->view_start ([$newvalue])
410    
411     Returns the negative row number of the topmost line. Minimum value is
412     C<0>, which displays the normal terminal contents. Larger values scroll
413     this many lines into the scrollback buffer.
414    
415 root 1.13 =item $text = $term->ROW_t ($row_number[, $new_text[, $start_col]])
416 root 1.12
417     Returns the text of the entire row with number C<$row_number>. Row C<0>
418     is the topmost terminal line, row C<< $term->$ncol-1 >> is the bottommost
419     terminal line. The scrollback buffer starts at line C<-1> and extends to
420     line C<< -$term->nsaved >>.
421    
422 root 1.13 If C<$new_text> is specified, it will replace characters in the current
423     line, starting at column C<$start_col> (default C<0>), which is useful
424     to replace only parts of a line. The font iindex in the rendition will
425     automatically be updated.
426 root 1.12
427     C<$text> is in a special encoding: tabs and wide characters that use more
428     than one cell when displayed are padded with urxvt::NOCHAR characters
429     (C<chr 65535>). Characters with combining characters and other characters
430     that do not fit into the normal tetx encoding will be replaced with
431     characters in the private use area.
432    
433     You have to obey this encoding when changing text. The advantage is
434     that C<substr> and similar functions work on screen cells and not on
435     characters.
436    
437     The methods C<< $term->special_encode >> and C<< $term->special_decode >>
438     can be used to convert normal strings into this encoding and vice versa.
439    
440 root 1.13 =item $rend = $term->ROW_r ($row_number[, $new_rend[, $start_col]])
441    
442     Like C<< $term->ROW_t >>, but returns an arrayref with rendition
443     bitsets. Rendition bitsets contain information about colour, font, font
444     styles and similar information. See also C<< $term->ROW_t >>.
445    
446     When setting rendition, the font mask will be ignored.
447 root 1.12
448 root 1.13 See the section on RENDITION, below.
449    
450     =item $length = $term->ROW_l ($row_number[, $new_length])
451    
452     Returns the number of screen cells that are in use ("the line length"). If
453     it is C<-1>, then the line is part of a multiple-row logical "line", which
454     means all characters are in use and it is continued on the next row.
455 root 1.12
456     =item $text = $term->special_encode $string
457    
458     Converts a perl string into the special encoding used by rxvt-unicode,
459     where one character corresponds to one screen cell. See
460     C<< $term->ROW_t >> for details.
461    
462     =item $string = $term->special_decode $text
463    
464     Converts rxvt-unicodes text reprsentation into a perl string. See
465     C<< $term->ROW_t >> for details.
466 root 1.6
467 root 1.1 =back
468    
469 root 1.13 =head2 RENDITION
470    
471     Rendition bitsets contain information about colour, font, font styles and
472     similar information for each screen cell.
473    
474     The following "macros" deal with changes in rendition sets. You should
475     never just create a bitset, you should always modify an existing one,
476     as they contain important information required for correct operation of
477     rxvt-unicode.
478    
479     =over 4
480    
481     =item $rend = urxvt::DEFAULT_RSTYLE
482    
483     Returns the default rendition, as used when the terminal is starting up or
484     being reset. Useful as a base
485    
486     =back
487    
488     =cut
489    
490 root 1.1 =head2 The C<urxvt::timer> Class
491    
492     This class implements timer watchers/events. Time is represented as a
493     fractional number of seconds since the epoch. Example:
494    
495     # create a digital clock display in upper right corner
496     $term->{timer} = urxvt::timer
497     ->new
498     ->start (urxvt::NOW)
499     ->cb (sub {
500     my ($timer) = @_;
501     my $time = $timer->at;
502     $timer->start ($time + 1);
503     $self->scr_overlay (-1, 0,
504     POSIX::strftime "%H:%M:%S", localtime $time);
505     });
506    
507     =over 4
508    
509     =item $timer = new urxvt::timer
510    
511     Create a new timer object in stopped state.
512    
513     =item $timer = $timer->cb (sub { my ($timer) = @_; ... })
514    
515     Set the callback to be called when the timer triggers.
516    
517     =item $tstamp = $timer->at
518    
519     Return the time this watcher will fire next.
520    
521     =item $timer = $timer->set ($tstamp)
522    
523     Set the time the event is generated to $tstamp.
524    
525     =item $timer = $timer->start
526    
527     Start the timer.
528    
529     =item $timer = $timer->start ($tstamp)
530    
531     Set the event trigger time to C<$tstamp> and start the timer.
532    
533     =item $timer = $timer->stop
534    
535     Stop the timer.
536    
537     =back
538    
539     =head2 The C<urxvt::iow> Class
540    
541     This class implements io watchers/events. Example:
542    
543     $term->{socket} = ...
544     $term->{iow} = urxvt::iow
545     ->new
546     ->fd (fileno $term->{socket})
547     ->events (1) # wait for read data
548     ->start
549     ->cb (sub {
550     my ($iow, $revents) = @_;
551     # $revents must be 1 here, no need to check
552     sysread $term->{socket}, my $buf, 8192
553     or end-of-file;
554     });
555    
556    
557     =over 4
558    
559     =item $iow = new urxvt::iow
560    
561     Create a new io watcher object in stopped state.
562    
563     =item $iow = $iow->cb (sub { my ($iow, $reventmask) = @_; ... })
564    
565     Set the callback to be called when io events are triggered. C<$reventmask>
566     is a bitset as described in the C<events> method.
567    
568     =item $iow = $iow->fd ($fd)
569    
570     Set the filedescriptor (not handle) to watch.
571    
572     =item $iow = $iow->events ($eventmask)
573    
574     Set the event mask to watch. Bit #0 (value C<1>) enables watching for read
575     data, Bit #1 (value C<2>) enables watching for write data.
576    
577     =item $iow = $iow->start
578    
579     Start watching for requested events on the given handle.
580    
581     =item $iow = $iow->stop
582    
583     Stop watching for events on the given filehandle.
584    
585     =back
586    
587 root 1.4 =head1 ENVIRONMENT
588    
589     =head2 URXVT_PERL_VERBOSITY
590    
591     This variable controls the verbosity level of the perl extension. Higher
592     numbers indicate more verbose output.
593    
594     =over 4
595    
596     =item 0 - only fatal messages
597    
598     =item 3 - script loading and management
599    
600     =item 10 - all events received
601    
602     =back
603    
604 root 1.1 =head1 AUTHOR
605    
606     Marc Lehmann <pcg@goof.com>
607     http://software.schmorp.de/pkg/rxvt-unicode
608    
609     =cut
610    
611     1