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