ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
Revision: 1.154
Committed: Sat Jun 2 06:43:02 2007 UTC (16 years, 11 months ago) by root
Branch: MAIN
Changes since 1.153: +3 -0 lines
Log Message:
yes, perl is not that evil especially when disabled

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