ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.118
Committed: Fri Jan 20 18:50:49 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.117: +2 -0 lines
Log Message:
*** empty log message ***

File Contents

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