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