ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.59
Committed: Mon Jan 9 00:34:36 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.58: +11 -5 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.17 =encoding utf8
2    
3 root 1.1 =head1 NAME
4    
5 root 1.11 @@RXVT_NAME@@perl - rxvt-unicode's embedded perl interpreter
6 root 1.1
7     =head1 SYNOPSIS
8    
9 root 1.10 # create a file grab_test in $HOME:
10 root 1.1
11     sub on_sel_grab {
12     warn "you selected ", $_[0]->selection;
13 root 1.3 ()
14 root 1.1 }
15    
16 root 1.10 # start a @@RXVT_NAME@@ using it:
17    
18     @@RXVT_NAME@@ --perl-lib $HOME -pe grab_test
19 root 1.1
20     =head1 DESCRIPTION
21    
22 root 1.44 Everytime a terminal object gets created, extension scripts specified via
23     the C<perl> resource are loaded and associated with it.
24 root 1.10
25     Scripts are compiled in a 'use strict' and 'use utf8' environment, and
26     thus must be encoded as UTF-8.
27 root 1.6
28     Each script will only ever be loaded once, even in @@RXVT_NAME@@d, where
29 root 1.16 scripts will be shared (but not enabled) for all terminals.
30 root 1.6
31 root 1.17 =head2 Prepackaged Extensions
32 root 1.15
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 root 1.54 =item selection (enabled by default)
43 root 1.15
44 root 1.26 Intelligent selection. This extension tries to be more intelligent when
45     the user extends selections (double-click). Right now, it tries to select
46     urls and complete shell-quoted arguments, which is very convenient, too,
47     if your F<ls> supports C<--quoting-style=shell>.
48 root 1.22
49     It also offers the following bindable event:
50 root 1.15
51     =over 4
52    
53     =item rot13
54    
55     Rot-13 the selection when activated. Used via keyboard trigger:
56    
57     URxvt.keysym.C-M-r: perl:selection:rot13
58    
59     =back
60    
61 root 1.54 =item option-popup (enabled by default)
62    
63 root 1.59 Binds a popup menu to Ctrl-Button2 that lets you toggle (some) options at
64 root 1.54 runtime.
65    
66 root 1.59 =item selection-popup (enabled by default)
67    
68     Binds a popup menu to Ctrl-Button3 that lets you convert the selection
69     text into various other formats/action.
70    
71 root 1.15 =item digital-clock
72    
73 root 1.20 Displays a digital clock using the built-in overlay.
74    
75 root 1.35 =item mark-urls
76    
77 root 1.42 Uses per-line display filtering (C<on_line_update>) to underline urls.
78    
79     =item block-graphics-to-ascii
80    
81     A not very useful example of filtering all text output to the terminal,
82     by replacing all line-drawing characters (U+2500 .. U+259F) by a
83     similar-looking ascii character.
84 root 1.35
85 root 1.20 =item example-refresh-hooks
86    
87 root 1.15 Displays a very simple digital clock in the upper right corner of the
88     window. Illustrates overwriting the refresh callbacks to create your own
89     overlays or changes.
90    
91     =back
92    
93 root 1.6 =head2 General API Considerations
94    
95     All objects (such as terminals, time watchers etc.) are typical
96     reference-to-hash objects. The hash can be used to store anything you
97 root 1.7 like. All members starting with an underscore (such as C<_ptr> or
98 root 1.23 C<_hook>) are reserved for internal uses and B<MUST NOT> be accessed or
99 root 1.7 modified).
100 root 1.6
101     When objects are destroyed on the C++ side, the perl object hashes are
102     emptied, so its best to store related objects such as time watchers and
103     the like inside the terminal object so they get destroyed as soon as the
104     terminal is destroyed.
105    
106 root 1.33 Argument names also often indicate the type of a parameter. Here are some
107     hints on what they mean:
108    
109     =over 4
110    
111     =item $text
112    
113     Rxvt-unicodes special way of encoding text, where one "unicode" character
114     always represents one screen cell. See L<row_t> for a discussion of this format.
115    
116     =item $string
117    
118     A perl text string, with an emphasis on I<text>. It can store all unicode
119     characters and is to be distinguished with text encoded in a specific
120     encoding (often locale-specific) and binary data.
121    
122     =item $octets
123    
124     Either binary data or - more common - a text string encoded in a
125     locale-specific way.
126    
127     =back
128    
129 root 1.1 =head2 Hooks
130    
131 root 1.43 The following subroutines can be declared in extension files, and will be
132 root 1.23 called whenever the relevant event happens.
133    
134     The first argument passed to them is an object private to each terminal
135 root 1.44 and extension package. You can call all C<urxvt::term> methods on it, but
136 root 1.23 its not a real C<urxvt::term> object. Instead, the real C<urxvt::term>
137     object that is shared between all packages is stored in the C<term>
138 root 1.44 member. It is, however, blessed intot he package of the extension script,
139     so for all practical purposes you can treat an extension script as a class.
140 root 1.1
141     All of them must return a boolean value. If it is true, then the event
142     counts as being I<consumed>, and the invocation of other hooks is skipped,
143     and the relevant action might not be carried out by the C++ code.
144    
145     When in doubt, return a false value (preferably C<()>).
146    
147     =over 4
148    
149     =item on_init $term
150    
151     Called after a new terminal object has been initialized, but before
152 root 1.36 windows are created or the command gets run. Most methods are unsafe to
153     call or deliver senseless data, as terminal size and other characteristics
154     have not yet been determined. You can safely query and change resources,
155     though.
156 root 1.1
157     =item on_reset $term
158    
159     Called after the screen is "reset" for any reason, such as resizing or
160     control sequences. Here is where you can react on changes to size-related
161     variables.
162    
163     =item on_start $term
164    
165     Called at the very end of initialisation of a new terminal, just before
166     returning to the mainloop.
167    
168     =item on_sel_make $term, $eventtime
169    
170     Called whenever a selection has been made by the user, but before the
171     selection text is copied, so changes to the beginning, end or type of the
172     selection will be honored.
173    
174     Returning a true value aborts selection making by urxvt, in which case you
175     have to make a selection yourself by calling C<< $term->selection_grab >>.
176    
177     =item on_sel_grab $term, $eventtime
178    
179     Called whenever a selection has been copied, but before the selection is
180     requested from the server. The selection text can be queried and changed
181     by calling C<< $term->selection >>.
182    
183     Returning a true value aborts selection grabbing. It will still be hilighted.
184    
185 root 1.22 =item on_sel_extend $term
186    
187     Called whenever the user tries to extend the selection (e.g. with a double
188     click) and is either supposed to return false (normal operation), or
189     should extend the selection itelf and return true to suppress the built-in
190     processing.
191    
192     See the F<selection> example extension.
193    
194 root 1.1 =item on_view_change $term, $offset
195    
196     Called whenever the view offset changes, i..e the user or program
197     scrolls. Offset C<0> means display the normal terminal, positive values
198     show this many lines of scrollback.
199    
200     =item on_scroll_back $term, $lines, $saved
201    
202     Called whenever lines scroll out of the terminal area into the scrollback
203     buffer. C<$lines> is the number of lines scrolled out and may be larger
204     than the scroll back buffer or the terminal.
205    
206     It is called before lines are scrolled out (so rows 0 .. min ($lines - 1,
207     $nrow - 1) represent the lines to be scrolled out). C<$saved> is the total
208     number of lines that will be in the scrollback buffer.
209    
210     =item on_tty_activity $term *NYI*
211    
212     Called whenever the program(s) running in the urxvt window send output.
213    
214 root 1.28 =item on_osc_seq $term, $string
215    
216 root 1.29 Called whenever the B<ESC ] 777 ; string ST> command sequence (OSC =
217     operating system command) is processed. Cursor position and other state
218     information is up-to-date when this happens. For interoperability, the
219     string should start with the extension name and a colon, to distinguish
220     it from commands for other extensions, and this might be enforced in the
221     future.
222    
223     Be careful not ever to trust (in a security sense) the data you receive,
224     as its source can not easily be controleld (e-mail content, messages from
225     other users on the same system etc.).
226 root 1.28
227 root 1.33 =item on_add_lines $term, $string
228    
229     Called whenever text is about to be output, with the text as argument. You
230     can filter/change and output the text yourself by returning a true value
231     and calling C<< $term->scr_add_lines >> yourself. Please note that this
232     might be very slow, however, as your hook is called for B<all> text being
233     output.
234    
235 root 1.35 =item on_line_update $term, $row
236    
237     Called whenever a line was updated or changed. Can be used to filter
238     screen output (e.g. underline urls or other useless stuff). Only lines
239     that are being shown will be filtered, and, due to performance reasons,
240     not always immediately.
241    
242     The row number is always the topmost row of the line if the line spans
243     multiple rows.
244    
245     Please note that, if you change the line, then the hook might get called
246     later with the already-modified line (e.g. if unrelated parts change), so
247     you cannot just toggle rendition bits, but only set them.
248    
249 root 1.1 =item on_refresh_begin $term
250    
251     Called just before the screen gets redrawn. Can be used for overlay
252     or similar effects by modify terminal contents in refresh_begin, and
253     restoring them in refresh_end. The built-in overlay and selection display
254     code is run after this hook, and takes precedence.
255    
256     =item on_refresh_end $term
257    
258     Called just after the screen gets redrawn. See C<on_refresh_begin>.
259    
260 root 1.11 =item on_keyboard_command $term, $string
261    
262     Called whenever the user presses a key combination that has a
263     C<perl:string> action bound to it (see description of the B<keysym>
264     resource in the @@RXVT_NAME@@(1) manpage).
265    
266 root 1.45 =item on_focus_in $term
267    
268     Called whenever the window gets the keyboard focus, before rxvt-unicode
269     does focus in processing.
270    
271     =item on_focus_out $term
272    
273     Called wheneever the window loses keyboard focus, before rxvt-unicode does
274     focus out processing.
275    
276 root 1.38 =item on_key_press $term, $event, $octets
277 root 1.37
278     =item on_key_release $term, $event
279    
280     =item on_button_press $term, $event
281    
282     =item on_button_release $term, $event
283    
284     =item on_motion_notify $term, $event
285    
286 root 1.45 =item on_map_notify $term, $event
287    
288     =item on_unmap_notify $term, $event
289    
290 root 1.39 Called whenever the corresponding X event is received for the terminal If
291     the hook returns true, then the even will be ignored by rxvt-unicode.
292    
293     The event is a hash with most values as named by Xlib (see the XEvent
294     manpage), with the additional members C<row> and C<col>, which are the row
295     and column under the mouse cursor.
296 root 1.38
297     C<on_key_press> additionally receives the string rxvt-unicode would
298     output, if any, in locale-specific encoding.
299 root 1.37
300     subwindow.
301    
302 root 1.1 =back
303    
304 root 1.23 =head2 Variables in the C<urxvt> Package
305    
306     =over 4
307    
308     =item $urxvt::TERM
309    
310 root 1.43 The current terminal. This variable stores the current C<urxvt::term>
311     object, whenever a callback/hook is executing.
312 root 1.23
313     =back
314    
315 root 1.1 =head2 Functions in the C<urxvt> Package
316    
317     =over 4
318    
319 root 1.36 =item $term = new urxvt [arg...]
320    
321     Creates a new terminal, very similar as if you had started it with
322     C<system $binfile, arg...>. Croaks (and probably outputs an error message)
323     if the new instance couldn't be created. Returns C<undef> if the new
324     instance didn't initialise perl, and the terminal object otherwise. The
325     C<init> and C<start> hooks will be called during the call.
326    
327 root 1.1 =item urxvt::fatal $errormessage
328    
329     Fatally aborts execution with the given error message. Avoid at all
330     costs! The only time this is acceptable is when the terminal process
331     starts up.
332    
333     =item urxvt::warn $string
334    
335 root 1.6 Calls C<rxvt_warn> with the given string which should not include a
336 root 1.1 newline. The module also overwrites the C<warn> builtin with a function
337     that calls this function.
338    
339     Using this function has the advantage that its output ends up in the
340     correct place, e.g. on stderr of the connecting urxvtc client.
341    
342     =item $time = urxvt::NOW
343    
344     Returns the "current time" (as per the event loop).
345    
346 root 1.47 =item urxvt::CurrentTime
347    
348     =item urxvt::ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask,
349     Mod3Mask, Mod4Mask, Mod5Mask, Button1Mask, Button2Mask, Button3Mask,
350     Button4Mask, Button5Mask, AnyModifier
351    
352 root 1.55 Various constants for use in X calls and event processing.
353 root 1.47
354 root 1.21 =back
355    
356 root 1.18 =head2 RENDITION
357    
358     Rendition bitsets contain information about colour, font, font styles and
359     similar information for each screen cell.
360    
361     The following "macros" deal with changes in rendition sets. You should
362     never just create a bitset, you should always modify an existing one,
363     as they contain important information required for correct operation of
364     rxvt-unicode.
365    
366     =over 4
367    
368     =item $rend = urxvt::DEFAULT_RSTYLE
369    
370     Returns the default rendition, as used when the terminal is starting up or
371     being reset. Useful as a base to start when creating renditions.
372    
373     =item $rend = urxvt::OVERLAY_RSTYLE
374    
375     Return the rendition mask used for overlays by default.
376    
377     =item $rendbit = urxvt::RS_Bold, RS_Italic, RS_Blink, RS_RVid, RS_Uline
378    
379     Return the bit that enabled bold, italic, blink, reverse-video and
380 root 1.19 underline, respectively. To enable such a style, just logically OR it into
381     the bitset.
382 root 1.18
383     =item $foreground = urxvt::GET_BASEFG $rend
384    
385     =item $background = urxvt::GET_BASEBG $rend
386    
387     Return the foreground/background colour index, respectively.
388    
389     =item $rend = urxvt::SET_FGCOLOR ($rend, $new_colour)
390    
391     =item $rend = urxvt::SET_BGCOLOR ($rend, $new_colour)
392    
393     Replace the foreground/background colour in the rendition mask with the
394     specified one.
395    
396 root 1.19 =item $value = urxvt::GET_CUSTOM ($rend)
397    
398     Return the "custom" value: Every rendition has 5 bits for use by
399     extensions. They can be set and changed as you like and are initially
400     zero.
401    
402     =item $rend = urxvt::SET_CUSTOM ($rend, $new_value)
403    
404     Change the custom value.
405    
406 root 1.18 =back
407    
408 root 1.1 =cut
409    
410     package urxvt;
411    
412 root 1.48 use utf8;
413 root 1.1 use strict;
414 root 1.23 use Scalar::Util ();
415 root 1.48 use List::Util ();
416 root 1.1
417 root 1.55 our $VERSION = 1;
418 root 1.23 our $TERM;
419 root 1.1 our @HOOKNAME;
420 root 1.49 our %OPTION;
421 root 1.1 our $LIBDIR;
422    
423     BEGIN {
424     urxvt->bootstrap;
425    
426     # overwrite perl's warn
427     *CORE::GLOBAL::warn = sub {
428     my $msg = join "", @_;
429     $msg .= "\n"
430     unless $msg =~ /\n$/;
431     urxvt::warn ($msg);
432     };
433 root 1.59
434     $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin";
435     delete $ENV{CDPATH};
436 root 1.1 }
437    
438 root 1.8 my @hook_count;
439 root 1.7 my $verbosity = $ENV{URXVT_PERL_VERBOSITY};
440 root 1.1
441     sub verbose {
442     my ($level, $msg) = @_;
443 root 1.8 warn "$msg\n" if $level <= $verbosity;
444 root 1.1 }
445    
446     # find on_xxx subs in the package and register them
447     # as hooks
448     sub register_package($) {
449     my ($pkg) = @_;
450    
451 root 1.7 for my $htype (0.. $#HOOKNAME) {
452     my $name = $HOOKNAME[$htype];
453 root 1.1
454     my $ref = $pkg->can ("on_" . lc $name)
455     or next;
456    
457 root 1.23 $TERM->{_hook}[$htype]{$pkg} = $ref;
458 root 1.7 $hook_count[$htype]++
459     or set_should_invoke $htype, 1;
460 root 1.1 }
461     }
462    
463 root 1.44 my $extension_pkg = "extension0000";
464     my %extension_pkg;
465 root 1.1
466     # load a single script into its own package, once only
467 root 1.44 sub extension_package($) {
468 root 1.1 my ($path) = @_;
469    
470 root 1.44 $extension_pkg{$path} ||= do {
471     my $pkg = "urxvt::" . ($extension_pkg++);
472 root 1.8
473 root 1.44 verbose 3, "loading extension '$path' into package '$pkg'";
474 root 1.1
475     open my $fh, "<:raw", $path
476     or die "$path: $!";
477    
478 root 1.59 my $source = untaint "package $pkg; use strict; use utf8;\n"
479 root 1.44 . "use base urxvt::term::proxy::;\n"
480 root 1.8 . "#line 1 \"$path\"\n{\n"
481     . (do { local $/; <$fh> })
482     . "\n};\n1";
483    
484     eval $source or die "$path: $@";
485 root 1.1
486     $pkg
487 root 1.7 }
488 root 1.1 }
489    
490 root 1.31 our $retval; # return value for urxvt
491    
492 root 1.8 # called by the rxvt core
493     sub invoke {
494 root 1.23 local $TERM = shift;
495 root 1.8 my $htype = shift;
496 root 1.6
497 root 1.8 if ($htype == 0) { # INIT
498 root 1.23 my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl");
499 root 1.49
500 root 1.50 my %want_ext;
501 root 1.6
502 root 1.50 for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) {
503     if ($_ eq "default") {
504 root 1.59 $want_ext{$_}++ for qw(selection option-popup selection-popup);
505 root 1.51 } elsif (/^-(.*)$/) {
506 root 1.50 delete $want_ext{$1};
507 root 1.49 } else {
508 root 1.50 $want_ext{$_}++;
509     }
510     }
511 root 1.6
512 root 1.50 for my $ext (keys %want_ext) {
513     my @files = grep -f $_, map "$_/$ext", @dirs;
514    
515     if (@files) {
516     register_package extension_package $files[0];
517     } else {
518     warn "perl extension '$ext' not found in perl library search path\n";
519 root 1.8 }
520     }
521 root 1.55
522     eval "#line 1 \"--perl-eval resource/argument\"\n" . $TERM->resource ("perl_eval");
523     warn $@ if $@;
524 root 1.31 }
525    
526     $retval = undef;
527 root 1.6
528 root 1.31 if (my $cb = $TERM->{_hook}[$htype]) {
529     verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")"
530     if $verbosity >= 10;
531    
532     keys %$cb;
533    
534     while (my ($pkg, $cb) = each %$cb) {
535 root 1.44 eval {
536     $retval = $cb->(
537     $TERM->{_pkg}{$pkg} ||= do {
538     my $proxy = bless { }, $pkg;
539     Scalar::Util::weaken ($proxy->{term} = $TERM);
540     $proxy
541     },
542     @_,
543     ) and last;
544     };
545 root 1.58 if ($@) {
546     $TERM->ungrab; # better to lose the grab than the session
547     warn $@;
548     }
549 root 1.31 }
550     }
551    
552     if ($htype == 1) { # DESTROY
553     # remove hooks if unused
554 root 1.23 if (my $hook = $TERM->{_hook}) {
555 root 1.8 for my $htype (0..$#$hook) {
556     $hook_count[$htype] -= scalar keys %{ $hook->[$htype] || {} }
557     or set_should_invoke $htype, 0;
558     }
559     }
560 root 1.7
561 root 1.31 # clear package objects
562     %$_ = () for values %{ $TERM->{_pkg} };
563 root 1.25
564 root 1.31 # clear package
565     %$TERM = ();
566 root 1.7 }
567    
568 root 1.31 $retval
569 root 1.7 }
570 root 1.1
571 root 1.55 # urxvt::term::proxy
572    
573 root 1.23 sub urxvt::term::proxy::AUTOLOAD {
574     $urxvt::term::proxy::AUTOLOAD =~ /:([^:]+)$/
575     or die "FATAL: \$AUTOLOAD '$urxvt::term::proxy::AUTOLOAD' unparsable";
576    
577     eval qq{
578     sub $urxvt::term::proxy::AUTOLOAD {
579 root 1.24 my \$proxy = shift;
580     \$proxy->{term}->$1 (\@_)
581 root 1.23 }
582     1
583     } or die "FATAL: unable to compile method forwarder: $@";
584    
585     goto &$urxvt::term::proxy::AUTOLOAD;
586     }
587    
588 root 1.58 sub urxvt::term::proxy::DESTROY {
589     # nop
590     }
591    
592 root 1.55 # urxvt::destroy_hook
593    
594 root 1.45 sub urxvt::destroy_hook::DESTROY {
595     ${$_[0]}->();
596     }
597    
598     sub urxvt::destroy_hook(&) {
599     bless \shift, urxvt::destroy_hook::
600     }
601    
602 root 1.56 package urxvt::anyevent;
603    
604     =head2 The C<urxvt::anyevent> Class
605    
606     The sole purpose of this class is to deliver an interface to the
607     C<AnyEvent> module - any module using it will work inside urxvt without
608     further work. The only exception is that you cannot wait on condition
609     variables, but non-blocking condvar use is ok. What this means is that you
610     cannot use blocking APIs, but the non-blocking variant should work.
611 root 1.55
612 root 1.56 =cut
613 root 1.55
614     our $VERSION = 1;
615    
616     $INC{"urxvt/anyevent.pm"} = 1; # mark us as there
617     push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
618    
619     sub timer {
620     my ($class, %arg) = @_;
621    
622     my $cb = $arg{cb};
623    
624     urxvt::timer
625     ->new
626     ->start (urxvt::NOW + $arg{after})
627     ->cb (sub {
628     $_[0]->stop; # need to cancel manually
629     $cb->();
630     })
631     }
632    
633     sub io {
634     my ($class, %arg) = @_;
635    
636     my $cb = $arg{cb};
637    
638     bless [$arg{fh}, urxvt::iow
639     ->new
640     ->fd (fileno $arg{fh})
641     ->events (($arg{poll} =~ /r/ ? 1 : 0)
642     | ($arg{poll} =~ /w/ ? 2 : 0))
643     ->start
644     ->cb (sub {
645     $cb->(($_[1] & 1 ? 'r' : '')
646     . ($_[1] & 2 ? 'w' : ''));
647     })],
648     urxvt::anyevent::
649     }
650    
651     sub DESTROY {
652     $_[0][1]->stop;
653     }
654    
655     sub condvar {
656     bless \my $flag, urxvt::anyevent::condvar::
657     }
658    
659     sub urxvt::anyevent::condvar::broadcast {
660     ${$_[0]}++;
661     }
662    
663     sub urxvt::anyevent::condvar::wait {
664     unless (${$_[0]}) {
665     require Carp;
666     Carp::croak ("AnyEvent->condvar blocking wait unsupported in urxvt, use a non-blocking API");
667     }
668     }
669    
670     package urxvt::term;
671    
672 root 1.1 =head2 The C<urxvt::term> Class
673    
674     =over 4
675    
676 root 1.36 =item $term->destroy
677    
678     Destroy the terminal object (close the window, free resources etc.).
679    
680 root 1.49 =item $isset = $term->option ($optval[, $set])
681    
682     Returns true if the option specified by C<$optval> is enabled, and
683     optionally change it. All option values are stored by name in the hash
684     C<%urxvt::OPTION>. Options not enabled in this binary are not in the hash.
685    
686     Here is a a likely non-exhaustive list of option names, please see the
687     source file F</src/optinc.h> to see the actual list:
688    
689     borderLess console cursorBlink cursorUnderline hold iconic insecure
690     intensityStyles jumpScroll loginShell mapAlert meta8 mouseWheelScrollPage
691     pastableTabs pointerBlank reverseVideo scrollBar scrollBar_floating
692     scrollBar_right scrollTtyKeypress scrollTtyOutput scrollWithBuffer
693     secondaryScreen secondaryScroll skipBuiltinGlyphs transparent
694     tripleclickwords utmpInhibit visualBell
695    
696 root 1.4 =item $value = $term->resource ($name[, $newval])
697    
698     Returns the current resource value associated with a given name and
699     optionally sets a new value. Setting values is most useful in the C<init>
700     hook. Unset resources are returned and accepted as C<undef>.
701    
702     The new value must be properly encoded to a suitable character encoding
703     before passing it to this method. Similarly, the returned value may need
704     to be converted from the used encoding to text.
705    
706     Resource names are as defined in F<src/rsinc.h>. Colours can be specified
707     as resource names of the form C<< color+<index> >>, e.g. C<color+5>. (will
708     likely change).
709    
710     Please note that resource strings will currently only be freed when the
711     terminal is destroyed, so changing options frequently will eat memory.
712    
713 root 1.5 Here is a a likely non-exhaustive list of resource names, not all of which
714 root 1.49 are supported in every build, please see the source file F</src/rsinc.h>
715     to see the actual list:
716 root 1.5
717     answerbackstring backgroundPixmap backspace_key boldFont boldItalicFont
718     borderLess color cursorBlink cursorUnderline cutchars delete_key
719     display_name embed ext_bwidth fade font geometry hold iconName
720     imFont imLocale inputMethod insecure int_bwidth intensityStyles
721 root 1.8 italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier
722 root 1.30 mouseWheelScrollPage name pastableTabs path perl_eval perl_ext_1 perl_ext_2
723 root 1.6 perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd
724     reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating
725     scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput
726     scrollWithBuffer scrollstyle secondaryScreen secondaryScroll selectstyle
727     shade term_name title transparent transparent_all tripleclickwords
728     utmpInhibit visualBell
729 root 1.5
730 root 1.4 =cut
731    
732 root 1.55 sub resource($$;$) {
733 root 1.4 my ($self, $name) = (shift, shift);
734     unshift @_, $self, $name, ($name =~ s/\s*\+\s*(\d+)$// ? $1 : 0);
735 root 1.45 &urxvt::term::_resource
736 root 1.4 }
737    
738 root 1.33 =item $rend = $term->rstyle ([$new_rstyle])
739 root 1.32
740 root 1.33 Return and optionally change the current rendition. Text that is output by
741     the terminal application will use this style.
742 root 1.32
743     =item ($row, $col) = $term->screen_cur ([$row, $col])
744    
745     Return the current coordinates of the text cursor position and optionally
746     set it (which is usually bad as applications don't expect that).
747    
748 root 1.1 =item ($row, $col) = $term->selection_mark ([$row, $col])
749    
750     =item ($row, $col) = $term->selection_beg ([$row, $col])
751    
752     =item ($row, $col) = $term->selection_end ([$row, $col])
753    
754     Return the current values of the selection mark, begin or end positions,
755     and optionally set them to new values.
756    
757     =item $success = $term->selection_grab ($eventtime)
758    
759     Try to request the primary selection from the server (for example, as set
760     by the next method).
761    
762     =item $oldtext = $term->selection ([$newtext])
763    
764     Return the current selection text and optionally replace it by C<$newtext>.
765    
766 root 1.20 #=item $term->overlay ($x, $y, $text)
767     #
768     #Create a simple multi-line overlay box. See the next method for details.
769     #
770     #=cut
771 root 1.33 #
772     #sub urxvt::term::scr_overlay {
773     # my ($self, $x, $y, $text) = @_;
774     #
775     # my @lines = split /\n/, $text;
776     #
777     # my $w = 0;
778     # for (map $self->strwidth ($_), @lines) {
779     # $w = $_ if $w < $_;
780     # }
781     #
782     # $self->scr_overlay_new ($x, $y, $w, scalar @lines);
783     # $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines;
784     #}
785 root 1.1
786 root 1.20 =item $term->overlay ($x, $y, $width, $height[, $rstyle[, $border]])
787 root 1.1
788     Create a new (empty) overlay at the given position with the given
789 root 1.20 width/height. C<$rstyle> defines the initial rendition style
790     (default: C<OVERLAY_RSTYLE>).
791 root 1.1
792 root 1.20 If C<$border> is C<2> (default), then a decorative border will be put
793     around the box.
794 root 1.1
795 root 1.20 If either C<$x> or C<$y> is negative, then this is counted from the
796     right/bottom side, respectively.
797 root 1.1
798 root 1.20 This method returns an urxvt::overlay object. The overlay will be visible
799     as long as the perl object is referenced.
800 root 1.1
801 root 1.22 The methods currently supported on C<urxvt::overlay> objects are:
802    
803     =over 4
804 root 1.1
805 root 1.20 =item $overlay->set ($x, $y, $text, $rend)
806 root 1.1
807 root 1.20 Similar to C<< $term->ROW_t >> and C<< $term->ROW_r >> in that it puts
808     text in rxvt-unicode's special encoding and an array of rendition values
809     at a specific position inside the overlay.
810 root 1.1
811 root 1.22 =item $overlay->hide
812    
813     If visible, hide the overlay, but do not destroy it.
814    
815     =item $overlay->show
816    
817     If hidden, display the overlay again.
818    
819     =back
820    
821 root 1.45 =item $popup = $term->popup ($event)
822    
823     Creates a new C<urxvt::popup> object that implements a popup menu. The
824     C<$event> I<must> be the event causing the menu to pop up (a button event,
825     currently).
826    
827     =cut
828    
829 root 1.55 sub popup {
830 root 1.45 my ($self, $event) = @_;
831    
832     $self->grab ($event->{time}, 1)
833     or return;
834    
835     my $popup = bless {
836     term => $self,
837     event => $event,
838     }, urxvt::popup::;
839    
840     Scalar::Util::weaken $popup->{term};
841    
842     $self->{_destroy}{$popup} = urxvt::destroy_hook { $popup->{popup}->destroy };
843     Scalar::Util::weaken $self->{_destroy}{$popup};
844    
845     $popup
846     }
847    
848 root 1.40 =item $cellwidth = $term->strwidth ($string)
849 root 1.6
850     Returns the number of screen-cells this string would need. Correctly
851     accounts for wide and combining characters.
852    
853 root 1.40 =item $octets = $term->locale_encode ($string)
854 root 1.6
855     Convert the given text string into the corresponding locale encoding.
856    
857 root 1.40 =item $string = $term->locale_decode ($octets)
858 root 1.6
859     Convert the given locale-encoded octets into a perl string.
860    
861 root 1.33 =item $term->scr_add_lines ($string)
862    
863     Write the given text string to the screen, as if output by the application
864     running inside the terminal. It may not contain command sequences (escape
865     codes), but is free to use line feeds, carriage returns and tabs. The
866     string is a normal text string, not in locale-dependent encoding.
867    
868     Normally its not a good idea to use this function, as programs might be
869     confused by changes in cursor position or scrolling. Its useful inside a
870     C<on_add_lines> hook, though.
871    
872 root 1.36 =item $term->cmd_parse ($octets)
873    
874     Similar to C<scr_add_lines>, but the argument must be in the
875     locale-specific encoding of the terminal and can contain command sequences
876     (escape codes) that will be interpreted.
877    
878 root 1.6 =item $term->tt_write ($octets)
879    
880     Write the octets given in C<$data> to the tty (i.e. as program input). To
881 root 1.12 pass characters instead of octets, you should convert your strings first
882     to the locale-specific encoding using C<< $term->locale_encode >>.
883    
884 root 1.40 =item $windowid = $term->parent
885    
886     Return the window id of the toplevel window.
887    
888     =item $windowid = $term->vt
889    
890     Return the window id of the terminal window.
891    
892 root 1.32 =item $window_width = $term->width
893    
894     =item $window_height = $term->height
895    
896     =item $font_width = $term->fwidth
897    
898     =item $font_height = $term->fheight
899    
900     =item $font_ascent = $term->fbase
901    
902     =item $terminal_rows = $term->nrow
903    
904     =item $terminal_columns = $term->ncol
905    
906     =item $has_focus = $term->focus
907    
908     =item $is_mapped = $term->mapped
909 root 1.13
910 root 1.32 =item $max_scrollback = $term->saveLines
911 root 1.13
912 root 1.32 =item $nrow_plus_saveLines = $term->total_rows
913 root 1.13
914 root 1.32 =item $lines_in_scrollback = $term->nsaved
915 root 1.12
916 root 1.32 Return various integers describing terminal characteristics.
917 root 1.12
918 root 1.47 =item $modifiermask = $term->ModLevel3Mask
919    
920     =item $modifiermask = $term->ModMetaMask
921    
922     =item $modifiermask = $term->ModNumLockMask
923    
924     Return the modifier masks corresponding to the "ISO Level 3 Shift" (often
925     AltGr), the meta key (often Alt) and the num lock key, if applicable.
926    
927 root 1.12 =item $view_start = $term->view_start ([$newvalue])
928    
929     Returns the negative row number of the topmost line. Minimum value is
930     C<0>, which displays the normal terminal contents. Larger values scroll
931     this many lines into the scrollback buffer.
932    
933 root 1.14 =item $term->want_refresh
934    
935     Requests a screen refresh. At the next opportunity, rxvt-unicode will
936     compare the on-screen display with its stored representation. If they
937     differ, it redraws the differences.
938    
939     Used after changing terminal contents to display them.
940    
941 root 1.13 =item $text = $term->ROW_t ($row_number[, $new_text[, $start_col]])
942 root 1.12
943     Returns the text of the entire row with number C<$row_number>. Row C<0>
944     is the topmost terminal line, row C<< $term->$ncol-1 >> is the bottommost
945     terminal line. The scrollback buffer starts at line C<-1> and extends to
946 root 1.24 line C<< -$term->nsaved >>. Nothing will be returned if a nonexistent line
947     is requested.
948 root 1.12
949 root 1.13 If C<$new_text> is specified, it will replace characters in the current
950     line, starting at column C<$start_col> (default C<0>), which is useful
951 root 1.18 to replace only parts of a line. The font index in the rendition will
952 root 1.13 automatically be updated.
953 root 1.12
954     C<$text> is in a special encoding: tabs and wide characters that use more
955     than one cell when displayed are padded with urxvt::NOCHAR characters
956     (C<chr 65535>). Characters with combining characters and other characters
957     that do not fit into the normal tetx encoding will be replaced with
958     characters in the private use area.
959    
960     You have to obey this encoding when changing text. The advantage is
961     that C<substr> and similar functions work on screen cells and not on
962     characters.
963    
964     The methods C<< $term->special_encode >> and C<< $term->special_decode >>
965     can be used to convert normal strings into this encoding and vice versa.
966    
967 root 1.13 =item $rend = $term->ROW_r ($row_number[, $new_rend[, $start_col]])
968    
969     Like C<< $term->ROW_t >>, but returns an arrayref with rendition
970     bitsets. Rendition bitsets contain information about colour, font, font
971     styles and similar information. See also C<< $term->ROW_t >>.
972    
973     When setting rendition, the font mask will be ignored.
974 root 1.12
975 root 1.18 See the section on RENDITION, above.
976 root 1.13
977     =item $length = $term->ROW_l ($row_number[, $new_length])
978    
979 root 1.24 Returns the number of screen cells that are in use ("the line
980     length"). Unlike the urxvt core, this returns C<< $term->ncol >> if the
981     line is joined with the following one.
982    
983     =item $bool = $term->is_longer ($row_number)
984    
985     Returns true if the row is part of a multiple-row logical "line" (i.e.
986     joined with the following row), which means all characters are in use
987     and it is continued on the next row (and possibly a continuation of the
988     previous row(s)).
989    
990     =item $line = $term->line ($row_number)
991    
992     Create and return a new C<urxvt::line> object that stores information
993     about the logical line that row C<$row_number> is part of. It supports the
994     following methods:
995 root 1.12
996 root 1.24 =over 4
997    
998 root 1.35 =item $text = $line->t ([$new_text])
999 root 1.24
1000 root 1.35 Returns or replaces the full text of the line, similar to C<ROW_t>
1001 root 1.24
1002 root 1.35 =item $rend = $line->r ([$new_rend])
1003 root 1.24
1004 root 1.35 Returns or replaces the full rendition array of the line, similar to C<ROW_r>
1005 root 1.24
1006     =item $length = $line->l
1007    
1008     Returns the length of the line in cells, similar to C<ROW_l>.
1009    
1010     =item $rownum = $line->beg
1011    
1012     =item $rownum = $line->end
1013    
1014     Return the row number of the first/last row of the line, respectively.
1015    
1016     =item $offset = $line->offset_of ($row, $col)
1017    
1018     Returns the character offset of the given row|col pair within the logical
1019     line.
1020    
1021     =item ($row, $col) = $line->coord_of ($offset)
1022    
1023     Translates a string offset into terminal coordinates again.
1024    
1025     =back
1026    
1027     =cut
1028    
1029 root 1.55 sub line {
1030 root 1.24 my ($self, $row) = @_;
1031    
1032     my $maxrow = $self->nrow - 1;
1033    
1034     my ($beg, $end) = ($row, $row);
1035    
1036     --$beg while $self->ROW_is_longer ($beg - 1);
1037     ++$end while $self->ROW_is_longer ($end) && $end < $maxrow;
1038    
1039     bless {
1040     term => $self,
1041     beg => $beg,
1042     end => $end,
1043 root 1.34 ncol => $self->ncol,
1044 root 1.24 len => ($end - $beg) * $self->ncol + $self->ROW_l ($end),
1045     }, urxvt::line::
1046     }
1047    
1048     sub urxvt::line::t {
1049     my ($self) = @_;
1050    
1051 root 1.34 if (@_ > 1)
1052     {
1053     $self->{term}->ROW_t ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1054     for $self->{beg} .. $self->{end};
1055     }
1056    
1057     defined wantarray &&
1058     substr +(join "", map $self->{term}->ROW_t ($_), $self->{beg} .. $self->{end}),
1059     0, $self->{len}
1060 root 1.24 }
1061    
1062     sub urxvt::line::r {
1063     my ($self) = @_;
1064    
1065 root 1.34 if (@_ > 1)
1066     {
1067     $self->{term}->ROW_r ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1068     for $self->{beg} .. $self->{end};
1069     }
1070    
1071     if (defined wantarray) {
1072     my $rend = [
1073     map @{ $self->{term}->ROW_r ($_) }, $self->{beg} .. $self->{end}
1074     ];
1075     $#$rend = $self->{len} - 1;
1076     return $rend;
1077     }
1078    
1079     ()
1080 root 1.24 }
1081    
1082     sub urxvt::line::beg { $_[0]{beg} }
1083     sub urxvt::line::end { $_[0]{end} }
1084     sub urxvt::line::l { $_[0]{len} }
1085    
1086     sub urxvt::line::offset_of {
1087     my ($self, $row, $col) = @_;
1088    
1089 root 1.34 ($row - $self->{beg}) * $self->{ncol} + $col
1090 root 1.24 }
1091    
1092     sub urxvt::line::coord_of {
1093     my ($self, $offset) = @_;
1094    
1095     use integer;
1096    
1097     (
1098 root 1.34 $offset / $self->{ncol} + $self->{beg},
1099     $offset % $self->{ncol}
1100 root 1.24 )
1101     }
1102    
1103     =item ($row, $col) = $line->coord_of ($offset)
1104 root 1.12 =item $text = $term->special_encode $string
1105    
1106     Converts a perl string into the special encoding used by rxvt-unicode,
1107     where one character corresponds to one screen cell. See
1108     C<< $term->ROW_t >> for details.
1109    
1110     =item $string = $term->special_decode $text
1111    
1112     Converts rxvt-unicodes text reprsentation into a perl string. See
1113     C<< $term->ROW_t >> for details.
1114 root 1.6
1115 root 1.1 =back
1116    
1117 root 1.55 =cut
1118    
1119     package urxvt::popup;
1120    
1121 root 1.45 =head2 The C<urxvt::popup> Class
1122    
1123     =over 4
1124    
1125     =cut
1126    
1127     sub add_item {
1128     my ($self, $item) = @_;
1129    
1130 root 1.53 $item->{rend}{normal} = "\x1b[0;30;47m" unless exists $item->{rend}{normal};
1131     $item->{rend}{hover} = "\x1b[0;30;46m" unless exists $item->{rend}{hover};
1132     $item->{rend}{active} = "\x1b[m" unless exists $item->{rend}{active};
1133    
1134     $item->{render} ||= sub { $_[0]{text} };
1135    
1136 root 1.45 push @{ $self->{item} }, $item;
1137     }
1138    
1139 root 1.53 sub add_separator {
1140     my ($self, $sep) = @_;
1141    
1142     $sep ||= "═";
1143    
1144     $self->add_item ({
1145     rend => { normal => "\x1b[0;30;47m", hover => "\x1b[0;30;47m", active => "\x1b[0;30;47m" },
1146     text => "",
1147     render => sub { $sep x $urxvt::TERM->ncol },
1148     activate => sub { },
1149     });
1150     }
1151    
1152     sub add_title {
1153     my ($self, $title) = @_;
1154    
1155     $self->add_item ({
1156     rend => { normal => "\x1b[38;5;11;44m", hover => "\x1b[38;5;11;44m", active => "\x1b[38;5;11;44m" },
1157     text => $title,
1158     activate => sub { },
1159     });
1160     }
1161    
1162 root 1.45 sub add_button {
1163     my ($self, $text, $cb) = @_;
1164    
1165 root 1.53 $self->add_item ({ type => "button", text => "[ $text ]", activate => $cb});
1166 root 1.48 }
1167    
1168     sub add_toggle {
1169     my ($self, $text, $cb, $value) = @_;
1170    
1171 root 1.49 my $item; $item = {
1172     type => "button",
1173     text => " $text",
1174     value => $value,
1175 root 1.58 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1176     activate => sub { $cb->($_[0]{value} = !$_[0]{value}); },
1177 root 1.49 };
1178    
1179     $self->add_item ($item);
1180 root 1.45 }
1181    
1182     sub show {
1183     my ($self) = @_;
1184    
1185     local $urxvt::popup::self = $self;
1186    
1187     urxvt->new ("--perl-lib" => "", "--perl-ext-common" => "", "-pty-fd" => -1, "-sl" => 0, "-b" => 0,
1188     "--transient-for" => $self->{term}->parent,
1189 root 1.46 "-pe" => "urxvt-popup")
1190 root 1.45 or die "unable to create popup window\n";
1191     }
1192    
1193     sub DESTROY {
1194     my ($self) = @_;
1195    
1196 root 1.58 delete $self->{term}{_destroy}{$self};
1197 root 1.45 $self->{term}->ungrab;
1198     }
1199    
1200 root 1.1 =head2 The C<urxvt::timer> Class
1201    
1202     This class implements timer watchers/events. Time is represented as a
1203     fractional number of seconds since the epoch. Example:
1204    
1205 root 1.20 $term->{overlay} = $term->overlay (-1, 0, 8, 1, urxvt::OVERLAY_RSTYLE, 0);
1206 root 1.1 $term->{timer} = urxvt::timer
1207     ->new
1208 root 1.20 ->interval (1)
1209 root 1.1 ->cb (sub {
1210 root 1.20 $term->{overlay}->set (0, 0,
1211     sprintf "%2d:%02d:%02d", (localtime urxvt::NOW)[2,1,0]);
1212     });
1213 root 1.1
1214     =over 4
1215    
1216     =item $timer = new urxvt::timer
1217    
1218 root 1.20 Create a new timer object in started state. It is scheduled to fire
1219     immediately.
1220 root 1.1
1221     =item $timer = $timer->cb (sub { my ($timer) = @_; ... })
1222    
1223     Set the callback to be called when the timer triggers.
1224    
1225     =item $tstamp = $timer->at
1226    
1227     Return the time this watcher will fire next.
1228    
1229     =item $timer = $timer->set ($tstamp)
1230    
1231     Set the time the event is generated to $tstamp.
1232    
1233 root 1.20 =item $timer = $timer->interval ($interval)
1234    
1235     Normally (and when C<$interval> is C<0>), the timer will automatically
1236     stop after it has fired once. If C<$interval> is non-zero, then the timer
1237     is automatically rescheduled at the given intervals.
1238    
1239 root 1.1 =item $timer = $timer->start
1240    
1241     Start the timer.
1242    
1243     =item $timer = $timer->start ($tstamp)
1244    
1245     Set the event trigger time to C<$tstamp> and start the timer.
1246    
1247     =item $timer = $timer->stop
1248    
1249     Stop the timer.
1250    
1251     =back
1252    
1253     =head2 The C<urxvt::iow> Class
1254    
1255     This class implements io watchers/events. Example:
1256    
1257     $term->{socket} = ...
1258     $term->{iow} = urxvt::iow
1259     ->new
1260     ->fd (fileno $term->{socket})
1261     ->events (1) # wait for read data
1262     ->start
1263     ->cb (sub {
1264     my ($iow, $revents) = @_;
1265     # $revents must be 1 here, no need to check
1266     sysread $term->{socket}, my $buf, 8192
1267     or end-of-file;
1268     });
1269    
1270    
1271     =over 4
1272    
1273     =item $iow = new urxvt::iow
1274    
1275     Create a new io watcher object in stopped state.
1276    
1277     =item $iow = $iow->cb (sub { my ($iow, $reventmask) = @_; ... })
1278    
1279     Set the callback to be called when io events are triggered. C<$reventmask>
1280     is a bitset as described in the C<events> method.
1281    
1282     =item $iow = $iow->fd ($fd)
1283    
1284     Set the filedescriptor (not handle) to watch.
1285    
1286     =item $iow = $iow->events ($eventmask)
1287    
1288     Set the event mask to watch. Bit #0 (value C<1>) enables watching for read
1289     data, Bit #1 (value C<2>) enables watching for write data.
1290    
1291     =item $iow = $iow->start
1292    
1293     Start watching for requested events on the given handle.
1294    
1295     =item $iow = $iow->stop
1296    
1297     Stop watching for events on the given filehandle.
1298    
1299     =back
1300    
1301 root 1.4 =head1 ENVIRONMENT
1302    
1303     =head2 URXVT_PERL_VERBOSITY
1304    
1305     This variable controls the verbosity level of the perl extension. Higher
1306     numbers indicate more verbose output.
1307    
1308     =over 4
1309    
1310 root 1.58 =item == 0 - fatal messages
1311 root 1.4
1312 root 1.58 =item >= 3 - script loading and management
1313 root 1.4
1314 root 1.58 =item >=10 - all events received
1315 root 1.4
1316     =back
1317    
1318 root 1.1 =head1 AUTHOR
1319    
1320     Marc Lehmann <pcg@goof.com>
1321     http://software.schmorp.de/pkg/rxvt-unicode
1322    
1323     =cut
1324    
1325     1