… | |
… | |
13 | use Safe; |
13 | use Safe; |
14 | |
14 | |
15 | our ($bgdsl_self, $old, $new); |
15 | our ($bgdsl_self, $old, $new); |
16 | our ($l, $t, $w, $h); |
16 | our ($l, $t, $w, $h); |
17 | |
17 | |
18 | our $MIN_INTERVAL = 1/60; |
18 | our $MIN_INTERVAL = 1/100; |
19 | |
19 | |
20 | { |
20 | { |
21 | package urxvt::bgdsl; # background language |
21 | package urxvt::bgdsl; # background language |
22 | |
22 | |
23 | *repeat_black = \&urxvt::RepeatNone; #TODO wtf |
23 | *repeat_black = \&urxvt::RepeatNone; #TODO wtf |
… | |
… | |
137 | |
137 | |
138 | # evaluate the current bg expression |
138 | # evaluate the current bg expression |
139 | sub recalculate { |
139 | sub recalculate { |
140 | my ($self) = @_; |
140 | my ($self) = @_; |
141 | |
141 | |
|
|
142 | # rate limit evaluation |
|
|
143 | |
142 | if ($self->{next_refresh} > urxvt::NOW) { |
144 | if ($self->{next_refresh} > urxvt::NOW) { |
143 | $self->{next_refresh_timer} = urxvt::timer->new->after ($self->{next_refresh} - urxvt::NOW)->cb (sub { |
145 | $self->{next_refresh_timer} = urxvt::timer->new->after ($self->{next_refresh} - urxvt::NOW)->cb (sub { |
144 | $self->recalculate; |
146 | $self->recalculate; |
145 | }); |
147 | }); |
146 | } |
148 | } |
147 | |
149 | |
148 | $self->{next_refresh} = urxvt::NOW + $MIN_INTERVAL; |
150 | $self->{next_refresh} = urxvt::NOW + $MIN_INTERVAL; |
149 | |
151 | |
150 | #TODO: rate limit calls |
152 | # set environment to evaluate user expression |
151 | |
153 | |
152 | local $bgdsl_self = $self; |
154 | local $bgdsl_self = $self; |
153 | |
155 | |
154 | local $old = $self->{state}; |
156 | local $old = $self->{state}; |
155 | local $new = my $state = $self->{state} = {}; |
157 | local $new = my $state = $self->{state} = {}; |
156 | |
158 | |
157 | ($l, $t, $w, $h) = |
159 | ($l, $t, $w, $h) = |
158 | $self->get_geometry; |
160 | $self->get_geometry; |
159 | |
161 | |
|
|
162 | # evaluate user expression |
|
|
163 | |
160 | my $img = eval { $self->{expr}->() }; |
164 | my $img = eval { $self->{expr}->() }; |
161 | warn $@ if $@;#d# |
165 | warn $@ if $@;#d# |
|
|
166 | |
|
|
167 | # if the expression is sensitive to external events, prepare reevaluation then |
162 | |
168 | |
163 | my $repeat; |
169 | my $repeat; |
164 | |
170 | |
165 | if (my $again = $state->{again}) { |
171 | if (my $again = $state->{again}) { |
166 | $repeat = 1; |
172 | $repeat = 1; |
… | |
… | |
191 | $self->enable (rootpmap_change => sub { $_[0]->recalculate }); |
197 | $self->enable (rootpmap_change => sub { $_[0]->recalculate }); |
192 | } else { |
198 | } else { |
193 | $self->disable ("rootpmap_change"); |
199 | $self->disable ("rootpmap_change"); |
194 | } |
200 | } |
195 | |
201 | |
|
|
202 | # clear stuff we no longer need |
|
|
203 | |
196 | %$old = (); |
204 | %$old = (); |
197 | |
205 | |
198 | unless ($repeat) { |
206 | unless ($repeat) { |
199 | delete $self->{state}; |
207 | delete $self->{state}; |
200 | delete $self->{expr}; |
208 | delete $self->{expr}; |
201 | } |
209 | } |
202 | |
210 | |
|
|
211 | # prepare and set background pixmap |
|
|
212 | |
203 | $img = $img->sub_rect (0, 0, $w, $h) |
213 | $img = $img->sub_rect (0, 0, $w, $h) |
204 | if $img->w != $w || $img->h != $h; |
214 | if $img->w != $w || $img->h != $h; |
205 | |
215 | |
206 | $self->set_background ($img); |
216 | $self->set_background ($img); |
207 | $self->scr_recolour (0); |
217 | $self->scr_recolour (0); |