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