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