ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.110
Committed: Thu Jan 19 16:22:13 2006 UTC (18 years, 4 months ago) by root
Branch: MAIN
CVS Tags: rel-7_1
Changes since 1.109: +4 -6 lines
Log Message:
*** empty log message ***

File Contents

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