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