|
|
|
#!/bin/sh -- # A comment mentioning perl
|
|
|
|
eval 'exec perl -S $0 ${1+"$@"}'
|
|
|
|
if 0;
|
|
|
|
#
|
|
|
|
# slide.pl: amusing example slideshow program for use with x11vnc -rawfb mode.
|
|
|
|
#
|
|
|
|
# E.g. x11vnc -rawfb map:/tmp/foo@640x480x32:ff/ff00/ff0000 -pipeinput slide.pl
|
|
|
|
#
|
|
|
|
# requires: jpegtopnm(1), (maybe LSB too).
|
|
|
|
#
|
|
|
|
|
|
|
|
@jpegs = qw(
|
|
|
|
dr_fun_new.jpg canon.jpg go_microsoft.jpg jonathan2.jpg
|
|
|
|
michelle1.jpg novm.jpg photo-008.jpg presrange.jpg
|
|
|
|
);
|
|
|
|
|
|
|
|
# Or:
|
|
|
|
# @jpegs = @ARGV;
|
|
|
|
# @jpegs = <*.jpg>;
|
|
|
|
|
|
|
|
# this is x11vnc's -rawfb value:
|
|
|
|
if ($ENV{X11VNC_RAWFB_STR} =~ m,:(.*)@(\d+)x(\d+)x(\d+),) {
|
|
|
|
$fb = $1; # filename
|
|
|
|
$W = $2; # width
|
|
|
|
$H = $3; # height
|
|
|
|
} else {
|
|
|
|
die "No usable X11VNC_RAWFB_STR\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
open(FB, ">$fb") || die "$!";
|
|
|
|
|
|
|
|
# make a solid background:
|
|
|
|
$ones = "\377" x ($W * 4);
|
|
|
|
$grey = "\340" x ($W * 4);
|
|
|
|
for ($y = 0; $y < $H; $y++) {
|
|
|
|
print FB $grey;
|
|
|
|
}
|
|
|
|
|
|
|
|
# this is rather slow with many jpegs... oh well.
|
|
|
|
foreach $pic (@jpegs) {
|
|
|
|
print STDERR "loading '$pic' please wait ...\n";
|
|
|
|
open(JPEG, "jpegtopnm '$pic' 2>/dev/null|") || die "$!";
|
|
|
|
while (<JPEG>) {
|
|
|
|
next if /^P\d/;
|
|
|
|
if (/^(\d+)\s+(\d+)\s*$/) {
|
|
|
|
$Jpeg{$pic}{w} = $1;
|
|
|
|
$Jpeg{$pic}{h} = $2;
|
|
|
|
}
|
|
|
|
last if /^255$/;
|
|
|
|
}
|
|
|
|
$data = '';
|
|
|
|
while (<JPEG>) {
|
|
|
|
$data .= $_;
|
|
|
|
}
|
|
|
|
close(JPEG);
|
|
|
|
|
|
|
|
# need to put in a 4th 0 byte after RGB for 32bpp. 24bpp doesn't work.
|
|
|
|
# (MSB might be other way around).
|
|
|
|
|
|
|
|
$new = '';
|
|
|
|
for ($l = 0; $l < int(length($data)/3); $l++) {
|
|
|
|
$new .= substr($data, $l * 3, 3) . "\0";
|
|
|
|
}
|
|
|
|
$Jpeg{$pic}{data} = $new;
|
|
|
|
$data = ''; $new = '';
|
|
|
|
|
|
|
|
if ($pic eq $jpegs[0]) {
|
|
|
|
showpic(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$N = scalar(@jpegs);
|
|
|
|
print STDERR "\nFinished loading $N images. Click Button or Spacebar for next.\n";
|
|
|
|
$I = 0;
|
|
|
|
|
|
|
|
while (<>) {
|
|
|
|
# read the next user input event, watch for button press or spacebar:
|
|
|
|
###last if /^Keysym.* [qQ] /;
|
|
|
|
next unless /^(Pointer.*ButtonPress|Keysym.*space.*KeyPress)/;
|
|
|
|
$I = ($I + 1) % $N;
|
|
|
|
showpic($I);
|
|
|
|
}
|
|
|
|
|
|
|
|
sub showpic {
|
|
|
|
my($i) = @_;
|
|
|
|
|
|
|
|
my $pic = $jpegs[$i];
|
|
|
|
my $h = $Jpeg{$pic}{h};
|
|
|
|
my $w = $Jpeg{$pic}{w};
|
|
|
|
|
|
|
|
my $dy = int(($H - $h)/2);
|
|
|
|
my $dx = int(($W - $w)/2);
|
|
|
|
|
|
|
|
print STDERR "showing pic $i: $pic\t$w x $h +$dy+$dx\n";
|
|
|
|
|
|
|
|
# clear screen:
|
|
|
|
seek(FB, 0, 0);
|
|
|
|
for ($y = 0; $y < $H; $y++) {
|
|
|
|
print FB $ones;
|
|
|
|
}
|
|
|
|
|
|
|
|
# insert new picture:
|
|
|
|
for ($y = 0; $y < $h; $y++) {
|
|
|
|
seek(FB, (($y + $dy) * $W + $dx) * 4, 0);
|
|
|
|
$line = substr($Jpeg{$pic}{data}, $y * $w * 4, $w * 4);
|
|
|
|
print FB $line;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
close(FB);
|
|
|
|
###unlink($fb); # this (probably) won't kill x11vnc
|
|
|
|
print STDERR "$0 done.\n";
|