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