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