ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.242
Committed: Sat Oct 11 20:46:36 2014 UTC (9 years, 7 months ago) by sf-exg
Branch: MAIN
Changes since 1.241: +6 -4 lines
Log Message:
Doc fix.

File Contents

# Content
1 =encoding utf8
2
3 =head1 NAME
4
5 urxvtperl - rxvt-unicode's embedded perl interpreter
6
7 =head1 SYNOPSIS
8
9 # create a file grab_test in $HOME:
10
11 sub on_sel_grab {
12 warn "you selected ", $_[0]->selection;
13 ()
14 }
15
16 # start a urxvt using it:
17
18 urxvt --perl-lib $HOME -pe grab_test
19
20 =head1 DESCRIPTION
21
22 Every time a terminal object gets created, extension scripts specified via
23 the C<perl> resource are loaded and associated with it.
24
25 Scripts are compiled in a 'use strict "vars"' and 'use utf8' environment, and
26 thus must be encoded as UTF-8.
27
28 Each script will only ever be loaded once, even in urxvtd, where
29 scripts will be shared (but not enabled) for all terminals.
30
31 You can disable the embedded perl interpreter by setting both "perl-ext"
32 and "perl-ext-common" resources to the empty string.
33
34 =head1 PREPACKAGED EXTENSIONS
35
36 A number of extensions are delivered with this release. You can find them
37 in F<< <libdir>/urxvt/perl/ >>, and the documentation can be viewed using
38 F<< man urxvt-<EXTENSIONNAME> >>.
39
40 You can activate them like this:
41
42 urxvt -pe <extensionname>
43
44 Or by adding them to the resource for extensions loaded by default:
45
46 URxvt.perl-ext-common: default,selection-autotransform
47
48 Extensions may add resources on their own. Similarly to builtin
49 resources, these resources can also be specified on the command line
50 as long options (with '.' replaced by '-'), in which case the
51 corresponding extension is loaded automatically.
52
53 =head1 API DOCUMENTATION
54
55 =head2 General API Considerations
56
57 All objects (such as terminals, time watchers etc.) are typical
58 reference-to-hash objects. The hash can be used to store anything you
59 like. All members starting with an underscore (such as C<_ptr> or
60 C<_hook>) are reserved for internal uses and B<MUST NOT> be accessed or
61 modified).
62
63 When objects are destroyed on the C++ side, the perl object hashes are
64 emptied, so its best to store related objects such as time watchers and
65 the like inside the terminal object so they get destroyed as soon as the
66 terminal is destroyed.
67
68 Argument names also often indicate the type of a parameter. Here are some
69 hints on what they mean:
70
71 =over 4
72
73 =item $text
74
75 Rxvt-unicode's special way of encoding text, where one "unicode" character
76 always represents one screen cell. See L<ROW_t> for a discussion of this format.
77
78 =item $string
79
80 A perl text string, with an emphasis on I<text>. It can store all unicode
81 characters and is to be distinguished with text encoded in a specific
82 encoding (often locale-specific) and binary data.
83
84 =item $octets
85
86 Either binary data or - more common - a text string encoded in a
87 locale-specific way.
88
89 =item $keysym
90
91 an integer that is a valid X11 keysym code. You can convert a string
92 into a keysym and viceversa by using C<XStringToKeysym> and
93 C<XKeysymToString>.
94
95 =back
96
97 =head2 Extension Objects
98
99 Every perl extension is a perl class. A separate perl object is created
100 for each terminal, and each terminal has its own set of extension objects,
101 which are passed as the first parameter to hooks. So extensions can use
102 their C<$self> object without having to think about clashes with other
103 extensions or other terminals, with the exception of methods and members
104 that begin with an underscore character C<_>: these are reserved for
105 internal use.
106
107 Although it isn't a C<urxvt::term> object, you can call all methods of the
108 C<urxvt::term> class on this object.
109
110 Additional methods only supported for extension objects are described in
111 the C<urxvt::extension> section below.
112
113 =head2 Hooks
114
115 The following subroutines can be declared in extension files, and will be
116 called whenever the relevant event happens.
117
118 The first argument passed to them is an extension object as described in
119 the in the C<Extension Objects> section.
120
121 B<All> of these hooks must return a boolean value. If any of the called
122 hooks returns true, then the event counts as being I<consumed>, and the
123 relevant action might not be carried out by the C++ code.
124
125 I<< When in doubt, return a false value (preferably C<()>). >>
126
127 =over 4
128
129 =item on_init $term
130
131 Called after a new terminal object has been initialized, but before
132 windows are created or the command gets run. Most methods are unsafe to
133 call or deliver senseless data, as terminal size and other characteristics
134 have not yet been determined. You can safely query and change resources
135 and options, though. For many purposes the C<on_start> hook is a better
136 place.
137
138 =item on_start $term
139
140 Called at the very end of initialisation of a new terminal, just before
141 trying to map (display) the toplevel and returning to the main loop.
142
143 =item on_destroy $term
144
145 Called whenever something tries to destroy terminal, when the terminal is
146 still fully functional (not for long, though).
147
148 =item on_reset $term
149
150 Called after the screen is "reset" for any reason, such as resizing or
151 control sequences. Here is where you can react on changes to size-related
152 variables.
153
154 =item on_child_start $term, $pid
155
156 Called just after the child process has been C<fork>ed.
157
158 =item on_child_exit $term, $status
159
160 Called just after the child process has exited. C<$status> is the status
161 from C<waitpid>.
162
163 =item on_sel_make $term, $eventtime
164
165 Called whenever a selection has been made by the user, but before the
166 selection text is copied, so changes to the beginning, end or type of the
167 selection will be honored.
168
169 Returning a true value aborts selection making by urxvt, in which case you
170 have to make a selection yourself by calling C<< $term->selection_grab >>.
171
172 =item on_sel_grab $term, $eventtime
173
174 Called whenever a selection has been copied, but before the selection is
175 requested from the server. The selection text can be queried and changed
176 by calling C<< $term->selection >>.
177
178 Returning a true value aborts selection grabbing. It will still be highlighted.
179
180 =item on_sel_extend $term
181
182 Called whenever the user tries to extend the selection (e.g. with a double
183 click) and is either supposed to return false (normal operation), or
184 should extend the selection itself and return true to suppress the built-in
185 processing. This can happen multiple times, as long as the callback
186 returns true, it will be called on every further click by the user and is
187 supposed to enlarge the selection more and more, if possible.
188
189 See the F<selection> example extension.
190
191 =item on_view_change $term, $offset
192
193 Called whenever the view offset changes, i.e. the user or program
194 scrolls. Offset C<0> means display the normal terminal, positive values
195 show this many lines of scrollback.
196
197 =item on_scroll_back $term, $lines, $saved
198
199 Called whenever lines scroll out of the terminal area into the scrollback
200 buffer. C<$lines> is the number of lines scrolled out and may be larger
201 than the scroll back buffer or the terminal.
202
203 It is called before lines are scrolled out (so rows 0 .. min ($lines - 1,
204 $nrow - 1) represent the lines to be scrolled out). C<$saved> is the total
205 number of lines that will be in the scrollback buffer.
206
207 =item on_osc_seq $term, $op, $args, $resp
208
209 Called on every OSC sequence and can be used to suppress it or modify its
210 behaviour. The default should be to return an empty list. A true value
211 suppresses execution of the request completely. Make sure you don't get
212 confused by recursive invocations when you output an OSC sequence within
213 this callback.
214
215 C<on_osc_seq_perl> should be used for new behaviour.
216
217 =item on_osc_seq_perl $term, $args, $resp
218
219 Called whenever the B<ESC ] 777 ; string ST> command sequence (OSC =
220 operating system command) is processed. Cursor position and other state
221 information is up-to-date when this happens. For interoperability, the
222 string should start with the extension name (sans -osc) and a semicolon,
223 to distinguish it from commands for other extensions, and this might be
224 enforced in the future.
225
226 For example, C<overlay-osc> uses this:
227
228 sub on_osc_seq_perl {
229 my ($self, $osc, $resp) = @_;
230
231 return unless $osc =~ s/^overlay;//;
232
233 ... process remaining $osc string
234 }
235
236 Be careful not ever to trust (in a security sense) the data you receive,
237 as its source can not easily be controlled (e-mail content, messages from
238 other users on the same system etc.).
239
240 For responses, C<$resp> contains the end-of-args separator used by the
241 sender.
242
243 =item on_add_lines $term, $string
244
245 Called whenever text is about to be output, with the text as argument. You
246 can filter/change and output the text yourself by returning a true value
247 and calling C<< $term->scr_add_lines >> yourself. Please note that this
248 might be very slow, however, as your hook is called for B<all> text being
249 output.
250
251 =item on_tt_write $term, $octets
252
253 Called whenever some data is written to the tty/pty and can be used to
254 suppress or filter tty input.
255
256 =item on_tt_paste $term, $octets
257
258 Called whenever text is about to be pasted, with the text as argument. You
259 can filter/change and paste the text yourself by returning a true value
260 and calling C<< $term->tt_paste >> yourself. C<$octets> is
261 locale-encoded.
262
263 =item on_line_update $term, $row
264
265 Called whenever a line was updated or changed. Can be used to filter
266 screen output (e.g. underline urls or other useless stuff). Only lines
267 that are being shown will be filtered, and, due to performance reasons,
268 not always immediately.
269
270 The row number is always the topmost row of the line if the line spans
271 multiple rows.
272
273 Please note that, if you change the line, then the hook might get called
274 later with the already-modified line (e.g. if unrelated parts change), so
275 you cannot just toggle rendition bits, but only set them.
276
277 =item on_refresh_begin $term
278
279 Called just before the screen gets redrawn. Can be used for overlay or
280 similar effects by modifying the terminal contents in refresh_begin, and
281 restoring them in refresh_end. The built-in overlay and selection display
282 code is run after this hook, and takes precedence.
283
284 =item on_refresh_end $term
285
286 Called just after the screen gets redrawn. See C<on_refresh_begin>.
287
288 =item on_user_command $term, $string *DEPRECATED*
289
290 Called whenever a user-configured event is being activated (e.g. via
291 a C<perl:string> action bound to a key, see description of the B<keysym>
292 resource in the urxvt(1) manpage).
293
294 The event is simply the action string. This interface is going away in
295 preference to the C<on_action> hook.
296
297 =item on_resize_all_windows $term, $new_width, $new_height
298
299 Called just after the new window size has been calculated, but before
300 windows are actually being resized or hints are being set. If this hook
301 returns a true value, setting of the window hints is being skipped.
302
303 =item on_x_event $term, $event
304
305 Called on every X event received on the vt window (and possibly other
306 windows). Should only be used as a last resort. Most event structure
307 members are not passed.
308
309 =item on_root_event $term, $event
310
311 Like C<on_x_event>, but is called for events on the root window.
312
313 =item on_focus_in $term
314
315 Called whenever the window gets the keyboard focus, before rxvt-unicode
316 does focus in processing.
317
318 =item on_focus_out $term
319
320 Called whenever the window loses keyboard focus, before rxvt-unicode does
321 focus out processing.
322
323 =item on_configure_notify $term, $event
324
325 =item on_property_notify $term, $event
326
327 =item on_key_press $term, $event, $keysym, $octets
328
329 =item on_key_release $term, $event, $keysym
330
331 =item on_button_press $term, $event
332
333 =item on_button_release $term, $event
334
335 =item on_motion_notify $term, $event
336
337 =item on_map_notify $term, $event
338
339 =item on_unmap_notify $term, $event
340
341 Called whenever the corresponding X event is received for the terminal. If
342 the hook returns true, then the event will be ignored by rxvt-unicode.
343
344 The event is a hash with most values as named by Xlib (see the XEvent
345 manpage), with the additional members C<row> and C<col>, which are the
346 (real, not screen-based) row and column under the mouse cursor.
347
348 C<on_key_press> additionally receives the string rxvt-unicode would
349 output, if any, in locale-specific encoding.
350
351 =item on_client_message $term, $event
352
353 =item on_wm_protocols $term, $event
354
355 =item on_wm_delete_window $term, $event
356
357 Called when various types of ClientMessage events are received (all with
358 format=32, WM_PROTOCOLS or WM_PROTOCOLS:WM_DELETE_WINDOW).
359
360 =item on_bell $term
361
362 Called on receipt of a bell character.
363
364 =back
365
366 =cut
367
368 package urxvt;
369
370 use utf8;
371 use strict 'vars';
372 use Carp ();
373 use Scalar::Util ();
374 use List::Util ();
375
376 our $VERSION = 1;
377 our $TERM;
378 our @TERM_INIT; # should go, prevents async I/O etc.
379 our @TERM_EXT; # should go, prevents async I/O etc.
380 our @HOOKNAME;
381 our %HOOKTYPE = map +($HOOKNAME[$_] => $_), 0..$#HOOKNAME;
382 our %OPTION;
383
384 our $LIBDIR;
385 our $RESNAME;
386 our $RESCLASS;
387 our $RXVTNAME;
388
389 our $NOCHAR = chr 0xffff;
390
391 =head2 Variables in the C<urxvt> Package
392
393 =over 4
394
395 =item $urxvt::LIBDIR
396
397 The rxvt-unicode library directory, where, among other things, the perl
398 modules and scripts are stored.
399
400 =item $urxvt::RESCLASS, $urxvt::RESCLASS
401
402 The resource class and name rxvt-unicode uses to look up X resources.
403
404 =item $urxvt::RXVTNAME
405
406 The basename of the installed binaries, usually C<urxvt>.
407
408 =item $urxvt::TERM
409
410 The current terminal. This variable stores the current C<urxvt::term>
411 object, whenever a callback/hook is executing.
412
413 =item @urxvt::TERM_INIT
414
415 All code references in this array will be called as methods of the next newly
416 created C<urxvt::term> object (during the C<on_init> phase). The array
417 gets cleared before the code references that were in it are being executed,
418 so references can push themselves onto it again if they so desire.
419
420 This complements to the perl-eval command line option, but gets executed
421 first.
422
423 =item @urxvt::TERM_EXT
424
425 Works similar to C<@TERM_INIT>, but contains perl package/class names, which
426 get registered as normal extensions after calling the hooks in C<@TERM_INIT>
427 but before other extensions. Gets cleared just like C<@TERM_INIT>.
428
429 =back
430
431 =head2 Functions in the C<urxvt> Package
432
433 =over 4
434
435 =item urxvt::fatal $errormessage
436
437 Fatally aborts execution with the given error message (which should
438 include a trailing newline). Avoid at all costs! The only time this
439 is acceptable (and useful) is in the init hook, where it prevents the
440 terminal from starting up.
441
442 =item urxvt::warn $string
443
444 Calls C<rxvt_warn> with the given string which should include a trailing
445 newline. The module also overwrites the C<warn> builtin with a function
446 that calls this function.
447
448 Using this function has the advantage that its output ends up in the
449 correct place, e.g. on stderr of the connecting urxvtc client.
450
451 Messages have a size limit of 1023 bytes currently.
452
453 =item @terms = urxvt::termlist
454
455 Returns all urxvt::term objects that exist in this process, regardless of
456 whether they are started, being destroyed etc., so be careful. Only term
457 objects that have perl extensions attached will be returned (because there
458 is no urxvt::term object associated with others).
459
460 =item $time = urxvt::NOW
461
462 Returns the "current time" (as per the event loop).
463
464 =item urxvt::CurrentTime
465
466 =item urxvt::ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask,
467 Mod3Mask, Mod4Mask, Mod5Mask, Button1Mask, Button2Mask, Button3Mask,
468 Button4Mask, Button5Mask, AnyModifier
469
470 =item urxvt::NoEventMask, KeyPressMask, KeyReleaseMask,
471 ButtonPressMask, ButtonReleaseMask, EnterWindowMask, LeaveWindowMask,
472 PointerMotionMask, PointerMotionHintMask, Button1MotionMask, Button2MotionMask,
473 Button3MotionMask, Button4MotionMask, Button5MotionMask, ButtonMotionMask,
474 KeymapStateMask, ExposureMask, VisibilityChangeMask, StructureNotifyMask,
475 ResizeRedirectMask, SubstructureNotifyMask, SubstructureRedirectMask,
476 FocusChangeMask, PropertyChangeMask, ColormapChangeMask, OwnerGrabButtonMask
477
478 =item urxvt::KeyPress, KeyRelease, ButtonPress, ButtonRelease, MotionNotify,
479 EnterNotify, LeaveNotify, FocusIn, FocusOut, KeymapNotify, Expose,
480 GraphicsExpose, NoExpose, VisibilityNotify, CreateNotify, DestroyNotify,
481 UnmapNotify, MapNotify, MapRequest, ReparentNotify, ConfigureNotify,
482 ConfigureRequest, GravityNotify, ResizeRequest, CirculateNotify,
483 CirculateRequest, PropertyNotify, SelectionClear, SelectionRequest,
484 SelectionNotify, ColormapNotify, ClientMessage, MappingNotify
485
486 Various constants for use in X calls and event processing.
487
488 =back
489
490 =head2 RENDITION
491
492 Rendition bitsets contain information about colour, font, font styles and
493 similar information for each screen cell.
494
495 The following "macros" deal with changes in rendition sets. You should
496 never just create a bitset, you should always modify an existing one,
497 as they contain important information required for correct operation of
498 rxvt-unicode.
499
500 =over 4
501
502 =item $rend = urxvt::DEFAULT_RSTYLE
503
504 Returns the default rendition, as used when the terminal is starting up or
505 being reset. Useful as a base to start when creating renditions.
506
507 =item $rend = urxvt::OVERLAY_RSTYLE
508
509 Return the rendition mask used for overlays by default.
510
511 =item $rendbit = urxvt::RS_Bold, urxvt::RS_Italic, urxvt::RS_Blink,
512 urxvt::RS_RVid, urxvt::RS_Uline
513
514 Return the bit that enabled bold, italic, blink, reverse-video and
515 underline, respectively. To enable such a style, just logically OR it into
516 the bitset.
517
518 =item $foreground = urxvt::GET_BASEFG $rend
519
520 =item $background = urxvt::GET_BASEBG $rend
521
522 Return the foreground/background colour index, respectively.
523
524 =item $rend = urxvt::SET_FGCOLOR $rend, $new_colour
525
526 =item $rend = urxvt::SET_BGCOLOR $rend, $new_colour
527
528 =item $rend = urxvt::SET_COLOR $rend, $new_fg, $new_bg
529
530 Replace the foreground/background colour in the rendition mask with the
531 specified one.
532
533 =item $value = urxvt::GET_CUSTOM $rend
534
535 Return the "custom" value: Every rendition has 5 bits for use by
536 extensions. They can be set and changed as you like and are initially
537 zero.
538
539 =item $rend = urxvt::SET_CUSTOM $rend, $new_value
540
541 Change the custom value.
542
543 =back
544
545 =cut
546
547 BEGIN {
548 # overwrite perl's warn
549 *CORE::GLOBAL::warn = sub {
550 my $msg = join "", @_;
551 $msg .= "\n"
552 unless $msg =~ /\n$/;
553 urxvt::warn ($msg);
554 };
555 }
556
557 no warnings 'utf8';
558
559 sub parse_resource {
560 my ($term, $name, $isarg, $longopt, $flag, $value) = @_;
561
562 $term->scan_extensions;
563
564 my $r = $term->{meta}{resource};
565 keys %$r; # reset iterator
566 while (my ($k, $v) = each %$r) {
567 my $pattern = $k;
568 $pattern =~ y/./-/ if $isarg;
569 my $prefix = $name;
570 my $suffix;
571 if ($pattern =~ /\-$/) {
572 $prefix = substr $name, 0, length $pattern;
573 $suffix = substr $name, length $pattern;
574 }
575 if ($pattern eq $prefix) {
576 $name = "$urxvt::RESCLASS.$k$suffix";
577
578 push @{ $term->{perl_ext_3} }, $v->[0];
579
580 if ($v->[1] eq "boolean") {
581 $term->put_option_db ($name, $flag ? "true" : "false");
582 return 1;
583 } else {
584 $term->put_option_db ($name, $value);
585 return 1 + 2;
586 }
587 }
588 }
589
590 0
591 }
592
593 sub usage {
594 my ($term, $usage_type) = @_;
595
596 $term->scan_extensions;
597
598 my $r = $term->{meta}{resource};
599
600 for my $pattern (sort keys %$r) {
601 my ($ext, $type, $desc) = @{ $r->{$pattern} };
602
603 $desc .= " (-pe $ext)";
604
605 if ($usage_type == 1) {
606 $pattern =~ y/./-/;
607 $pattern =~ s/-$/-.../g;
608
609 if ($type eq "boolean") {
610 urxvt::log sprintf " -%-30s %s\n", "/+$pattern", $desc;
611 } else {
612 urxvt::log sprintf " -%-30s %s\n", "$pattern $type", $desc;
613 }
614 } else {
615 $pattern =~ s/\.$/.*/g;
616 urxvt::log sprintf " %-31s %s\n", "$pattern:", $type;
617 }
618 }
619 }
620
621 my $verbosity = $ENV{URXVT_PERL_VERBOSITY};
622
623 sub verbose {
624 my ($level, $msg) = @_;
625 warn "$msg\n" if $level <= $verbosity;
626 }
627
628 my %extension_pkg;
629
630 # load a single script into its own package, once only
631 sub extension_package($) {
632 my ($path) = @_;
633
634 $extension_pkg{$path} ||= do {
635 $path =~ /([^\/\\]+)$/;
636 my $pkg = $1;
637 $pkg =~ s/[^[:word:]]/_/g;
638 $pkg = "urxvt::ext::$pkg";
639
640 verbose 3, "loading extension '$path' into package '$pkg'";
641
642 (${"$pkg\::_NAME"} = $path) =~ s/^.*[\\\/]//; # hackish
643
644 open my $fh, "<:raw", $path
645 or die "$path: $!";
646
647 my $source =
648 "package $pkg; use strict 'vars'; use utf8; no warnings 'utf8';\n"
649 . "#line 1 \"$path\"\n{\n"
650 . (do { local $/; <$fh> })
651 . "\n};\n1";
652
653 eval $source
654 or die "$path: $@";
655
656 $pkg
657 }
658 }
659
660 our $retval; # return value for urxvt
661
662 # called by the rxvt core
663 sub invoke {
664 local $TERM = shift;
665 my $htype = shift;
666
667 if ($htype == HOOK_INIT) {
668 my @dirs = $TERM->perl_libdirs;
669
670 $TERM->scan_extensions;
671
672 my %ext_arg;
673
674 {
675 my @init = @TERM_INIT;
676 @TERM_INIT = ();
677 $_->($TERM) for @init;
678 my @pkg = @TERM_EXT;
679 @TERM_EXT = ();
680 $TERM->register_package ($_) for @pkg;
681 }
682
683 for (
684 grep $_, map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2
685 ) {
686 if ($_ eq "default") {
687
688 $ext_arg{$_} = []
689 for
690 qw(selection option-popup selection-popup readline),
691 @{ delete $TERM->{perl_ext_3} },
692 map $_->[0], values %{ $TERM->{meta}{binding} };
693
694 for ($TERM->_keysym_resources) {
695 next if /^(?:string|command|builtin|builtin-string|perl)/;
696 next unless /^([A-Za-z0-9_\-]+):/;
697
698 my $ext = $1;
699
700 $ext_arg{$ext} = [];
701 }
702
703 } elsif (/^-(.*)$/) {
704 delete $ext_arg{$1};
705
706 } elsif (/^([^<]+)<(.*)>$/) {
707 push @{ $ext_arg{$1} }, $2;
708
709 } else {
710 $ext_arg{$_} ||= [];
711 }
712 }
713
714 # now register default key bindings
715 for my $ext (sort keys %ext_arg) {
716 while (my ($k, $v) = each %{ $TERM->{meta}{ext}{$ext}{binding} }) {
717 $TERM->bind_action ($k, "$v->[0]:$v->[1]");
718 }
719 }
720
721 for my $ext (sort keys %ext_arg) {
722 my @files = grep -f $_, map "$_/$ext", @dirs;
723
724 if (@files) {
725 $TERM->register_package (extension_package $files[0], $ext_arg{$ext});
726 } else {
727 warn "perl extension '$ext' not found in perl library search path\n";
728 }
729 }
730
731 eval "#line 1 \"--perl-eval resource/argument\"\n" . $TERM->resource ("perl_eval");
732 warn $@ if $@;
733 }
734
735 $retval = undef;
736
737 if (my $cb = $TERM->{_hook}[$htype]) {
738 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $TERM, @_) . ")"
739 if $verbosity >= 10;
740
741 if ($htype == HOOK_ACTION) {
742 # this hook is only sent to the extension with the name
743 # matching the first arg
744 my $pkg = shift;
745 $pkg =~ y/-/_/;
746 $pkg = "urxvt::ext::$pkg";
747
748 $cb = $cb->{$pkg}
749 or return undef; #TODO: maybe warn user?
750
751 $cb = { $pkg => $cb };
752 }
753
754 for my $pkg (keys %$cb) {
755 my $retval_ = eval { $cb->{$pkg}->($TERM->{_pkg}{$pkg} || $TERM, @_) };
756 $retval ||= $retval_;
757
758 if ($@) {
759 $TERM->ungrab; # better to lose the grab than the session
760 warn $@;
761 }
762 }
763
764 verbose 11, "$HOOKNAME[$htype] returning <$retval>"
765 if $verbosity >= 11;
766 }
767
768 if ($htype == HOOK_DESTROY) {
769 # clear package objects
770 %$_ = () for values %{ $TERM->{_pkg} };
771
772 # clear package
773 %$TERM = ();
774 }
775
776 $retval
777 }
778
779 sub SET_COLOR($$$) {
780 SET_BGCOLOR (SET_FGCOLOR ($_[0], $_[1]), $_[2])
781 }
782
783 sub rend2mask {
784 no strict 'refs';
785 my ($str, $mask) = (@_, 0);
786 my %color = ( fg => undef, bg => undef );
787 my @failed;
788 for my $spec ( split /\s+/, $str ) {
789 if ( $spec =~ /^([fb]g)[_:-]?(\d+)/i ) {
790 $color{lc($1)} = $2;
791 } else {
792 my $neg = $spec =~ s/^[-^]//;
793 unless ( exists &{"RS_$spec"} ) {
794 push @failed, $spec;
795 next;
796 }
797 my $cur = &{"RS_$spec"};
798 if ( $neg ) {
799 $mask &= ~$cur;
800 } else {
801 $mask |= $cur;
802 }
803 }
804 }
805 ($mask, @color{qw(fg bg)}, \@failed)
806 }
807
808 package urxvt::term::extension;
809
810 =head2 The C<urxvt::term::extension> class
811
812 Each extension attached to a terminal object is represented by
813 a C<urxvt::term::extension> object.
814
815 You can use these objects, which are passed to all callbacks to store any
816 state related to the terminal and extension instance.
817
818 The methods (And data members) documented below can be called on extension
819 objects, in addition to call methods documented for the <urxvt::term>
820 class.
821
822 =over 4
823
824 =item $urxvt_term = $self->{term}
825
826 Returns the C<urxvt::term> object associated with this instance of the
827 extension. This member I<must not> be changed in any way.
828
829 =cut
830
831 our $AUTOLOAD;
832
833 sub AUTOLOAD {
834 $AUTOLOAD =~ /:([^:]+)$/
835 or die "FATAL: \$AUTOLOAD '$AUTOLOAD' unparsable";
836
837 eval qq{
838 sub $AUTOLOAD {
839 my \$proxy = shift;
840 \$proxy->{term}->$1 (\@_)
841 }
842 1
843 } or die "FATAL: unable to compile method forwarder: $@";
844
845 goto &$AUTOLOAD;
846 }
847
848 sub DESTROY {
849 # nop
850 }
851
852 # urxvt::destroy_hook (basically a cheap Guard:: implementation)
853
854 sub urxvt::destroy_hook::DESTROY {
855 ${$_[0]}->();
856 }
857
858 sub urxvt::destroy_hook(&) {
859 bless \shift, urxvt::destroy_hook::
860 }
861
862 =item $self->enable ($hook_name => $cb[, $hook_name => $cb..])
863
864 Dynamically enable the given hooks (named without the C<on_> prefix) for
865 this extension, replacing any hook previously installed via C<enable> in
866 this extension.
867
868 This is useful when you want to overwrite time-critical hooks only
869 temporarily.
870
871 To install additional callbacks for the same hook, you can use the C<on>
872 method of the C<urxvt::term> class.
873
874 =item $self->disable ($hook_name[, $hook_name..])
875
876 Dynamically disable the given hooks.
877
878 =cut
879
880 sub enable {
881 my ($self, %hook) = @_;
882 my $pkg = $self->{_pkg};
883
884 while (my ($name, $cb) = each %hook) {
885 my $htype = $HOOKTYPE{uc $name};
886 defined $htype
887 or Carp::croak "unsupported hook type '$name'";
888
889 $self->set_should_invoke ($htype, +1)
890 unless exists $self->{term}{_hook}[$htype]{$pkg};
891
892 $self->{term}{_hook}[$htype]{$pkg} = $cb;
893 }
894 }
895
896 sub disable {
897 my ($self, @hook) = @_;
898 my $pkg = $self->{_pkg};
899
900 for my $name (@hook) {
901 my $htype = $HOOKTYPE{uc $name};
902 defined $htype
903 or Carp::croak "unsupported hook type '$name'";
904
905 $self->set_should_invoke ($htype, -1)
906 if delete $self->{term}{_hook}[$htype]{$pkg};
907 }
908 }
909
910 =item $guard = $self->on ($hook_name => $cb[, $hook_name => $cb..])
911
912 Similar to the C<enable> enable, but installs additional callbacks for
913 the given hook(s) (that is, it doesn't replace existing callbacks), and
914 returns a guard object. When the guard object is destroyed the callbacks
915 are disabled again.
916
917 =cut
918
919 sub urxvt::extension::on_disable::DESTROY {
920 my $disable = shift;
921
922 my $term = delete $disable->{""};
923
924 while (my ($htype, $id) = each %$disable) {
925 delete $term->{_hook}[$htype]{$id};
926 $term->set_should_invoke ($htype, -1);
927 }
928 }
929
930 sub on {
931 my ($self, %hook) = @_;
932
933 my $term = $self->{term};
934
935 my %disable = ( "" => $term );
936
937 while (my ($name, $cb) = each %hook) {
938 my $htype = $HOOKTYPE{uc $name};
939 defined $htype
940 or Carp::croak "unsupported hook type '$name'";
941
942 $term->set_should_invoke ($htype, +1);
943 $term->{_hook}[$htype]{ $disable{$htype} = $cb+0 }
944 = sub { shift; $cb->($self, @_) }; # very ugly indeed
945 }
946
947 bless \%disable, "urxvt::extension::on_disable"
948 }
949
950 =item $self->x_resource ($pattern)
951
952 =item $self->x_resource_boolean ($pattern)
953
954 These methods support an additional C<%> prefix when called on an
955 extension object - see the description of these methods in the
956 C<urxvt::term> class for details.
957
958 =cut
959
960 sub x_resource {
961 my ($self, $name) = @_;
962 $name =~ s/^%(\.|$)/$_[0]{_name}$1/;
963 $self->{term}->x_resource ($name)
964 }
965
966 sub x_resource_boolean {
967 my ($self, $name) = @_;
968 $name =~ s/^%(\.|$)/$_[0]{_name}$1/;
969 $self->{term}->x_resource_boolean ($name)
970 }
971
972 =back
973
974 =cut
975
976 package urxvt::anyevent;
977
978 =head2 The C<urxvt::anyevent> Class
979
980 The sole purpose of this class is to deliver an interface to the
981 C<AnyEvent> module - any module using it will work inside urxvt without
982 further programming. The only exception is that you cannot wait on
983 condition variables, but non-blocking condvar use is ok.
984
985 In practical terms this means is that you cannot use blocking APIs, but
986 the non-blocking variant should work.
987
988 =cut
989
990 our $VERSION = '5.23';
991
992 $INC{"urxvt/anyevent.pm"} = 1; # mark us as there
993 push @AnyEvent::REGISTRY, [urxvt => urxvt::anyevent::];
994
995 sub timer {
996 my ($class, %arg) = @_;
997
998 my $cb = $arg{cb};
999
1000 urxvt::timer
1001 ->new
1002 ->after ($arg{after}, $arg{interval})
1003 ->cb ($arg{interval} ? $cb : sub {
1004 $_[0]->stop; # need to cancel manually
1005 $cb->();
1006 })
1007 }
1008
1009 sub io {
1010 my ($class, %arg) = @_;
1011
1012 my $cb = $arg{cb};
1013 my $fd = fileno $arg{fh};
1014 defined $fd or $fd = $arg{fh};
1015
1016 bless [$arg{fh}, urxvt::iow
1017 ->new
1018 ->fd ($fd)
1019 ->events (($arg{poll} =~ /r/ ? 1 : 0)
1020 | ($arg{poll} =~ /w/ ? 2 : 0))
1021 ->start
1022 ->cb ($cb)
1023 ], urxvt::anyevent::
1024 }
1025
1026 sub idle {
1027 my ($class, %arg) = @_;
1028
1029 my $cb = $arg{cb};
1030
1031 urxvt::iw
1032 ->new
1033 ->start
1034 ->cb ($cb)
1035 }
1036
1037 sub child {
1038 my ($class, %arg) = @_;
1039
1040 my $cb = $arg{cb};
1041
1042 urxvt::pw
1043 ->new
1044 ->start ($arg{pid})
1045 ->cb (sub {
1046 $_[0]->stop; # need to cancel manually
1047 $cb->($_[0]->rpid, $_[0]->rstatus);
1048 })
1049 }
1050
1051 sub DESTROY {
1052 $_[0][1]->stop;
1053 }
1054
1055 # only needed for AnyEvent < 6 compatibility
1056 sub one_event {
1057 Carp::croak "AnyEvent->one_event blocking wait unsupported in urxvt, use a non-blocking API";
1058 }
1059
1060 package urxvt::term;
1061
1062 =head2 The C<urxvt::term> Class
1063
1064 =over 4
1065
1066 =cut
1067
1068 # find on_xxx subs in the package and register them
1069 # as hooks
1070 sub register_package {
1071 my ($self, $pkg, $argv) = @_;
1072
1073 no strict 'refs';
1074
1075 urxvt::verbose 6, "register package $pkg to $self";
1076
1077 @{"$pkg\::ISA"} = urxvt::term::extension::;
1078
1079 my $proxy = bless {
1080 _pkg => $pkg,
1081 _name => ${"$pkg\::_NAME"}, # hackish
1082 argv => $argv,
1083 }, $pkg;
1084 Scalar::Util::weaken ($proxy->{term} = $self);
1085
1086 $self->{_pkg}{$pkg} = $proxy;
1087
1088 for my $name (@HOOKNAME) {
1089 if (my $ref = $pkg->can ("on_" . lc $name)) {
1090 $proxy->enable ($name => $ref);
1091 }
1092 }
1093 }
1094
1095 sub perl_libdirs {
1096 map { split /:/ }
1097 $_[0]->resource ("perl_lib"),
1098 $ENV{URXVT_PERL_LIB},
1099 "$ENV{HOME}/.urxvt/ext",
1100 "$LIBDIR/perl"
1101 }
1102
1103 # scan for available extensions and collect their metadata
1104 sub scan_extensions {
1105 my ($self) = @_;
1106
1107 return if exists $self->{meta};
1108
1109 my @libdirs = perl_libdirs $self;
1110
1111 # return if $self->{meta_libdirs} eq join "\x00", @libdirs;#d#
1112
1113 # $self->{meta_libdirs} = join "\x00", @libdirs;#d#
1114 $self->{meta} = \my %meta;
1115
1116 # first gather extensions
1117 for my $dir (reverse @libdirs) {
1118 opendir my $fh, $dir
1119 or next;
1120 for my $ext (readdir $fh) {
1121 $ext !~ /^\./
1122 and open my $fh, "<", "$dir/$ext"
1123 or next;
1124
1125 my %ext = (dir => $dir);
1126
1127 while (<$fh>) {
1128 if (/^#:META:(?:X_)?RESOURCE:(.*)/) {
1129 my ($pattern, $type, $desc) = split /:/, $1;
1130 $pattern =~ s/^%(\.|$)/$ext$1/g; # % in pattern == extension name
1131 if ($pattern =~ /[^a-zA-Z0-9\-\.]/) {
1132 warn "$dir/$ext: meta resource '$pattern' contains illegal characters (not alphanumeric nor . nor *)\n";
1133 } else {
1134 $ext{resource}{$pattern} = [$ext, $type, $desc];
1135 }
1136 } elsif (/^#:META:BINDING:(.*)/) {
1137 my ($keysym, $action) = split /:/, $1;
1138 $ext{binding}{$keysym} = [$ext, $action];
1139 } elsif (/^\s*(?:#|$)/) {
1140 # skip other comments and empty lines
1141 } else {
1142 last; # stop parsing on first non-empty non-comment line
1143 }
1144 }
1145
1146 $meta{ext}{$ext} = \%ext;
1147 }
1148 }
1149
1150 # and now merge resources and bindings
1151 while (my ($k, $v) = each %{ $meta{ext} }) {
1152 #TODO: should check for extensions overriding each other
1153 %{ $meta{resource} } = (%{ $meta{resource} }, %{ $v->{resource} });
1154 %{ $meta{binding} } = (%{ $meta{binding} }, %{ $v->{binding} });
1155 }
1156 }
1157
1158 =item $term = new urxvt::term $envhashref, $rxvtname, [arg...]
1159
1160 Creates a new terminal, very similar as if you had started it with system
1161 C<$rxvtname, arg...>. C<$envhashref> must be a reference to a C<%ENV>-like
1162 hash which defines the environment of the new terminal.
1163
1164 Croaks (and probably outputs an error message) if the new instance
1165 couldn't be created. Returns C<undef> if the new instance didn't
1166 initialise perl, and the terminal object otherwise. The C<init> and
1167 C<start> hooks will be called before this call returns, and are free to
1168 refer to global data (which is race free).
1169
1170 =cut
1171
1172 sub new {
1173 my ($class, $env, @args) = @_;
1174
1175 $env or Carp::croak "environment hash missing in call to urxvt::term->new";
1176 @args or Carp::croak "name argument missing in call to urxvt::term->new";
1177
1178 _new ([ map "$_=$env->{$_}", keys %$env ], \@args);
1179 }
1180
1181 =item $term->destroy
1182
1183 Destroy the terminal object (close the window, free resources
1184 etc.). Please note that urxvt will not exit as long as any event
1185 watchers (timers, io watchers) are still active.
1186
1187 =item $term->exec_async ($cmd[, @args])
1188
1189 Works like the combination of the C<fork>/C<exec> builtins, which executes
1190 ("starts") programs in the background. This function takes care of setting
1191 the user environment before exec'ing the command (e.g. C<PATH>) and should
1192 be preferred over explicit calls to C<exec> or C<system>.
1193
1194 Returns the pid of the subprocess or C<undef> on error.
1195
1196 =cut
1197
1198 sub exec_async {
1199 my $self = shift;
1200
1201 my $pid = fork;
1202
1203 return $pid
1204 if !defined $pid or $pid;
1205
1206 %ENV = %{ $self->env };
1207
1208 exec @_;
1209 urxvt::_exit 255;
1210 }
1211
1212 =item $isset = $term->option ($optval[, $set])
1213
1214 Returns true if the option specified by C<$optval> is enabled, and
1215 optionally change it. All option values are stored by name in the hash
1216 C<%urxvt::OPTION>. Options not enabled in this binary are not in the hash.
1217
1218 Here is a likely non-exhaustive list of option names, please see the
1219 source file F</src/optinc.h> to see the actual list:
1220
1221 borderLess buffered console cursorBlink cursorUnderline hold iconic
1222 insecure intensityStyles iso14755 iso14755_52 jumpScroll loginShell
1223 mapAlert meta8 mouseWheelScrollPage override_redirect pastableTabs
1224 pointerBlank reverseVideo scrollBar scrollBar_floating scrollBar_right
1225 scrollTtyKeypress scrollTtyOutput scrollWithBuffer secondaryScreen
1226 secondaryScroll skipBuiltinGlyphs skipScroll transparent tripleclickwords
1227 urgentOnBell utmpInhibit visualBell
1228
1229 =item $value = $term->resource ($name[, $newval])
1230
1231 Returns the current resource value associated with a given name and
1232 optionally sets a new value. Setting values is most useful in the C<init>
1233 hook. Unset resources are returned and accepted as C<undef>.
1234
1235 The new value must be properly encoded to a suitable character encoding
1236 before passing it to this method. Similarly, the returned value may need
1237 to be converted from the used encoding to text.
1238
1239 Resource names are as defined in F<src/rsinc.h>. Colours can be specified
1240 as resource names of the form C<< color+<index> >>, e.g. C<color+5>. (will
1241 likely change).
1242
1243 Please note that resource strings will currently only be freed when the
1244 terminal is destroyed, so changing options frequently will eat memory.
1245
1246 Here is a likely non-exhaustive list of resource names, not all of which
1247 are supported in every build, please see the source file F</src/rsinc.h>
1248 to see the actual list:
1249
1250 answerbackstring backgroundPixmap backspace_key blurradius
1251 boldFont boldItalicFont borderLess buffered chdir color cursorBlink
1252 cursorUnderline cutchars delete_key depth display_name embed ext_bwidth
1253 fade font geometry hold iconName iconfile imFont imLocale inputMethod
1254 insecure int_bwidth intensityStyles iso14755 iso14755_52 italicFont
1255 jumpScroll letterSpace lineSpace loginShell mapAlert meta8 modifier
1256 mouseWheelScrollPage name override_redirect pastableTabs path perl_eval
1257 perl_ext_1 perl_ext_2 perl_lib pointerBlank pointerBlankDelay
1258 preeditType print_pipe pty_fd reverseVideo saveLines scrollBar
1259 scrollBar_align scrollBar_floating scrollBar_right scrollBar_thickness
1260 scrollTtyKeypress scrollTtyOutput scrollWithBuffer scrollstyle
1261 secondaryScreen secondaryScroll shade skipBuiltinGlyphs skipScroll
1262 term_name title transient_for transparent tripleclickwords urgentOnBell
1263 utmpInhibit visualBell
1264
1265 =cut
1266
1267 sub resource($$;$) {
1268 my ($self, $name) = (shift, shift);
1269 unshift @_, $self, $name, ($name =~ s/\s*\+\s*(\d+)$// ? $1 : 0);
1270 goto &urxvt::term::_resource
1271 }
1272
1273 =item $value = $term->x_resource ($pattern)
1274
1275 Returns the X-Resource for the given pattern, excluding the program or
1276 class name, i.e. C<< $term->x_resource ("boldFont") >> should return the
1277 same value as used by this instance of rxvt-unicode. Returns C<undef> if no
1278 resource with that pattern exists.
1279
1280 Extensions that define extra resources also need to call this method
1281 to access their values.
1282
1283 If the method is called on an extension object (basically, from an
1284 extension), then the special prefix C<%.> will be replaced by the name of
1285 the extension and a dot, and the lone string C<%> will be replaced by the
1286 extension name itself. This makes it possible to code extensions so you
1287 can rename them and get a new set of commandline switches and resources
1288 without having to change the actual code.
1289
1290 This method should only be called during the C<on_start> hook, as there is
1291 only one resource database per display, and later invocations might return
1292 the wrong resources.
1293
1294 =item $value = $term->x_resource_boolean ($pattern)
1295
1296 Like C<x_resource>, above, but interprets the string value as a boolean
1297 and returns C<1> for true values, C<0> for false values and C<undef> if
1298 the resource or option isn't specified.
1299
1300 You should always use this method to parse boolean resources.
1301
1302 =cut
1303
1304 sub x_resource_boolean {
1305 my $res = &x_resource;
1306
1307 $res =~ /^\s*(?:true|yes|on|1)\s*$/i ? 1 : defined $res && 0
1308 }
1309
1310 =item $success = $term->bind_action ($key, $octets)
1311
1312 Adds a key binding exactly as specified via a C<keysym> resource. See the
1313 C<keysym> resource in the urxvt(1) manpage.
1314
1315 =item $rend = $term->rstyle ([$new_rstyle])
1316
1317 Return and optionally change the current rendition. Text that is output by
1318 the terminal application will use this style.
1319
1320 =item ($row, $col) = $term->screen_cur ([$row, $col])
1321
1322 Return the current coordinates of the text cursor position and optionally
1323 set it (which is usually bad as applications don't expect that).
1324
1325 =item ($row, $col) = $term->selection_mark ([$row, $col])
1326
1327 =item ($row, $col) = $term->selection_beg ([$row, $col])
1328
1329 =item ($row, $col) = $term->selection_end ([$row, $col])
1330
1331 Return the current values of the selection mark, begin or end positions.
1332
1333 When arguments are given, then the selection coordinates are set to
1334 C<$row> and C<$col>, and the selection screen is set to the current
1335 screen.
1336
1337 =item $screen = $term->selection_screen ([$screen])
1338
1339 Returns the current selection screen, and then optionally sets it.
1340
1341 =item $term->selection_make ($eventtime[, $rectangular])
1342
1343 Tries to make a selection as set by C<selection_beg> and
1344 C<selection_end>. If C<$rectangular> is true (default: false), a
1345 rectangular selection will be made. This is the preferred function to make
1346 a selection.
1347
1348 =item $success = $term->selection_grab ($eventtime[, $clipboard])
1349
1350 Try to acquire ownership of the primary (clipboard if C<$clipboard> is
1351 true) selection from the server. The corresponding text can be set
1352 with the next method. No visual feedback will be given. This function
1353 is mostly useful from within C<on_sel_grab> hooks.
1354
1355 =item $oldtext = $term->selection ([$newtext, $clipboard])
1356
1357 Return the current selection (clipboard if C<$clipboard> is true) text
1358 and optionally replace it by C<$newtext>.
1359
1360 =item $term->selection_clear ([$clipboard])
1361
1362 Revoke ownership of the primary (clipboard if C<$clipboard> is true) selection.
1363
1364 =item $term->overlay_simple ($x, $y, $text)
1365
1366 Create a simple multi-line overlay box. See the next method for details.
1367
1368 =cut
1369
1370 sub overlay_simple {
1371 my ($self, $x, $y, $text) = @_;
1372
1373 my @lines = split /\n/, $text;
1374
1375 my $w = List::Util::max map $self->strwidth ($_), @lines;
1376
1377 my $overlay = $self->overlay ($x, $y, $w, scalar @lines);
1378 $overlay->set (0, $_, $lines[$_]) for 0.. $#lines;
1379
1380 $overlay
1381 }
1382
1383 =item $term->overlay ($x, $y, $width, $height[, $rstyle[, $border]])
1384
1385 Create a new (empty) overlay at the given position with the given
1386 width/height. C<$rstyle> defines the initial rendition style
1387 (default: C<OVERLAY_RSTYLE>).
1388
1389 If C<$border> is C<2> (default), then a decorative border will be put
1390 around the box.
1391
1392 If either C<$x> or C<$y> is negative, then this is counted from the
1393 right/bottom side, respectively.
1394
1395 This method returns an urxvt::overlay object. The overlay will be visible
1396 as long as the perl object is referenced.
1397
1398 The methods currently supported on C<urxvt::overlay> objects are:
1399
1400 =over 4
1401
1402 =item $overlay->set ($x, $y, $text[, $rend])
1403
1404 Similar to C<< $term->ROW_t >> and C<< $term->ROW_r >> in that it puts
1405 text in rxvt-unicode's special encoding and an array of rendition values
1406 at a specific position inside the overlay.
1407
1408 If C<$rend> is missing, then the rendition will not be changed.
1409
1410 =item $overlay->hide
1411
1412 If visible, hide the overlay, but do not destroy it.
1413
1414 =item $overlay->show
1415
1416 If hidden, display the overlay again.
1417
1418 =back
1419
1420 =item $popup = $term->popup ($event)
1421
1422 Creates a new C<urxvt::popup> object that implements a popup menu. The
1423 C<$event> I<must> be the event causing the menu to pop up (a button event,
1424 currently).
1425
1426 =cut
1427
1428 sub popup {
1429 my ($self, $event) = @_;
1430
1431 $self->grab ($event->{time}, 1)
1432 or return;
1433
1434 my $popup = bless {
1435 term => $self,
1436 event => $event,
1437 }, urxvt::popup::;
1438
1439 Scalar::Util::weaken $popup->{term};
1440
1441 $self->{_destroy}{$popup} = urxvt::destroy_hook { $popup->{popup}->destroy };
1442 Scalar::Util::weaken $self->{_destroy}{$popup};
1443
1444 $popup
1445 }
1446
1447 =item $cellwidth = $term->strwidth ($string)
1448
1449 Returns the number of screen-cells this string would need. Correctly
1450 accounts for wide and combining characters.
1451
1452 =item $octets = $term->locale_encode ($string)
1453
1454 Convert the given text string into the corresponding locale encoding.
1455
1456 =item $string = $term->locale_decode ($octets)
1457
1458 Convert the given locale-encoded octets into a perl string.
1459
1460 =item $term->scr_xor_span ($beg_row, $beg_col, $end_row, $end_col[, $rstyle])
1461
1462 XORs the rendition values in the given span with the provided value
1463 (default: C<RS_RVid>), which I<MUST NOT> contain font styles. Useful in
1464 refresh hooks to provide effects similar to the selection.
1465
1466 =item $term->scr_xor_rect ($beg_row, $beg_col, $end_row, $end_col[, $rstyle1[, $rstyle2]])
1467
1468 Similar to C<scr_xor_span>, but xors a rectangle instead. Trailing
1469 whitespace will additionally be xored with the C<$rstyle2>, which defaults
1470 to C<RS_RVid | RS_Uline>, which removes reverse video again and underlines
1471 it instead. Both styles I<MUST NOT> contain font styles.
1472
1473 =item $term->scr_bell
1474
1475 Ring the bell!
1476
1477 =item $term->scr_add_lines ($string)
1478
1479 Write the given text string to the screen, as if output by the application
1480 running inside the terminal. It may not contain command sequences (escape
1481 codes), but is free to use line feeds, carriage returns and tabs. The
1482 string is a normal text string, not in locale-dependent encoding.
1483
1484 Normally its not a good idea to use this function, as programs might be
1485 confused by changes in cursor position or scrolling. Its useful inside a
1486 C<on_add_lines> hook, though.
1487
1488 =item $term->scr_change_screen ($screen)
1489
1490 Switch to given screen - 0 primary, 1 secondary.
1491
1492 =item $term->cmd_parse ($octets)
1493
1494 Similar to C<scr_add_lines>, but the argument must be in the
1495 locale-specific encoding of the terminal and can contain command sequences
1496 (escape codes) that will be interpreted.
1497
1498 =item $term->tt_write ($octets)
1499
1500 Write the octets given in C<$octets> to the tty (i.e. as program input). To
1501 pass characters instead of octets, you should convert your strings first
1502 to the locale-specific encoding using C<< $term->locale_encode >>.
1503
1504 =item $term->tt_write_user_input ($octets)
1505
1506 Like C<tt_write>, but should be used when writing strings in response to
1507 the user pressing a key, to invoke the additional actions requested by
1508 the user for that case (C<tt_write> doesn't do that).
1509
1510 The typical use case would be inside C<on_action> hooks.
1511
1512 =item $term->tt_paste ($octets)
1513
1514 Write the octets given in C<$octets> to the tty as a paste, converting NL to
1515 CR and bracketing the data with control sequences if bracketed paste mode
1516 is set.
1517
1518 =item $old_events = $term->pty_ev_events ([$new_events])
1519
1520 Replaces the event mask of the pty watcher by the given event mask. Can
1521 be used to suppress input and output handling to the pty/tty. See the
1522 description of C<< urxvt::timer->events >>. Make sure to always restore
1523 the previous value.
1524
1525 =item $fd = $term->pty_fd
1526
1527 Returns the master file descriptor for the pty in use, or C<-1> if no pty
1528 is used.
1529
1530 =item $windowid = $term->parent
1531
1532 Return the window id of the toplevel window.
1533
1534 =item $windowid = $term->vt
1535
1536 Return the window id of the terminal window.
1537
1538 =item $term->vt_emask_add ($x_event_mask)
1539
1540 Adds the specified events to the vt event mask. Useful e.g. when you want
1541 to receive pointer events all the times:
1542
1543 $term->vt_emask_add (urxvt::PointerMotionMask);
1544
1545 =item $term->set_urgency ($set)
1546
1547 Enable/disable the urgency hint on the toplevel window.
1548
1549 =item $term->focus_in
1550
1551 =item $term->focus_out
1552
1553 =item $term->key_press ($state, $keycode[, $time])
1554
1555 =item $term->key_release ($state, $keycode[, $time])
1556
1557 Deliver various fake events to to terminal.
1558
1559 =item $window_width = $term->width
1560
1561 =item $window_height = $term->height
1562
1563 =item $font_width = $term->fwidth
1564
1565 =item $font_height = $term->fheight
1566
1567 =item $font_ascent = $term->fbase
1568
1569 =item $terminal_rows = $term->nrow
1570
1571 =item $terminal_columns = $term->ncol
1572
1573 =item $has_focus = $term->focus
1574
1575 =item $is_mapped = $term->mapped
1576
1577 =item $max_scrollback = $term->saveLines
1578
1579 =item $nrow_plus_saveLines = $term->total_rows
1580
1581 =item $topmost_scrollback_row = $term->top_row
1582
1583 Return various integers describing terminal characteristics.
1584
1585 =item $x_display = $term->display_id
1586
1587 Return the DISPLAY used by rxvt-unicode.
1588
1589 =item $lc_ctype = $term->locale
1590
1591 Returns the LC_CTYPE category string used by this rxvt-unicode.
1592
1593 =item $env = $term->env
1594
1595 Returns a copy of the environment in effect for the terminal as a hashref
1596 similar to C<\%ENV>.
1597
1598 =item @envv = $term->envv
1599
1600 Returns the environment as array of strings of the form C<VAR=VALUE>.
1601
1602 =item @argv = $term->argv
1603
1604 Return the argument vector as this terminal, similar to @ARGV, but
1605 includes the program name as first element.
1606
1607 =cut
1608
1609 sub env {
1610 +{ map /^([^=]+)(?:=(.*))?$/s && ($1 => $2), $_[0]->envv }
1611 }
1612
1613 =item $modifiermask = $term->ModLevel3Mask
1614
1615 =item $modifiermask = $term->ModMetaMask
1616
1617 =item $modifiermask = $term->ModNumLockMask
1618
1619 Return the modifier masks corresponding to the "ISO Level 3 Shift" (often
1620 AltGr), the meta key (often Alt) and the num lock key, if applicable.
1621
1622 =item $screen = $term->current_screen
1623
1624 Returns the currently displayed screen (0 primary, 1 secondary).
1625
1626 =item $cursor_is_hidden = $term->hidden_cursor
1627
1628 Returns whether the cursor is currently hidden or not.
1629
1630 =item $view_start = $term->view_start ([$newvalue])
1631
1632 Returns the row number of the topmost displayed line. Maximum value is
1633 C<0>, which displays the normal terminal contents. Lower values scroll
1634 this many lines into the scrollback buffer.
1635
1636 =item $term->want_refresh
1637
1638 Requests a screen refresh. At the next opportunity, rxvt-unicode will
1639 compare the on-screen display with its stored representation. If they
1640 differ, it redraws the differences.
1641
1642 Used after changing terminal contents to display them.
1643
1644 =item $text = $term->ROW_t ($row_number[, $new_text[, $start_col]])
1645
1646 Returns the text of the entire row with number C<$row_number>. Row C<< $term->top_row >>
1647 is the topmost terminal line, row C<< $term->nrow-1 >> is the bottommost
1648 terminal line. Nothing will be returned if a nonexistent line
1649 is requested.
1650
1651 If C<$new_text> is specified, it will replace characters in the current
1652 line, starting at column C<$start_col> (default C<0>), which is useful
1653 to replace only parts of a line. The font index in the rendition will
1654 automatically be updated.
1655
1656 C<$text> is in a special encoding: tabs and wide characters that use more
1657 than one cell when displayed are padded with C<$urxvt::NOCHAR> (chr 65535)
1658 characters. Characters with combining characters and other characters that
1659 do not fit into the normal text encoding will be replaced with characters
1660 in the private use area.
1661
1662 You have to obey this encoding when changing text. The advantage is
1663 that C<substr> and similar functions work on screen cells and not on
1664 characters.
1665
1666 The methods C<< $term->special_encode >> and C<< $term->special_decode >>
1667 can be used to convert normal strings into this encoding and vice versa.
1668
1669 =item $rend = $term->ROW_r ($row_number[, $new_rend[, $start_col]])
1670
1671 Like C<< $term->ROW_t >>, but returns an arrayref with rendition
1672 bitsets. Rendition bitsets contain information about colour, font, font
1673 styles and similar information. See also C<< $term->ROW_t >>.
1674
1675 When setting rendition, the font mask will be ignored.
1676
1677 See the section on RENDITION, above.
1678
1679 =item $length = $term->ROW_l ($row_number[, $new_length])
1680
1681 Returns the number of screen cells that are in use ("the line
1682 length"). Unlike the urxvt core, this returns C<< $term->ncol >> if the
1683 line is joined with the following one.
1684
1685 =item $bool = $term->is_longer ($row_number)
1686
1687 Returns true if the row is part of a multiple-row logical "line" (i.e.
1688 joined with the following row), which means all characters are in use
1689 and it is continued on the next row (and possibly a continuation of the
1690 previous row(s)).
1691
1692 =item $line = $term->line ($row_number)
1693
1694 Create and return a new C<urxvt::line> object that stores information
1695 about the logical line that row C<$row_number> is part of. It supports the
1696 following methods:
1697
1698 =over 4
1699
1700 =item $text = $line->t ([$new_text])
1701
1702 Returns or replaces the full text of the line, similar to C<ROW_t>
1703
1704 =item $rend = $line->r ([$new_rend])
1705
1706 Returns or replaces the full rendition array of the line, similar to C<ROW_r>
1707
1708 =item $length = $line->l
1709
1710 Returns the length of the line in cells, similar to C<ROW_l>.
1711
1712 =item $rownum = $line->beg
1713
1714 =item $rownum = $line->end
1715
1716 Return the row number of the first/last row of the line, respectively.
1717
1718 =item $offset = $line->offset_of ($row, $col)
1719
1720 Returns the character offset of the given row|col pair within the logical
1721 line. Works for rows outside the line, too, and returns corresponding
1722 offsets outside the string.
1723
1724 =item ($row, $col) = $line->coord_of ($offset)
1725
1726 Translates a string offset into terminal coordinates again.
1727
1728 =back
1729
1730 =cut
1731
1732 sub line {
1733 my ($self, $row) = @_;
1734
1735 my $maxrow = $self->nrow - 1;
1736
1737 my ($beg, $end) = ($row, $row);
1738
1739 --$beg while $self->ROW_is_longer ($beg - 1);
1740 ++$end while $self->ROW_is_longer ($end) && $end < $maxrow;
1741
1742 bless {
1743 term => $self,
1744 beg => $beg,
1745 end => $end,
1746 ncol => $self->ncol,
1747 len => ($end - $beg) * $self->ncol + $self->ROW_l ($end),
1748 }, urxvt::line::
1749 }
1750
1751 sub urxvt::line::t {
1752 my ($self) = @_;
1753
1754 if (@_ > 1) {
1755 $self->{term}->ROW_t ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1756 for $self->{beg} .. $self->{end};
1757 }
1758
1759 defined wantarray &&
1760 substr +(join "", map $self->{term}->ROW_t ($_), $self->{beg} .. $self->{end}),
1761 0, $self->{len}
1762 }
1763
1764 sub urxvt::line::r {
1765 my ($self) = @_;
1766
1767 if (@_ > 1) {
1768 $self->{term}->ROW_r ($_, $_[1], 0, ($_ - $self->{beg}) * $self->{ncol}, $self->{ncol})
1769 for $self->{beg} .. $self->{end};
1770 }
1771
1772 if (defined wantarray) {
1773 my $rend = [
1774 map @{ $self->{term}->ROW_r ($_) }, $self->{beg} .. $self->{end}
1775 ];
1776 $#$rend = $self->{len} - 1;
1777 return $rend;
1778 }
1779
1780 ()
1781 }
1782
1783 sub urxvt::line::beg { $_[0]{beg} }
1784 sub urxvt::line::end { $_[0]{end} }
1785 sub urxvt::line::l { $_[0]{len} }
1786
1787 sub urxvt::line::offset_of {
1788 my ($self, $row, $col) = @_;
1789
1790 ($row - $self->{beg}) * $self->{ncol} + $col
1791 }
1792
1793 sub urxvt::line::coord_of {
1794 my ($self, $offset) = @_;
1795
1796 use integer;
1797
1798 (
1799 $offset / $self->{ncol} + $self->{beg},
1800 $offset % $self->{ncol}
1801 )
1802 }
1803
1804 =item $text = $term->special_encode $string
1805
1806 Converts a perl string into the special encoding used by rxvt-unicode,
1807 where one character corresponds to one screen cell. See
1808 C<< $term->ROW_t >> for details.
1809
1810 =item $string = $term->special_decode $text
1811
1812 Converts rxvt-unicodes text representation into a perl string. See
1813 C<< $term->ROW_t >> for details.
1814
1815 =item $success = $term->grab_button ($button, $modifiermask[, $window = $term->vt])
1816
1817 =item $term->ungrab_button ($button, $modifiermask[, $window = $term->vt])
1818
1819 Register/unregister a synchronous button grab. See the XGrabButton
1820 manpage.
1821
1822 =item $success = $term->grab ($eventtime[, $sync])
1823
1824 Calls XGrabPointer and XGrabKeyboard in asynchronous (default) or
1825 synchronous (C<$sync> is true). Also remembers the grab timestamp.
1826
1827 =item $term->allow_events_async
1828
1829 Calls XAllowEvents with AsyncBoth for the most recent grab.
1830
1831 =item $term->allow_events_sync
1832
1833 Calls XAllowEvents with SyncBoth for the most recent grab.
1834
1835 =item $term->allow_events_replay
1836
1837 Calls XAllowEvents with both ReplayPointer and ReplayKeyboard for the most
1838 recent grab.
1839
1840 =item $term->ungrab
1841
1842 Calls XUngrabPointer and XUngrabKeyboard for the most recent grab. Is called automatically on
1843 evaluation errors, as it is better to lose the grab in the error case as
1844 the session.
1845
1846 =item $atom = $term->XInternAtom ($atom_name[, $only_if_exists])
1847
1848 =item $atom_name = $term->XGetAtomName ($atom)
1849
1850 =item @atoms = $term->XListProperties ($window)
1851
1852 =item ($type,$format,$octets) = $term->XGetWindowProperty ($window, $property)
1853
1854 =item $term->XChangeProperty ($window, $property, $type, $format, $octets)
1855
1856 =item $term->XDeleteProperty ($window, $property)
1857
1858 =item $window = $term->DefaultRootWindow
1859
1860 =item $term->XReparentWindow ($window, $parent, [$x, $y])
1861
1862 =item $term->XMapWindow ($window)
1863
1864 =item $term->XUnmapWindow ($window)
1865
1866 =item $term->XMoveResizeWindow ($window, $x, $y, $width, $height)
1867
1868 =item ($x, $y, $child_window) = $term->XTranslateCoordinates ($src, $dst, $x, $y)
1869
1870 =item $term->XChangeInput ($window, $add_events[, $del_events])
1871
1872 =item $keysym = $term->XStringToKeysym ($string)
1873
1874 =item $string = $term->XKeysymToString ($keysym)
1875
1876 Various X or X-related functions. The C<$term> object only serves as
1877 the source of the display, otherwise those functions map more-or-less
1878 directly onto the X functions of the same name.
1879
1880 =back
1881
1882 =cut
1883
1884 package urxvt::popup;
1885
1886 =head2 The C<urxvt::popup> Class
1887
1888 =over 4
1889
1890 =cut
1891
1892 sub add_item {
1893 my ($self, $item) = @_;
1894
1895 $item->{rend}{normal} = "\x1b[0;30;47m" unless exists $item->{rend}{normal};
1896 $item->{rend}{hover} = "\x1b[0;30;46m" unless exists $item->{rend}{hover};
1897 $item->{rend}{active} = "\x1b[m" unless exists $item->{rend}{active};
1898
1899 $item->{render} ||= sub { $_[0]{text} };
1900
1901 push @{ $self->{item} }, $item;
1902 }
1903
1904 =item $popup->add_title ($title)
1905
1906 Adds a non-clickable title to the popup.
1907
1908 =cut
1909
1910 sub add_title {
1911 my ($self, $title) = @_;
1912
1913 $self->add_item ({
1914 rend => { normal => "\x1b[38;5;11;44m", hover => "\x1b[38;5;11;44m", active => "\x1b[38;5;11;44m" },
1915 text => $title,
1916 activate => sub { },
1917 });
1918 }
1919
1920 =item $popup->add_separator ([$sepchr])
1921
1922 Creates a separator, optionally using the character given as C<$sepchr>.
1923
1924 =cut
1925
1926 sub add_separator {
1927 my ($self, $sep) = @_;
1928
1929 $sep ||= "=";
1930
1931 $self->add_item ({
1932 rend => { normal => "\x1b[0;30;47m", hover => "\x1b[0;30;47m", active => "\x1b[0;30;47m" },
1933 text => "",
1934 render => sub { $sep x $self->{term}->ncol },
1935 activate => sub { },
1936 });
1937 }
1938
1939 =item $popup->add_button ($text, $cb)
1940
1941 Adds a clickable button to the popup. C<$cb> is called whenever it is
1942 selected.
1943
1944 =cut
1945
1946 sub add_button {
1947 my ($self, $text, $cb) = @_;
1948
1949 $self->add_item ({ type => "button", text => $text, activate => $cb});
1950 }
1951
1952 =item $popup->add_toggle ($text, $initial_value, $cb)
1953
1954 Adds a toggle/checkbox item to the popup. The callback gets called
1955 whenever it gets toggled, with a boolean indicating its new value as its
1956 first argument.
1957
1958 =cut
1959
1960 sub add_toggle {
1961 my ($self, $text, $value, $cb) = @_;
1962
1963 my $item; $item = {
1964 type => "button",
1965 text => " $text",
1966 value => $value,
1967 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1968 activate => sub { $cb->($_[1]{value} = !$_[1]{value}); },
1969 };
1970
1971 $self->add_item ($item);
1972 }
1973
1974 =item $popup->show
1975
1976 Displays the popup (which is initially hidden).
1977
1978 =cut
1979
1980 sub show {
1981 my ($self) = @_;
1982
1983 local $urxvt::popup::self = $self;
1984
1985 my $env = $self->{term}->env;
1986 # we can't hope to reproduce the locale algorithm, so nuke LC_ALL and set LC_CTYPE.
1987 delete $env->{LC_ALL};
1988 $env->{LC_CTYPE} = $self->{term}->locale;
1989
1990 my $term = urxvt::term->new (
1991 $env, "popup",
1992 "--perl-lib" => "", "--perl-ext-common" => "",
1993 "-pty-fd" => -1, "-sl" => 0,
1994 "-b" => 1, "-bd" => "grey80", "-bl", "-override-redirect",
1995 "--transient-for" => $self->{term}->parent,
1996 "-display" => $self->{term}->display_id,
1997 "-pe" => "urxvt-popup",
1998 ) or die "unable to create popup window\n";
1999
2000 unless (delete $term->{urxvt_popup_init_done}) {
2001 $term->ungrab;
2002 $term->destroy;
2003 die "unable to initialise popup window\n";
2004 }
2005 }
2006
2007 sub DESTROY {
2008 my ($self) = @_;
2009
2010 delete $self->{term}{_destroy}{$self};
2011 $self->{term}->ungrab;
2012 }
2013
2014 =back
2015
2016 =cut
2017
2018 package urxvt::watcher;
2019
2020 =head2 The C<urxvt::timer> Class
2021
2022 This class implements timer watchers/events. Time is represented as a
2023 fractional number of seconds since the epoch. Example:
2024
2025 $term->{overlay} = $term->overlay (-1, 0, 8, 1, urxvt::OVERLAY_RSTYLE, 0);
2026 $term->{timer} = urxvt::timer
2027 ->new
2028 ->interval (1)
2029 ->cb (sub {
2030 $term->{overlay}->set (0, 0,
2031 sprintf "%2d:%02d:%02d", (localtime urxvt::NOW)[2,1,0]);
2032 });
2033
2034 =over 4
2035
2036 =item $timer = new urxvt::timer
2037
2038 Create a new timer object in started state. It is scheduled to fire
2039 immediately.
2040
2041 =item $timer = $timer->cb (sub { my ($timer) = @_; ... })
2042
2043 Set the callback to be called when the timer triggers.
2044
2045 =item $timer = $timer->set ($tstamp[, $interval])
2046
2047 Set the time the event is generated to $tstamp (and optionally specifies a
2048 new $interval).
2049
2050 =item $timer = $timer->interval ($interval)
2051
2052 By default (and when C<$interval> is C<0>), the timer will automatically
2053 stop after it has fired once. If C<$interval> is non-zero, then the timer
2054 is automatically rescheduled at the given intervals.
2055
2056 =item $timer = $timer->start
2057
2058 Start the timer.
2059
2060 =item $timer = $timer->start ($tstamp[, $interval])
2061
2062 Set the event trigger time to C<$tstamp> and start the timer. Optionally
2063 also replaces the interval.
2064
2065 =item $timer = $timer->after ($delay[, $interval])
2066
2067 Like C<start>, but sets the expiry timer to c<urxvt::NOW + $delay>.
2068
2069 =item $timer = $timer->stop
2070
2071 Stop the timer.
2072
2073 =back
2074
2075 =head2 The C<urxvt::iow> Class
2076
2077 This class implements io watchers/events. Example:
2078
2079 $term->{socket} = ...
2080 $term->{iow} = urxvt::iow
2081 ->new
2082 ->fd (fileno $term->{socket})
2083 ->events (urxvt::EV_READ)
2084 ->start
2085 ->cb (sub {
2086 my ($iow, $revents) = @_;
2087 # $revents must be 1 here, no need to check
2088 sysread $term->{socket}, my $buf, 8192
2089 or end-of-file;
2090 });
2091
2092
2093 =over 4
2094
2095 =item $iow = new urxvt::iow
2096
2097 Create a new io watcher object in stopped state.
2098
2099 =item $iow = $iow->cb (sub { my ($iow, $reventmask) = @_; ... })
2100
2101 Set the callback to be called when io events are triggered. C<$reventmask>
2102 is a bitset as described in the C<events> method.
2103
2104 =item $iow = $iow->fd ($fd)
2105
2106 Set the file descriptor (not handle) to watch.
2107
2108 =item $iow = $iow->events ($eventmask)
2109
2110 Set the event mask to watch. The only allowed values are
2111 C<urxvt::EV_READ> and C<urxvt::EV_WRITE>, which might be ORed
2112 together, or C<urxvt::EV_NONE>.
2113
2114 =item $iow = $iow->start
2115
2116 Start watching for requested events on the given handle.
2117
2118 =item $iow = $iow->stop
2119
2120 Stop watching for events on the given file handle.
2121
2122 =back
2123
2124 =head2 The C<urxvt::iw> Class
2125
2126 This class implements idle watchers, that get called automatically when
2127 the process is idle. They should return as fast as possible, after doing
2128 some useful work.
2129
2130 =over 4
2131
2132 =item $iw = new urxvt::iw
2133
2134 Create a new idle watcher object in stopped state.
2135
2136 =item $iw = $iw->cb (sub { my ($iw) = @_; ... })
2137
2138 Set the callback to be called when the watcher triggers.
2139
2140 =item $timer = $timer->start
2141
2142 Start the watcher.
2143
2144 =item $timer = $timer->stop
2145
2146 Stop the watcher.
2147
2148 =back
2149
2150 =head2 The C<urxvt::pw> Class
2151
2152 This class implements process watchers. They create an event whenever a
2153 process exits, after which they stop automatically.
2154
2155 my $pid = fork;
2156 ...
2157 $term->{pw} = urxvt::pw
2158 ->new
2159 ->start ($pid)
2160 ->cb (sub {
2161 my ($pw, $exit_status) = @_;
2162 ...
2163 });
2164
2165 =over 4
2166
2167 =item $pw = new urxvt::pw
2168
2169 Create a new process watcher in stopped state.
2170
2171 =item $pw = $pw->cb (sub { my ($pw, $exit_status) = @_; ... })
2172
2173 Set the callback to be called when the timer triggers.
2174
2175 =item $pw = $timer->start ($pid)
2176
2177 Tells the watcher to start watching for process C<$pid>.
2178
2179 =item $pw = $pw->stop
2180
2181 Stop the watcher.
2182
2183 =back
2184
2185 =head1 ENVIRONMENT
2186
2187 =head2 URXVT_PERL_VERBOSITY
2188
2189 This variable controls the verbosity level of the perl extension. Higher
2190 numbers indicate more verbose output.
2191
2192 =over 4
2193
2194 =item == 0 - fatal messages
2195
2196 =item >= 3 - script loading and management
2197
2198 =item >=10 - all called hooks
2199
2200 =item >=11 - hook return values
2201
2202 =back
2203
2204 =head1 AUTHOR
2205
2206 Marc Lehmann <schmorp@schmorp.de>
2207 http://software.schmorp.de/pkg/rxvt-unicode
2208
2209 =cut
2210
2211 1
2212
2213 # vim: sw=3: