ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.96
Committed: Tue Jan 17 16:22:41 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.95: +1 -7 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 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.1 =item $time = urxvt::NOW
504    
505     Returns the "current time" (as per the event loop).
506    
507 root 1.47 =item urxvt::CurrentTime
508    
509     =item urxvt::ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask,
510     Mod3Mask, Mod4Mask, Mod5Mask, Button1Mask, Button2Mask, Button3Mask,
511     Button4Mask, Button5Mask, AnyModifier
512    
513 root 1.92 =item urxvt::NoEventMask, KeyPressMask, KeyReleaseMask,
514     ButtonPressMask, ButtonReleaseMask, EnterWindowMask, LeaveWindowMask,
515     PointerMotionMask, PointerMotionHintMask, Button1MotionMask, Button2MotionMask,
516     Button3MotionMask, Button4MotionMask, Button5MotionMask, ButtonMotionMask,
517     KeymapStateMask, ExposureMask, VisibilityChangeMask, StructureNotifyMask,
518     ResizeRedirectMask, SubstructureNotifyMask, SubstructureRedirectMask,
519     FocusChangeMask, PropertyChangeMask, ColormapChangeMask, OwnerGrabButtonMask
520    
521     =item urxvt::KeyPress, KeyRelease, ButtonPress, ButtonRelease, MotionNotify,
522     EnterNotify, LeaveNotify, FocusIn, FocusOut, KeymapNotify, Expose,
523     GraphicsExpose, NoExpose, VisibilityNotify, CreateNotify, DestroyNotify,
524     UnmapNotify, MapNotify, MapRequest, ReparentNotify, ConfigureNotify,
525     ConfigureRequest, GravityNotify, ResizeRequest, CirculateNotify,
526     CirculateRequest, PropertyNotify, SelectionClear, SelectionRequest,
527     SelectionNotify, ColormapNotify, ClientMessage, MappingNotify
528    
529 root 1.55 Various constants for use in X calls and event processing.
530 root 1.47
531 root 1.21 =back
532    
533 root 1.18 =head2 RENDITION
534    
535     Rendition bitsets contain information about colour, font, font styles and
536     similar information for each screen cell.
537    
538     The following "macros" deal with changes in rendition sets. You should
539     never just create a bitset, you should always modify an existing one,
540     as they contain important information required for correct operation of
541     rxvt-unicode.
542    
543     =over 4
544    
545     =item $rend = urxvt::DEFAULT_RSTYLE
546    
547     Returns the default rendition, as used when the terminal is starting up or
548     being reset. Useful as a base to start when creating renditions.
549    
550     =item $rend = urxvt::OVERLAY_RSTYLE
551    
552     Return the rendition mask used for overlays by default.
553    
554     =item $rendbit = urxvt::RS_Bold, RS_Italic, RS_Blink, RS_RVid, RS_Uline
555    
556     Return the bit that enabled bold, italic, blink, reverse-video and
557 root 1.19 underline, respectively. To enable such a style, just logically OR it into
558     the bitset.
559 root 1.18
560     =item $foreground = urxvt::GET_BASEFG $rend
561    
562     =item $background = urxvt::GET_BASEBG $rend
563    
564     Return the foreground/background colour index, respectively.
565    
566 root 1.75 =item $rend = urxvt::SET_FGCOLOR $rend, $new_colour
567 root 1.18
568 root 1.75 =item $rend = urxvt::SET_BGCOLOR $rend, $new_colour
569 root 1.18
570     Replace the foreground/background colour in the rendition mask with the
571     specified one.
572    
573 root 1.75 =item $value = urxvt::GET_CUSTOM $rend
574 root 1.19
575     Return the "custom" value: Every rendition has 5 bits for use by
576     extensions. They can be set and changed as you like and are initially
577     zero.
578    
579 root 1.75 =item $rend = urxvt::SET_CUSTOM $rend, $new_value
580 root 1.19
581     Change the custom value.
582    
583 root 1.18 =back
584    
585 root 1.1 =cut
586    
587     BEGIN {
588     urxvt->bootstrap;
589    
590     # overwrite perl's warn
591     *CORE::GLOBAL::warn = sub {
592     my $msg = join "", @_;
593     $msg .= "\n"
594     unless $msg =~ /\n$/;
595     urxvt::warn ($msg);
596     };
597 root 1.59
598 root 1.82 # %ENV is the original startup environment
599 root 1.81 delete $ENV{IFS};
600     delete $ENV{CDPATH};
601     delete $ENV{BASH_ENV};
602     $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin:/opt/sbin";
603 root 1.1 }
604    
605 root 1.7 my $verbosity = $ENV{URXVT_PERL_VERBOSITY};
606 root 1.1
607     sub verbose {
608     my ($level, $msg) = @_;
609 root 1.8 warn "$msg\n" if $level <= $verbosity;
610 root 1.1 }
611    
612 root 1.44 my $extension_pkg = "extension0000";
613     my %extension_pkg;
614 root 1.1
615     # load a single script into its own package, once only
616 root 1.44 sub extension_package($) {
617 root 1.1 my ($path) = @_;
618    
619 root 1.44 $extension_pkg{$path} ||= do {
620     my $pkg = "urxvt::" . ($extension_pkg++);
621 root 1.8
622 root 1.44 verbose 3, "loading extension '$path' into package '$pkg'";
623 root 1.1
624     open my $fh, "<:raw", $path
625     or die "$path: $!";
626    
627 root 1.96 my $source =
628 root 1.69 "package $pkg; use strict; use utf8;\n"
629 root 1.71 . "use base urxvt::term::extension::;\n"
630 root 1.69 . "#line 1 \"$path\"\n{\n"
631     . (do { local $/; <$fh> })
632     . "\n};\n1";
633 root 1.8
634 root 1.69 eval $source
635     or die "$path: $@";
636 root 1.1
637     $pkg
638 root 1.7 }
639 root 1.1 }
640    
641 root 1.31 our $retval; # return value for urxvt
642    
643 root 1.8 # called by the rxvt core
644     sub invoke {
645 root 1.23 local $TERM = shift;
646 root 1.8 my $htype = shift;
647 root 1.6
648 root 1.8 if ($htype == 0) { # INIT
649 root 1.23 my @dirs = ((split /:/, $TERM->resource ("perl_lib")), "$LIBDIR/perl");
650 root 1.49
651 root 1.68 my %ext_arg;
652 root 1.6
653 root 1.50 for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) {
654     if ($_ eq "default") {
655 root 1.69 $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup searchable-scrollback);
656 root 1.51 } elsif (/^-(.*)$/) {
657 root 1.68 delete $ext_arg{$1};
658     } elsif (/^([^<]+)<(.*)>$/) {
659     push @{ $ext_arg{$1} }, $2;
660 root 1.49 } else {
661 root 1.68 $ext_arg{$_} ||= [];
662 root 1.50 }
663     }
664 root 1.6
665 root 1.68 while (my ($ext, $argv) = each %ext_arg) {
666 root 1.50 my @files = grep -f $_, map "$_/$ext", @dirs;
667    
668     if (@files) {
669 root 1.68 $TERM->register_package (extension_package $files[0], $argv);
670 root 1.50 } else {
671     warn "perl extension '$ext' not found in perl library search path\n";
672 root 1.8 }
673     }
674 root 1.55
675     eval "#line 1 \"--perl-eval resource/argument\"\n" . $TERM->resource ("perl_eval");
676     warn $@ if $@;
677 root 1.31 }
678    
679     $retval = undef;
680 root 1.6
681 root 1.31 if (my $cb = $TERM->{_hook}[$htype]) {
682     verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")"
683     if $verbosity >= 10;
684    
685     keys %$cb;
686    
687     while (my ($pkg, $cb) = each %$cb) {
688 root 1.68 $retval = eval { $cb->($TERM->{_pkg}{$pkg}, @_) }
689     and last;
690    
691 root 1.58 if ($@) {
692     $TERM->ungrab; # better to lose the grab than the session
693     warn $@;
694     }
695 root 1.31 }
696 root 1.85
697     verbose 11, "$HOOKNAME[$htype] returning <$retval>"
698     if $verbosity >= 11;
699 root 1.31 }
700    
701     if ($htype == 1) { # DESTROY
702     # clear package objects
703     %$_ = () for values %{ $TERM->{_pkg} };
704 root 1.25
705 root 1.31 # clear package
706     %$TERM = ();
707 root 1.7 }
708    
709 root 1.31 $retval
710 root 1.7 }
711 root 1.1
712 root 1.84 sub exec_async(@) {
713     my $pid = fork;
714    
715     return
716     if !defined $pid or $pid;
717    
718     %ENV = %{ $TERM->env };
719    
720     exec @_;
721     _exit 255;
722     }
723    
724 root 1.71 # urxvt::term::extension
725 root 1.55
726 root 1.71 package urxvt::term::extension;
727 root 1.69
728     sub enable {
729     my ($self, %hook) = @_;
730     my $pkg = $self->{_pkg};
731    
732     while (my ($name, $cb) = each %hook) {
733     my $htype = $HOOKTYPE{uc $name};
734     defined $htype
735     or Carp::croak "unsupported hook type '$name'";
736    
737 root 1.92 $self->set_should_invoke ($htype, +1)
738     unless exists $self->{term}{_hook}[$htype]{$pkg};
739 root 1.69
740     $self->{term}{_hook}[$htype]{$pkg} = $cb;
741     }
742     }
743    
744     sub disable {
745     my ($self, @hook) = @_;
746     my $pkg = $self->{_pkg};
747    
748     for my $name (@hook) {
749     my $htype = $HOOKTYPE{uc $name};
750     defined $htype
751     or Carp::croak "unsupported hook type '$name'";
752    
753 root 1.92 $self->set_should_invoke ($htype, -1)
754     if delete $self->{term}{_hook}[$htype]{$pkg};
755 root 1.69 }
756     }
757    
758     our $AUTOLOAD;
759    
760     sub AUTOLOAD {
761     $AUTOLOAD =~ /:([^:]+)$/
762     or die "FATAL: \$AUTOLOAD '$AUTOLOAD' unparsable";
763 root 1.23
764     eval qq{
765 root 1.69 sub $AUTOLOAD {
766 root 1.24 my \$proxy = shift;
767     \$proxy->{term}->$1 (\@_)
768 root 1.23 }
769     1
770     } or die "FATAL: unable to compile method forwarder: $@";
771    
772 root 1.69 goto &$AUTOLOAD;
773 root 1.23 }
774    
775 root 1.69 sub DESTROY {
776 root 1.58 # nop
777     }
778    
779 root 1.55 # urxvt::destroy_hook
780    
781 root 1.45 sub urxvt::destroy_hook::DESTROY {
782     ${$_[0]}->();
783     }
784    
785     sub urxvt::destroy_hook(&) {
786     bless \shift, urxvt::destroy_hook::
787     }
788    
789 root 1.56 package urxvt::anyevent;
790    
791     =head2 The C<urxvt::anyevent> Class
792    
793     The sole purpose of this class is to deliver an interface to the
794     C<AnyEvent> module - any module using it will work inside urxvt without
795 root 1.75 further programming. The only exception is that you cannot wait on
796     condition variables, but non-blocking condvar use is ok. What this means
797     is that you cannot use blocking APIs, but the non-blocking variant should
798     work.
799 root 1.55
800 root 1.56 =cut
801 root 1.55
802     our $VERSION = 1;
803    
804     $INC{"urxvt/anyevent.pm"} = 1; # mark us as there
805     push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
806    
807     sub timer {
808     my ($class, %arg) = @_;
809    
810     my $cb = $arg{cb};
811    
812     urxvt::timer
813     ->new
814     ->start (urxvt::NOW + $arg{after})
815     ->cb (sub {
816     $_[0]->stop; # need to cancel manually
817     $cb->();
818     })
819     }
820    
821     sub io {
822     my ($class, %arg) = @_;
823    
824     my $cb = $arg{cb};
825    
826     bless [$arg{fh}, urxvt::iow
827     ->new
828     ->fd (fileno $arg{fh})
829     ->events (($arg{poll} =~ /r/ ? 1 : 0)
830     | ($arg{poll} =~ /w/ ? 2 : 0))
831     ->start
832     ->cb (sub {
833     $cb->(($_[1] & 1 ? 'r' : '')
834     . ($_[1] & 2 ? 'w' : ''));
835     })],
836     urxvt::anyevent::
837     }
838    
839     sub DESTROY {
840     $_[0][1]->stop;
841     }
842    
843     sub condvar {
844     bless \my $flag, urxvt::anyevent::condvar::
845     }
846    
847     sub urxvt::anyevent::condvar::broadcast {
848     ${$_[0]}++;
849     }
850    
851     sub urxvt::anyevent::condvar::wait {
852     unless (${$_[0]}) {
853 root 1.69 Carp::croak "AnyEvent->condvar blocking wait unsupported in urxvt, use a non-blocking API";
854 root 1.55 }
855     }
856    
857     package urxvt::term;
858    
859 root 1.1 =head2 The C<urxvt::term> Class
860    
861     =over 4
862    
863 root 1.68 =cut
864    
865     # find on_xxx subs in the package and register them
866     # as hooks
867     sub register_package {
868     my ($self, $pkg, $argv) = @_;
869    
870 root 1.69 my $proxy = bless {
871     _pkg => $pkg,
872     argv => $argv,
873     }, $pkg;
874     Scalar::Util::weaken ($proxy->{term} = $self);
875 root 1.68
876     $self->{_pkg}{$pkg} = $proxy;
877    
878 root 1.69 for my $name (@HOOKNAME) {
879     if (my $ref = $pkg->can ("on_" . lc $name)) {
880     $proxy->enable ($name => $ref);
881     }
882 root 1.68 }
883     }
884    
885 root 1.77 =item $term = new urxvt::term $envhashref, $rxvtname, [arg...]
886    
887     Creates a new terminal, very similar as if you had started it with system
888 root 1.78 C<$rxvtname, arg...>. C<$envhashref> must be a reference to a C<%ENV>-like
889     hash which defines the environment of the new terminal.
890 root 1.77
891     Croaks (and probably outputs an error message) if the new instance
892     couldn't be created. Returns C<undef> if the new instance didn't
893     initialise perl, and the terminal object otherwise. The C<init> and
894     C<start> hooks will be called during this call.
895    
896     =cut
897    
898     sub new {
899     my ($class, $env, @args) = @_;
900    
901     _new ([ map "$_=$env->{$_}", keys %$env ], @args);
902     }
903    
904 root 1.36 =item $term->destroy
905    
906 root 1.75 Destroy the terminal object (close the window, free resources
907     etc.). Please note that @@RXVT_NAME@@ will not exit as long as any event
908     watchers (timers, io watchers) are still active.
909 root 1.36
910 root 1.49 =item $isset = $term->option ($optval[, $set])
911    
912     Returns true if the option specified by C<$optval> is enabled, and
913     optionally change it. All option values are stored by name in the hash
914     C<%urxvt::OPTION>. Options not enabled in this binary are not in the hash.
915    
916     Here is a a likely non-exhaustive list of option names, please see the
917     source file F</src/optinc.h> to see the actual list:
918    
919     borderLess console cursorBlink cursorUnderline hold iconic insecure
920     intensityStyles jumpScroll loginShell mapAlert meta8 mouseWheelScrollPage
921     pastableTabs pointerBlank reverseVideo scrollBar scrollBar_floating
922     scrollBar_right scrollTtyKeypress scrollTtyOutput scrollWithBuffer
923     secondaryScreen secondaryScroll skipBuiltinGlyphs transparent
924     tripleclickwords utmpInhibit visualBell
925    
926 root 1.4 =item $value = $term->resource ($name[, $newval])
927    
928     Returns the current resource value associated with a given name and
929     optionally sets a new value. Setting values is most useful in the C<init>
930     hook. Unset resources are returned and accepted as C<undef>.
931    
932     The new value must be properly encoded to a suitable character encoding
933     before passing it to this method. Similarly, the returned value may need
934     to be converted from the used encoding to text.
935    
936     Resource names are as defined in F<src/rsinc.h>. Colours can be specified
937     as resource names of the form C<< color+<index> >>, e.g. C<color+5>. (will
938     likely change).
939    
940     Please note that resource strings will currently only be freed when the
941     terminal is destroyed, so changing options frequently will eat memory.
942    
943 root 1.5 Here is a a likely non-exhaustive list of resource names, not all of which
944 root 1.49 are supported in every build, please see the source file F</src/rsinc.h>
945     to see the actual list:
946 root 1.5
947     answerbackstring backgroundPixmap backspace_key boldFont boldItalicFont
948     borderLess color cursorBlink cursorUnderline cutchars delete_key
949     display_name embed ext_bwidth fade font geometry hold iconName
950     imFont imLocale inputMethod insecure int_bwidth intensityStyles
951 root 1.8 italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier
952 root 1.30 mouseWheelScrollPage name pastableTabs path perl_eval perl_ext_1 perl_ext_2
953 root 1.6 perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd
954     reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating
955     scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput
956     scrollWithBuffer scrollstyle secondaryScreen secondaryScroll selectstyle
957     shade term_name title transparent transparent_all tripleclickwords
958     utmpInhibit visualBell
959 root 1.5
960 root 1.4 =cut
961    
962 root 1.55 sub resource($$;$) {
963 root 1.4 my ($self, $name) = (shift, shift);
964     unshift @_, $self, $name, ($name =~ s/\s*\+\s*(\d+)$// ? $1 : 0);
965 root 1.45 &urxvt::term::_resource
966 root 1.4 }
967    
968 root 1.79 =item $value = $term->x_resource ($pattern)
969    
970     Returns the X-Resource for the given pattern, excluding the program or
971     class name, i.e. C<< $term->x_resource ("boldFont") >> should return the
972     same value as used by this instance of rxvt-unicode. Returns C<undef> if no
973     resource with that pattern exists.
974    
975     This method should only be called during the C<on_start> hook, as there is
976     only one resource database per display, and later invocations might return
977     the wrong resources.
978    
979 root 1.69 =item $success = $term->parse_keysym ($keysym_spec, $command_string)
980    
981     Adds a keymap translation exactly as specified via a resource. See the
982     C<keysym> resource in the @@RXVT_NAME@@(1) manpage.
983    
984 root 1.33 =item $rend = $term->rstyle ([$new_rstyle])
985 root 1.32
986 root 1.33 Return and optionally change the current rendition. Text that is output by
987     the terminal application will use this style.
988 root 1.32
989     =item ($row, $col) = $term->screen_cur ([$row, $col])
990    
991     Return the current coordinates of the text cursor position and optionally
992     set it (which is usually bad as applications don't expect that).
993    
994 root 1.1 =item ($row, $col) = $term->selection_mark ([$row, $col])
995    
996     =item ($row, $col) = $term->selection_beg ([$row, $col])
997    
998     =item ($row, $col) = $term->selection_end ([$row, $col])
999    
1000     Return the current values of the selection mark, begin or end positions,
1001     and optionally set them to new values.
1002    
1003 root 1.86 =item $term->selection_make ($eventtime[, $rectangular])
1004    
1005     Tries to make a selection as set by C<selection_beg> and
1006     C<selection_end>. If C<$rectangular> is true (default: false), a
1007     rectangular selection will be made. This is the prefered function to make
1008     a selection.
1009    
1010 root 1.1 =item $success = $term->selection_grab ($eventtime)
1011    
1012 root 1.86 Try to request the primary selection text from the server (for example, as
1013     set by the next method). No visual feedback will be given. This function
1014     is mostly useful from within C<on_sel_grab> hooks.
1015 root 1.1
1016     =item $oldtext = $term->selection ([$newtext])
1017    
1018     Return the current selection text and optionally replace it by C<$newtext>.
1019    
1020 root 1.69 =item $term->overlay_simple ($x, $y, $text)
1021    
1022     Create a simple multi-line overlay box. See the next method for details.
1023    
1024     =cut
1025    
1026     sub overlay_simple {
1027     my ($self, $x, $y, $text) = @_;
1028    
1029     my @lines = split /\n/, $text;
1030    
1031     my $w = List::Util::max map $self->strwidth ($_), @lines;
1032    
1033     my $overlay = $self->overlay ($x, $y, $w, scalar @lines);
1034     $overlay->set (0, $_, $lines[$_]) for 0.. $#lines;
1035    
1036     $overlay
1037     }
1038 root 1.1
1039 root 1.20 =item $term->overlay ($x, $y, $width, $height[, $rstyle[, $border]])
1040 root 1.1
1041     Create a new (empty) overlay at the given position with the given
1042 root 1.20 width/height. C<$rstyle> defines the initial rendition style
1043     (default: C<OVERLAY_RSTYLE>).
1044 root 1.1
1045 root 1.20 If C<$border> is C<2> (default), then a decorative border will be put
1046     around the box.
1047 root 1.1
1048 root 1.20 If either C<$x> or C<$y> is negative, then this is counted from the
1049     right/bottom side, respectively.
1050 root 1.1
1051 root 1.20 This method returns an urxvt::overlay object. The overlay will be visible
1052     as long as the perl object is referenced.
1053 root 1.1
1054 root 1.22 The methods currently supported on C<urxvt::overlay> objects are:
1055    
1056     =over 4
1057 root 1.1
1058 root 1.20 =item $overlay->set ($x, $y, $text, $rend)
1059 root 1.1
1060 root 1.20 Similar to C<< $term->ROW_t >> and C<< $term->ROW_r >> in that it puts
1061     text in rxvt-unicode's special encoding and an array of rendition values
1062     at a specific position inside the overlay.
1063 root 1.1
1064 root 1.22 =item $overlay->hide
1065    
1066     If visible, hide the overlay, but do not destroy it.
1067    
1068     =item $overlay->show
1069    
1070     If hidden, display the overlay again.
1071    
1072     =back
1073    
1074 root 1.45 =item $popup = $term->popup ($event)
1075    
1076     Creates a new C<urxvt::popup> object that implements a popup menu. The
1077     C<$event> I<must> be the event causing the menu to pop up (a button event,
1078     currently).
1079    
1080     =cut
1081    
1082 root 1.55 sub popup {
1083 root 1.45 my ($self, $event) = @_;
1084    
1085     $self->grab ($event->{time}, 1)
1086     or return;
1087    
1088     my $popup = bless {
1089     term => $self,
1090     event => $event,
1091     }, urxvt::popup::;
1092    
1093     Scalar::Util::weaken $popup->{term};
1094    
1095     $self->{_destroy}{$popup} = urxvt::destroy_hook { $popup->{popup}->destroy };
1096     Scalar::Util::weaken $self->{_destroy}{$popup};
1097    
1098     $popup
1099     }
1100    
1101 root 1.40 =item $cellwidth = $term->strwidth ($string)
1102 root 1.6
1103     Returns the number of screen-cells this string would need. Correctly
1104     accounts for wide and combining characters.
1105    
1106 root 1.40 =item $octets = $term->locale_encode ($string)
1107 root 1.6
1108     Convert the given text string into the corresponding locale encoding.
1109    
1110 root 1.40 =item $string = $term->locale_decode ($octets)
1111 root 1.6
1112     Convert the given locale-encoded octets into a perl string.
1113    
1114 root 1.70 =item $term->scr_xor_span ($beg_row, $beg_col, $end_row, $end_col[, $rstyle])
1115    
1116     XORs the rendition values in the given span with the provided value
1117 root 1.86 (default: C<RS_RVid>), which I<MUST NOT> contain font styles. Useful in
1118     refresh hooks to provide effects similar to the selection.
1119 root 1.70
1120     =item $term->scr_xor_rect ($beg_row, $beg_col, $end_row, $end_col[, $rstyle1[, $rstyle2]])
1121    
1122     Similar to C<scr_xor_span>, but xors a rectangle instead. Trailing
1123     whitespace will additionally be xored with the C<$rstyle2>, which defaults
1124     to C<RS_RVid | RS_Uline>, which removes reverse video again and underlines
1125 root 1.86 it instead. Both styles I<MUST NOT> contain font styles.
1126 root 1.70
1127 root 1.69 =item $term->scr_bell
1128    
1129     Ring the bell!
1130    
1131 root 1.33 =item $term->scr_add_lines ($string)
1132    
1133     Write the given text string to the screen, as if output by the application
1134     running inside the terminal. It may not contain command sequences (escape
1135     codes), but is free to use line feeds, carriage returns and tabs. The
1136     string is a normal text string, not in locale-dependent encoding.
1137    
1138     Normally its not a good idea to use this function, as programs might be
1139     confused by changes in cursor position or scrolling. Its useful inside a
1140     C<on_add_lines> hook, though.
1141    
1142 root 1.36 =item $term->cmd_parse ($octets)
1143    
1144     Similar to C<scr_add_lines>, but the argument must be in the
1145     locale-specific encoding of the terminal and can contain command sequences
1146     (escape codes) that will be interpreted.
1147    
1148 root 1.6 =item $term->tt_write ($octets)
1149    
1150     Write the octets given in C<$data> to the tty (i.e. as program input). To
1151 root 1.12 pass characters instead of octets, you should convert your strings first
1152     to the locale-specific encoding using C<< $term->locale_encode >>.
1153    
1154 root 1.69 =item $old_events = $term->pty_ev_events ([$new_events])
1155    
1156     Replaces the event mask of the pty watcher by the given event mask. Can
1157     be used to suppress input and output handling to the pty/tty. See the
1158     description of C<< urxvt::timer->events >>. Make sure to always restore
1159     the previous value.
1160    
1161 root 1.40 =item $windowid = $term->parent
1162    
1163     Return the window id of the toplevel window.
1164    
1165     =item $windowid = $term->vt
1166    
1167     Return the window id of the terminal window.
1168    
1169 root 1.92 =item $term->vt_emask_add ($x_event_mask)
1170    
1171     Adds the specified events to the vt event mask. Useful e.g. when you want
1172     to receive pointer events all the times:
1173    
1174     $term->vt_emask_add (urxvt::PointerMotionMask);
1175    
1176 root 1.32 =item $window_width = $term->width
1177    
1178     =item $window_height = $term->height
1179    
1180     =item $font_width = $term->fwidth
1181    
1182     =item $font_height = $term->fheight
1183    
1184     =item $font_ascent = $term->fbase
1185    
1186     =item $terminal_rows = $term->nrow
1187    
1188     =item $terminal_columns = $term->ncol
1189    
1190     =item $has_focus = $term->focus
1191    
1192     =item $is_mapped = $term->mapped
1193 root 1.13
1194 root 1.32 =item $max_scrollback = $term->saveLines
1195 root 1.13
1196 root 1.32 =item $nrow_plus_saveLines = $term->total_rows
1197 root 1.13
1198 root 1.94 =item $topmost_scrollback_row = $term->top_row
1199 root 1.12
1200 root 1.32 Return various integers describing terminal characteristics.
1201 root 1.12
1202 root 1.77 =item $x_display = $term->display_id
1203    
1204     Return the DISPLAY used by rxvt-unicode.
1205    
1206 root 1.66 =item $lc_ctype = $term->locale
1207    
1208     Returns the LC_CTYPE category string used by this rxvt-unicode.
1209    
1210 root 1.77 =item $env = $term->env
1211    
1212     Returns a copy of the environment in effect for the terminal as a hashref
1213     similar to C<\%ENV>.
1214    
1215     =cut
1216 root 1.66
1217 root 1.77 sub env {
1218     if (my $env = $_[0]->_env) {
1219     +{ map /^([^=]+)(?:=(.*))?$/s && ($1 => $2), @$env }
1220     } else {
1221     +{ %ENV }
1222     }
1223     }
1224 root 1.66
1225 root 1.47 =item $modifiermask = $term->ModLevel3Mask
1226    
1227     =item $modifiermask = $term->ModMetaMask
1228    
1229     =item $modifiermask = $term->ModNumLockMask
1230    
1231     Return the modifier masks corresponding to the "ISO Level 3 Shift" (often
1232     AltGr), the meta key (often Alt) and the num lock key, if applicable.
1233    
1234 root 1.12 =item $view_start = $term->view_start ([$newvalue])
1235    
1236 root 1.94 Returns the row number of the topmost displayed line. Maximum value is
1237     C<0>, which displays the normal terminal contents. Lower values scroll
1238 root 1.12 this many lines into the scrollback buffer.
1239    
1240 root 1.14 =item $term->want_refresh
1241    
1242     Requests a screen refresh. At the next opportunity, rxvt-unicode will
1243     compare the on-screen display with its stored representation. If they
1244     differ, it redraws the differences.
1245    
1246     Used after changing terminal contents to display them.
1247    
1248 root 1.13 =item $text = $term->ROW_t ($row_number[, $new_text[, $start_col]])
1249 root 1.12
1250     Returns the text of the entire row with number C<$row_number>. Row C<0>
1251     is the topmost terminal line, row C<< $term->$ncol-1 >> is the bottommost
1252     terminal line. The scrollback buffer starts at line C<-1> and extends to
1253 root 1.24 line C<< -$term->nsaved >>. Nothing will be returned if a nonexistent line
1254     is requested.
1255 root 1.12
1256 root 1.13 If C<$new_text> is specified, it will replace characters in the current
1257     line, starting at column C<$start_col> (default C<0>), which is useful
1258 root 1.18 to replace only parts of a line. The font index in the rendition will
1259 root 1.13 automatically be updated.
1260 root 1.12
1261     C<$text> is in a special encoding: tabs and wide characters that use more
1262     than one cell when displayed are padded with urxvt::NOCHAR characters
1263     (C<chr 65535>). Characters with combining characters and other characters
1264     that do not fit into the normal tetx encoding will be replaced with
1265     characters in the private use area.
1266    
1267     You have to obey this encoding when changing text. The advantage is
1268     that C<substr> and similar functions work on screen cells and not on
1269     characters.
1270    
1271     The methods C<< $term->special_encode >> and C<< $term->special_decode >>
1272     can be used to convert normal strings into this encoding and vice versa.
1273    
1274 root 1.13 =item $rend = $term->ROW_r ($row_number[, $new_rend[, $start_col]])
1275    
1276     Like C<< $term->ROW_t >>, but returns an arrayref with rendition
1277     bitsets. Rendition bitsets contain information about colour, font, font
1278     styles and similar information. See also C<< $term->ROW_t >>.
1279    
1280     When setting rendition, the font mask will be ignored.
1281 root 1.12
1282 root 1.18 See the section on RENDITION, above.
1283 root 1.13
1284     =item $length = $term->ROW_l ($row_number[, $new_length])
1285    
1286 root 1.24 Returns the number of screen cells that are in use ("the line
1287     length"). Unlike the urxvt core, this returns C<< $term->ncol >> if the
1288     line is joined with the following one.
1289    
1290     =item $bool = $term->is_longer ($row_number)
1291    
1292     Returns true if the row is part of a multiple-row logical "line" (i.e.
1293     joined with the following row), which means all characters are in use
1294     and it is continued on the next row (and possibly a continuation of the
1295     previous row(s)).
1296    
1297     =item $line = $term->line ($row_number)
1298    
1299     Create and return a new C<urxvt::line> object that stores information
1300     about the logical line that row C<$row_number> is part of. It supports the
1301     following methods:
1302 root 1.12
1303 root 1.24 =over 4
1304    
1305 root 1.35 =item $text = $line->t ([$new_text])
1306 root 1.24
1307 root 1.35 Returns or replaces the full text of the line, similar to C<ROW_t>
1308 root 1.24
1309 root 1.35 =item $rend = $line->r ([$new_rend])
1310 root 1.24
1311 root 1.35 Returns or replaces the full rendition array of the line, similar to C<ROW_r>
1312 root 1.24
1313     =item $length = $line->l
1314    
1315     Returns the length of the line in cells, similar to C<ROW_l>.
1316    
1317     =item $rownum = $line->beg
1318    
1319     =item $rownum = $line->end
1320    
1321     Return the row number of the first/last row of the line, respectively.
1322    
1323     =item $offset = $line->offset_of ($row, $col)
1324    
1325     Returns the character offset of the given row|col pair within the logical
1326 root 1.85 line. Works for rows outside the line, too, and returns corresponding
1327     offsets outside the string.
1328 root 1.24
1329     =item ($row, $col) = $line->coord_of ($offset)
1330    
1331     Translates a string offset into terminal coordinates again.
1332    
1333     =back
1334    
1335     =cut
1336    
1337 root 1.55 sub line {
1338 root 1.24 my ($self, $row) = @_;
1339    
1340     my $maxrow = $self->nrow - 1;
1341    
1342     my ($beg, $end) = ($row, $row);
1343    
1344     --$beg while $self->ROW_is_longer ($beg - 1);
1345     ++$end while $self->ROW_is_longer ($end) && $end < $maxrow;
1346    
1347     bless {
1348     term => $self,
1349     beg => $beg,
1350     end => $end,
1351 root 1.34 ncol => $self->ncol,
1352 root 1.24 len => ($end - $beg) * $self->ncol + $self->ROW_l ($end),
1353     }, urxvt::line::
1354     }
1355    
1356     sub urxvt::line::t {
1357     my ($self) = @_;
1358    
1359 root 1.34 if (@_ > 1)
1360     {
1361     $self->{term}->ROW_t ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1362     for $self->{beg} .. $self->{end};
1363     }
1364    
1365     defined wantarray &&
1366     substr +(join "", map $self->{term}->ROW_t ($_), $self->{beg} .. $self->{end}),
1367     0, $self->{len}
1368 root 1.24 }
1369    
1370     sub urxvt::line::r {
1371     my ($self) = @_;
1372    
1373 root 1.34 if (@_ > 1)
1374     {
1375     $self->{term}->ROW_r ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1376     for $self->{beg} .. $self->{end};
1377     }
1378    
1379     if (defined wantarray) {
1380     my $rend = [
1381     map @{ $self->{term}->ROW_r ($_) }, $self->{beg} .. $self->{end}
1382     ];
1383     $#$rend = $self->{len} - 1;
1384     return $rend;
1385     }
1386    
1387     ()
1388 root 1.24 }
1389    
1390     sub urxvt::line::beg { $_[0]{beg} }
1391     sub urxvt::line::end { $_[0]{end} }
1392     sub urxvt::line::l { $_[0]{len} }
1393    
1394     sub urxvt::line::offset_of {
1395     my ($self, $row, $col) = @_;
1396    
1397 root 1.34 ($row - $self->{beg}) * $self->{ncol} + $col
1398 root 1.24 }
1399    
1400     sub urxvt::line::coord_of {
1401     my ($self, $offset) = @_;
1402    
1403     use integer;
1404    
1405     (
1406 root 1.34 $offset / $self->{ncol} + $self->{beg},
1407     $offset % $self->{ncol}
1408 root 1.24 )
1409     }
1410    
1411 root 1.12 =item $text = $term->special_encode $string
1412    
1413     Converts a perl string into the special encoding used by rxvt-unicode,
1414     where one character corresponds to one screen cell. See
1415     C<< $term->ROW_t >> for details.
1416    
1417     =item $string = $term->special_decode $text
1418    
1419     Converts rxvt-unicodes text reprsentation into a perl string. See
1420     C<< $term->ROW_t >> for details.
1421 root 1.6
1422 root 1.61 =item $success = $term->grab_button ($button, $modifiermask)
1423    
1424 root 1.64 Registers a synchronous button grab. See the XGrabButton manpage.
1425 root 1.61
1426     =item $success = $term->grab ($eventtime[, $sync])
1427    
1428     Calls XGrabPointer and XGrabKeyboard in asynchronous (default) or
1429     synchronous (C<$sync> is true). Also remembers the grab timestampe.
1430    
1431     =item $term->allow_events_async
1432    
1433     Calls XAllowEvents with AsyncBoth for the most recent grab.
1434    
1435     =item $term->allow_events_sync
1436    
1437     Calls XAllowEvents with SyncBoth for the most recent grab.
1438    
1439     =item $term->allow_events_replay
1440    
1441     Calls XAllowEvents with both ReplayPointer and ReplayKeyboard for the most
1442     recent grab.
1443    
1444     =item $term->ungrab
1445    
1446     Calls XUngrab for the most recent grab. Is called automatically on
1447     evaluation errors, as it is better to lose the grab in the error case as
1448     the session.
1449    
1450 root 1.1 =back
1451    
1452 root 1.55 =cut
1453    
1454     package urxvt::popup;
1455    
1456 root 1.45 =head2 The C<urxvt::popup> Class
1457    
1458     =over 4
1459    
1460     =cut
1461    
1462     sub add_item {
1463     my ($self, $item) = @_;
1464    
1465 root 1.53 $item->{rend}{normal} = "\x1b[0;30;47m" unless exists $item->{rend}{normal};
1466     $item->{rend}{hover} = "\x1b[0;30;46m" unless exists $item->{rend}{hover};
1467     $item->{rend}{active} = "\x1b[m" unless exists $item->{rend}{active};
1468    
1469     $item->{render} ||= sub { $_[0]{text} };
1470    
1471 root 1.45 push @{ $self->{item} }, $item;
1472     }
1473    
1474 root 1.76 =item $popup->add_title ($title)
1475    
1476     Adds a non-clickable title to the popup.
1477    
1478     =cut
1479    
1480     sub add_title {
1481     my ($self, $title) = @_;
1482    
1483     $self->add_item ({
1484     rend => { normal => "\x1b[38;5;11;44m", hover => "\x1b[38;5;11;44m", active => "\x1b[38;5;11;44m" },
1485     text => $title,
1486     activate => sub { },
1487     });
1488     }
1489    
1490     =item $popup->add_separator ([$sepchr])
1491    
1492     Creates a separator, optionally using the character given as C<$sepchr>.
1493    
1494     =cut
1495    
1496 root 1.53 sub add_separator {
1497     my ($self, $sep) = @_;
1498    
1499 root 1.67 $sep ||= "=";
1500 root 1.53
1501     $self->add_item ({
1502     rend => { normal => "\x1b[0;30;47m", hover => "\x1b[0;30;47m", active => "\x1b[0;30;47m" },
1503     text => "",
1504 root 1.65 render => sub { $sep x $self->{term}->ncol },
1505 root 1.53 activate => sub { },
1506     });
1507     }
1508    
1509 root 1.76 =item $popup->add_button ($text, $cb)
1510    
1511     Adds a clickable button to the popup. C<$cb> is called whenever it is
1512     selected.
1513 root 1.53
1514 root 1.76 =cut
1515 root 1.53
1516 root 1.45 sub add_button {
1517     my ($self, $text, $cb) = @_;
1518    
1519 root 1.64 $self->add_item ({ type => "button", text => $text, activate => $cb});
1520 root 1.48 }
1521    
1522 root 1.76 =item $popup->add_toggle ($text, $cb, $initial_value)
1523    
1524     Adds a toggle/checkbox item to the popup. Teh callback gets called
1525     whenever it gets toggled, with a boolean indicating its value as its first
1526     argument.
1527    
1528     =cut
1529    
1530 root 1.48 sub add_toggle {
1531     my ($self, $text, $cb, $value) = @_;
1532    
1533 root 1.49 my $item; $item = {
1534     type => "button",
1535     text => " $text",
1536     value => $value,
1537 root 1.58 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1538 root 1.76 activate => sub { $cb->($_[1]{value} = !$_[1]{value}); },
1539 root 1.49 };
1540    
1541     $self->add_item ($item);
1542 root 1.45 }
1543    
1544 root 1.76 =item $popup->show
1545    
1546     Displays the popup (which is initially hidden).
1547    
1548     =cut
1549    
1550 root 1.45 sub show {
1551     my ($self) = @_;
1552    
1553     local $urxvt::popup::self = $self;
1554    
1555 root 1.77 my $env = $self->{term}->env;
1556     # we can't hope to reproduce the locale algorithm, so nuke LC_ALL and set LC_CTYPE.
1557     delete $env->{LC_ALL};
1558     $env->{LC_CTYPE} = $self->{term}->locale;
1559    
1560     urxvt::term->new ($env, $self->{term}->resource ("name"),
1561     "--perl-lib" => "", "--perl-ext-common" => "", "-pty-fd" => -1, "-sl" => 0, "-b" => 0,
1562     "--transient-for" => $self->{term}->parent,
1563     "-display" => $self->{term}->display_id,
1564     "-pe" => "urxvt-popup")
1565 root 1.45 or die "unable to create popup window\n";
1566     }
1567    
1568     sub DESTROY {
1569     my ($self) = @_;
1570    
1571 root 1.58 delete $self->{term}{_destroy}{$self};
1572 root 1.45 $self->{term}->ungrab;
1573     }
1574    
1575 root 1.78 =back
1576    
1577 root 1.1 =head2 The C<urxvt::timer> Class
1578    
1579     This class implements timer watchers/events. Time is represented as a
1580     fractional number of seconds since the epoch. Example:
1581    
1582 root 1.20 $term->{overlay} = $term->overlay (-1, 0, 8, 1, urxvt::OVERLAY_RSTYLE, 0);
1583 root 1.1 $term->{timer} = urxvt::timer
1584     ->new
1585 root 1.20 ->interval (1)
1586 root 1.1 ->cb (sub {
1587 root 1.20 $term->{overlay}->set (0, 0,
1588     sprintf "%2d:%02d:%02d", (localtime urxvt::NOW)[2,1,0]);
1589     });
1590 root 1.1
1591     =over 4
1592    
1593     =item $timer = new urxvt::timer
1594    
1595 root 1.20 Create a new timer object in started state. It is scheduled to fire
1596     immediately.
1597 root 1.1
1598     =item $timer = $timer->cb (sub { my ($timer) = @_; ... })
1599    
1600     Set the callback to be called when the timer triggers.
1601    
1602     =item $tstamp = $timer->at
1603    
1604     Return the time this watcher will fire next.
1605    
1606     =item $timer = $timer->set ($tstamp)
1607    
1608     Set the time the event is generated to $tstamp.
1609    
1610 root 1.20 =item $timer = $timer->interval ($interval)
1611    
1612     Normally (and when C<$interval> is C<0>), the timer will automatically
1613     stop after it has fired once. If C<$interval> is non-zero, then the timer
1614     is automatically rescheduled at the given intervals.
1615    
1616 root 1.1 =item $timer = $timer->start
1617    
1618     Start the timer.
1619    
1620     =item $timer = $timer->start ($tstamp)
1621    
1622     Set the event trigger time to C<$tstamp> and start the timer.
1623    
1624     =item $timer = $timer->stop
1625    
1626     Stop the timer.
1627    
1628     =back
1629    
1630     =head2 The C<urxvt::iow> Class
1631    
1632     This class implements io watchers/events. Example:
1633    
1634     $term->{socket} = ...
1635     $term->{iow} = urxvt::iow
1636     ->new
1637     ->fd (fileno $term->{socket})
1638 root 1.69 ->events (urxvt::EVENT_READ)
1639 root 1.1 ->start
1640     ->cb (sub {
1641     my ($iow, $revents) = @_;
1642     # $revents must be 1 here, no need to check
1643     sysread $term->{socket}, my $buf, 8192
1644     or end-of-file;
1645     });
1646    
1647    
1648     =over 4
1649    
1650     =item $iow = new urxvt::iow
1651    
1652     Create a new io watcher object in stopped state.
1653    
1654     =item $iow = $iow->cb (sub { my ($iow, $reventmask) = @_; ... })
1655    
1656     Set the callback to be called when io events are triggered. C<$reventmask>
1657     is a bitset as described in the C<events> method.
1658    
1659     =item $iow = $iow->fd ($fd)
1660    
1661     Set the filedescriptor (not handle) to watch.
1662    
1663     =item $iow = $iow->events ($eventmask)
1664    
1665 root 1.69 Set the event mask to watch. The only allowed values are
1666     C<urxvt::EVENT_READ> and C<urxvt::EVENT_WRITE>, which might be ORed
1667     together, or C<urxvt::EVENT_NONE>.
1668 root 1.1
1669     =item $iow = $iow->start
1670    
1671     Start watching for requested events on the given handle.
1672    
1673     =item $iow = $iow->stop
1674    
1675     Stop watching for events on the given filehandle.
1676    
1677     =back
1678    
1679 root 1.4 =head1 ENVIRONMENT
1680    
1681     =head2 URXVT_PERL_VERBOSITY
1682    
1683     This variable controls the verbosity level of the perl extension. Higher
1684     numbers indicate more verbose output.
1685    
1686     =over 4
1687    
1688 root 1.58 =item == 0 - fatal messages
1689 root 1.4
1690 root 1.58 =item >= 3 - script loading and management
1691 root 1.4
1692 root 1.85 =item >=10 - all called hooks
1693    
1694     =item >=11 - hook reutrn values
1695 root 1.4
1696     =back
1697    
1698 root 1.1 =head1 AUTHOR
1699    
1700     Marc Lehmann <pcg@goof.com>
1701     http://software.schmorp.de/pkg/rxvt-unicode
1702    
1703     =cut
1704    
1705     1