ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.119
Committed: Fri Jan 20 18:59:31 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
Changes since 1.118: +30 -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 =item $atom = $term->XInternAtom ($atom_name[, $only_if_exists])
1574
1575 =item $atom_name = $term->XGetAtomName ($atom)
1576
1577 =item @atoms = $term->XListProperties ($window)
1578
1579 =item ($type,$format,$octets) = $term->XGetWindowProperty ($window, $property)
1580
1581 =item $term->XChangeWindowProperty ($window, $property, $type, $format, $octets)
1582
1583 =item $term->XDeleteProperty ($window, $property)
1584
1585 =item $window = $term->DefaultRootWindow
1586
1587 =item $term->XReparentWindow ($window, $parent, [$x, $y])
1588
1589 =item $term->XMapWindow ($window)
1590
1591 =item $term->XUnmapWindow ($window)
1592
1593 =item $term->XMoveResizeWindow ($window, $x, $y, $width, $height)
1594
1595 =item ($x, $y, $child_window) = $term->XTranslateCoordinates ($src, $dst, $x, $y)
1596
1597 =item $term->XChangeInput ($window, $add_events[, $del_events])
1598
1599 Various X or X-related functions. The C<$term> object only serves as
1600 the source of the display, otherwise those functions map more-or-less
1601 directory onto the X functions of the same name.
1602
1603 =back
1604
1605 =cut
1606
1607 package urxvt::popup;
1608
1609 =head2 The C<urxvt::popup> Class
1610
1611 =over 4
1612
1613 =cut
1614
1615 sub add_item {
1616 my ($self, $item) = @_;
1617
1618 $item->{rend}{normal} = "\x1b[0;30;47m" unless exists $item->{rend}{normal};
1619 $item->{rend}{hover} = "\x1b[0;30;46m" unless exists $item->{rend}{hover};
1620 $item->{rend}{active} = "\x1b[m" unless exists $item->{rend}{active};
1621
1622 $item->{render} ||= sub { $_[0]{text} };
1623
1624 push @{ $self->{item} }, $item;
1625 }
1626
1627 =item $popup->add_title ($title)
1628
1629 Adds a non-clickable title to the popup.
1630
1631 =cut
1632
1633 sub add_title {
1634 my ($self, $title) = @_;
1635
1636 $self->add_item ({
1637 rend => { normal => "\x1b[38;5;11;44m", hover => "\x1b[38;5;11;44m", active => "\x1b[38;5;11;44m" },
1638 text => $title,
1639 activate => sub { },
1640 });
1641 }
1642
1643 =item $popup->add_separator ([$sepchr])
1644
1645 Creates a separator, optionally using the character given as C<$sepchr>.
1646
1647 =cut
1648
1649 sub add_separator {
1650 my ($self, $sep) = @_;
1651
1652 $sep ||= "=";
1653
1654 $self->add_item ({
1655 rend => { normal => "\x1b[0;30;47m", hover => "\x1b[0;30;47m", active => "\x1b[0;30;47m" },
1656 text => "",
1657 render => sub { $sep x $self->{term}->ncol },
1658 activate => sub { },
1659 });
1660 }
1661
1662 =item $popup->add_button ($text, $cb)
1663
1664 Adds a clickable button to the popup. C<$cb> is called whenever it is
1665 selected.
1666
1667 =cut
1668
1669 sub add_button {
1670 my ($self, $text, $cb) = @_;
1671
1672 $self->add_item ({ type => "button", text => $text, activate => $cb});
1673 }
1674
1675 =item $popup->add_toggle ($text, $cb, $initial_value)
1676
1677 Adds a toggle/checkbox item to the popup. Teh callback gets called
1678 whenever it gets toggled, with a boolean indicating its value as its first
1679 argument.
1680
1681 =cut
1682
1683 sub add_toggle {
1684 my ($self, $text, $cb, $value) = @_;
1685
1686 my $item; $item = {
1687 type => "button",
1688 text => " $text",
1689 value => $value,
1690 render => sub { ($_[0]{value} ? "* " : " ") . $text },
1691 activate => sub { $cb->($_[1]{value} = !$_[1]{value}); },
1692 };
1693
1694 $self->add_item ($item);
1695 }
1696
1697 =item $popup->show
1698
1699 Displays the popup (which is initially hidden).
1700
1701 =cut
1702
1703 sub show {
1704 my ($self) = @_;
1705
1706 local $urxvt::popup::self = $self;
1707
1708 my $env = $self->{term}->env;
1709 # we can't hope to reproduce the locale algorithm, so nuke LC_ALL and set LC_CTYPE.
1710 delete $env->{LC_ALL};
1711 $env->{LC_CTYPE} = $self->{term}->locale;
1712
1713 urxvt::term->new ($env, "popup",
1714 "--perl-lib" => "", "--perl-ext-common" => "",
1715 "-pty-fd" => -1, "-sl" => 0,
1716 "-b" => 1, "-bd" => "grey80", "-bl", "-override-redirect",
1717 "--transient-for" => $self->{term}->parent,
1718 "-display" => $self->{term}->display_id,
1719 "-pe" => "urxvt-popup")
1720 or die "unable to create popup window\n";
1721 }
1722
1723 sub DESTROY {
1724 my ($self) = @_;
1725
1726 delete $self->{term}{_destroy}{$self};
1727 $self->{term}->ungrab;
1728 }
1729
1730 =back
1731
1732 =cut
1733
1734 package urxvt::watcher;
1735
1736 @urxvt::timer::ISA = __PACKAGE__;
1737 @urxvt::iow::ISA = __PACKAGE__;
1738 @urxvt::pw::ISA = __PACKAGE__;
1739 @urxvt::iw::ISA = __PACKAGE__;
1740
1741 =head2 The C<urxvt::timer> Class
1742
1743 This class implements timer watchers/events. Time is represented as a
1744 fractional number of seconds since the epoch. Example:
1745
1746 $term->{overlay} = $term->overlay (-1, 0, 8, 1, urxvt::OVERLAY_RSTYLE, 0);
1747 $term->{timer} = urxvt::timer
1748 ->new
1749 ->interval (1)
1750 ->cb (sub {
1751 $term->{overlay}->set (0, 0,
1752 sprintf "%2d:%02d:%02d", (localtime urxvt::NOW)[2,1,0]);
1753 });
1754
1755 =over 4
1756
1757 =item $timer = new urxvt::timer
1758
1759 Create a new timer object in started state. It is scheduled to fire
1760 immediately.
1761
1762 =item $timer = $timer->cb (sub { my ($timer) = @_; ... })
1763
1764 Set the callback to be called when the timer triggers.
1765
1766 =item $tstamp = $timer->at
1767
1768 Return the time this watcher will fire next.
1769
1770 =item $timer = $timer->set ($tstamp)
1771
1772 Set the time the event is generated to $tstamp.
1773
1774 =item $timer = $timer->interval ($interval)
1775
1776 Normally (and when C<$interval> is C<0>), the timer will automatically
1777 stop after it has fired once. If C<$interval> is non-zero, then the timer
1778 is automatically rescheduled at the given intervals.
1779
1780 =item $timer = $timer->start
1781
1782 Start the timer.
1783
1784 =item $timer = $timer->start ($tstamp)
1785
1786 Set the event trigger time to C<$tstamp> and start the timer.
1787
1788 =item $timer = $timer->after ($delay)
1789
1790 Like C<start>, but sets the expiry timer to c<urxvt::NOW + $delay>.
1791
1792 =item $timer = $timer->stop
1793
1794 Stop the timer.
1795
1796 =back
1797
1798 =head2 The C<urxvt::iow> Class
1799
1800 This class implements io watchers/events. Example:
1801
1802 $term->{socket} = ...
1803 $term->{iow} = urxvt::iow
1804 ->new
1805 ->fd (fileno $term->{socket})
1806 ->events (urxvt::EVENT_READ)
1807 ->start
1808 ->cb (sub {
1809 my ($iow, $revents) = @_;
1810 # $revents must be 1 here, no need to check
1811 sysread $term->{socket}, my $buf, 8192
1812 or end-of-file;
1813 });
1814
1815
1816 =over 4
1817
1818 =item $iow = new urxvt::iow
1819
1820 Create a new io watcher object in stopped state.
1821
1822 =item $iow = $iow->cb (sub { my ($iow, $reventmask) = @_; ... })
1823
1824 Set the callback to be called when io events are triggered. C<$reventmask>
1825 is a bitset as described in the C<events> method.
1826
1827 =item $iow = $iow->fd ($fd)
1828
1829 Set the filedescriptor (not handle) to watch.
1830
1831 =item $iow = $iow->events ($eventmask)
1832
1833 Set the event mask to watch. The only allowed values are
1834 C<urxvt::EVENT_READ> and C<urxvt::EVENT_WRITE>, which might be ORed
1835 together, or C<urxvt::EVENT_NONE>.
1836
1837 =item $iow = $iow->start
1838
1839 Start watching for requested events on the given handle.
1840
1841 =item $iow = $iow->stop
1842
1843 Stop watching for events on the given filehandle.
1844
1845 =back
1846
1847 =head2 The C<urxvt::iw> Class
1848
1849 This class implements idle watchers, that get called automatically when
1850 the process is idle. They should return as fast as possible, after doing
1851 some useful work.
1852
1853 =over 4
1854
1855 =item $iw = new urxvt::iw
1856
1857 Create a new idle watcher object in stopped state.
1858
1859 =item $iw = $iw->cb (sub { my ($iw) = @_; ... })
1860
1861 Set the callback to be called when the watcher triggers.
1862
1863 =item $timer = $timer->start
1864
1865 Start the watcher.
1866
1867 =item $timer = $timer->stop
1868
1869 Stop the watcher.
1870
1871 =back
1872
1873 =head2 The C<urxvt::pw> Class
1874
1875 This class implements process watchers. They create an event whenever a
1876 process exits, after which they stop automatically.
1877
1878 my $pid = fork;
1879 ...
1880 $term->{pw} = urxvt::pw
1881 ->new
1882 ->start ($pid)
1883 ->cb (sub {
1884 my ($pw, $exit_status) = @_;
1885 ...
1886 });
1887
1888 =over 4
1889
1890 =item $pw = new urxvt::pw
1891
1892 Create a new process watcher in stopped state.
1893
1894 =item $pw = $pw->cb (sub { my ($pw, $exit_status) = @_; ... })
1895
1896 Set the callback to be called when the timer triggers.
1897
1898 =item $pw = $timer->start ($pid)
1899
1900 Tells the wqtcher to start watching for process C<$pid>.
1901
1902 =item $pw = $pw->stop
1903
1904 Stop the watcher.
1905
1906 =back
1907
1908 =head1 ENVIRONMENT
1909
1910 =head2 URXVT_PERL_VERBOSITY
1911
1912 This variable controls the verbosity level of the perl extension. Higher
1913 numbers indicate more verbose output.
1914
1915 =over 4
1916
1917 =item == 0 - fatal messages
1918
1919 =item >= 3 - script loading and management
1920
1921 =item >=10 - all called hooks
1922
1923 =item >=11 - hook reutrn values
1924
1925 =back
1926
1927 =head1 AUTHOR
1928
1929 Marc Lehmann <pcg@goof.com>
1930 http://software.schmorp.de/pkg/rxvt-unicode
1931
1932 =cut
1933
1934 1