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.96 by root, Tue Sep 17 17:57:49 2019 UTC vs.
Revision 1.99 by sf-exg, Sat May 8 07:45:48 2021 UTC

24 --background-border 24 --background-border
25 --background-interval seconds 25 --background-interval seconds
26 26
27=head1 QUICK AND DIRTY CHEAT SHEET 27=head1 QUICK AND DIRTY CHEAT SHEET
28 28
29Just load a random jpeg image and tile the background with it without 29Load a random jpeg image and tile the background with it without scaling
30scaling or anything else: 30or anything else:
31 31
32 load "/path/to/img.jpg" 32 load "/path/to/img.jpg"
33 33
34The same, but use mirroring/reflection instead of tiling: 34The same, but use mirroring/reflection instead of tiling:
35 35
1148vertical radius of 0 disables blurring. 1148vertical radius of 0 disables blurring.
1149 1149
1150=back 1150=back
1151 1151
1152=head2 OSC sequences 1152=head2 OSC sequences
1153
1154This extension will react to the following OSC sequences. Note that
1155this extension will not be autoloaded when these are used currently,
1156so to make urxvt recognize them, you have to enable the C<background>
1157extension. One way to achieve that is to use the C<--background-expr ''>
1158command line argument or by specifying an empty C<URxvt.background.expr:>>
1159resource.
1153 1160
1154=over 4 1161=over 4
1155 1162
1156=item B<< C<ESC ] 705 ; Pt ST> >> Change transparent background tint colour to B<< C<Pt> >>. 1163=item B<< C<ESC ] 705 ; Pt ST> >> Change transparent background tint colour to B<< C<Pt> >>.
1157 1164
1214=cut 1221=cut
1215 1222
1216} 1223}
1217 1224
1218sub parse_expr { 1225sub parse_expr {
1226 my ($expr) = @_;
1227
1228 # an empty expression is valid and represents the default background
1229 if ($expr !~ /\S/) {
1230 $expr = sub {
1231 undef
1232 };
1233 } else {
1219 my $expr = eval 1234 $expr = eval
1220 "sub {\n" 1235 "sub {\n"
1221 . "package urxvt::bgdsl;\n" 1236 . "package urxvt::bgdsl;\n"
1222 . "#line 0 'background expression'\n" 1237 . "#line 0 'background expression'\n"
1223 . "$_[0]\n" 1238 . "$expr\n"
1224 . "}"; 1239 . "}";
1225 die if $@; 1240 die if $@;
1241 }
1242
1226 $expr 1243 $expr
1227} 1244}
1228 1245
1229# compiles a parsed expression 1246# compiles a parsed expression
1230sub set_expr { 1247sub set_expr {
1321 # evaluate user expression 1338 # evaluate user expression
1322 1339
1323 my @img = eval { $self->{expr}->() }; 1340 my @img = eval { $self->{expr}->() };
1324 die $@ if $@; 1341 die $@ if $@;
1325 die "background-expr did not return anything.\n" unless @img; 1342 die "background-expr did not return anything.\n" unless @img;
1343
1344 if ($img[0]) {
1326 die "background-expr: expected image(s), got something else.\n" 1345 die "background-expr: expected image(s), got something else.\n"
1327 if grep { !UNIVERSAL::isa $_, "urxvt::img" } @img; 1346 if grep { !UNIVERSAL::isa $_, "urxvt::img" } @img;
1328 1347
1329 my $img = urxvt::bgdsl::merge @img; 1348 my $img = urxvt::bgdsl::merge @img;
1330 1349
1331 $frame->[FR_AGAIN]{size} = 1 1350 $frame->[FR_AGAIN]{size} = 1
1332 if $img->repeat_mode != urxvt::RepeatNormal; 1351 if $img->repeat_mode != urxvt::RepeatNormal;
1333 1352
1334 # if the expression is sensitive to external events, prepare reevaluation then 1353 # if the expression is sensitive to external events, prepare reevaluation then
1335 $self->compile_frame ($frame, sub { $arg_self->recalculate }); 1354 $self->compile_frame ($frame, sub { $arg_self->recalculate });
1336 1355
1337 # clear stuff we no longer need 1356 # clear stuff we no longer need
1338 1357
1339# unless (%{ $frame->[FR_STATE] }) { 1358# unless (%{ $frame->[FR_STATE] }) {
1340# delete $self->{state}; 1359# delete $self->{state};
1341# delete $self->{expr}; 1360# delete $self->{expr};
1342# } 1361# }
1343 1362
1344 # set background pixmap 1363 # set background pixmap
1345 1364
1346 $self->set_background ($img, $self->{border}); 1365 $self->set_background ($img, $self->{border});
1366 } else {
1367 $self->clr_background;
1368 }
1369
1347 $self->scr_recolor (0); 1370 $self->scr_recolor (0);
1348 $self->want_refresh; 1371 $self->want_refresh;
1349} 1372}
1350 1373
1351sub old_bg_opts { 1374sub old_bg_opts {
1358 return unless $str[0] or $self->{bg_opts}->{path}; 1381 return unless $str[0] or $self->{bg_opts}->{path};
1359 1382
1360 my $bg_opts = $self->{bg_opts}; 1383 my $bg_opts = $self->{bg_opts};
1361 1384
1362 if ($str[0]) { 1385 if ($str[0]) {
1363 $bg_opts->{tile} = 0; 1386 $bg_opts->{tile} = 0;
1364 $bg_opts->{keep_aspect} = 0; 1387 $bg_opts->{keep_aspect} = 0;
1365 $bg_opts->{root_align} = 0; 1388 $bg_opts->{root_align} = 0;
1366 $bg_opts->{h_scale} = $bg_opts->{v_scale} = 100; 1389 $bg_opts->{h_scale} = $bg_opts->{v_scale} = 100;
1367 $bg_opts->{h_align} = $bg_opts->{v_align} = 50; 1390 $bg_opts->{h_align} = $bg_opts->{v_align} = 50;
1368 $bg_opts->{path} = unpack "H*", $str[0]; 1391 $bg_opts->{path} = $str[0];
1369 } 1392 }
1370 1393
1371 my @oplist = split /:/, $str[1]; 1394 my @oplist = split /:/, $str[1];
1372 1395
1373 for (@oplist) { 1396 for (@oplist) {
1422 $bg_opts->{v_align} = $y if defined $y; 1445 $bg_opts->{v_align} = $y if defined $y;
1423 } 1446 }
1424 } 1447 }
1425} 1448}
1426 1449
1450# helper function, quote string as perl without allowing
1451# any code execution or other shenanigans. does not
1452# support binary NULs in string.
1453sub q0 {
1454 (my $str = shift) =~ s/\x00//g; # make sure there really aren't any embedded NULs
1455 "q\x00$str\x00"
1456}
1457
1427sub old_bg_expr { 1458sub old_bg_expr {
1428 my ($self) = @_; 1459 my ($self) = @_;
1429 1460
1430 my $expr; 1461 my $expr;
1431 1462
1446 } 1477 }
1447 1478
1448 my $tint = $bg_opts->{tint}; 1479 my $tint = $bg_opts->{tint};
1449 1480
1450 if ($tint) { 1481 if ($tint) {
1482 $tint = q0 $tint;
1451 $expr .= "tint $tint, "; 1483 $expr .= "tint $tint,";
1452 } 1484 }
1453 1485
1454 my $blur = $bg_opts->{blur}; 1486 my $blur = $bg_opts->{blur};
1455 1487
1456 if ($blur and $blur =~ /^ =? ([0-9]+)? (?:[xX] ([0-9]+))? $/x) { 1488 if ($blur and $blur =~ /^ =? ([0-9]+)? (?:[xX] ([0-9]+))? $/x) {
1487 if ($h_scale != 0 and $v_scale != 0) { 1519 if ($h_scale != 0 and $v_scale != 0) {
1488 my $op = $bg_opts->{keep_aspect} ? "fit" : "resize"; 1520 my $op = $bg_opts->{keep_aspect} ? "fit" : "resize";
1489 $file_expr .= "$op TW * $h_scale, TH * $v_scale, "; 1521 $file_expr .= "$op TW * $h_scale, TH * $v_scale, ";
1490 } 1522 }
1491 1523
1524 my $path = q0 $bg_opts->{path};
1525
1492 $file_expr .= "keep { load pack \"H*\", \"$bg_opts->{path}\" })"; 1526 $file_expr .= "keep { load $path })";
1493 1527
1494 if ($expr) { 1528 if ($expr) {
1495 $expr .= ", tint (\"[50]white\", $file_expr)"; 1529 $expr .= ", tint (\"[50]white\", $file_expr)";
1496 } else { 1530 } else {
1497 $expr = $file_expr; 1531 $expr = $file_expr;
1545 1579
1546 if (!$expr) { 1580 if (!$expr) {
1547 $self->{bg_opts} = { h_scale => 100, v_scale => 100, 1581 $self->{bg_opts} = { h_scale => 100, v_scale => 100,
1548 h_align => 50, v_align => 50 }; 1582 h_align => 50, v_align => 50 };
1549 1583
1550 $self->{bg_opts}->{shade} = $self->find_resource ("shading", "sh"); 1584 $self->{bg_opts}{shade} = $self->find_resource ("shading", "sh");
1551 $self->{bg_opts}->{tint} = $self->find_resource ("tintColor", "tint"); 1585 $self->{bg_opts}{tint} = $self->find_resource ("tintColor", "tint");
1552 $self->{bg_opts}->{blur} = $self->find_resource ("blurRadius", "blr"); 1586 $self->{bg_opts}{blur} = $self->find_resource ("blurRadius", "blr");
1553 $self->{bg_opts}->{root} = $self->find_resource ("transparent", "tr"); 1587 $self->{bg_opts}{root} = $self->find_resource ("transparent", "tr");
1554 1588
1555 $self->old_bg_opts ($self->find_resource ("backgroundPixmap", "pixmap")); 1589 $self->old_bg_opts ($self->find_resource ("backgroundPixmap", "pixmap"));
1556 $expr = $self->old_bg_expr; 1590 $expr = $self->old_bg_expr;
1557 } 1591 }
1558 1592
1559 $expr or return;
1560
1561 $self->set_expr (parse_expr $expr); 1593 $self->set_expr (parse_expr $expr);
1562 $self->{border} = $self->x_resource_boolean ("%.border"); 1594 $self->{border} = $self->x_resource_boolean ("%.border");
1563 1595
1564 $MIN_INTERVAL = $self->x_resource ("%.interval"); 1596 $MIN_INTERVAL = $self->x_resource ("%.interval");
1565 1597

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines