Source

pygame / lib / mac_scrap.py

#
# These methods are called internally by pygame.scrap
#
from AppKit import *
from Foundation import *

import sys
import tempfile
import pygame.image
from pygame.locals import SCRAP_TEXT, SCRAP_BMP
from cStringIO import StringIO

ScrapPboardType = u'org.pygame.scrap'

def init():
    return 1

def get(scrap_type):
    board = NSPasteboard.generalPasteboard()
    if scrap_type == SCRAP_TEXT:
        content = board.stringForType_(NSStringPboardType)
        return content
    elif scrap_type == SCRAP_BMP:
        # We could try loading directly but I don't trust pygame's TIFF loading.
        # This is slow and stupid but it does happen to work.
        if not NSImage.canInitWithPasteboard_(board):
            return None
        img = NSImage.alloc().initWithPasteboard_(board)
        data = img.TIFFRepresentation()
        rep = NSBitmapImageRep.alloc().initWithData_(data)
        if rep is None:
            return None
        data = rep.representationUsingType_properties_(NSBMPFileType, None)
        bmp = StringIO(data)
        return pygame.image.load(bmp, "scrap.bmp")
    else:
        raise ValueError("Unsupported scrap_type: %r" % (scrap_type,))


def put(scrap_type, thing):
    board = NSPasteboard.generalPasteboard()
    if scrap_type == SCRAP_TEXT:
        board.declareTypes_owner_([NSStringPboardType, ScrapPboardType], None)
        if isinstance(thing, unicode):
            text_thing = thing
        else:
            text_thing = unicode(text_thing, 'utf-8')
        board.setString_forType_(text_thing, NSStringPboardType)
        board.setString_forType_(u'', ScrapPboardType)
    elif scrap_type == SCRAP_BMP:
        # This is pretty silly, we shouldn't have to do this...
        fh = tempfile.NamedTemporaryFile(suffix='.png')
        pygame.image.save(thing, fh.name)
        path = fh.name
        if not isinstance(path, unicode):
            path = unicode(path, sys.getfilesystemencoding())
        img = NSImage.alloc().initByReferencingFile_(path)
        tiff = img.TIFFRepresentation()
        fh.close()
        board.declareTypes_owner_([NSTIFFPboardType, ScrapPboardType], None)
        board.setData_forType_(tiff, NSTIFFPboardType)
        board.setString_forType_(u'', ScrapPboardType)
    else:
        raise ValueError("Unsupported scrap_type: %r" % (scrap_type,))

def lost():
    board = NSPasteboard.generalPasteboard()
    return not board.availableTypeFromArray_([ScrapPboardType])
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.