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.5 by root, Mon Jan 2 17:20:00 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) {
183 return 1 if $v->($term, @_); 304 return 1 if $v->($term, @_);
184 } 305 }
185 306
186 0 307 0
187} 308}
188
189# find on_xxx subs in the package and register them
190# as hooks
191sub register_package($) {
192 my ($pkg) = @_;
193
194 for my $hook (0.. $#HOOKNAME) {
195 my $name = $HOOKNAME[$hook];
196
197 my $ref = $pkg->can ("on_" . lc $name)
198 or next;
199
200 $invoke_cb[$hook]{$ref*1} = $ref;
201 set_should_invoke $hook, 1;
202 }
203}
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 309
232=back 310=back
233 311
234=head2 The C<urxvt::term> Class 312=head2 The C<urxvt::term> Class
235 313
258 336
259 answerbackstring backgroundPixmap backspace_key boldFont boldItalicFont 337 answerbackstring backgroundPixmap backspace_key boldFont boldItalicFont
260 borderLess color cursorBlink cursorUnderline cutchars delete_key 338 borderLess color cursorBlink cursorUnderline cutchars delete_key
261 display_name embed ext_bwidth fade font geometry hold iconName 339 display_name embed ext_bwidth fade font geometry hold iconName
262 imFont imLocale inputMethod insecure int_bwidth intensityStyles 340 imFont imLocale inputMethod insecure int_bwidth intensityStyles
263 italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 341 italicFont jumpScroll lineSpace loginShell mapAlert menu meta8 modifier
264 modifier mouseWheelScrollPage name pastableTabs path pointerBlank 342 mouseWheelScrollPage name pastableTabs path perl_eval perl_ext
265 pointerBlankDelay preeditType print_pipe pty_fd reverseVideo saveLines 343 perl_lib pointerBlank pointerBlankDelay preeditType print_pipe pty_fd
266 scrollBar scrollBar_align scrollBar_floating scrollBar_right 344 reverseVideo saveLines scrollBar scrollBar_align scrollBar_floating
267 scrollBar_thickness scrollTtyKeypress scrollTtyOutput scrollWithBuffer 345 scrollBar_right scrollBar_thickness scrollTtyKeypress scrollTtyOutput
268 scrollstyle secondaryScreen secondaryScroll selectstyle shade term_name 346 scrollWithBuffer scrollstyle secondaryScreen secondaryScroll selectstyle
269 title transparent transparent_all tripleclickwords utmpInhibit 347 shade term_name title transparent transparent_all tripleclickwords
270 visualBell 348 utmpInhibit visualBell
271 349
272=cut 350=cut
273 351
274sub urxvt::term::resource($$;$) { 352sub urxvt::term::resource($$;$) {
275 my ($self, $name) = (shift, shift); 353 my ($self, $name) = (shift, shift);
305 my ($self, $x, $y, $text) = @_; 383 my ($self, $x, $y, $text) = @_;
306 384
307 my @lines = split /\n/, $text; 385 my @lines = split /\n/, $text;
308 386
309 my $w = 0; 387 my $w = 0;
310 for (map urxvt::wcswidth $_, @lines) { 388 for (map $self->strwidth ($_), @lines) {
311 $w = $_ if $w < $_; 389 $w = $_ if $w < $_;
312 } 390 }
313 391
314 $self->scr_overlay_new ($x, $y, $w, scalar @lines); 392 $self->scr_overlay_new ($x, $y, $w, scalar @lines);
315 $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines; 393 $self->scr_overlay_set (0, $_, $lines[$_]) for 0.. $#lines;
333 411
334=item $term->scr_overlay_set ($x, $y, $text) 412=item $term->scr_overlay_set ($x, $y, $text)
335 413
336Write a string at the given position into the overlay. 414Write a string at the given position into the overlay.
337 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
338=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
339 534
340=head2 The C<urxvt::timer> Class 535=head2 The C<urxvt::timer> Class
341 536
342This class implements timer watchers/events. Time is represented as a 537This class implements timer watchers/events. Time is represented as a
343fractional number of seconds since the epoch. Example: 538fractional number of seconds since the epoch. Example:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines