ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/urxvt.pm
(Generate patch)

Comparing rxvt-unicode/src/urxvt.pm (file contents):
Revision 1.3 by root, Mon Jan 2 15:59:25 2006 UTC vs.
Revision 1.16 by root, Tue Jan 3 01:41:06 2006 UTC

1=head1 NAME 1=head1 NAME
2 2
3rxvtperl - rxvt-unicode's embedded perl interpreter 3@@RXVT_NAME@@perl - rxvt-unicode's embedded perl interpreter
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7* Put your scripts into F<@@RXVT_LIBDIR@@/urxvt/perl-ext/>, they will be loaded automatically. 7 # create a file grab_test in $HOME:
8
9* Each script will only be loaded once, even in urxvtd, and will be valid
10globally.
11
12* Scripts are evaluated in a 'use strict' and 'use utf8' environment, and
13thus must be encoded as UTF-8.
14 8
15 sub on_sel_grab { 9 sub on_sel_grab {
16 warn "you selected ", $_[0]->selection; 10 warn "you selected ", $_[0]->selection;
17 () 11 ()
18 } 12 }
19 13
20 1 14 # start a @@RXVT_NAME@@ using it:
15
16 @@RXVT_NAME@@ --perl-lib $HOME -pe grab_test
21 17
22=head1 DESCRIPTION 18=head1 DESCRIPTION
19
20Everytime a terminal object gets created, scripts specified via the
21C<perl> resource are loaded and associated with it.
22
23Scripts are compiled in a 'use strict' and 'use utf8' environment, and
24thus must be encoded as UTF-8.
25
26Each script will only ever be loaded once, even in @@RXVT_NAME@@d, where
27scripts will be shared (but not enabled) for all terminals.
28
29=head1 PACKAGED EXTENSIONS
30
31This section describes the extensiosn delivered with this version. You can
32find them in F<@@RXVT_LIBDIR@@/urxvt/perl/>.
33
34You can activate them like this:
35
36 @@RXVT_NAME@@ -pe <extensionname>
37
38=over 4
39
40=item selection
41
42Miscellaneous selection modifications.
43
44=over 4
45
46=item rot13
47
48Rot-13 the selection when activated. Used via keyboard trigger:
49
50 URxvt.keysym.C-M-r: perl:selection:rot13
51
52=back
53
54=item digital-clock
55
56Displays a very simple digital clock in the upper right corner of the
57window. Illustrates overwriting the refresh callbacks to create your own
58overlays or changes.
59
60=item simple-overlay-clock
61
62Displays a digital clock using the built-in overlay (colorful, useless).
63
64=back
65
66=head2 General API Considerations
67
68All objects (such as terminals, time watchers etc.) are typical
69reference-to-hash objects. The hash can be used to store anything you
70like. All members starting with an underscore (such as C<_ptr> or
71C<_hook>) are reserved for internal uses and must not be accessed or
72modified).
73
74When objects are destroyed on the C++ side, the perl object hashes are
75emptied, so its best to store related objects such as time watchers and
76the like inside the terminal object so they get destroyed as soon as the
77terminal is destroyed.
23 78
24=head2 Hooks 79=head2 Hooks
25 80
26The following subroutines can be declared in loaded scripts, and will be called 81The following subroutines can be declared in loaded scripts, and will be called
27whenever the relevant event happens. 82whenever the relevant event happens.
106 161
107=item on_refresh_end $term 162=item on_refresh_end $term
108 163
109Called just after the screen gets redrawn. See C<on_refresh_begin>. 164Called just after the screen gets redrawn. See C<on_refresh_begin>.
110 165
166=item on_keyboard_command $term, $string
167
168Called whenever the user presses a key combination that has a
169C<perl:string> action bound to it (see description of the B<keysym>
170resource in the @@RXVT_NAME@@(1) manpage).
171
111=back 172=back
112 173
113=head2 Functions in the C<urxvt> Package 174=head2 Functions in the C<urxvt> Package
114 175
115=over 4 176=over 4
120costs! The only time this is acceptable is when the terminal process 181costs! The only time this is acceptable is when the terminal process
121starts up. 182starts up.
122 183
123=item urxvt::warn $string 184=item urxvt::warn $string
124 185
125Calls C<rxvt_warn> witht eh given string which should not include a 186Calls C<rxvt_warn> with the given string which should not include a
126newline. The module also overwrites the C<warn> builtin with a function 187newline. The module also overwrites the C<warn> builtin with a function
127that calls this function. 188that calls this function.
128 189
129Using this function has the advantage that its output ends up in the 190Using this function has the advantage that its output ends up in the
130correct place, e.g. on stderr of the connecting urxvtc client. 191correct place, e.g. on stderr of the connecting urxvtc client.
131
132=item $cellwidth = urxvt::wcswidth $string
133
134Returns the number of screen-cells this string would need. Correctly
135accounts for wide and combining characters.
136 192
137=item $time = urxvt::NOW 193=item $time = urxvt::NOW
138 194
139Returns the "current time" (as per the event loop). 195Returns the "current time" (as per the event loop).
140 196
158 unless $msg =~ /\n$/; 214 unless $msg =~ /\n$/;
159 urxvt::warn ($msg); 215 urxvt::warn ($msg);
160 }; 216 };
161} 217}
162 218
219my @hook_count;
163my $verbosity = $ENV{URXVT_PERL_VERBOSITY} || 10; 220my $verbosity = $ENV{URXVT_PERL_VERBOSITY};
164 221
165sub verbose { 222sub verbose {
166 my ($level, $msg) = @_; 223 my ($level, $msg) = @_;
167 warn "$msg\n"; #d# 224 warn "$msg\n" if $level <= $verbosity;
168} 225}
169 226
170my @invoke_cb; 227# find on_xxx subs in the package and register them
228# as hooks
229sub register_package($) {
230 my ($pkg) = @_;
231
232 for my $htype (0.. $#HOOKNAME) {
233 my $name = $HOOKNAME[$htype];
234
235 my $ref = $pkg->can ("on_" . lc $name)
236 or next;
237
238 $term->{_hook}[$htype]{$ref*1} = $ref;
239 $hook_count[$htype]++
240 or set_should_invoke $htype, 1;
241 }
242}
243
244my $script_pkg = "script0000";
245my %script_pkg;
246
247# load a single script into its own package, once only
248sub script_package($) {
249 my ($path) = @_;
250
251 $script_pkg{$path} ||= do {
252 my $pkg = "urxvt::" . ($script_pkg++);
253
254 verbose 3, "loading script '$path' into package '$pkg'";
255
256 open my $fh, "<:raw", $path
257 or die "$path: $!";
258
259 my $source = "package $pkg; use strict; use utf8;\n"
260 . "#line 1 \"$path\"\n{\n"
261 . (do { local $/; <$fh> })
262 . "\n};\n1";
263
264 eval $source or die "$path: $@";
265
266 $pkg
267 }
268}
171 269
172# called by the rxvt core 270# called by the rxvt core
173sub invoke { 271sub invoke {
174 local $term = shift; 272 local $term = shift;
175 my $htype = shift; 273 my $htype = shift;
176 274
177 my $cb = $invoke_cb[$htype]; 275 if ($htype == 0) { # INIT
276 my @dirs = ((split /:/, $term->resource ("perl_lib")), "$LIBDIR/perl");
277
278 for my $ext (split /:/, $term->resource ("perl_ext")) {
279 my @files = grep -f $_, map "$_/$ext", @dirs;
280
281 if (@files) {
282 register_package script_package $files[0];
283 } else {
284 warn "perl extension '$ext' not found in perl library search path\n";
285 }
286 }
287
288 } elsif ($htype == 1) { # DESTROY
289 if (my $hook = $term->{_hook}) {
290 for my $htype (0..$#$hook) {
291 $hook_count[$htype] -= scalar keys %{ $hook->[$htype] || {} }
292 or set_should_invoke $htype, 0;
293 }
294 }
295 }
296
297 my $cb = $term->{_hook}[$htype]
298 or return;
178 299
179 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $term, @_) . ")" 300 verbose 10, "$HOOKNAME[$htype] (" . (join ", ", $term, @_) . ")"
180 if $verbosity >= 10; 301 if $verbosity >= 10;
181 302
182 while (my ($k, $v) = each %$cb) { 303 while (my ($k, $v) = each %$cb) {
184 } 305 }
185 306
186 0 307 0
187} 308}
188 309
189# find on_xxx subs in the package and register them 310=back
190# as hooks
191sub register_package($) {
192 my ($pkg) = @_;
193 311
194 for my $hook (0.. $#HOOKNAME) { 312=head2 The C<urxvt::term> Class
195 my $name = $HOOKNAME[$hook];
196 313
197 my $ref = $pkg->can ("on_" . lc $name) 314=over 4
198 or next;
199 315
200 $invoke_cb[$hook]{$ref*1} = $ref; 316=item $value = $term->resource ($name[, $newval])
201 set_should_invoke $hook, 1; 317
202 } 318Returns the current resource value associated with a given name and
319optionally sets a new value. Setting values is most useful in the C<init>
320hook. Unset resources are returned and accepted as C<undef>.
321
322The new value must be properly encoded to a suitable character encoding
323before passing it to this method. Similarly, the returned value may need
324to be converted from the used encoding to text.
325
326Resource names are as defined in F<src/rsinc.h>. Colours can be specified
327as resource names of the form C<< color+<index> >>, e.g. C<color+5>. (will
328likely change).
329
330Please note that resource strings will currently only be freed when the
331terminal is destroyed, so changing options frequently will eat memory.
332
333Here is a a likely non-exhaustive list of resource names, not all of which
334are supported in every build, please see the source to see the actual
335list:
336
337 answerbackstring backgroundPixmap backspace_key boldFont boldItalicFont
338 borderLess color cursorBlink cursorUnderline cutchars delete_key
339 display_name embed ext_bwidth fade font geometry hold iconName
340 imFont imLocale inputMethod insecure int_bwidth intensityStyles
341 italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier
342 mouseWheelScrollPage name pastableTabs path perl_eval perl_ext
343 perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd
344 reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating
345 scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput
346 scrollWithBuffer scrollstyle secondaryScreen secondaryScroll selectstyle
347 shade term_name title transparent transparent_all tripleclickwords
348 utmpInhibit visualBell
349
350=cut
351
352sub urxvt::term::resource($$;$) {
353 my ($self, $name) = (shift, shift);
354 unshift @_, $self, $name, ($name =~ s/\s*\+\s*(\d+)$// ? $1 : 0);
355 goto &urxvt::term::_resource;
203} 356}
204
205my $script_pkg = "script0000";
206my %script_pkg;
207
208# load a single script into its own package, once only
209sub load_script($) {
210 my ($path) = @_;
211
212 $script_pkg{$path} ||= do {
213 my $pkg = $script_pkg++;
214 verbose 3, "loading script '$path' into package '$pkg'";
215
216 open my $fh, "<:raw", $path
217 or die "$path: $!";
218
219 eval "package $pkg; use strict; use utf8;\n"
220 . "#line 1 \"$path\"\n"
221 . do { local $/; <$fh> }
222 or die "$path: $@";
223
224 register_package $pkg;
225
226 $pkg
227 };
228}
229
230load_script $_ for grep -f $_, <$LIBDIR/perl-ext/*>;
231
232
233=back
234
235=head2 The C<urxvt::term> Class
236
237=over 4
238 357
239=item ($row, $col) = $term->selection_mark ([$row, $col]) 358=item ($row, $col) = $term->selection_mark ([$row, $col])
240 359
241=item ($row, $col) = $term->selection_beg ([$row, $col]) 360=item ($row, $col) = $term->selection_beg ([$row, $col])
242 361
264 my ($self, $x, $y, $text) = @_; 383 my ($self, $x, $y, $text) = @_;
265 384
266 my @lines = split /\n/, $text; 385 my @lines = split /\n/, $text;
267 386
268 my $w = 0; 387 my $w = 0;
269 for (map urxvt::wcswidth $_, @lines) { 388 for (map $self->strwidth ($_), @lines) {
270 $w = $_ if $w < $_; 389 $w = $_ if $w < $_;
271 } 390 }
272 391
273 $self->scr_overlay_new ($x, $y, $w, scalar @lines); 392 $self->scr_overlay_new ($x, $y, $w, scalar @lines);
274 $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines; 393 $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines;
292 411
293=item $term->scr_overlay_set ($x, $y, $text) 412=item $term->scr_overlay_set ($x, $y, $text)
294 413
295Write a string at the given position into the overlay. 414Write a string at the given position into the overlay.
296 415
416=item $cellwidth = $term->strwidth $string
417
418Returns the number of screen-cells this string would need. Correctly
419accounts for wide and combining characters.
420
421=item $octets = $term->locale_encode $string
422
423Convert the given text string into the corresponding locale encoding.
424
425=item $string = $term->locale_decode $octets
426
427Convert the given locale-encoded octets into a perl string.
428
429=item $term->tt_write ($octets)
430
431Write the octets given in C<$data> to the tty (i.e. as program input). To
432pass characters instead of octets, you should convert your strings first
433to the locale-specific encoding using C<< $term->locale_encode >>.
434
435=item $nrow = $term->nrow
436
437=item $ncol = $term->ncol
438
439Return the number of rows/columns of the terminal window (i.e. as
440specified by C<-geometry>, excluding any scrollback).
441
442=item $nsaved = $term->nsaved
443
444Returns the number of lines in the scrollback buffer.
445
446=item $view_start = $term->view_start ([$newvalue])
447
448Returns the negative row number of the topmost line. Minimum value is
449C<0>, which displays the normal terminal contents. Larger values scroll
450this many lines into the scrollback buffer.
451
452=item $term->want_refresh
453
454Requests a screen refresh. At the next opportunity, rxvt-unicode will
455compare the on-screen display with its stored representation. If they
456differ, it redraws the differences.
457
458Used after changing terminal contents to display them.
459
460=item $text = $term->ROW_t ($row_number[, $new_text[, $start_col]])
461
462Returns the text of the entire row with number C<$row_number>. Row C<0>
463is the topmost terminal line, row C<< $term->$ncol-1 >> is the bottommost
464terminal line. The scrollback buffer starts at line C<-1> and extends to
465line C<< -$term->nsaved >>.
466
467If C<$new_text> is specified, it will replace characters in the current
468line, starting at column C<$start_col> (default C<0>), which is useful
469to replace only parts of a line. The font iindex in the rendition will
470automatically be updated.
471
472C<$text> is in a special encoding: tabs and wide characters that use more
473than one cell when displayed are padded with urxvt::NOCHAR characters
474(C<chr 65535>). Characters with combining characters and other characters
475that do not fit into the normal tetx encoding will be replaced with
476characters in the private use area.
477
478You have to obey this encoding when changing text. The advantage is
479that C<substr> and similar functions work on screen cells and not on
480characters.
481
482The methods C<< $term->special_encode >> and C<< $term->special_decode >>
483can be used to convert normal strings into this encoding and vice versa.
484
485=item $rend = $term->ROW_r ($row_number[, $new_rend[, $start_col]])
486
487Like C<< $term->ROW_t >>, but returns an arrayref with rendition
488bitsets. Rendition bitsets contain information about colour, font, font
489styles and similar information. See also C<< $term->ROW_t >>.
490
491When setting rendition, the font mask will be ignored.
492
493See the section on RENDITION, below.
494
495=item $length = $term->ROW_l ($row_number[, $new_length])
496
497Returns the number of screen cells that are in use ("the line length"). If
498it is C<-1>, then the line is part of a multiple-row logical "line", which
499means all characters are in use and it is continued on the next row.
500
501=item $text = $term->special_encode $string
502
503Converts a perl string into the special encoding used by rxvt-unicode,
504where one character corresponds to one screen cell. See
505C<< $term->ROW_t >> for details.
506
507=item $string = $term->special_decode $text
508
509Converts rxvt-unicodes text reprsentation into a perl string. See
510C<< $term->ROW_t >> for details.
511
297=back 512=back
513
514=head2 RENDITION
515
516Rendition bitsets contain information about colour, font, font styles and
517similar information for each screen cell.
518
519The following "macros" deal with changes in rendition sets. You should
520never just create a bitset, you should always modify an existing one,
521as they contain important information required for correct operation of
522rxvt-unicode.
523
524=over 4
525
526=item $rend = urxvt::DEFAULT_RSTYLE
527
528Returns the default rendition, as used when the terminal is starting up or
529being reset. Useful as a base
530
531=back
532
533=cut
298 534
299=head2 The C<urxvt::timer> Class 535=head2 The C<urxvt::timer> Class
300 536
301This class implements timer watchers/events. Time is represented as a 537This class implements timer watchers/events. Time is represented as a
302fractional number of seconds since the epoch. Example: 538fractional number of seconds since the epoch. Example:
391 627
392Stop watching for events on the given filehandle. 628Stop watching for events on the given filehandle.
393 629
394=back 630=back
395 631
632=head1 ENVIRONMENT
633
634=head2 URXVT_PERL_VERBOSITY
635
636This variable controls the verbosity level of the perl extension. Higher
637numbers indicate more verbose output.
638
639=over 4
640
641=item 0 - only fatal messages
642
643=item 3 - script loading and management
644
645=item 10 - all events received
646
647=back
648
396=head1 AUTHOR 649=head1 AUTHOR
397 650
398 Marc Lehmann <pcg@goof.com> 651 Marc Lehmann <pcg@goof.com>
399 http://software.schmorp.de/pkg/rxvt-unicode 652 http://software.schmorp.de/pkg/rxvt-unicode
400 653

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines