ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.22
Committed: Tue Jan 3 19:10:54 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.21: +26 -2 lines
Log Message:
*** empty log message ***

File Contents

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