Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/pygame/mac_scrap.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pygame/mac_scrap.py')
-rw-r--r--src/pygame/mac_scrap.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/pygame/mac_scrap.py b/src/pygame/mac_scrap.py
new file mode 100644
index 0000000..678c991
--- /dev/null
+++ b/src/pygame/mac_scrap.py
@@ -0,0 +1,139 @@
+#
+# 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])