diff options
author | Simon Rettberg | 2018-10-16 10:08:48 +0200 |
---|---|---|
committer | Simon Rettberg | 2018-10-16 10:08:48 +0200 |
commit | d3a98cf6cbc3bd0b9efc570f58e8812c03931c18 (patch) | |
tree | cbddf8e50f35a9c6e878a5bfe3c6d625d99e12ba /driver/xscreensaver-getimage-desktop | |
download | xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.gz xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.xz xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.zip |
Original 5.40
Diffstat (limited to 'driver/xscreensaver-getimage-desktop')
-rwxr-xr-x | driver/xscreensaver-getimage-desktop | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/driver/xscreensaver-getimage-desktop b/driver/xscreensaver-getimage-desktop new file mode 100755 index 0000000..2a6d345 --- /dev/null +++ b/driver/xscreensaver-getimage-desktop @@ -0,0 +1,174 @@ +#!/usr/bin/perl -w +# Copyright © 2003-2013 Jamie Zawinski <jwz@jwz.org>. +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation. No representations are made about the suitability of this +# software for any purpose. It is provided "as is" without express or +# implied warranty. +# +# +# This script is invoked by "xscreensaver-getimage" on X11 MacOS systems +# to grab an image of the desktop, and then load it on to the given X11 +# Drawable using the "xscreensaver-getimage-file" program. +# +# This script is only used in an *X11* build on MacOS systems. +# +# When running on non-Mac X11 systems, utils/grabscreen.c is used. +# +# However, when running under X11 on MacOS, that usual X11-based +# screen-grabbing mechanism doesn't work, so we need to invoke the +# "/usr/bin/screencapture" program to do it instead. (This script). +# +# However again, for the MacOS-native (Cocoa) build of the screen savers, +# "utils/grabclient.c" instead links against "OSX/osxgrabscreen.m", which +# grabs screen images directly without invoking a sub-process to do it. +# +# Created: 20-Oct-2003. + + +require 5; +#use diagnostics; # Fails on some MacOS 10.5 systems +use strict; + +my $progname = $0; $progname =~ s@.*/@@g; +my $version = q{ $Revision: 1.6 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; + +my @grabber = ("screencapture", "-x"); +my @converter = ("pdf2jpeg"); + +my $verbose = 0; + + +sub error($) { + ($_) = @_; + print STDERR "$progname: $_\n"; + exit 1; +} + +# returns the full path of the named program, or undef. +# +sub which($) { + my ($prog) = @_; + foreach (split (/:/, $ENV{PATH})) { + if (-x "$_/$prog") { + return $prog; + } + } + return undef; +} + +sub check_path() { + my $ok = 1; + foreach ($grabber[0], $converter[0]) { + if (! which ($_)) { + print STDERR "$progname: \"$_\" not found on \$PATH.\n"; + $ok = 0; + } + } + exit (1) unless $ok; +} + + +sub grab_image() { + + check_path(); + + my $tmpdir = $ENV{TMPDIR}; + $tmpdir = "/tmp" unless $tmpdir; + + my $tmpfile = sprintf ("%s/xssgrab.%08x.pdf", $tmpdir, rand(0xffffffff)); + my @cmd = (@grabber, $tmpfile); + + unlink $tmpfile; + + print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n" + if ($verbose); + system (join(' ', @cmd) . ' 2>/dev/null'); + + my @st = stat($tmpfile); + my $size = (@st ? $st[7] : 0); + if ($size <= 2048) { + unlink $tmpfile; + if ($size == 0) { + error "\"" . join(' ', @cmd) . "\" produced no data."; + } else { + error "\"" . join(' ', @cmd) . "\" produced only $size bytes."; + } + } + + # On MacOS 10.3, "screencapture -x" always wrote a PDF. + # On 10.4.2, it writes a PNG by default, and the output format can be + # changed with the new "-t" argument. + # + # So, for maximal compatibility, we run it without "-t", but look at + # the first few bytes to see if it's a PDF, and if it is, convert it + # to a JPEG first. Otherwise, we assume that whatever screencapture + # wrote is a file format that xscreensaver-getimage-file can already + # cope with (though it will have the extension ".pdf", regardless of + # what is actually in the file). + # + my $pdf_p = 0; + { + open (my $in, '<:raw', $tmpfile) || error ("$tmpfile: $!"); + my $buf = ''; + read ($in, $buf, 10); + close $in; + $pdf_p = ($buf =~ m/^%PDF-/s); + } + + # If it's a PDF, convert it to a JPEG. + # + if ($pdf_p) + { + my $jpgfile = $tmpfile; + $jpgfile =~ s/\.[^.]+$//; + $jpgfile .= ".jpg"; + + @cmd = (@converter, $tmpfile, $jpgfile); + push @cmd, "--verbose" if ($verbose); + + print STDERR "$progname: executing \"" . join(' ', @cmd) . "\"\n" + if ($verbose); + system (@cmd); + unlink $tmpfile; + $tmpfile = $jpgfile; + } + + @st = stat($tmpfile); + $size = (@st ? $st[7] : 0); + if ($size <= 2048) { + unlink $tmpfile; + if ($size == 0) { + error "\"" . join(' ', @cmd) . "\" produced no data."; + } else { + error "\"" . join(' ', @cmd) . "\" produced only $size bytes."; + } + } + + print STDERR "$progname: wrote \"$tmpfile\"\n" if ($verbose); + print STDOUT "$tmpfile\n"; +} + + +sub usage() { + print STDERR "usage: $progname [--verbose]\n"; + exit 1; +} + +sub main() { + while ($_ = $ARGV[0]) { + shift @ARGV; + if (m/^--?verbose$/s) { $verbose++; } + elsif (m/^-v+$/s) { $verbose += length($_)-1; } + elsif (m/^--?name$/s) { } # ignored, for compatibility + elsif (m/^-./) { usage; } + else { usage; } + } + grab_image(); +} + +main; +exit 0; |