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