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

Comparing rxvt-unicode/src/perl/background (file contents):
Revision 1.14 by root, Tue Jun 5 22:23:07 2012 UTC vs.
Revision 1.28 by root, Thu Jun 7 12:56:27 2012 UTC

1#! perl 1#! perl
2 2
3#:META:RESOURCE:$$:string:background expression 3#:META:X_RESOURCE:%.expr:string:background expression
4#:META:RESOURCE:$$-enable:boolean:some boolean 4#:META:X_RESOURCE:%.enable:boolean:some boolean
5#:META:X_RESOURCE:%.extra.:value:extra config
5 6
6our $EXPR = 'move load "/root/pix/das_fette_schwein.jpg", repeat_wrap, X, Y'; 7our $EXPR;
8#$EXPR = 'move W * 0.1, -H * 0.1, resize W * 0.5, H * 0.5, repeat_none load "opensource.png"';
9$EXPR = 'border; move -X, -Y, load "argb.png"';
7$EXPR = ' 10#$EXPR = '
8 rotate W, H, 50, 50, counter 1/59.95, repeat_mirror, 11# rotate W, H, 50, 50, counter 1/59.95, repeat_mirror,
9 clip X, Y, W, H, repeat_mirror, 12# clip X, Y, W, H, repeat_mirror,
10 load "/root/pix/das_fette_schwein.jpg" 13# load "/root/pix/das_fette_schwein.jpg"
11'; 14#';
15#$EXPR = 'solid "red"';
12#$EXPR = 'blur root, 10, 10' 16#$EXPR = 'blur root, 10, 10'
13#$EXPR = 'blur move (root, -x, -y), 5, 5' 17#$EXPR = 'blur move (root, -x, -y), 5, 5'
14#resize load "/root/pix/das_fette_schwein.jpg", w, h 18#resize load "/root/pix/das_fette_schwein.jpg", w, h
15 19
16use Safe; 20use Safe;
17 21
22our $border;
18our ($bgdsl_self, $old, $new); 23our ($bgdsl_self, $old, $new);
19our ($l, $t, $w, $h); 24our ($l, $t, $w, $h);
20 25
21# enforce at leats this time between updates 26# enforce at least this interval between updates
22our $MIN_INTERVAL = 1/100; 27our $MIN_INTERVAL = 1/100;
23 28
24{ 29{
25 package urxvt::bgdsl; # background language 30 package urxvt::bgdsl; # background language
26 31
27 *repeat_black = \&urxvt::RepeatNone; #TODO wtf 32# *repeat_empty = \&urxvt::RepeatNone;
28 *repeat_wrap = \&urxvt::RepeatNormal; 33# *repeat_tile = \&urxvt::RepeatNormal;
29 *repeat_pad = \&urxvt::RepeatPad; 34# *repeat_pad = \&urxvt::RepeatPad;
30 *repeat_mirror = \&urxvt::RepeatReflect; 35# *repeat_mirror = \&urxvt::RepeatReflect;
36
37=head2 PROVIDERS/GENERATORS
38
39=over 4
40
41=item load $path
42
43=cut
31 44
32 sub load($) { 45 sub load($) {
33 my ($path) = @_; 46 my ($path) = @_;
34 47
35 $new->{load}{$path} = $old->{load}{$path} || $bgdsl_self->new_img_from_file ($path); 48 $new->{load}{$path} = $old->{load}{$path} || $bgdsl_self->new_img_from_file ($path);
38 sub root() { 51 sub root() {
39 $new->{rootpmap_sensitive} = 1; 52 $new->{rootpmap_sensitive} = 1;
40 die "root op not supported, exg, we need you"; 53 die "root op not supported, exg, we need you";
41 } 54 }
42 55
56 sub solid($;$$) {
57 my $img = $bgdsl_self->new_img (urxvt::PictStandardARGB32, $_[1] || 1, $_[2] || 1);
58 $img->fill ($_[0]);
59 $img
60 }
61
62=back
63
64=head2 VARIABLES
65
66=over 4
67
68=cut
69
70 sub X() { $new->{position_sensitive} = 1; $l }
71 sub Y() { $new->{position_sensitive} = 1; $t }
72 sub W() { $new->{size_sensitive} = 1; $w }
73 sub H() { $new->{size_sensitive} = 1; $h }
74
75 sub now() { urxvt::NOW }
76
77 sub again($) {
78 $new->{again} = $_[0];
79 }
80
81 sub counter($) {
82 $new->{again} = $_[0];
83 $bgdsl_self->{counter} + 0
84 }
85
86=back
87
88=head2 TILING MODES
89
90The following operators modify the tiling mode of an image, that is, the
91way that pixels outside the image area are painted when the image is used.
92
93=over 4
94
95=item tile $img
96
97Tiles the whole plane with the image and returns this new image - or in
98other words, it returns a copy of the image in plane tiling mode.
99
100=item mirror $img
101
102Similar to tile, but reflects the image each time it uses a new copy, so
103that top edges always touch top edges, right edges always touch right
104edges and so on (with normal tiling, left edges always touch right edges
105and top always touch bottom edges).
106
107=item pad $img
108
109Takes an image and modifies it so that all pixels outside the image area
110become transparent. This mode is most useful when you want to place an
111image over another image or the background colour while leaving all
112background pixels outside the image unchanged.
113
114=item extend $img
115
116Extends the image over the whole plane, using the closest pixel in the
117area outside the image. This mode is mostly useful when you more complex
118filtering operations and want the pixels outside the image to have the
119same values as the pixels near the edge.
120
121=cut
122
123 sub pad($) {
124 my $img = $_[0]->clone;
125 $img->repeat_mode (urxvt::RepeatNone);
126 $img
127 }
128
129 sub tile($) {
130 my $img = $_[0]->clone;
131 $img->repeat_mode (urxvt::RepeatNormal);
132 $img
133 }
134
135 sub mirror($) {
136 my $img = $_[0]->clone;
137 $img->repeat_mode (urxvt::RepeatReflect);
138 $img
139 }
140
141 sub extend($) {
142 my $img = $_[0]->clone;
143 $img->repeat_mode (urxvt::RepeatPad);
144 $img
145 }
146
147=back
148
149=head2 PIXEL OPERATORS
150
151The following operators modify the image pixels in various ways.
152
153=over 4
154
155=item clone $img
156
157Returns an exact copy of the image.
158
159=cut
160
43# sub clone($) { 161 sub clone($) {
44# $_[0]->clone 162 $_[0]->clone
45# } 163 }
46 164
165=item clip $img
166
167=item clip $width, $height, $img
168
169=item clip $x, $y, $width, $height, $img
170
171Clips an image to the given rectangle. If the rectangle is outside the
172image area (e.g. when C<$x> or C<$y> are negative) or the rectangle is
173larger than the image, then the tiling mode defines how the extra pixels
174will be filled.
175
176If C<$x> an C<$y> are missing, then C<0> is assumed for both.
177
178If C<$width> and C<$height> are missing, then the window size will be
179assumed.
180
181Example: load an image, blur it, and clip it to the window size to save
182memory.
183
184 clip blur 10, load "mybg.png"
185
186=cut
187
47 sub clip($$$$$;$) { 188 sub clip($;$$;$$) {
189 my $img = pop;
48 my $img = pop; 190 my $h = pop || H;
191 my $w = pop || W;
49 $img->sub_rect ($_[0], $_[1], $_[2], $_[3], $_[4]) 192 $img->sub_rect ($_[0], $_[1], $w, $h)
193 }
194
195=item scale $img
196
197=item scale $size_percent, $img
198
199=item scale $width_percent, $height_percent, $img
200
201Scales the image by the given percentages in horizontal
202(C<$width_percent>) and vertical (C<$height_percent>) direction.
203
204If only one percentage is give, it is used for both directions.
205
206If no percentages are given, scales the image to the window size without
207keeping aspect.
208
209=item resize $width, $height, $img
210
211Resizes the image to exactly C<$width> times C<$height> pixels.
212
213=cut
214
215#TODO: maximise, maximise_fill?
216
217 sub scale($$$) {
218 my $img = pop;
219
220 @_ == 2 ? $img->scale ($_[0] * $img->w * 0.01, $_[1] * $img->h * 0.01)
221 : @_ ? $img->scale ($_[0] * $img->w * 0.01, $_[0] * $img->h * 0.01)
222 : $img->scale (W, H)
50 } 223 }
51 224
52 sub resize($$$) { 225 sub resize($$$) {
53 my $img = pop; 226 my $img = pop;
54 $img->scale ($_[0], $_[1]) 227 $img->scale ($_[0], $_[1])
55 } 228 }
56 229
57 # TODO: ugly 230 # TODO: ugly
58 sub move($$;$) { 231 sub move($$;$) {
232 my $img = pop->clone;
233 $img->move ($_[0], $_[1]);
234 $img
59 my $img = pop; 235# my $img = pop;
60 $img->sub_rect ( 236# $img->sub_rect (
61 $_[0], $_[1], 237# $_[0], $_[1],
62 $img->w, $img->h, 238# $img->w, $img->h,
63 $_[2], 239# $_[2],
64 ) 240# )
65 } 241 }
66 242
67 sub rotate($$$$$$;$) { 243 sub rotate($$$$$$) {
68 my $img = pop; 244 my $img = pop;
69 $img->rotate ( 245 $img->rotate (
70 $_[0], 246 $_[0],
71 $_[1], 247 $_[1],
72 $_[2] * $img->w * .01, 248 $_[2] * $img->w * .01,
73 $_[3] * $img->h * .01, 249 $_[3] * $img->h * .01,
74 $_[4] * (3.14159265 / 180), 250 $_[4] * (3.14159265 / 180),
75 $_[5],
76 ) 251 )
77 } 252 }
78 253
79 sub blur($$$) { 254 sub blur($$;$) {
80 my ($rh, $rv, $img) = @_; 255 my $img = pop;
81 256
82 $img->blur ($rh, $rv); 257 $img->blur ($_[0], @_ >= 2 ? $_[1] : $_[0]);
83 } 258 }
84 259
85 sub contrast($$;$$;$) { 260 sub contrast($$;$$;$) {
86 my $img = pop; 261 my $img = pop;
87 my ($r, $g, $b, $a) = @_; 262 my ($r, $g, $b, $a) = @_;
104 $img = $img->clone; 279 $img = $img->clone;
105 $img->brightness ($r, $g, $b, $a); 280 $img->brightness ($r, $g, $b, $a);
106 $img 281 $img
107 } 282 }
108 283
109 sub X() { $new->{position_sensitive} = 1; $l } 284=back
110 sub Y() { $new->{position_sensitive} = 1; $t }
111 sub W() { $new->{size_sensitive} = 1; $w }
112 sub H() { $new->{size_sensitive} = 1; $h }
113 285
114 sub now() { urxvt::NOW } 286=head2 SETTINGS
115 287
116 sub again($) { 288=over 4
117 $new->{again} = $_[0];
118 }
119 289
120 sub counter($) { 290=item border $respect_border=1
121 $new->{again} = $_[0]; 291
122 $bgdsl_self->{counter} + 0 292Sets whether the image should respect the terminal border (argument true
293or missing), or whether it should fill the whole window (the default).
294
295By default, the image will cover the whole toplevel window. If C<border>
296is enabled, then it will only fill the character area and leave a normal
297border in the background colour around it and behind the scrollbar.
298
299=cut
300
301 sub border {
302 $border = @_ ? $_[0] : 1;
123 } 303 }
304
305=back
306
307=cut
308
124} 309}
125 310
126sub parse_expr { 311sub parse_expr {
127 my $expr = eval "sub {\npackage urxvt::bgdsl;\n#line 0 'background expression'\n$_[0]\n}"; 312 my $expr = eval "sub {\npackage urxvt::bgdsl;\n#line 0 'background expression'\n$_[0]\n}";
128 die if $@; 313 die if $@;
153 $self->{next_refresh} = urxvt::NOW + $MIN_INTERVAL; 338 $self->{next_refresh} = urxvt::NOW + $MIN_INTERVAL;
154 339
155 # set environment to evaluate user expression 340 # set environment to evaluate user expression
156 341
157 local $bgdsl_self = $self; 342 local $bgdsl_self = $self;
343 local $border;
158 344
159 local $old = $self->{state}; 345 local $old = $self->{state};
160 local $new = my $state = $self->{state} = {}; 346 local $new = my $state = $self->{state} = {};
161 347
162 ($l, $t, $w, $h) = 348 ($l, $t, $w, $h) =
163 $self->get_geometry; 349 $self->get_geometry;
164 350
351 warn "$l,$t,$w,$h\n";#d#
352
165 # evaluate user expression 353 # evaluate user expression
166 354
167 my $img = eval { $self->{expr}->() }; 355 my $img = eval { $self->{expr}->() };
168 warn $@ if $@;#d# 356 warn $@ if $@;#d#
357 die if !UNIVERSAL::isa $img, "urxvt::img";
169 358
170 # if the expression is sensitive to external events, prepare reevaluation then 359 # if the expression is sensitive to external events, prepare reevaluation then
171 360
172 my $repeat; 361 my $repeat;
173 362
214 # prepare and set background pixmap 403 # prepare and set background pixmap
215 404
216 $img = $img->sub_rect (0, 0, $w, $h) 405 $img = $img->sub_rect (0, 0, $w, $h)
217 if $img->w != $w || $img->h != $h; 406 if $img->w != $w || $img->h != $h;
218 407
219 $self->set_background ($img); 408 $self->set_background ($img, $border);
220 $self->scr_recolour (0); 409 $self->scr_recolour (0);
221 $self->want_refresh; 410 $self->want_refresh;
222} 411}
223 412
224sub on_start { 413sub on_start {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines