1 | from CoreGraphics import *
|
---|
2 | import sys
|
---|
3 | import os
|
---|
4 | import subprocess
|
---|
5 | import tempfile
|
---|
6 | from Carbon.File import FSPathMakeRef
|
---|
7 | from Carbon.Folder import FSFindFolder
|
---|
8 | from Carbon.Folders import kUserDomain, kDesktopFolderType
|
---|
9 | from Carbon.CF import CFURLCreateFromFileSystemRepresentation
|
---|
10 | from LaunchServices.Launch import LSSetExtensionHiddenForRef
|
---|
11 |
|
---|
12 | def check(retval):
|
---|
13 | if retval != 0:
|
---|
14 | sys.exit(retval)
|
---|
15 |
|
---|
16 | def dumpPNG(pdf, pageNumber, outFileBase):
|
---|
17 | if pageNumber is None:
|
---|
18 | outFile = outFileBase + ".png"
|
---|
19 | pageNumber = 1
|
---|
20 | else:
|
---|
21 | outFile = outFileBase + "-%03d.png" % pageNumber
|
---|
22 |
|
---|
23 | w = pdf.getTrimBox(pageNumber).getWidth()
|
---|
24 | h = pdf.getTrimBox(pageNumber).getHeight()
|
---|
25 |
|
---|
26 | ctx = CGBitmapContextCreateWithColor(int(w), int(h), CGColorSpaceCreateDeviceRGB(), (0,0,0,0))
|
---|
27 | ctx.drawPDFDocument(pdf.getTrimBox(pageNumber), pdf, pageNumber)
|
---|
28 | ctx.writeToFile(outFile, kCGImageFormatPNG)
|
---|
29 | return outFile
|
---|
30 |
|
---|
31 | tempDir = tempfile.mkdtemp()
|
---|
32 | pdfFile = os.path.join(tempDir, 'screenshot.pdf')
|
---|
33 |
|
---|
34 | check(subprocess.call(['/usr/sbin/screencapture', '-iW', pdfFile]))
|
---|
35 |
|
---|
36 | pdf = CGPDFDocumentCreateWithProvider(CGDataProviderCreateWithFilename(pdfFile))
|
---|
37 | numberOfPages = pdf.getNumberOfPages()
|
---|
38 |
|
---|
39 | desktopDir = FSFindFolder(kUserDomain, kDesktopFolderType, False).as_pathname()
|
---|
40 | desktopContents = os.listdir(desktopDir)
|
---|
41 | index = 1
|
---|
42 | outFile = None
|
---|
43 | while outFile is None:
|
---|
44 | outFile = 'Screenshot %d' % index
|
---|
45 | for filePath in desktopContents:
|
---|
46 | if filePath.startswith(outFile):
|
---|
47 | index += 1
|
---|
48 | outFile = None
|
---|
49 | break
|
---|
50 | outFile = os.path.join(desktopDir, outFile)
|
---|
51 |
|
---|
52 | writtenPaths = []
|
---|
53 | if numberOfPages == 1:
|
---|
54 | writtenPaths = [dumpPNG(pdf, None, outFile)]
|
---|
55 | else:
|
---|
56 | for pageNumber in xrange(1, numberOfPages+1):
|
---|
57 | writtenPaths.append(dumpPNG(pdf, pageNumber, outFile))
|
---|
58 |
|
---|
59 | os.remove(pdfFile)
|
---|
60 | os.rmdir(tempDir)
|
---|
61 |
|
---|
62 | for path in writtenPaths:
|
---|
63 | LSSetExtensionHiddenForRef(FSPathMakeRef(path)[0], True)
|
---|
64 |
|
---|
65 | # Carbon.File module doesn't implement FNNotify
|
---|
66 | subprocess.call(['/usr/bin/osascript', '-e', 'tell app "Finder" to update desktop'])
|
---|
67 |
|
---|
68 | # LaunchServices module doesn't implement LSOpenFrom*Spec
|
---|
69 | subprocess.call([os.path.join(os.getenv('RESOURCEPATH'), 'launch'), '-i', 'tv.kungfoo.1001'] + writtenPaths)
|
---|