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