ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.88
Committed: Thu Jan 12 12:05:28 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.87: +43 -3 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.75 =head1 PREPACKAGED EXTENSIONS
32 root 1.15
33 root 1.75 This section describes the extensions delivered with this release. You can
34 root 1.15 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.75 (More) intelligent selection. This extension tries to be more intelligent
45 root 1.87 when the user extends selections (double-click and further clicks). Right
46     now, it tries to select words, urls and complete shell-quoted
47     arguments, which is very convenient, too, if your F<ls> supports
48     C<--quoting-style=shell>.
49    
50     A double-click usually selects the word under the cursor, further clicks
51     will enlarge the selection.
52 root 1.22
53 root 1.88 The selection works by trying to match a number of regexes and displaying
54     them in increasing order of length. You can add your own regexes by
55     specifying resources of the form:
56    
57     URxvt.selection.pattern-0: perl-regex
58     URxvt.selection.pattern-1: perl-regex
59     ...
60    
61     The index number (0, 1...) must not have any holes, and each regex must
62     contain at least one pair of capturing parentheses, which will be used for
63     the match. For example, the followign adds a regex that matches everything
64     between two vertical bars:
65    
66     URxvt.selection.pattern-0: \\|([^|]+)\\|
67    
68     You can look at the source of the selection extension to see more
69     interesting uses, such as parsing a line from beginning to end.
70    
71     This extension also offers the following bindable keyboard command:
72 root 1.15
73     =over 4
74    
75     =item rot13
76    
77     Rot-13 the selection when activated. Used via keyboard trigger:
78    
79     URxvt.keysym.C-M-r: perl:selection:rot13
80    
81     =back
82    
83 root 1.54 =item option-popup (enabled by default)
84    
85 root 1.59 Binds a popup menu to Ctrl-Button2 that lets you toggle (some) options at
86 root 1.54 runtime.
87    
88 root 1.59 =item selection-popup (enabled by default)
89    
90     Binds a popup menu to Ctrl-Button3 that lets you convert the selection
91 root 1.75 text into various other formats/action (such as uri unescaping, perl
92     evalution, web-browser starting etc.), depending on content.
93 root 1.59
94 root 1.74 =item searchable-scrollback<hotkey> (enabled by default)
95 root 1.69
96 root 1.74 Adds regex search functionality to the scrollback buffer, triggered
97 root 1.87 by a hotkey (default: C<M-s>). While in search mode, normal terminal
98     input/output is suspended and a regex is displayed at the bottom of the
99     screen.
100    
101     Inputting characters appends them to the regex and continues incremental
102     search. C<BackSpace> removes a character from the regex, C<Up> and C<Down>
103     search upwards/downwards in the scrollback buffer, C<End> jumps to the
104     bottom. C<Escape> leaves search mode and returns to the point where search
105     was started, while C<Enter> or C<Return> stay at the current position and
106     additionally stores the first match in the current line into the primary
107     selection.
108 root 1.69
109 root 1.88 =item selection-autotransform
110    
111     This selection allows you to do automatic transforms on a selection
112     whenever a selection is made.
113    
114     It works by specifying perl snippets (most useful is a single C<s///>
115     operator) that modify C<$_> as resources:
116    
117     URxvt.selection-autotransform.0: transform
118     URxvt.selection-autotransform.1: transform
119     ...
120    
121     For example, the following will transform selections of the form
122     C<word:number> into C<vi +$number $word>:
123    
124     URxvt.selection-autotransform.0: s/^(S+):(d+):?$/vi +$2 $1\\x0d/
125    
126     And this example matches the same,but replaces it with vi-commands you can
127     paste directory into your (vi :) editor:
128 root 1.15
129 root 1.88 URxvt.selection-autotransform.0: s/^(S+):(d+):?$/\\x1b:e $1\\x0d:$2\\x0d/
130 root 1.20
131 root 1.35 =item mark-urls
132    
133 root 1.79 Uses per-line display filtering (C<on_line_update>) to underline urls and
134 root 1.83 make them clickable. When middle-clicked, the program specified in the
135 root 1.87 resource C<urlLauncher> (default C<x-www-browser>) will be started with
136     the URL as first argument.
137 root 1.42
138     =item block-graphics-to-ascii
139    
140     A not very useful example of filtering all text output to the terminal,
141     by replacing all line-drawing characters (U+2500 .. U+259F) by a
142     similar-looking ascii character.
143 root 1.35
144 root 1.88 =item digital-clock
145    
146     Displays a digital clock using the built-in overlay.
147    
148 root 1.20 =item example-refresh-hooks
149    
150 root 1.15 Displays a very simple digital clock in the upper right corner of the
151     window. Illustrates overwriting the refresh callbacks to create your own
152     overlays or changes.
153    
154     =back
155    
156 root 1.75 =head1 API DOCUMENTATION
157    
158 root 1.6 =head2 General API Considerations
159    
160     All objects (such as terminals, time watchers etc.) are typical
161     reference-to-hash objects. The hash can be used to store anything you
162 root 1.7 like. All members starting with an underscore (such as C<_ptr> or
163 root 1.23 C<_hook>) are reserved for internal uses and B<MUST NOT> be accessed or
164 root 1.7 modified).
165 root 1.6
166     When objects are destroyed on the C++ side, the perl object hashes are
167     emptied, so its best to store related objects such as time watchers and
168     the like inside the terminal object so they get destroyed as soon as the
169     terminal is destroyed.
170    
171 root 1.33 Argument names also often indicate the type of a parameter. Here are some
172     hints on what they mean:
173    
174     =over 4
175    
176     =item $text
177    
178     Rxvt-unicodes special way of encoding text, where one "unicode" character
179 root 1.78 always represents one screen cell. See L<ROW_t> for a discussion of this format.
180 root 1.33
181     =item $string
182    
183     A perl text string, with an emphasis on I<text>. It can store all unicode
184     characters and is to be distinguished with text encoded in a specific
185     encoding (often locale-specific) and binary data.
186    
187     =item $octets
188    
189     Either binary data or - more common - a text string encoded in a
190     locale-specific way.
191    
192     =back
193    
194 root 1.69 =head2 Extension Objects
195    
196     Very perl extension is a perl class. A separate perl object is created
197     for each terminal and each extension and passed as the first parameter to
198     hooks. So extensions can use their C<$self> object without having to think
199     about other extensions, with the exception of methods and members that
200     begin with an underscore character C<_>: these are reserved for internal
201     use.
202    
203     Although it isn't a C<urxvt::term> object, you can call all methods of the
204     C<urxvt::term> class on this object.
205    
206     It has the following methods and data members:
207    
208     =over 4
209    
210     =item $urxvt_term = $self->{term}
211    
212     Returns the C<urxvt::term> object associated with this instance of the
213     extension. This member I<must not> be changed in any way.
214    
215     =item $self->enable ($hook_name => $cb, [$hook_name => $cb..])
216    
217     Dynamically enable the given hooks (named without the C<on_> prefix) for
218     this extension, replacing any previous hook. This is useful when you want
219     to overwrite time-critical hooks only temporarily.
220    
221     =item $self->disable ($hook_name[, $hook_name..])
222    
223     Dynamically disable the given hooks.
224    
225     =back
226    
227 root 1.1 =head2 Hooks
228    
229 root 1.43 The following subroutines can be declared in extension files, and will be
230 root 1.23 called whenever the relevant event happens.
231    
232 root 1.69 The first argument passed to them is an extension oject as described in
233     the in the C<Extension Objects> section.
234    
235     B<All> of these hooks must return a boolean value. If it is true, then the
236     event counts as being I<consumed>, and the invocation of other hooks is
237     skipped, and the relevant action might not be carried out by the C++ code.
238 root 1.1
239 root 1.69 I<< When in doubt, return a false value (preferably C<()>). >>
240 root 1.1
241     =over 4
242    
243     =item on_init $term
244    
245     Called after a new terminal object has been initialized, but before
246 root 1.36 windows are created or the command gets run. Most methods are unsafe to
247     call or deliver senseless data, as terminal size and other characteristics
248     have not yet been determined. You can safely query and change resources,
249     though.
250 root 1.1
251     =item on_reset $term
252    
253     Called after the screen is "reset" for any reason, such as resizing or
254     control sequences. Here is where you can react on changes to size-related
255     variables.
256    
257     =item on_start $term
258    
259     Called at the very end of initialisation of a new terminal, just before
260     returning to the mainloop.
261    
262     =item on_sel_make $term, $eventtime
263    
264     Called whenever a selection has been made by the user, but before the
265     selection text is copied, so changes to the beginning, end or type of the
266     selection will be honored.
267    
268     Returning a true value aborts selection making by urxvt, in which case you
269     have to make a selection yourself by calling C<< $term->selection_grab >>.
270    
271     =item on_sel_grab $term, $eventtime
272    
273     Called whenever a selection has been copied, but before the selection is
274     requested from the server. The selection text can be queried and changed
275     by calling C<< $term->selection >>.
276    
277     Returning a true value aborts selection grabbing. It will still be hilighted.
278    
279 root 1.22 =item on_sel_extend $term
280    
281     Called whenever the user tries to extend the selection (e.g. with a double
282     click) and is either supposed to return false (normal operation), or
283     should extend the selection itelf and return true to suppress the built-in
284 root 1.85 processing. This can happen multiple times, as long as the callback
285     returns true, it will be called on every further click by the user and is
286     supposed to enlarge the selection more and more, if possible.
287 root 1.22
288     See the F<selection> example extension.
289    
290 root 1.1 =item on_view_change $term, $offset
291    
292     Called whenever the view offset changes, i..e the user or program
293     scrolls. Offset C<0> means display the normal terminal, positive values
294     show this many lines of scrollback.
295    
296     =item on_scroll_back $term, $lines, $saved
297    
298     Called whenever lines scroll out of the terminal area into the scrollback
299     buffer. C<$lines> is the number of lines scrolled out and may be larger
300     than the scroll back buffer or the terminal.
301    
302     It is called before lines are scrolled out (so rows 0 .. min ($lines - 1,
303     $nrow - 1) represent the lines to be scrolled out). C<$saved> is the total
304     number of lines that will be in the scrollback buffer.
305    
306 root 1.28 =item on_osc_seq $term, $string
307    
308 root 1.29 Called whenever the B<ESC ] 777 ; string ST> command sequence (OSC =
309     operating system command) is processed. Cursor position and other state
310     information is up-to-date when this happens. For interoperability, the
311     string should start with the extension name and a colon, to distinguish
312     it from commands for other extensions, and this might be enforced in the
313     future.
314    
315     Be careful not ever to trust (in a security sense) the data you receive,
316     as its source can not easily be controleld (e-mail content, messages from
317     other users on the same system etc.).
318 root 1.28
319 root 1.33 =item on_add_lines $term, $string
320    
321     Called whenever text is about to be output, with the text as argument. You
322     can filter/change and output the text yourself by returning a true value
323     and calling C<< $term->scr_add_lines >> yourself. Please note that this
324     might be very slow, however, as your hook is called for B<all> text being
325     output.
326    
327 root 1.72 =item on_tt_write $term, $octets
328    
329     Called whenever some data is written to the tty/pty and can be used to
330     suppress or filter tty input.
331    
332 root 1.35 =item on_line_update $term, $row
333    
334     Called whenever a line was updated or changed. Can be used to filter
335     screen output (e.g. underline urls or other useless stuff). Only lines
336     that are being shown will be filtered, and, due to performance reasons,
337     not always immediately.
338    
339     The row number is always the topmost row of the line if the line spans
340     multiple rows.
341    
342     Please note that, if you change the line, then the hook might get called
343     later with the already-modified line (e.g. if unrelated parts change), so
344     you cannot just toggle rendition bits, but only set them.
345    
346 root 1.1 =item on_refresh_begin $term
347    
348     Called just before the screen gets redrawn. Can be used for overlay
349     or similar effects by modify terminal contents in refresh_begin, and
350     restoring them in refresh_end. The built-in overlay and selection display
351     code is run after this hook, and takes precedence.
352    
353     =item on_refresh_end $term
354    
355     Called just after the screen gets redrawn. See C<on_refresh_begin>.
356    
357 root 1.11 =item on_keyboard_command $term, $string
358    
359     Called whenever the user presses a key combination that has a
360     C<perl:string> action bound to it (see description of the B<keysym>
361     resource in the @@RXVT_NAME@@(1) manpage).
362    
363 root 1.45 =item on_focus_in $term
364    
365     Called whenever the window gets the keyboard focus, before rxvt-unicode
366     does focus in processing.
367    
368     =item on_focus_out $term
369    
370     Called wheneever the window loses keyboard focus, before rxvt-unicode does
371     focus out processing.
372    
373 root 1.69 =item on_key_press $term, $event, $keysym, $octets
374 root 1.37
375 root 1.69 =item on_key_release $term, $event, $keysym
376 root 1.37
377     =item on_button_press $term, $event
378    
379     =item on_button_release $term, $event
380    
381     =item on_motion_notify $term, $event
382    
383 root 1.45 =item on_map_notify $term, $event
384    
385     =item on_unmap_notify $term, $event
386    
387 root 1.39 Called whenever the corresponding X event is received for the terminal If
388     the hook returns true, then the even will be ignored by rxvt-unicode.
389    
390     The event is a hash with most values as named by Xlib (see the XEvent
391     manpage), with the additional members C<row> and C<col>, which are the row
392     and column under the mouse cursor.
393 root 1.38
394     C<on_key_press> additionally receives the string rxvt-unicode would
395     output, if any, in locale-specific encoding.
396 root 1.37
397     subwindow.
398    
399 root 1.1 =back
400    
401 root 1.77 =cut
402    
403     package urxvt;
404    
405     use utf8;
406     use strict;
407     use Carp ();
408     use Scalar::Util ();
409     use List::Util ();
410    
411     our $VERSION = 1;
412     our $TERM;
413     our @HOOKNAME;
414     our %HOOKTYPE = map +($HOOKNAME[$_] => $_), 0..$#HOOKNAME;
415     our %OPTION;
416    
417     our $LIBDIR;
418     our $RESNAME;
419     our $RESCLASS;
420     our $RXVTNAME;
421    
422 root 1.23 =head2 Variables in the C<urxvt> Package
423    
424     =over 4
425    
426 root 1.75 =item $urxvt::LIBDIR
427    
428     The rxvt-unicode library directory, where, among other things, the perl
429     modules and scripts are stored.
430    
431     =item $urxvt::RESCLASS, $urxvt::RESCLASS
432    
433     The resource class and name rxvt-unicode uses to look up X resources.
434    
435     =item $urxvt::RXVTNAME
436    
437     The basename of the installed binaries, usually C<urxvt>.
438    
439 root 1.23 =item $urxvt::TERM
440    
441 root 1.43 The current terminal. This variable stores the current C<urxvt::term>
442     object, whenever a callback/hook is executing.
443 root 1.23
444     =back
445    
446 root 1.1 =head2 Functions in the C<urxvt> Package
447    
448     =over 4
449    
450     =item urxvt::fatal $errormessage
451    
452     Fatally aborts execution with the given error message. Avoid at all
453     costs! The only time this is acceptable is when the terminal process
454     starts up.
455    
456     =item urxvt::warn $string
457    
458 root 1.6 Calls C<rxvt_warn> with the given string which should not include a
459 root 1.1 newline. The module also overwrites the C<warn> builtin with a function
460     that calls this function.
461    
462     Using this function has the advantage that its output ends up in the
463     correct place, e.g. on stderr of the connecting urxvtc client.
464    
465 root 1.77 Messages have a size limit of 1023 bytes currently.
466    
467 root 1.62 =item $is_safe = urxvt::safe
468    
469     Returns true when it is safe to do potentially unsafe things, such as
470     evaluating perl code specified by the user. This is true when urxvt was
471     started setuid or setgid.
472    
473 root 1.1 =item $time = urxvt::NOW
474    
475     Returns the "current time" (as per the event loop).
476    
477 root 1.47 =item urxvt::CurrentTime
478    
479     =item urxvt::ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask,
480     Mod3Mask, Mod4Mask, Mod5Mask, Button1Mask, Button2Mask, Button3Mask,
481     Button4Mask, Button5Mask, AnyModifier
482    
483 root 1.55 Various constants for use in X calls and event processing.
484 root 1.47
485 root 1.21 =back
486    
487 root 1.18 =head2 RENDITION
488    
489     Rendition bitsets contain information about colour, font, font styles and
490     similar information for each screen cell.
491    
492     The following "macros" deal with changes in rendition sets. You should
493     never just create a bitset, you should always modify an existing one,
494     as they contain important information required for correct operation of
495     rxvt-unicode.
496    
497     =over 4
498    
499     =item $rend = urxvt::DEFAULT_RSTYLE
500    
501     Returns the default rendition, as used when the terminal is starting up or
502     being reset. Useful as a base to start when creating renditions.
503    
504     =item $rend = urxvt::OVERLAY_RSTYLE
505    
506     Return the rendition mask used for overlays by default.
507    
508     =item $rendbit = urxvt::RS_Bold, RS_Italic, RS_Blink, RS_RVid, RS_Uline
509    
510     Return the bit that enabled bold, italic, blink, reverse-video and
511 root 1.19 underline, respectively. To enable such a style, just logically OR it into
512     the bitset.
513 root 1.18
514     =item $foreground = urxvt::GET_BASEFG $rend
515    
516     =item $background = urxvt::GET_BASEBG $rend
517    
518     Return the foreground/background colour index, respectively.
519    
520 root 1.75 =item $rend = urxvt::SET_FGCOLOR $rend, $new_colour
521 root 1.18
522 root 1.75 =item $rend = urxvt::SET_BGCOLOR $rend, $new_colour
523 root 1.18
524     Replace the foreground/background colour in the rendition mask with the
525     specified one.
526    
527 root 1.75 =item $value = urxvt::GET_CUSTOM $rend
528 root 1.19
529     Return the "custom" value: Every rendition has 5 bits for use by
530     extensions. They can be set and changed as you like and are initially
531     zero.
532    
533 root 1.75 =item $rend = urxvt::SET_CUSTOM $rend, $new_value
534 root 1.19
535     Change the custom value.
536    
537 root 1.18 =back
538    
539 root 1.1 =cut
540    
541     BEGIN {
542     urxvt->bootstrap;
543    
544     # overwrite perl's warn
545     *CORE::GLOBAL::warn = sub {
546     my $msg = join "", @_;
547     $msg .= "\n"
548     unless $msg =~ /\n$/;
549     urxvt::warn ($msg);
550     };
551 root 1.59
552 root 1.82 # %ENV is the original startup environment
553 root 1.81 delete $ENV{IFS};
554     delete $ENV{CDPATH};
555     delete $ENV{BASH_ENV};
556     $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin";
557 root 1.1 }
558    
559 root 1.8 my @hook_count;
560 root 1.7 my $verbosity = $ENV{URXVT_PERL_VERBOSITY};
561 root 1.1
562     sub verbose {
563     my ($level, $msg) = @_;
564 root 1.8 warn "$msg\n" if $level <= $verbosity;
565 root 1.1 }
566    
567 root 1.44 my $extension_pkg = "extension0000";
568     my %extension_pkg;
569 root 1.1
570     # load a single script into its own package, once only
571 root 1.44 sub extension_package($) {
572 root 1.1 my ($path) = @_;
573    
574 root 1.44 $extension_pkg{$path} ||= do {
575     my $pkg = "urxvt::" . ($extension_pkg++);
576 root 1.8
577 root 1.44 verbose 3, "loading extension '$path' into package '$pkg'";
578 root 1.1
579     open my $fh, "<:raw", $path
580     or die "$path: $!";
581    
582 root 1.69 my $source = untaint
583     "package $pkg; use strict; use utf8;\n"
584 root 1.71 . "use base urxvt::term::extension::;\n"
585 root 1.69 . "#line 1 \"$path\"\n{\n"
586     . (do { local $/; <$fh> })
587     . "\n};\n1";
588 root 1.8
589 root 1.69 eval $source
590     or die "$path: $@";
591 root 1.1
592     $pkg
593 root 1.7 }
594 root 1.1 }
595    
596 root 1.31 our $retval; # return value for urxvt
597    
598 root 1.8 # called by the rxvt core
599     sub invoke {
600 root 1.23 local $TERM = shift;
601 root 1.8 my $htype = shift;
602 root 1.6
603 root 1.8 if ($htype == 0) { # INIT
604 root 1.23 my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl");
605 root 1.49
606 root 1.68 my %ext_arg;
607 root 1.6
608 root 1.50 for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) {
609     if ($_ eq "default") {
610 root 1.69 $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup searchable-scrollback);
611 root 1.51 } elsif (/^-(.*)$/) {
612 root 1.68 delete $ext_arg{$1};
613     } elsif (/^([^<]+)<(.*)>$/) {
614     push @{ $ext_arg{$1} }, $2;
615 root 1.49 } else {
616 root 1.68 $ext_arg{$_} ||= [];
617 root 1.50 }
618     }
619 root 1.6
620 root 1.68 while (my ($ext, $argv) = each %ext_arg) {
621 root 1.50 my @files = grep -f $_, map "$_/$ext", @dirs;
622    
623     if (@files) {
624 root 1.68 $TERM->register_package (extension_package $files[0], $argv);
625 root 1.50 } else {
626     warn "perl extension '$ext' not found in perl library search path\n";
627 root 1.8 }
628     }
629 root 1.55
630     eval "#line 1 \"--perl-eval resource/argument\"\n" . $TERM->resource ("perl_eval");
631     warn $@ if $@;
632 root 1.31 }
633    
634     $retval = undef;
635 root 1.6
636 root 1.31 if (my $cb = $TERM->{_hook}[$htype]) {
637     verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")"
638     if $verbosity >= 10;
639    
640     keys %$cb;
641    
642     while (my ($pkg, $cb) = each %$cb) {
643 root 1.68 $retval = eval { $cb->($TERM->{_pkg}{$pkg}, @_) }
644     and last;
645    
646 root 1.58 if ($@) {
647     $TERM->ungrab; # better to lose the grab than the session
648     warn $@;
649     }
650 root 1.31 }
651 root 1.85
652     verbose 11, "$HOOKNAME[$htype] returning <$retval>"
653     if $verbosity >= 11;
654 root 1.31 }
655    
656     if ($htype == 1) { # DESTROY
657 root 1.69 if (my $hook = delete $TERM->{_hook}) {
658 root 1.8 for my $htype (0..$#$hook) {
659     $hook_count[$htype] -= scalar keys %{ $hook->[$htype] || {} }
660     or set_should_invoke $htype, 0;
661     }
662     }
663 root 1.7
664 root 1.31 # clear package objects
665     %$_ = () for values %{ $TERM->{_pkg} };
666 root 1.25
667 root 1.31 # clear package
668     %$TERM = ();
669 root 1.7 }
670    
671 root 1.31 $retval
672 root 1.7 }
673 root 1.1
674 root 1.84 sub exec_async(@) {
675     my $pid = fork;
676    
677     return
678     if !defined $pid or $pid;
679    
680     %ENV = %{ $TERM->env };
681    
682     exec @_;
683     _exit 255;
684     }
685    
686 root 1.71 # urxvt::term::extension
687 root 1.55
688 root 1.71 package urxvt::term::extension;
689 root 1.69
690     sub enable {
691     my ($self, %hook) = @_;
692     my $pkg = $self->{_pkg};
693    
694     while (my ($name, $cb) = each %hook) {
695     my $htype = $HOOKTYPE{uc $name};
696     defined $htype
697     or Carp::croak "unsupported hook type '$name'";
698    
699     unless (exists $self->{term}{_hook}[$htype]{$pkg}) {
700     $hook_count[$htype]++
701     or urxvt::set_should_invoke $htype, 1;
702     }
703    
704     $self->{term}{_hook}[$htype]{$pkg} = $cb;
705     }
706     }
707    
708     sub disable {
709     my ($self, @hook) = @_;
710     my $pkg = $self->{_pkg};
711    
712     for my $name (@hook) {
713     my $htype = $HOOKTYPE{uc $name};
714     defined $htype
715     or Carp::croak "unsupported hook type '$name'";
716    
717     if (delete $self->{term}{_hook}[$htype]{$pkg}) {
718     --$hook_count[$htype]
719     or urxvt::set_should_invoke $htype, 0;
720     }
721     }
722     }
723    
724     our $AUTOLOAD;
725    
726     sub AUTOLOAD {
727     $AUTOLOAD =~ /:([^:]+)$/
728     or die "FATAL: \$AUTOLOAD '$AUTOLOAD' unparsable";
729 root 1.23
730     eval qq{
731 root 1.69 sub $AUTOLOAD {
732 root 1.24 my \$proxy = shift;
733     \$proxy->{term}->$1 (\@_)
734 root 1.23 }
735     1
736     } or die "FATAL: unable to compile method forwarder: $@";
737    
738 root 1.69 goto &$AUTOLOAD;
739 root 1.23 }
740    
741 root 1.69 sub DESTROY {
742 root 1.58 # nop
743     }
744    
745 root 1.55 # urxvt::destroy_hook
746    
747 root 1.45 sub urxvt::destroy_hook::DESTROY {
748     ${$_[0]}->();
749     }
750    
751     sub urxvt::destroy_hook(&) {
752     bless \shift, urxvt::destroy_hook::
753     }
754    
755 root 1.56 package urxvt::anyevent;
756    
757     =head2 The C<urxvt::anyevent> Class
758    
759     The sole purpose of this class is to deliver an interface to the
760     C<AnyEvent> module - any module using it will work inside urxvt without
761 root 1.75 further programming. The only exception is that you cannot wait on
762     condition variables, but non-blocking condvar use is ok. What this means
763     is that you cannot use blocking APIs, but the non-blocking variant should
764     work.
765 root 1.55
766 root 1.56 =cut
767 root 1.55
768     our $VERSION = 1;
769    
770     $INC{"urxvt/anyevent.pm"} = 1; # mark us as there
771     push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
772    
773     sub timer {
774     my ($class, %arg) = @_;
775    
776     my $cb = $arg{cb};
777    
778     urxvt::timer
779     ->new
780     ->start (urxvt::NOW + $arg{after})
781     ->cb (sub {
782     $_[0]->stop; # need to cancel manually
783     $cb->();
784     })
785     }
786    
787     sub io {
788     my ($class, %arg) = @_;
789    
790     my $cb = $arg{cb};
791    
792     bless [$arg{fh}, urxvt::iow
793     ->new
794     ->fd (fileno $arg{fh})
795     ->events (($arg{poll} =~ /r/ ? 1 : 0)
796     | ($arg{poll} =~ /w/ ? 2 : 0))
797     ->start
798     ->cb (sub {
799     $cb->(($_[1] & 1 ? 'r' : '')
800     . ($_[1] & 2 ? 'w' : ''));
801     })],
802     urxvt::anyevent::
803     }
804    
805     sub DESTROY {
806     $_[0][1]->stop;
807     }
808    
809     sub condvar {
810     bless \my $flag, urxvt::anyevent::condvar::
811     }
812    
813     sub urxvt::anyevent::condvar::broadcast {
814     ${$_[0]}++;
815     }
816    
817     sub urxvt::anyevent::condvar::wait {
818     unless (${$_[0]}) {
819 root 1.69 Carp::croak "AnyEvent->condvar blocking wait unsupported in urxvt, use a non-blocking API";
820 root 1.55 }
821     }
822    
823     package urxvt::term;
824    
825 root 1.1 =head2 The C<urxvt::term> Class
826    
827     =over 4
828    
829 root 1.68 =cut
830    
831     # find on_xxx subs in the package and register them
832     # as hooks
833     sub register_package {
834     my ($self, $pkg, $argv) = @_;
835    
836 root 1.69 my $proxy = bless {
837     _pkg => $pkg,
838     argv => $argv,
839     }, $pkg;
840     Scalar::Util::weaken ($proxy->{term} = $self);
841 root 1.68
842     $self->{_pkg}{$pkg} = $proxy;
843    
844 root 1.69 for my $name (@HOOKNAME) {
845     if (my $ref = $pkg->can ("on_" . lc $name)) {
846     $proxy->enable ($name => $ref);
847     }
848 root 1.68 }
849     }
850    
851 root 1.77 =item $term = new urxvt::term $envhashref, $rxvtname, [arg...]
852    
853     Creates a new terminal, very similar as if you had started it with system
854 root 1.78 C<$rxvtname, arg...>. C<$envhashref> must be a reference to a C<%ENV>-like
855     hash which defines the environment of the new terminal.
856 root 1.77
857     Croaks (and probably outputs an error message) if the new instance
858     couldn't be created. Returns C<undef> if the new instance didn't
859     initialise perl, and the terminal object otherwise. The C<init> and
860     C<start> hooks will be called during this call.
861    
862     =cut
863    
864     sub new {
865     my ($class, $env, @args) = @_;
866    
867     _new ([ map "$_=$env->{$_}", keys %$env ], @args);
868     }
869    
870 root 1.36 =item $term->destroy
871    
872 root 1.75 Destroy the terminal object (close the window, free resources
873     etc.). Please note that @@RXVT_NAME@@ will not exit as long as any event
874     watchers (timers, io watchers) are still active.
875 root 1.36
876 root 1.49 =item $isset = $term->option ($optval[, $set])
877    
878     Returns true if the option specified by C<$optval> is enabled, and
879     optionally change it. All option values are stored by name in the hash
880     C<%urxvt::OPTION>. Options not enabled in this binary are not in the hash.
881    
882     Here is a a likely non-exhaustive list of option names, please see the
883     source file F</src/optinc.h> to see the actual list:
884    
885     borderLess console cursorBlink cursorUnderline hold iconic insecure
886     intensityStyles jumpScroll loginShell mapAlert meta8 mouseWheelScrollPage
887     pastableTabs pointerBlank reverseVideo scrollBar scrollBar_floating
888     scrollBar_right scrollTtyKeypress scrollTtyOutput scrollWithBuffer
889     secondaryScreen secondaryScroll skipBuiltinGlyphs transparent
890     tripleclickwords utmpInhibit visualBell
891    
892 root 1.4 =item $value = $term->resource ($name[, $newval])
893    
894     Returns the current resource value associated with a given name and
895     optionally sets a new value. Setting values is most useful in the C<init>
896     hook. Unset resources are returned and accepted as C<undef>.
897    
898     The new value must be properly encoded to a suitable character encoding
899     before passing it to this method. Similarly, the returned value may need
900     to be converted from the used encoding to text.
901    
902     Resource names are as defined in F<src/rsinc.h>. Colours can be specified
903     as resource names of the form C<< color+<index> >>, e.g. C<color+5>. (will
904     likely change).
905    
906     Please note that resource strings will currently only be freed when the
907     terminal is destroyed, so changing options frequently will eat memory.
908    
909 root 1.5 Here is a a likely non-exhaustive list of resource names, not all of which
910 root 1.49 are supported in every build, please see the source file F</src/rsinc.h>
911     to see the actual list:
912 root 1.5
913     answerbackstring backgroundPixmap backspace_key boldFont boldItalicFont
914     borderLess color cursorBlink cursorUnderline cutchars delete_key
915     display_name embed ext_bwidth fade font geometry hold iconName
916     imFont imLocale inputMethod insecure int_bwidth intensityStyles
917 root 1.8 italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier
918 root 1.30 mouseWheelScrollPage name pastableTabs path perl_eval perl_ext_1 perl_ext_2
919 root 1.6 perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd
920     reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating
921     scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput
922     scrollWithBuffer scrollstyle secondaryScreen secondaryScroll selectstyle
923     shade term_name title transparent transparent_all tripleclickwords
924     utmpInhibit visualBell
925 root 1.5
926 root 1.4 =cut
927    
928 root 1.55 sub resource($$;$) {
929 root 1.4 my ($self, $name) = (shift, shift);
930     unshift @_, $self, $name, ($name =~ s/\s*\+\s*(\d+)$// ? $1 : 0);
931 root 1.45 &urxvt::term::_resource
932 root 1.4 }
933    
934 root 1.79 =item $value = $term->x_resource ($pattern)
935    
936     Returns the X-Resource for the given pattern, excluding the program or
937     class name, i.e. C<< $term->x_resource ("boldFont") >> should return the
938     same value as used by this instance of rxvt-unicode. Returns C<undef> if no
939     resource with that pattern exists.
940    
941     This method should only be called during the C<on_start> hook, as there is
942     only one resource database per display, and later invocations might return
943     the wrong resources.
944    
945 root 1.69 =item $success = $term->parse_keysym ($keysym_spec, $command_string)
946    
947     Adds a keymap translation exactly as specified via a resource. See the
948     C<keysym> resource in the @@RXVT_NAME@@(1) manpage.
949    
950 root 1.33 =item $rend = $term->rstyle ([$new_rstyle])
951 root 1.32
952 root 1.33 Return and optionally change the current rendition. Text that is output by
953     the terminal application will use this style.
954 root 1.32
955     =item ($row, $col) = $term->screen_cur ([$row, $col])
956    
957     Return the current coordinates of the text cursor position and optionally
958     set it (which is usually bad as applications don't expect that).
959    
960 root 1.1 =item ($row, $col) = $term->selection_mark ([$row, $col])
961    
962     =item ($row, $col) = $term->selection_beg ([$row, $col])
963    
964     =item ($row, $col) = $term->selection_end ([$row, $col])
965    
966     Return the current values of the selection mark, begin or end positions,
967     and optionally set them to new values.
968    
969 root 1.86 =item $term->selection_make ($eventtime[, $rectangular])
970    
971     Tries to make a selection as set by C<selection_beg> and
972     C<selection_end>. If C<$rectangular> is true (default: false), a
973     rectangular selection will be made. This is the prefered function to make
974     a selection.
975    
976 root 1.1 =item $success = $term->selection_grab ($eventtime)
977    
978 root 1.86 Try to request the primary selection text from the server (for example, as
979     set by the next method). No visual feedback will be given. This function
980     is mostly useful from within C<on_sel_grab> hooks.
981 root 1.1
982     =item $oldtext = $term->selection ([$newtext])
983    
984     Return the current selection text and optionally replace it by C<$newtext>.
985    
986 root 1.69 =item $term->overlay_simple ($x, $y, $text)
987    
988     Create a simple multi-line overlay box. See the next method for details.
989    
990     =cut
991    
992     sub overlay_simple {
993     my ($self, $x, $y, $text) = @_;
994    
995     my @lines = split /\n/, $text;
996    
997     my $w = List::Util::max map $self->strwidth ($_), @lines;
998    
999     my $overlay = $self->overlay ($x, $y, $w, scalar @lines);
1000     $overlay->set (0, $_, $lines[$_]) for 0.. $#lines;
1001    
1002     $overlay
1003     }
1004 root 1.1
1005 root 1.20 =item $term->overlay ($x, $y, $width, $height[, $rstyle[, $border]])
1006 root 1.1
1007     Create a new (empty) overlay at the given position with the given
1008 root 1.20 width/height. C<$rstyle> defines the initial rendition style
1009     (default: C<OVERLAY_RSTYLE>).
1010 root 1.1
1011 root 1.20 If C<$border> is C<2> (default), then a decorative border will be put
1012     around the box.
1013 root 1.1
1014 root 1.20 If either C<$x> or C<$y> is negative, then this is counted from the
1015     right/bottom side, respectively.
1016 root 1.1
1017 root 1.20 This method returns an urxvt::overlay object. The overlay will be visible
1018     as long as the perl object is referenced.
1019 root 1.1
1020 root 1.22 The methods currently supported on C<urxvt::overlay> objects are:
1021    
1022     =over 4
1023 root 1.1
1024 root 1.20 =item $overlay->set ($x, $y, $text, $rend)
1025 root 1.1
1026 root 1.20 Similar to C<< $term->ROW_t >> and C<< $term->ROW_r >> in that it puts
1027     text in rxvt-unicode's special encoding and an array of rendition values
1028     at a specific position inside the overlay.
1029 root 1.1
1030 root 1.22 =item $overlay->hide
1031    
1032     If visible, hide the overlay, but do not destroy it.
1033    
1034     =item $overlay->show
1035    
1036     If hidden, display the overlay again.
1037    
1038     =back
1039    
1040 root 1.45 =item $popup = $term->popup ($event)
1041    
1042     Creates a new C<urxvt::popup> object that implements a popup menu. The
1043     C<$event> I<must> be the event causing the menu to pop up (a button event,
1044     currently).
1045    
1046     =cut
1047    
1048 root 1.55 sub popup {
1049 root 1.45 my ($self, $event) = @_;
1050    
1051     $self->grab ($event->{time}, 1)
1052     or return;
1053    
1054     my $popup = bless {
1055     term => $self,
1056     event => $event,
1057     }, urxvt::popup::;
1058    
1059     Scalar::Util::weaken $popup->{term};
1060    
1061     $self->{_destroy}{$popup} = urxvt::destroy_hook { $popup->{popup}->destroy };
1062     Scalar::Util::weaken $self->{_destroy}{$popup};
1063    
1064     $popup
1065     }
1066    
1067 root 1.40 =item $cellwidth = $term->strwidth ($string)
1068 root 1.6
1069     Returns the number of screen-cells this string would need. Correctly
1070     accounts for wide and combining characters.
1071    
1072 root 1.40 =item $octets = $term->locale_encode ($string)
1073 root 1.6
1074     Convert the given text string into the corresponding locale encoding.
1075    
1076 root 1.40 =item $string = $term->locale_decode ($octets)
1077 root 1.6
1078     Convert the given locale-encoded octets into a perl string.
1079    
1080 root 1.70 =item $term->scr_xor_span ($beg_row, $beg_col, $end_row, $end_col[, $rstyle])
1081    
1082     XORs the rendition values in the given span with the provided value
1083 root 1.86 (default: C<RS_RVid>), which I<MUST NOT> contain font styles. Useful in
1084     refresh hooks to provide effects similar to the selection.
1085 root 1.70
1086     =item $term->scr_xor_rect ($beg_row, $beg_col, $end_row, $end_col[, $rstyle1[, $rstyle2]])
1087    
1088     Similar to C<scr_xor_span>, but xors a rectangle instead. Trailing
1089     whitespace will additionally be xored with the C<$rstyle2>, which defaults
1090     to C<RS_RVid | RS_Uline>, which removes reverse video again and underlines
1091 root 1.86 it instead. Both styles I<MUST NOT> contain font styles.
1092 root 1.70
1093 root 1.69 =item $term->scr_bell
1094    
1095     Ring the bell!
1096    
1097 root 1.33 =item $term->scr_add_lines ($string)
1098    
1099     Write the given text string to the screen, as if output by the application
1100     running inside the terminal. It may not contain command sequences (escape
1101     codes), but is free to use line feeds, carriage returns and tabs. The
1102     string is a normal text string, not in locale-dependent encoding.
1103    
1104     Normally its not a good idea to use this function, as programs might be
1105     confused by changes in cursor position or scrolling. Its useful inside a
1106     C<on_add_lines> hook, though.
1107    
1108 root 1.36 =item $term->cmd_parse ($octets)
1109    
1110     Similar to C<scr_add_lines>, but the argument must be in the
1111     locale-specific encoding of the terminal and can contain command sequences
1112     (escape codes) that will be interpreted.
1113    
1114 root 1.6 =item $term->tt_write ($octets)
1115    
1116     Write the octets given in C<$data> to the tty (i.e. as program input). To
1117 root 1.12 pass characters instead of octets, you should convert your strings first
1118     to the locale-specific encoding using C<< $term->locale_encode >>.
1119    
1120 root 1.69 =item $old_events = $term->pty_ev_events ([$new_events])
1121    
1122     Replaces the event mask of the pty watcher by the given event mask. Can
1123     be used to suppress input and output handling to the pty/tty. See the
1124     description of C<< urxvt::timer->events >>. Make sure to always restore
1125     the previous value.
1126    
1127 root 1.40 =item $windowid = $term->parent
1128    
1129     Return the window id of the toplevel window.
1130    
1131     =item $windowid = $term->vt
1132    
1133     Return the window id of the terminal window.
1134    
1135 root 1.32 =item $window_width = $term->width
1136    
1137     =item $window_height = $term->height
1138    
1139     =item $font_width = $term->fwidth
1140    
1141     =item $font_height = $term->fheight
1142    
1143     =item $font_ascent = $term->fbase
1144    
1145     =item $terminal_rows = $term->nrow
1146    
1147     =item $terminal_columns = $term->ncol
1148    
1149     =item $has_focus = $term->focus
1150    
1151     =item $is_mapped = $term->mapped
1152 root 1.13
1153 root 1.32 =item $max_scrollback = $term->saveLines
1154 root 1.13
1155 root 1.32 =item $nrow_plus_saveLines = $term->total_rows
1156 root 1.13
1157 root 1.32 =item $lines_in_scrollback = $term->nsaved
1158 root 1.12
1159 root 1.32 Return various integers describing terminal characteristics.
1160 root 1.12
1161 root 1.77 =item $x_display = $term->display_id
1162    
1163     Return the DISPLAY used by rxvt-unicode.
1164    
1165 root 1.66 =item $lc_ctype = $term->locale
1166    
1167     Returns the LC_CTYPE category string used by this rxvt-unicode.
1168    
1169 root 1.77 =item $env = $term->env
1170    
1171     Returns a copy of the environment in effect for the terminal as a hashref
1172     similar to C<\%ENV>.
1173    
1174     =cut
1175 root 1.66
1176 root 1.77 sub env {
1177     if (my $env = $_[0]->_env) {
1178     +{ map /^([^=]+)(?:=(.*))?$/s && ($1 => $2), @$env }
1179     } else {
1180     +{ %ENV }
1181     }
1182     }
1183 root 1.66
1184 root 1.47 =item $modifiermask = $term->ModLevel3Mask
1185    
1186     =item $modifiermask = $term->ModMetaMask
1187    
1188     =item $modifiermask = $term->ModNumLockMask
1189    
1190     Return the modifier masks corresponding to the "ISO Level 3 Shift" (often
1191     AltGr), the meta key (often Alt) and the num lock key, if applicable.
1192    
1193 root 1.12 =item $view_start = $term->view_start ([$newvalue])
1194    
1195     Returns the negative row number of the topmost line. Minimum value is
1196     C<0>, which displays the normal terminal contents. Larger values scroll
1197     this many lines into the scrollback buffer.
1198    
1199 root 1.14 =item $term->want_refresh
1200    
1201     Requests a screen refresh. At the next opportunity, rxvt-unicode will
1202     compare the on-screen display with its stored representation. If they
1203     differ, it redraws the differences.
1204    
1205     Used after changing terminal contents to display them.
1206    
1207 root 1.13 =item $text = $term->ROW_t ($row_number[, $new_text[, $start_col]])
1208 root 1.12
1209     Returns the text of the entire row with number C<$row_number>. Row C<0>
1210     is the topmost terminal line, row C<< $term->$ncol-1 >> is the bottommost
1211     terminal line. The scrollback buffer starts at line C<-1> and extends to
1212 root 1.24 line C<< -$term->nsaved >>. Nothing will be returned if a nonexistent line
1213     is requested.
1214 root 1.12
1215 root 1.13 If C<$new_text> is specified, it will replace characters in the current
1216     line, starting at column C<$start_col> (default C<0>), which is useful
1217 root 1.18 to replace only parts of a line. The font index in the rendition will
1218 root 1.13 automatically be updated.
1219 root 1.12
1220     C<$text> is in a special encoding: tabs and wide characters that use more
1221     than one cell when displayed are padded with urxvt::NOCHAR characters
1222     (C<chr 65535>). Characters with combining characters and other characters
1223     that do not fit into the normal tetx encoding will be replaced with
1224     characters in the private use area.
1225    
1226     You have to obey this encoding when changing text. The advantage is
1227     that C<substr> and similar functions work on screen cells and not on
1228     characters.
1229    
1230     The methods C<< $term->special_encode >> and C<< $term->special_decode >>
1231     can be used to convert normal strings into this encoding and vice versa.
1232    
1233 root 1.13 =item $rend = $term->ROW_r ($row_number[, $new_rend[, $start_col]])
1234    
1235     Like C<< $term->ROW_t >>, but returns an arrayref with rendition
1236     bitsets. Rendition bitsets contain information about colour, font, font
1237     styles and similar information. See also C<< $term->ROW_t >>.
1238    
1239     When setting rendition, the font mask will be ignored.
1240 root 1.12
1241 root 1.18 See the section on RENDITION, above.
1242 root 1.13
1243     =item $length = $term->ROW_l ($row_number[, $new_length])
1244    
1245 root 1.24 Returns the number of screen cells that are in use ("the line
1246     length"). Unlike the urxvt core, this returns C<< $term->ncol >> if the
1247     line is joined with the following one.
1248    
1249     =item $bool = $term->is_longer ($row_number)
1250    
1251     Returns true if the row is part of a multiple-row logical "line" (i.e.
1252     joined with the following row), which means all characters are in use
1253     and it is continued on the next row (and possibly a continuation of the
1254     previous row(s)).
1255    
1256     =item $line = $term->line ($row_number)
1257    
1258     Create and return a new C<urxvt::line> object that stores information
1259     about the logical line that row C<$row_number> is part of. It supports the
1260     following methods:
1261 root 1.12
1262 root 1.24 =over 4
1263    
1264 root 1.35 =item $text = $line->t ([$new_text])
1265 root 1.24
1266 root 1.35 Returns or replaces the full text of the line, similar to C<ROW_t>
1267 root 1.24
1268 root 1.35 =item $rend = $line->r ([$new_rend])
1269 root 1.24
1270 root 1.35 Returns or replaces the full rendition array of the line, similar to C<ROW_r>
1271 root 1.24
1272     =item $length = $line->l
1273    
1274     Returns the length of the line in cells, similar to C<ROW_l>.
1275    
1276     =item $rownum = $line->beg
1277    
1278     =item $rownum = $line->end
1279    
1280     Return the row number of the first/last row of the line, respectively.
1281    
1282     =item $offset = $line->offset_of ($row, $col)
1283    
1284     Returns the character offset of the given row|col pair within the logical
1285 root 1.85 line. Works for rows outside the line, too, and returns corresponding
1286     offsets outside the string.
1287 root 1.24
1288     =item ($row, $col) = $line->coord_of ($offset)
1289    
1290     Translates a string offset into terminal coordinates again.
1291    
1292     =back
1293    
1294     =cut
1295    
1296 root 1.55 sub line {
1297 root 1.24 my ($self, $row) = @_;
1298    
1299     my $maxrow = $self->nrow - 1;
1300    
1301     my ($beg, $end) = ($row, $row);
1302    
1303     --$beg while $self->ROW_is_longer ($beg - 1);
1304     ++$end while $self->ROW_is_longer ($end) && $end < $maxrow;
1305    
1306     bless {
1307     term => $self,
1308     beg => $beg,
1309     end => $end,
1310 root 1.34 ncol => $self->ncol,
1311 root 1.24 len => ($end - $beg) * $self->ncol + $self->ROW_l ($end),
1312     }, urxvt::line::
1313     }
1314    
1315     sub urxvt::line::t {
1316     my ($self) = @_;
1317    
1318 root 1.34 if (@_ > 1)
1319     {
1320     $self->{term}->ROW_t ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1321     for $self->{beg} .. $self->{end};
1322     }
1323    
1324     defined wantarray &&
1325     substr +(join "", map $self->{term}->ROW_t ($_), $self->{beg} .. $self->{end}),
1326     0, $self->{len}
1327 root 1.24 }
1328    
1329     sub urxvt::line::r {
1330     my ($self) = @_;
1331    
1332 root 1.34 if (@_ > 1)
1333     {
1334     $self->{term}->ROW_r ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1335     for $self->{beg} .. $self->{end};
1336     }
1337    
1338     if (defined wantarray) {
1339     my $rend = [
1340     map @{ $self->{term}->ROW_r ($_) }, $self->{beg} .. $self->{end}
1341     ];
1342     $#$rend = $self->{len} - 1;
1343     return $rend;
1344     }
1345    
1346     ()
1347 root 1.24 }
1348    
1349     sub urxvt::line::beg { $_[0]{beg} }
1350     sub urxvt::line::end { $_[0]{end} }
1351     sub urxvt::line::l { $_[0]{len} }
1352    
1353     sub urxvt::line::offset_of {
1354     my ($self, $row, $col) = @_;
1355    
1356 root 1.34 ($row - $self->{beg}) * $self->{ncol} + $col
1357 root 1.24 }
1358    
1359     sub urxvt::line::coord_of {
1360     my ($self, $offset) = @_;
1361    
1362     use integer;
1363    
1364     (
1365 root 1.34 $offset / $self->{ncol} + $self->{beg},
1366     $offset % $self->{ncol}
1367 root 1.24 )
1368     }
1369    
1370 root 1.12 =item $text = $term->special_encode $string
1371    
1372     Converts a perl string into the special encoding used by rxvt-unicode,
1373     where one character corresponds to one screen cell. See
1374     C<< $term->ROW_t >> for details.
1375    
1376     =item $string = $term->special_decode $text
1377    
1378     Converts rxvt-unicodes text reprsentation into a perl string. See
1379     C<< $term->ROW_t >> for details.
1380 root 1.6
1381 root 1.61 =item $success = $term->grab_button ($button, $modifiermask)
1382    
1383 root 1.64 Registers a synchronous button grab. See the XGrabButton manpage.
1384 root 1.61
1385     =item $success = $term->grab ($eventtime[, $sync])
1386    
1387     Calls XGrabPointer and XGrabKeyboard in asynchronous (default) or
1388     synchronous (C<$sync> is true). Also remembers the grab timestampe.
1389    
1390     =item $term->allow_events_async
1391    
1392     Calls XAllowEvents with AsyncBoth for the most recent grab.
1393    
1394     =item $term->allow_events_sync
1395    
1396     Calls XAllowEvents with SyncBoth for the most recent grab.
1397    
1398     =item $term->allow_events_replay
1399    
1400     Calls XAllowEvents with both ReplayPointer and ReplayKeyboard for the most
1401     recent grab.
1402    
1403     =item $term->ungrab
1404    
1405     Calls XUngrab for the most recent grab. Is called automatically on
1406     evaluation errors, as it is better to lose the grab in the error case as
1407     the session.
1408    
1409 root 1.1 =back
1410    
1411 root 1.55 =cut
1412    
1413     package urxvt::popup;
1414    
1415 root 1.45 =head2 The C<urxvt::popup> Class
1416    
1417     =over 4
1418    
1419     =cut
1420    
1421     sub add_item {
1422     my ($self, $item) = @_;
1423    
1424 root 1.53 $item->{rend}{normal} = "\x1b[0;30;47m" unless exists $item->{rend}{normal};
1425     $item->{rend}{hover} = "\x1b[0;30;46m" unless exists $item->{rend}{hover};
1426     $item->{rend}{active} = "\x1b[m" unless exists $item->{rend}{active};
1427    
1428     $item->{render} ||= sub { $_[0]{text} };
1429    
1430 root 1.45 push @{ $self->{item} }, $item;
1431     }
1432    
1433 root 1.76 =item $popup->add_title ($title)
1434    
1435     Adds a non-clickable title to the popup.
1436    
1437     =cut
1438    
1439     sub add_title {
1440     my ($self, $title) = @_;
1441    
1442     $self->add_item ({
1443     rend => { normal => "\x1b[38;5;11;44m", hover => "\x1b[38;5;11;44m", active => "\x1b[38;5;11;44m" },
1444     text => $title,
1445     activate => sub { },
1446     });
1447     }
1448    
1449     =item $popup->add_separator ([$sepchr])
1450    
1451     Creates a separator, optionally using the character given as C<$sepchr>.
1452    
1453     =cut
1454    
1455 root 1.53 sub add_separator {
1456     my ($self, $sep) = @_;
1457    
1458 root 1.67 $sep ||= "=";
1459 root 1.53
1460     $self->add_item ({
1461     rend => { normal => "\x1b[0;30;47m", hover => "\x1b[0;30;47m", active => "\x1b[0;30;47m" },
1462     text => "",
1463 root 1.65 render => sub { $sep x $self->{term}->ncol },
1464 root 1.53 activate => sub { },
1465     });
1466     }
1467    
1468 root 1.76 =item $popup->add_button ($text, $cb)
1469    
1470     Adds a clickable button to the popup. C<$cb> is called whenever it is
1471     selected.
1472 root 1.53
1473 root 1.76 =cut
1474 root 1.53
1475 root 1.45 sub add_button {
1476     my ($self, $text, $cb) = @_;
1477    
1478 root 1.64 $self->add_item ({ type => "button", text => $text, activate => $cb});
1479 root 1.48 }
1480    
1481 root 1.76 =item $popup->add_toggle ($text, $cb, $initial_value)
1482    
1483     Adds a toggle/checkbox item to the popup. Teh callback gets called
1484     whenever it gets toggled, with a boolean indicating its value as its first
1485     argument.
1486    
1487     =cut
1488    
1489 root 1.48 sub add_toggle {
1490     my ($self, $text, $cb, $value) = @_;
1491    
1492 root 1.49 my $item; $item = {
1493     type => "button",
1494     text => " $text",
1495     value => $value,
1496 root 1.58 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1497 root 1.76 activate => sub { $cb->($_[1]{value} = !$_[1]{value}); },
1498 root 1.49 };
1499    
1500     $self->add_item ($item);
1501 root 1.45 }
1502    
1503 root 1.76 =item $popup->show
1504    
1505     Displays the popup (which is initially hidden).
1506    
1507     =cut
1508    
1509 root 1.45 sub show {
1510     my ($self) = @_;
1511    
1512     local $urxvt::popup::self = $self;
1513    
1514 root 1.77 my $env = $self->{term}->env;
1515     # we can't hope to reproduce the locale algorithm, so nuke LC_ALL and set LC_CTYPE.
1516     delete $env->{LC_ALL};
1517     $env->{LC_CTYPE} = $self->{term}->locale;
1518    
1519     urxvt::term->new ($env, $self->{term}->resource ("name"),
1520     "--perl-lib" => "", "--perl-ext-common" => "", "-pty-fd" => -1, "-sl" => 0, "-b" => 0,
1521     "--transient-for" => $self->{term}->parent,
1522     "-display" => $self->{term}->display_id,
1523     "-pe" => "urxvt-popup")
1524 root 1.45 or die "unable to create popup window\n";
1525     }
1526    
1527     sub DESTROY {
1528     my ($self) = @_;
1529    
1530 root 1.58 delete $self->{term}{_destroy}{$self};
1531 root 1.45 $self->{term}->ungrab;
1532     }
1533    
1534 root 1.78 =back
1535    
1536 root 1.1 =head2 The C<urxvt::timer> Class
1537    
1538     This class implements timer watchers/events. Time is represented as a
1539     fractional number of seconds since the epoch. Example:
1540    
1541 root 1.20 $term->{overlay} = $term->overlay (-1, 0, 8, 1, urxvt::OVERLAY_RSTYLE, 0);
1542 root 1.1 $term->{timer} = urxvt::timer
1543     ->new
1544 root 1.20 ->interval (1)
1545 root 1.1 ->cb (sub {
1546 root 1.20 $term->{overlay}->set (0, 0,
1547     sprintf "%2d:%02d:%02d", (localtime urxvt::NOW)[2,1,0]);
1548     });
1549 root 1.1
1550     =over 4
1551    
1552     =item $timer = new urxvt::timer
1553    
1554 root 1.20 Create a new timer object in started state. It is scheduled to fire
1555     immediately.
1556 root 1.1
1557     =item $timer = $timer->cb (sub { my ($timer) = @_; ... })
1558    
1559     Set the callback to be called when the timer triggers.
1560    
1561     =item $tstamp = $timer->at
1562    
1563     Return the time this watcher will fire next.
1564    
1565     =item $timer = $timer->set ($tstamp)
1566    
1567     Set the time the event is generated to $tstamp.
1568    
1569 root 1.20 =item $timer = $timer->interval ($interval)
1570    
1571     Normally (and when C<$interval> is C<0>), the timer will automatically
1572     stop after it has fired once. If C<$interval> is non-zero, then the timer
1573     is automatically rescheduled at the given intervals.
1574    
1575 root 1.1 =item $timer = $timer->start
1576    
1577     Start the timer.
1578    
1579     =item $timer = $timer->start ($tstamp)
1580    
1581     Set the event trigger time to C<$tstamp> and start the timer.
1582    
1583     =item $timer = $timer->stop
1584    
1585     Stop the timer.
1586    
1587     =back
1588    
1589     =head2 The C<urxvt::iow> Class
1590    
1591     This class implements io watchers/events. Example:
1592    
1593     $term->{socket} = ...
1594     $term->{iow} = urxvt::iow
1595     ->new
1596     ->fd (fileno $term->{socket})
1597 root 1.69 ->events (urxvt::EVENT_READ)
1598 root 1.1 ->start
1599     ->cb (sub {
1600     my ($iow, $revents) = @_;
1601     # $revents must be 1 here, no need to check
1602     sysread $term->{socket}, my $buf, 8192
1603     or end-of-file;
1604     });
1605    
1606    
1607     =over 4
1608    
1609     =item $iow = new urxvt::iow
1610    
1611     Create a new io watcher object in stopped state.
1612    
1613     =item $iow = $iow->cb (sub { my ($iow, $reventmask) = @_; ... })
1614    
1615     Set the callback to be called when io events are triggered. C<$reventmask>
1616     is a bitset as described in the C<events> method.
1617    
1618     =item $iow = $iow->fd ($fd)
1619    
1620     Set the filedescriptor (not handle) to watch.
1621    
1622     =item $iow = $iow->events ($eventmask)
1623    
1624 root 1.69 Set the event mask to watch. The only allowed values are
1625     C<urxvt::EVENT_READ> and C<urxvt::EVENT_WRITE>, which might be ORed
1626     together, or C<urxvt::EVENT_NONE>.
1627 root 1.1
1628     =item $iow = $iow->start
1629    
1630     Start watching for requested events on the given handle.
1631    
1632     =item $iow = $iow->stop
1633    
1634     Stop watching for events on the given filehandle.
1635    
1636     =back
1637    
1638 root 1.4 =head1 ENVIRONMENT
1639    
1640     =head2 URXVT_PERL_VERBOSITY
1641    
1642     This variable controls the verbosity level of the perl extension. Higher
1643     numbers indicate more verbose output.
1644    
1645     =over 4
1646    
1647 root 1.58 =item == 0 - fatal messages
1648 root 1.4
1649 root 1.58 =item >= 3 - script loading and management
1650 root 1.4
1651 root 1.85 =item >=10 - all called hooks
1652    
1653     =item >=11 - hook reutrn values
1654 root 1.4
1655     =back
1656    
1657 root 1.1 =head1 AUTHOR
1658    
1659     Marc Lehmann <pcg@goof.com>
1660     http://software.schmorp.de/pkg/rxvt-unicode
1661    
1662     =cut
1663    
1664     1