ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.95
Committed: Tue Jan 17 13:19:45 2006 UTC (18 years, 4 months ago) by elmex
Branch: MAIN
Changes since 1.94: +18 -1 lines
Log Message:
documented and improved remote-pastebin.

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