#
# 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,SCRAP_SELECTION,SCRAP_CLIPBOARD
from cStringIO import StringIO
from pygame.compat import unicode_
ScrapPboardType = unicode_('org.pygame.scrap')
err = "Only text has been implemented for scrap on mac. See lib/mac_scrap.py to debug."
def init():
return 1
def get(scrap_type):
board = NSPasteboard.generalPasteboard()
if 0:
print (board.types)
print (dir(board.types))
print (dir(board))
print (board.__doc__)
if scrap_type == SCRAP_TEXT:
return board.stringForType_(NSStringPboardType)
elif 1:
raise NotImplementedError(err)
elif 0 and 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
# bug with bmp, out of memory error... so we use png.
#data = rep.representationUsingType_properties_(NSBMPFileType, None)
data = rep.representationUsingType_properties_(NSPNGFileType, None)
bmp = StringIO(data)
return pygame.image.load(bmp, "scrap.png")
#elif scrap_type in board.types:
elif scrap_type == SCRAP_BMP:
return board.dataForType_(scrap_type)
else:
return board.stringForType_(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(thing, 'utf-8')
board.setString_forType_(text_thing, NSStringPboardType)
board.setString_forType_(unicode_(''), ScrapPboardType)
elif 1:
raise NotImplementedError(err)
elif 0 and scrap_type == SCRAP_BMP:
# Don't use this code... we put the data in as a string.
#if type(thing) != type(pygame.Surface((1,1))):
# thing = pygame.image.fromstring(thing, len(thing) * 4, "RGBA")
# 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_(unicode_(''), ScrapPboardType)
elif scrap_type == SCRAP_BMP:
other_type = scrap_type
board.declareTypes_owner_([other_type], None)
board.setData_forType_(thing, other_type)
else:
other_type = scrap_type
if 0:
board.declareTypes_owner_([NSStringPboardType, other_type], None)
board.setString_forType_(text_thing, NSStringPboardType)
elif 0:
board.declareTypes_owner_([other_type], None)
#board.setString_forType_(thing, other_type)
board.setData_forType_(thing, other_type)
else:
board.declareTypes_owner_([NSStringPboardType, other_type], None)
board.setString_forType_(thing, NSStringPboardType)
#board.setData_forType_(thing, other_type)
def set_mode (mode):
# No diversion between clipboard and selection modes on MacOS X.
if mode not in [SCRAP_SELECTION, SCRAP_CLIPBOARD]:
raise ValueError("invalid clipboard mode")
def contains (scrap_type):
return scrap_type in NSPasteboard.generalPasteboard ().types ()
def get_types ():
typelist = []
types = NSPasteboard.generalPasteboard ().types ()
for t in types:
typelist.append (t)
return typelist
def lost ():
board = NSPasteboard.generalPasteboard ()
return not board.availableTypeFromArray_ ([ScrapPboardType])
|