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.92 by sf-exg, Thu Jul 14 05:33:26 2016 UTC vs.
Revision 1.97 by root, Tue Sep 17 18:17:14 2019 UTC

1302 return; 1302 return;
1303 } 1303 }
1304 1304
1305 $arg_self->{next_refresh} = urxvt::NOW + $MIN_INTERVAL; 1305 $arg_self->{next_refresh} = urxvt::NOW + $MIN_INTERVAL;
1306 1306
1307 unless ($arg_self->has_render) {
1308 warn "background extension needs RENDER extension 0.10 or higher, ignoring background-expr.\n";
1309 return;
1310 }
1311
1307 # set environment to evaluate user expression 1312 # set environment to evaluate user expression
1308 1313
1309 local $self = $arg_self; 1314 local $self = $arg_self;
1310 local $HOME = $ENV{HOME}; 1315 local $HOME = $ENV{HOME};
1311 local $frame = $self->{root}; 1316 local $frame = $self->{root};
1353 return unless $str[0] or $self->{bg_opts}->{path}; 1358 return unless $str[0] or $self->{bg_opts}->{path};
1354 1359
1355 my $bg_opts = $self->{bg_opts}; 1360 my $bg_opts = $self->{bg_opts};
1356 1361
1357 if ($str[0]) { 1362 if ($str[0]) {
1358 $bg_opts->{tile} = 0; 1363 $bg_opts->{tile} = 0;
1359 $bg_opts->{keep_aspect} = 0; 1364 $bg_opts->{keep_aspect} = 0;
1360 $bg_opts->{root_align} = 0; 1365 $bg_opts->{root_align} = 0;
1361 $bg_opts->{h_scale} = $bg_opts->{v_scale} = 100; 1366 $bg_opts->{h_scale} = $bg_opts->{v_scale} = 100;
1362 $bg_opts->{h_align} = $bg_opts->{v_align} = 50; 1367 $bg_opts->{h_align} = $bg_opts->{v_align} = 50;
1363 $bg_opts->{path} = unpack "H*", $str[0]; 1368 $bg_opts->{path} = $str[0];
1364 } 1369 }
1365 1370
1366 my @oplist = split /:/, $str[1]; 1371 my @oplist = split /:/, $str[1];
1367 1372
1368 for (@oplist) { 1373 for (@oplist) {
1396 $bg_opts->{root_align} = 1; 1401 $bg_opts->{root_align} = 1;
1397 $bg_opts->{h_scale} = $bg_opts->{v_scale} = 0; 1402 $bg_opts->{h_scale} = $bg_opts->{v_scale} = 0;
1398 $bg_opts->{h_align} = $bg_opts->{v_align} = 0; 1403 $bg_opts->{h_align} = $bg_opts->{v_align} = 0;
1399 } elsif (/op=tile/i) { 1404 } elsif (/op=tile/i) {
1400 $bg_opts->{tile} = 1; 1405 $bg_opts->{tile} = 1;
1401 } elsif (/op=keep_aspect/i) { 1406 } elsif (/op=keep-aspect/i) {
1402 $bg_opts->{keep_aspect} = 1; 1407 $bg_opts->{keep_aspect} = 1;
1403 } elsif (/op=root_align/i) { 1408 } elsif (/op=root-align/i) {
1404 $bg_opts->{root_align} = 1; 1409 $bg_opts->{root_align} = 1;
1405 } elsif (/^ =? ([0-9]+)? (?:[xX] ([0-9]+))? ([+-][0-9]+)? ([+-][0-9]+)? $/x) { 1410 } elsif (/^ =? ([0-9]+)? (?:[xX] ([0-9]+))? ([+-][0-9]+)? ([+-][0-9]+)? $/x) {
1406 my ($w, $h, $x, $y) = ($1, $2, $3, $4); 1411 my ($w, $h, $x, $y) = ($1, $2, $3, $4);
1407 1412
1408 if ($str[0]) { 1413 if ($str[0]) {
1417 $bg_opts->{v_align} = $y if defined $y; 1422 $bg_opts->{v_align} = $y if defined $y;
1418 } 1423 }
1419 } 1424 }
1420} 1425}
1421 1426
1427# helper function, quote string as perl without allowing
1428# any code execution or other shenanigans. does not
1429# support binary NULs in string.
1430sub q0 {
1431 (my $str = shift) =~ s/\x00//g; # make sure there really aren't any embedded NULs
1432 "q\x00$str\x00"
1433}
1434
1422sub old_bg_expr { 1435sub old_bg_expr {
1423 my ($self) = @_; 1436 my ($self) = @_;
1424 1437
1425 my $expr; 1438 my $expr;
1426 1439
1427 my $bg_opts = $self->{bg_opts}; 1440 my $bg_opts = $self->{bg_opts};
1428 1441
1429 if ($bg_opts->{root}) { 1442 if ($bg_opts->{root} =~ /^\s*(?:true|yes|on|1)\s*$/i) {
1430 $expr .= "tile ("; 1443 $expr .= "tile (";
1431 1444
1432 my $shade = $bg_opts->{shade}; 1445 my $shade = $bg_opts->{shade};
1433 1446
1434 if ($shade) { 1447 if ($shade) {
1441 } 1454 }
1442 1455
1443 my $tint = $bg_opts->{tint}; 1456 my $tint = $bg_opts->{tint};
1444 1457
1445 if ($tint) { 1458 if ($tint) {
1459 $tint = q0 $tint;
1446 $expr .= "tint $tint, "; 1460 $expr .= "tint $tint,";
1447 } 1461 }
1448 1462
1449 my $blur = $bg_opts->{blur}; 1463 my $blur = $bg_opts->{blur};
1450 1464
1451 if ($blur and $blur =~ /^ =? ([0-9]+)? (?:[xX] ([0-9]+))? $/x) { 1465 if ($blur and $blur =~ /^ =? ([0-9]+)? (?:[xX] ([0-9]+))? $/x) {
1482 if ($h_scale != 0 and $v_scale != 0) { 1496 if ($h_scale != 0 and $v_scale != 0) {
1483 my $op = $bg_opts->{keep_aspect} ? "fit" : "resize"; 1497 my $op = $bg_opts->{keep_aspect} ? "fit" : "resize";
1484 $file_expr .= "$op TW * $h_scale, TH * $v_scale, "; 1498 $file_expr .= "$op TW * $h_scale, TH * $v_scale, ";
1485 } 1499 }
1486 1500
1501 my $path = q0 $bg_opts->{path};
1502
1487 $file_expr .= "keep { load pack \"H*\", \"$bg_opts->{path}\" })"; 1503 $file_expr .= "keep { load $path })";
1488 1504
1489 if ($expr) { 1505 if ($expr) {
1490 $expr .= ", tint (\"[50]white\", $file_expr)"; 1506 $expr .= ", tint (\"[50]white\", $file_expr)";
1491 } else { 1507 } else {
1492 $expr = $file_expr; 1508 $expr = $file_expr;
1499sub on_osc_seq { 1515sub on_osc_seq {
1500 my ($self, $op, $arg) = @_; 1516 my ($self, $op, $arg) = @_;
1501 1517
1502 $self->{bg_opts} or return; 1518 $self->{bg_opts} or return;
1503 1519
1504 $op =~ /^(20|705)$/ or return; 1520 $op =~ /^(?:20|705)$/ or return;
1505 1521
1506 if ($op eq "20") { 1522 if ($op eq "20") {
1507 if ($arg eq "?") { 1523 if ($arg eq "?") {
1508 my $h_scale = $self->{bg_opts}->{h_scale}; 1524 my $h_scale = $self->{bg_opts}->{h_scale};
1509 my $v_scale = $self->{bg_opts}->{v_scale}; 1525 my $v_scale = $self->{bg_opts}->{v_scale};
1523 1539
1524 1 1540 1
1525} 1541}
1526 1542
1527sub find_resource { 1543sub find_resource {
1528 my ($self, $a, $b) = @_; 1544 my ($self, $res, $opt) = @_;
1529 1545
1530 my $v = $self->x_resource ($a); 1546 my $v = $self->x_resource ($opt);
1531 $v = $self->x_resource ($b) unless defined $v; 1547 $v = $self->x_resource ($res) unless defined $v;
1532 1548
1533 $v 1549 $v
1534} 1550}
1535 1551
1536sub on_start { 1552sub on_start {
1540 1556
1541 if (!$expr) { 1557 if (!$expr) {
1542 $self->{bg_opts} = { h_scale => 100, v_scale => 100, 1558 $self->{bg_opts} = { h_scale => 100, v_scale => 100,
1543 h_align => 50, v_align => 50 }; 1559 h_align => 50, v_align => 50 };
1544 1560
1545 $self->{bg_opts}->{shade} = $self->find_resource ("shading", "sh"); 1561 $self->{bg_opts}{shade} = $self->find_resource ("shading", "sh");
1546 $self->{bg_opts}->{tint} = $self->find_resource ("tintColor", "tint"); 1562 $self->{bg_opts}{tint} = $self->find_resource ("tintColor", "tint");
1547 $self->{bg_opts}->{blur} = $self->find_resource ("blurRadius", "blr"); 1563 $self->{bg_opts}{blur} = $self->find_resource ("blurRadius", "blr");
1548 if ($self->x_resource_boolean ("transparent") 1564 $self->{bg_opts}{root} = $self->find_resource ("transparent", "tr");
1549 or $self->x_resource_boolean ("tr")) {
1550 $self->{bg_opts}->{root} = 1;
1551 }
1552 1565
1553 $self->old_bg_opts ($self->find_resource ("backgroundPixmap", "pixmap")); 1566 $self->old_bg_opts ($self->find_resource ("backgroundPixmap", "pixmap"));
1554 $expr = $self->old_bg_expr; 1567 $expr = $self->old_bg_expr;
1555 } 1568 }
1556 1569
1557 $expr or return; 1570 $expr or return;
1558 1571
1559 $self->has_render
1560 or die "background extension needs RENDER extension 0.10 or higher, ignoring background-expr.\n";
1561
1562 $self->set_expr (parse_expr $expr); 1572 $self->set_expr (parse_expr $expr);
1563 $self->{border} = $self->x_resource_boolean ("%.border"); 1573 $self->{border} = $self->x_resource_boolean ("%.border");
1564 1574
1565 $MIN_INTERVAL = $self->x_resource ("%.interval"); 1575 $MIN_INTERVAL = $self->x_resource ("%.interval");
1566 1576

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines