def loadPlugin( self ): """ You can add an observer like in the example. Do all initializing here. """ try: NSBundle.loadNibNamed_owner_( "GlyphsGitDialog", self ) selector = objc.selector( self.documentWasSaved, signature="v@:@" ) NSNotificationCenter.defaultCenter().addObserver_selector_name_object_( self, selector, "GSDocumentWasSavedSuccessfully", None ) mainMenu = NSApplication.sharedApplication().mainMenu() s = objc.selector(self.showRevisions,signature='v@:') self.revisionMenuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_("View revision history", s, "" ) self.revisionMenuItem.setTarget_(self) index = 0 numberOfSeperators = 0 for menuItem in mainMenu.itemAtIndex_(1).submenu().itemArray(): if menuItem.isSeparatorItem(): numberOfSeperators += 1 if numberOfSeperators == 2: break index += 1; mainMenu.itemAtIndex_(1).submenu().insertItem_atIndex_(self.revisionMenuItem, index) return None except Exception, err: self.logToConsole( "init: %s" % traceback.format_exc() )
def testArgumentTypesPythonStyle(self): # Check that argumentTypes + returnType is correctly converted to # a signature s = objc.selector(lambda self: None, argumentTypes='ii', returnType='i') self.assertEqual(s.signature, b'i@:ii') s = objc.selector(lambda self: None, argumentTypes='Oi', returnType='i') self.assertEqual(s.signature, b'i@:@i') s = objc.selector(lambda self: None, argumentTypes='', returnType='l') self.assertEqual(s.signature, objc._C_LNG + b'@:') s = objc.selector(lambda self: None, argumentTypes='', returnType='f') self.assertEqual(s.signature, objc._C_FLT + b'@:') s = objc.selector(lambda self: None, argumentTypes='', returnType='d') self.assertEqual(s.signature, objc._C_DBL + b'@:') s = objc.selector(lambda self: None, argumentTypes='', returnType='i') self.assertEqual(s.signature, objc._C_INT + b'@:') s = objc.selector(lambda self: None, argumentTypes='', returnType='s') self.assertEqual(s.signature, b'@@:') s = objc.selector(lambda self: None, argumentTypes='', returnType='S') self.assertEqual(s.signature, b'@@:') s = objc.selector(lambda self: None, argumentTypes='', returnType='z') self.assertEqual(s.signature, b'@@:') s = objc.selector(lambda self: None, argumentTypes='zbhilcfdO', returnType='z') self.assertEqual(s.signature, b'@@:@csilcfd@')
class BBFileLikeObjectReader(NSObject): """ Provides a suitable delegate class for the BBDelegatingInputStream class in LightAquaBlue.framework. This basically provides a wrapper for a python file-like object so that it can be read through a NSInputStream. """ def initWithFileLikeObject_(self, fileobj): self = super(BBFileLikeObjectReader, self).init() self.__fileobj = fileobj return self initWithFileLikeObject_ = objc.selector(initWithFileLikeObject_, signature=b"@@:@") def readDataWithMaxLength_(self, maxlength): try: data = self.__fileobj.read(maxlength) except Exception: return None return buffer(data) readDataWithMaxLength_ = objc.selector( readDataWithMaxLength_, signature=b"@@:I") #"@12@0:4I8" #"@:I"
def start(self): try: # new API in Glyphs 2.3.1-910 new_update_menu_item = NSMenuItem(self.update_name, self.updateFilters_) new_restore_menu_item = NSMenuItem(self.restoredefault_name, self.restoreFilters_) new_opendir_menu_item = NSMenuItem(self.opendir_name, self.openGlyphsfiltersDirectory_) Glyphs.menu[EDIT_MENU].append(new_update_menu_item) Glyphs.menu[EDIT_MENU].append(new_restore_menu_item) Glyphs.menu[EDIT_MENU].append(new_opendir_menu_item) except Exception: main_menu = Glyphs.mainMenu() update_selector = objc.selector(self.updateFilters_, signature="v@:@") restore_selector = objc.selector(self.restoreFilters_, signature="v@:@") open_selector = objc.selector( self.openGlyphsfiltersDirectory_, signature="v@:@" ) new_update_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_( self.update_name, update_selector, "" ) new_restore_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_( self.restore_name, restore_selector, "" ) new_open_menu_item = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_( self.opendir_name, open_selector, "" ) new_update_menu_item.setTarget_(self) main_menu.itemWithTag_(5).submenu().addItem_(new_update_menu_item) new_restore_menu_item.setTarget_(self) main_menu.itemWithTag_(5).submenu().addItem_(new_restore_menu_item) new_open_menu_item.setTarget_(self) main_menu.itemWithTag_(5).submenu().addItem_(new_open_menu_item)
class OC_TestTypeCodeLeaks_Result(NSObject): def myBOOLResult(self): return True myBOOLResult = objc.selector(myBOOLResult, signature=objc._C_NSBOOL + b"@:") def myInt8Result(self): return True myInt8Result = objc.selector(myInt8Result, signature=objc._C_CHAR_AS_INT + b"@:") def myByteResult(self): return True myByteResult = objc.selector(myByteResult, signature=objc._C_CHAR_AS_TEXT + b"@:") def myUniCharResult(self): return True myUniCharResult = objc.selector(myUniCharResult, signature=objc._C_UNICHAR + b"@:") def myUniStrResult(self): return True myUniStrResult = objc.selector(myUniStrResult, signature=objc._C_PTR + objc._C_UNICHAR + b"@:")
class OC_TestTypeCodeLeaks_RefIn(NSObject): def myBOOLArg_(self, arg): pass myBOOLArg_ = objc.selector(myBOOLArg_, signature=b"v@:" + objc._C_IN + objc._C_PTR + objc._C_NSBOOL) def myInt8Arg_(self, arg): pass myInt8Arg_ = objc.selector( myInt8Arg_, signature=b"v@:" + objc._C_IN + objc._C_PTR + objc._C_CHAR_AS_INT, ) def myByteArg_(self, arg): pass myByteArg_ = objc.selector( myByteArg_, signature=b"v@:" + objc._C_IN + objc._C_PTR + objc._C_CHAR_AS_TEXT, ) def myUniCharArg_(self, arg): pass myUniCharArg_ = objc.selector( myUniCharArg_, signature=b"v@:" + objc._C_IN + objc._C_PTR + objc._C_UNICHAR, )
def testDefaultSignatures(self): def meth(): pass s = objc.selector(meth) self.assertEqual(s.selector, b'meth') self.assertEqual(s.signature, b'v@:') def meth__(): pass s = objc.selector(meth__) self.assertEqual(s.selector, b'meth::') self.assertEqual(s.signature, b'v@:@@') def meth(): return 1 s = objc.selector(meth) self.assertEqual(s.selector, b'meth') self.assertEqual(s.signature, b'@@:') def meth__(): return 1 s = objc.selector(meth__) self.assertEqual(s.selector, b'meth::') self.assertEqual(s.signature, b'@@:@@')
class OCTestHidden(objc.lookUpClass('NSObject')): m = hidden_method() @objc.selector def body(self): return "BODY" body.isHidden = True def bodyclass(self): return "BODYCLASS" bodyclass = objc.selector(bodyclass, isClassMethod=True) bodyclass.isHidden = True @objc.selector def somebody(self): return "instance" somebody.isHidden = True def boolMethod(self): return 1 boolMethod = objc.selector(boolMethod, signature=objc._C_NSBOOL + b'@:') boolMethod.isHidden = True
def testSelectorSignatures(self): self.assertIsInstance( objc.selector(lambda x,y:1, signature=b"ii"), objc.selector ) self.assertIsInstance( objc.selector(lambda x,y:1, argumentTypes="ii"), objc.selector ) self.assertIsInstance( objc.selector(lambda x,y:1, argumentTypes="ii", returnType="s"), objc.selector ) self.assertRaises(ValueError, objc.selector, lambda x,y:1, signature=b"FOOBAR") self.assertRaises(TypeError, objc.selector, lambda x,y:1, signature=b"@@", returnType="i") self.assertRaises(TypeError, objc.selector, lambda x,y:1, signature=b"@@", argumentTypes="ii") self.assertRaises(ValueError, objc.selector, lambda x,y:1, argumentTypes="iX") self.assertRaises(ValueError, objc.selector, lambda x,y:1, returnType="X")
class PyObjCDebuggingDelegate(NSObject): verbosity = objc.ivar('verbosity', 'i') def initWithVerbosity_(self, verbosity): self = self.init() self.verbosity = verbosity return self def exceptionHandler_shouldLogException_mask_(self, sender, exception, aMask): try: if isPythonException(exception): if self.verbosity & LOGSTACKTRACE: nsLogObjCException(exception) return nsLogPythonException(exception) elif self.verbosity & LOGSTACKTRACE: return nsLogObjCException(exception) else: return False except: print >> sys.stderr, "*** Exception occurred during exception handler ***" traceback.print_exc(sys.stderr) return True exceptionHandler_shouldLogException_mask_ = objc.selector( exceptionHandler_shouldLogException_mask_, signature='c@:@@I') def exceptionHandler_shouldHandleException_mask_(self, sender, exception, aMask): return False exceptionHandler_shouldHandleException_mask_ = objc.selector( exceptionHandler_shouldHandleException_mask_, signature='c@:@@I')
def testDefaultSignatures(self): def meth(): pass s = objc.selector(meth) self.assertEqual(s.selector, b"meth") self.assertEqual(s.signature, b"v@:") def meth__(): pass s = objc.selector(meth__) self.assertEqual(s.selector, b"meth::") self.assertEqual(s.signature, b"v@:@@") def meth(): return 1 s = objc.selector(meth) self.assertEqual(s.selector, b"meth") self.assertEqual(s.signature, b"@@:") def meth__(): return 1 s = objc.selector(meth__) self.assertEqual(s.selector, b"meth::") self.assertEqual(s.signature, b"@@:@@")
def __pyobjc_class_setup__(self, name, class_dict, instance_methods, class_methods): super(array_property, self).__pyobjc_class_setup__(name, class_dict, instance_methods, class_methods) # Insert (Mutable) Indexed Accessors # FIXME: should only do the mutable bits when we're actually a mutable property name = self._name Name = name[0].upper() + name[1:] countOf, objectIn, insert, remove, replace = makeArrayAccessors( self._name) countOf = selector( countOf, selector=('countOf%s' % (Name, )).encode('latin1'), signature=_C_NSUInteger + b'@:', ) countOf.isHidden = True instance_methods.add(countOf) objectIn = selector( objectIn, selector=('objectIn%sAtIndex:' % (Name, )).encode('latin1'), signature=b'@@:' + _C_NSUInteger, ) objectIn.isHidden = True instance_methods.add(objectIn) insert = selector( insert, selector=('insertObject:in%sAtIndex:' % (Name, )).encode('latin1'), signature=b'v@:@' + _C_NSUInteger, ) insert.isHidden = True instance_methods.add(insert) remove = selector( remove, selector=('removeObjectFrom%sAtIndex:' % (Name, )).encode('latin1'), signature=b'v@:' + _C_NSUInteger, ) remove.isHidden = True instance_methods.add(remove) replace = selector( replace, selector=('replaceObjectIn%sAtIndex:withObject:' % (Name, )).encode('latin1'), signature=b'v@:' + _C_NSUInteger + b'@', ) replace.isHidden = True instance_methods.add(replace)
class _ChannelServerEventListener(Foundation.NSObject): """ Listens for server-specific events on a RFCOMM or L2CAP channel (i.e. when a client connects) and makes callbacks to a specified object when events occur. """ # note this is a NSObject "init", not a python object "__init__" def initWithDelegate_port_protocol_(self, cb_obj, port, proto): """ Arguments: - cb_obj: to receive callbacks when a client connects to to the channel, the callback object should have a method '_handle_channelopened' which takes the newly opened IOBluetoothRFCOMMChannel or IOBluetoothL2CAPChannel as its argument. - port: the channel or PSM that the server is listening on - proto: L2CAP or RFCOMM. """ self = super(_ChannelServerEventListener, self).init() if cb_obj is None: raise TypeError("callback object is None") self.__cb_obj = cb_obj self.__usernotif = None if proto == _lightbluecommon.RFCOMM: usernotif = _IOBluetooth.IOBluetoothRFCOMMChannel.registerForChannelOpenNotifications_selector_withChannelID_direction_(self, "newChannelOpened:channel:", port, _macutil.kIOBluetoothUserNotificationChannelDirectionIncoming) elif proto == _lightbluecommon.L2CAP: usernotif = _IOBluetooth.IOBluetoothL2CAPChannel.registerForChannelOpenNotifications_selector_withPSM_direction_(self, "newChannelOpened:channel:", port, _macutil.kIOBluetoothUserNotificationChannelDirectionIncoming) if usernotif is None: raise _socket.error("Unable to register for channel-" + \ "opened notifications on server socket on channel/PSM %d" % \ port) self.__usernotif = usernotif return self initWithDelegate_port_protocol_ = objc.selector( initWithDelegate_port_protocol_, signature=b"@@:@ii") def close(self): if self.__usernotif is not None: self.__usernotif.unregister() def newChannelOpened_channel_(self, notif, newChannel): """ Handle when a client connects to the server channel. (This method is called for both RFCOMM and L2CAP channels.) """ if newChannel is not None and newChannel.isIncoming(): # not sure if delegate really needs to be set newChannel.setDelegate_(self) if hasattr(self.__cb_obj, '_handle_channelopened'): self.__cb_obj._handle_channelopened(newChannel) # makes this method receive notif and channel as objects newChannelOpened_channel_ = objc.selector( newChannelOpened_channel_, signature=b"v@:@@")
def test_python_only(self): def method(self, a, b): pass s = selector(method) self.assertEqual(s.selector, b'method') self.assertEqual(s.signature, b'v@:') def method_pep8(self, a, b): pass s = selector(method_pep8) self.assertEqual(s.selector, b'method_pep8') self.assertEqual(s.signature, b'v@:')
def __pyobjc_class_setup__(self, name, class_dict, instance_methods, class_methods): super(array_property, self).__pyobjc_class_setup__( name, class_dict, instance_methods, class_methods ) # Insert (Mutable) Indexed Accessors name = self._name Name = name[0].upper() + name[1:] countOf, objectIn, insert, remove, replace = makeArrayAccessors(self._name) countOf = selector( countOf, selector=("countOf%s" % (Name,)).encode("latin1"), signature=_C_NSUInteger + b"@:", ) countOf.isHidden = True instance_methods.add(countOf) objectIn = selector( objectIn, selector=("objectIn%sAtIndex:" % (Name,)).encode("latin1"), signature=b"@@:" + _C_NSUInteger, ) objectIn.isHidden = True instance_methods.add(objectIn) insert = selector( insert, selector=("insertObject:in%sAtIndex:" % (Name,)).encode("latin1"), signature=b"v@:@" + _C_NSUInteger, ) insert.isHidden = True instance_methods.add(insert) remove = selector( remove, selector=("removeObjectFrom%sAtIndex:" % (Name,)).encode("latin1"), signature=b"v@:" + _C_NSUInteger, ) remove.isHidden = True instance_methods.add(remove) replace = selector( replace, selector=("replaceObjectIn%sAtIndex:withObject:" % (Name,)).encode( "latin1" ), signature=b"v@:" + _C_NSUInteger + b"@", ) replace.isHidden = True instance_methods.add(replace)
def test_python_only(self): def method(self, a, b): pass s = selector(method) self.assertEqual(s.selector, b"method") self.assertEqual(s.signature, b"v@:") def method_pep8(self, a, b): pass s = selector(method_pep8) self.assertEqual(s.selector, b"method_pep8") self.assertEqual(s.signature, b"v@:")
def test_objective_c(self): def foo_(self, a): pass s = selector(foo_) self.assertEqual(s.selector, b'foo:') self.assertEqual(s.signature, b'v@:@') def foo_bar_(self, a): pass s = selector(foo_bar_) self.assertEqual(s.selector, b'foo:bar:') self.assertEqual(s.signature, b'v@:@@') def foo_bar_(self, a): return 1 s = selector(foo_bar_) self.assertEqual(s.selector, b'foo:bar:') self.assertEqual(s.signature, b'@@:@@')
def run(self): self.app = NSApplication.sharedApplication() self.delegate = self.createAppDelegate().alloc().init() self.app.setDelegate_(self.delegate) self.app.setActivationPolicy_(NSApplicationActivationPolicyAccessory) self.workspace = NSWorkspace.sharedWorkspace() # listen for events thrown by the Experience sampling window s = objc.selector(self.makeAppActive_,signature='v@:@') NSNotificationCenter.defaultCenter().addObserver_selector_name_object_(self, s, 'makeAppActive', None) s = objc.selector(self.takeExperienceScreenshot_,signature='v@:@') NSNotificationCenter.defaultCenter().addObserver_selector_name_object_(self, s, 'takeExperienceScreenshot', None) AppHelper.runEventLoop()
def testStructCallback(self): """ Regression test for an issue reported on the PyObjC mailinglist. """ tp = objc.createStructType("FooStruct", b'{FooStruct="first"i"second"i}', None) StructArrayDelegate = objc.informal_protocol( "StructArrayDelegate", [ objc.selector(None, b"arrayOf4Structs:", signature=b"@@:[4{FooStruct=ii}]"), ]) class OC_PyStruct (NSObject): def arrayOf4Structs_(self, value): return value self.assertEqual(OC_PyStruct.arrayOf4Structs_.signature, b"@@:[4{FooStruct=" + objc._C_INT + objc._C_INT + b"}]") o = OC_PyStruct.alloc().init() v = OC_StructTest.callArrayOf4Structs_(o) self.assertEqual(len(v), 4) for i in range(3): self.assertIsInstance(v[i], tp) self.assertEqual(v[0], tp(1, 2)) self.assertEqual(v[1], tp(3, 4)) self.assertEqual(v[2], tp(5, 6)) self.assertEqual(v[3], tp(7, 8))
def _runScript(self, compile=True, newSeed=True): if not self.cleanRun(self._execScript): pass # Check whether we are dealing with animation if self.canvas.speed is not None: if not self.namespace.has_key("draw"): errorAlert( "Not a proper NodeBox animation", "NodeBox animations should have at least a draw() method.") return # Check if animationTimer is already running if self.animationTimer is not None: self.stopScript() self.speed = self.canvas.speed # Run setup routine if self.namespace.has_key("setup"): self.fastRun(self.namespace["setup"]) window = self.currentView.window() window.makeFirstResponder_(self.currentView) # Start the timer self.animationTimer = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_( 1.0 / self.speed, self, objc.selector(self.doFrame, signature="v@:@"), None, True) # Start the spinner self.animationSpinner.startAnimation_(None)
def imageGrowLoop(self): img = self.samples[self.currentSample]['screenshot'][:] path = os.path.join(self.datadrive, "screenshots", self.samples[self.currentSample]['screenshot']) cueImage = NSImage.alloc().initByReferencingFile_(path) max_height = min(cueImage.size().height, self.viewH) if(self.cueH <= max_height-20 and self.growImage): print 'increasing size' self.cueH = self.cueH + 20 self.cueW = self.cueH * self.cueRatio targetImage = NSImage.alloc().initWithSize_(NSMakeSize(self.cueW, self.cueH)) if(self.samples[self.currentSample]['snippet']): x = float(path.split("_")[-2]) y = float(path.split("_")[-1].split('-')[0].split('.')[0]) fromRect = CG.CGRectMake(x-self.cueW/2, y-self.cueH/2, self.cueW, self.cueH) toRect = CG.CGRectMake(0.0, 0.0, self.cueW, self.cueH) else: fromRect = CG.CGRectMake(0.0, 0.0, cueImage.size().width, cueImage.size().height) toRect = CG.CGRectMake(0.0, 0.0, self.cueW, self.cueH) targetImage.lockFocus() cueImage.drawInRect_fromRect_operation_fraction_( toRect, fromRect, NSCompositeCopy, 1.0 ) targetImage.unlockFocus() self.reviewController.mainPanel.setImage_(targetImage) s = objc.selector(self.imageGrowLoop,signature='v@:') self.imageLoop = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(2, self, s, None, False)
def _runScript(self, compile=True, newSeed=True): if not self.cleanRun(self._execScript): pass # Check whether we are dealing with animation if self.canvas.speed is not None: if not self.namespace.has_key("draw"): errorAlert("Not a proper NodeBox animation", "NodeBox animations should have at least a draw() method.") return # Check if animationTimer is already running if self.animationTimer is not None: self.stopScript() self.speed = self.canvas.speed # Run setup routine if self.namespace.has_key("setup"): self.fastRun(self.namespace["setup"]) window = self.currentView.window() window.makeFirstResponder_(self.currentView) # Start the timer self.animationTimer = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_( 1.0 / self.speed, self, objc.selector(self.doFrame, signature="v@:@"), None, True ) # Start the spinner self.animationSpinner.startAnimation_(None)
def loadPlugin(self): mainMenu = NSApplication.sharedApplication().mainMenu() s = objc.selector(self.newDocument, signature='v@:') newMenuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_( "New Drawbot", s, "") newMenuItem.setTarget_(self) mainMenu.itemAtIndex_(1).submenu().insertItem_atIndex_(newMenuItem, 1)
def start(self): """Starts the plugin""" mainMenu = Glyphs.mainMenu() s = objc.selector(self.invokePlugin_, signature=b'v@:@') newMenuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(self.name, s, '') newMenuItem.setTarget_(self) mainMenu.itemWithTag_(5).submenu().addItem_(newMenuItem)
def do_informal_protocol(self, node): name = self.attribute_string(node, "name", None) if not name: return method_list = [] for method in node: sel_name = self.attribute_string(method, "selector", None) typestr = self.attribute_string(method, "type", "type64") is_class = self.attribute_bool(method, "classmethod", None, _SENTINEL) if is_class is _SENTINEL: # Manpage says 'class_method', older PyObjC used 'classmethod' is_class = self.attribute_bool(method, "class_method", None, False) if not sel_name or not typestr: continue typestr = self.typestr2typestr(typestr) sel = objc.selector(None, selector=_as_bytes(sel_name), signature=_as_bytes(typestr), isClassMethod=is_class) method_list.append(sel) if method_list: self.informal_protocols.append((name, method_list))
def testHiddenAddMethods(self): @objc.selector def addedmethod(self): return "NEW" addedmethod.isHidden = True def addedclass(self): return "NEWCLASS" addedclass = objc.selector(addedclass, isClassMethod=True) addedclass.isHidden = True objc.classAddMethods(OCTestHidden, [addedmethod, addedclass]) o = OCTestHidden.alloc().init() # Instance method self.assertRaises(AttributeError, getattr, o, 'addedmethod') v = o.performSelector_(b'addedmethod') self.assertEquals(v, "NEW") v = o.pyobjc_instanceMethods.addedmethod() self.assertEquals(v, "NEW") # Class method self.assertRaises(AttributeError, getattr, OCTestHidden, 'addedclass') v = OCTestHidden.performSelector_(b'addedclass') self.assertEquals(v, "NEWCLASS") v = OCTestHidden.pyobjc_classMethods.addedclass() self.assertEquals(v, "NEWCLASS")
def setup_itunes_observer(self): self.itunes = ScriptingBridge.SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes") log.debug("iTunes running: {}".format(self.itunes.isRunning())) dnc = Foundation.NSDistributedNotificationCenter.defaultCenter() selector = objc.selector(self.receivedNotification_, signature=b"v@:@") dnc.addObserver_selector_name_object_(self, selector, "com.apple.iTunes.playerInfo", None) log.debug("Added observer")
def prepare_to_scrobble(self, userinfo): log.debug("prepare_to_scrobble") self.cancel_scrobble_timer() if userinfo.get("PersistentID") is None: log.warning("Track being played doesn't have a PersistentID, so can't prepare to scrobble it!") return # We need to wait a bit for a certain amount of the track to be played before scrobbling it. # The delay is half the track's length or SCROBBLER_HALFWAY_THRESHOLD, whichever is sooner. track_length = userinfo.get("Total Time", 0) / 1000 # seconds if track_length == 0: log.debug("Track has zero length, trying to get it from itunes.currentTrack after 5 seconds") time.sleep(5) track_length = self.itunes.currentTrack().duration() log.debug("currentTrack().duration(): {}".format(track_length)) if not track_length: log.debug("Still zero-length, giving up!") return elif track_length < SCROBBLER_MIN_TRACK_LENGTH: log.debug("Track is too short ({}), so not going to scrobble it".format(track_length)) return timeout = min(ceil(track_length/2), SCROBBLER_HALFWAY_THRESHOLD) log.debug("Setting up a timer for {} seconds".format(timeout)) # Set up a timer that calls back after timeout seconds self.scrobble_timer = Foundation.NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_( timeout, self, objc.selector(self.scrobbleTimerFired_, signature=b"v@:@"), userinfo, False )
class ReturnAStruct(NSObject): def someRectWithRect_(self, aRect): ((x, y), (h, w)) = aRect return ((x, y), (h, w)) someRectWithRect_ = objc.selector(someRectWithRect_, signature=rct + b"@:" + rct)
class OC_TestCopy1(NSObject): def init(self): self = super(OC_TestCopy1, self).init() if self is not None: self.x = 1 self.y = 2 return self def modify(self): self.x = 42 self.y = 24 self.z = 0 @funcattr(occlass="OC_TestCopy1") def copyWithZone_(self, zone): other = OC_TestCopy1.allocWithZone_(zone).init() other.x = self.x other.y = self.y return other # Argh, copyWithZone_ is a classmethod by default unless the # superclass implements -copyWithZone: copyWithZone_ = objc.selector(copyWithZone_, signature=NSObject.copyWithZone_.signature, isClassMethod=False)
def init(self): """ Do all initializing here, and customize the quadruple underscore items. ____CFBundleIdentifier____ should be the reverse domain name you specified in Info.plist. """ try: self.controller = None if not NSBundle.loadNibNamed_owner_("FontNotePalette", self): self.logToConsole("Error loading .nib into Palette.") s = objc.selector(self.update, signature="v@:") NSNotificationCenter.defaultCenter( ).addObserver_selector_name_object_(self, s, "GSUpdateInterface", None) NSNotificationCenter.defaultCenter( ).addObserver_selector_name_object_(self, s, "GSDocumentCloseNotification", None) NSNotificationCenter.defaultCenter( ).addObserver_selector_name_object_( self, s, "GSDocumentActivateNotification", None) Frame = self._theView.frame() if NSUserDefaults.standardUserDefaults().objectForKey_( "com.mekkablue.FontNote.ViewHeight"): Frame.size.height = NSUserDefaults.standardUserDefaults( ).integerForKey_("com.mekkablue.FontNote.ViewHeight") self._theView.setFrame_(Frame) return self except Exception as e: self.logToConsole("init: %s" % str(e))
def toggleAudioPlay_(self, sender): try: if self.playingAudio: self.playingAudio = False s = NSAppleScript.alloc().initWithSource_( "tell application \"QuickTime Player\" \n stop the front document \n close the front document \n end tell" ) s.executeAndReturnError_(None) self.reviewController.playAudioButton.setTitle_("Play Audio") else: self.playingAudio = True s = NSAppleScript.alloc().initWithSource_( "set filePath to POSIX file \"" + self.audio_file + "\" \n tell application \"QuickTime Player\" \n open filePath \n tell application \"System Events\" \n set visible of process \"QuickTime Player\" to false \n repeat until visible of process \"QuickTime Player\" is false \n end repeat \n end tell \n play the front document \n end tell" ) s.executeAndReturnError_(None) audio = mutagen.mp4.MP4(self.audio_file) length = audio.info.length s = objc.selector(self.stopAudioPlay, signature='v@:') self.audioTimer = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_( length, self, s, None, False) self.reviewController.playAudioButton.setTitle_("Stop Audio") except: showAlert( "Problem playing audio. Please delete audio file and try again." )
def testIncorrectlyDefiningFormalProtocols(self): # Some bad calls to objc.formal_protocol self.assertRaises(TypeError, objc.formal_protocol, [], None, ()) self.assertRaises(TypeError, objc.formal_protocol, "supers", (NSObject, ), ()) self.assertRaises( TypeError, objc.formal_protocol, "supers", objc.protocolNamed("NSLocking"), (), ) self.assertRaises( TypeError, objc.formal_protocol, "supers", [objc.protocolNamed("NSLocking"), "hello"], (), ) self.assertRaises( TypeError, objc.formal_protocol, "supers", None, [ objc.selector(None, selector=b"fooMethod:", signature=b"v@:i"), "hello" ], )
def loadPlugin(self): mainMenu = NSApplication.sharedApplication().mainMenu() s = objc.selector(self.showWindow,signature='v@:') newMenuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(self.title(), s, "" ) newMenuItem.setTarget_(self) mainMenu.itemAtIndex_(2).submenu().addItem_(newMenuItem)
def start_continuous_acquisition(self): print "Starting continuous acquisition" self.continuously_acquiring = 1 acquire_selector = objc.selector(self.continuouslyAcquireImages, signature='v@:') NSThread.detachNewThreadSelector_toTarget_withObject_( acquire_selector, self, objc.nil)
class _SDPQueryRunner(Foundation.NSObject): """ Convenience class for performing a synchronous or asynchronous SDP query on an IOBluetoothDevice. """ def query(self, device, timeout=10.0): # do SDP query err = device.performSDPQuery_(self) if err != _macutil.kIOReturnSuccess: raise _lightbluecommon.BluetoothError(err, self._errmsg(device)) # performSDPQuery_ is async, so block-wait self._queryresult = None if not _macutil.waituntil(lambda: self._queryresult is not None, timeout): raise _lightbluecommon.BluetoothError( "Timed out getting services for %s" % \ device.getNameOrAddress()) # query is now complete if self._queryresult != _macutil.kIOReturnSuccess: raise _lightbluecommon.BluetoothError( self._queryresult, self._errmsg(device)) def sdpQueryComplete_status_(self, device, status): # can't raise exception during a callback, so just keep the err value self._queryresult = status _macutil.interruptwait() sdpQueryComplete_status_ = objc.selector( sdpQueryComplete_status_, signature="v@:@i") # accept object, int def _errmsg(self, device): return "Error getting services for %s" % device.getNameOrAddress()
def decorator(func): oldIMP = cls.instanceMethodForSelector_(SEL) def wrapper(self, *args, **kwargs): return func(self, oldIMP, *args, **kwargs) newMethod = objc.selector(wrapper, selector = oldIMP.selector, signature = oldIMP.signature) objc.classAddMethod(cls, SEL, newMethod) return wrapper
def testHiddenAddMethods(self): @objc.selector def addedmethod(self): return "NEW" addedmethod.isHidden = True def addedclass(self): return "NEWCLASS" addedclass=objc.selector(addedclass, isClassMethod=True) addedclass.isHidden=True objc.classAddMethods(OCTestHidden, [addedmethod, addedclass]) o = OCTestHidden.alloc().init() # Instance method self.assertRaises(AttributeError, getattr, o, 'addedmethod') v = o.performSelector_(b'addedmethod') self.assertEquals(v, "NEW") v = o.pyobjc_instanceMethods.addedmethod() self.assertEquals(v, "NEW") # Class method self.assertRaises(AttributeError, getattr, OCTestHidden, 'addedclass') v = OCTestHidden.performSelector_(b'addedclass') self.assertEquals(v, "NEWCLASS") v = OCTestHidden.pyobjc_classMethods.addedclass() self.assertEquals(v, "NEWCLASS")
def swizzle(cls, SEL, func): old_IMP = cls.instanceMethodForSelector_(SEL) def wrapper(self, *args, **kwargs): return func(self, old_IMP, *args, **kwargs) new_IMP = objc.selector(wrapper, selector=old_IMP.selector, signature=old_IMP.signature) objc.classAddMethod(cls, SEL, new_IMP)
def testAssignFuzzyMethod(self): self.assertRaises( (ValueError, TypeError), setattr, MEClass, "fuzzyMethod", objc.selector(None, selector=b"fuzzy", signature=b"@@:"), )
def __pyobjc_class_setup__(self, name, class_dict, instance_methods, class_methods): super(array_property, self).__pyobjc_class_setup__(name, class_dict, instance_methods, class_methods) # Insert (Mutable) Indexed Accessors # FIXME: should only do the mutable bits when we're actually a mutable property name = self._name Name = name[0].upper() + name[1:] countOf, objectIn, insert, remove, replace = makeArrayAccessors(self._name) countOf = selector(countOf, selector = ('countOf%s'%(Name,)).encode('latin1'), signature = _C_NSUInteger + b'@:', ) countOf.isHidden = True instance_methods.add(countOf) objectIn = selector(objectIn, selector = ('objectIn%sAtIndex:'%(Name,)).encode('latin1'), signature = b'@@:' + _C_NSUInteger, ) objectIn.isHidden = True instance_methods.add(objectIn) insert = selector(insert, selector = ('insertObject:in%sAtIndex:'%(Name,)).encode('latin1'), signature = b'v@:@' + _C_NSUInteger, ) insert.isHidden = True instance_methods.add(insert) remove = selector(remove, selector = ('removeObjectFrom%sAtIndex:'%(Name,)).encode('latin1'), signature = b'v@:' + _C_NSUInteger, ) remove.isHidden = True instance_methods.add(remove) replace = selector(replace, selector = ('replaceObjectIn%sAtIndex:withObject:'%(Name,)).encode('latin1'), signature = b'v@:' + _C_NSUInteger + b'@', ) replace.isHidden = True instance_methods.add(replace)
def __pyobjc_class_setup__(self, name, class_dict, instance_method_list, class_method_list): self.name = name def dospecial(self): pass m = objc.selector(dospecial, selector=("special"+name).encode('latin1')) #instance_method_list.append(m) class_dict['myspecialprop'] = m
def run(self): center = Foundation.NSDistributedNotificationCenter.defaultCenter() selector = objc.selector(self.didReceiveNotification_, signature='v@:@') center.addObserver_selector_name_object_suspensionBehavior_(self, selector, None, None, Foundation.NSNotificationSuspensionBehaviorDeliverImmediately) runloop = Foundation.NSRunLoop.currentRunLoop() while not self.should_terminate: runloop.runUntilDate_(Foundation.NSDate.dateWithTimeIntervalSinceNow_(1))
def swizzleWithNewMethod_(f): cls = old.definingClass oldSelectorName = old.__name__.replace("_", ":") oldIMP = cls.instanceMethodForSelector_(oldSelectorName) newSelectorName = f.__name__.replace("_", ":") argc = len(inspect.getargspec(f)[0]) newSEL = objc.selector(f, selector=newSelectorName, signature=old.signature) #oldSEL = objc.selector(lambda self, *args: oldIMP(self, *args), selector=newSelectorName, signature=old.signature) oldSEL = objc.selector(__swizzleIMPMap[argc](oldIMP), selector=newSelectorName, signature=old.signature) # Swap the two methods objc.classAddMethod(cls, newSelectorName, oldSEL) objc.classAddMethod(cls, oldSelectorName, newSEL) #NSLog(u"Swizzled %s.%s <-> %s" % (cls.__name__, oldSelectorName, newSelectorName)) return f
def endSheetMethod(meth): """ Return a selector that can be used as the delegate callback for sheet methods """ return objc.selector( meth, signature=b"v@:@" + objc._C_NSInteger + objc._C_NSInteger )
def __init__(self, listener, seconds_to_run=5.0): self._listener = listener callback = objc.selector(self.alarm, signature='v@:') self._timer = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_( seconds_to_run, # Interval self, # Target callback, # Selector None, # User info False) # Repeats?
def __pyobjc_class_setup__(self, name, class_dict, instance_methods, class_methods): super(set_property, self).__pyobjc_class_setup__(name, class_dict, instance_methods, class_methods) # (Mutable) Unordered Accessors # FIXME: should only do the mutable bits when we're actually a mutable property name = self._name Name = name[0].upper() + name[1:] countOf, enumeratorOf, memberOf, add, remove = makeSetAccessors(self._name) countOf = selector(countOf, selector = ('countOf%s'%(Name,)).encode('latin1'), signature = _C_NSUInteger + b'@:', ) countOf.isHidden = True instance_methods.add(countOf) enumeratorOf = selector(enumeratorOf, selector = ('enumeratorOf%s'%(Name,)).encode('latin1'), signature = b'@@:', ) enumeratorOf.isHidden = True instance_methods.add(enumeratorOf) memberOf = selector(memberOf, selector = ('memberOf%s:'%(Name,)).encode('latin'), signature = b'@@:@', ) memberOf.isHidden = True instance_methods.add(memberOf) add1 = selector(add, selector = ('add%s:'%(Name,)).encode('latin'), signature = b'v@:@', ) add1.isHidden = True instance_methods.add(add1) add2 = selector(add, selector = ('add%sObject:'%(Name,)).encode('latin1'), signature = b'v@:@', ) add2.isHidden = True instance_methods.add(add2) remove1 = selector(remove, selector = ('remove%s:'%(Name,)).encode('latin1'), signature = b'v@:@', ) remove1.isHidden = True instance_methods.add(remove1) remove2 = selector(remove, selector = ('remove%sObject:'%(Name,)).encode('latin'), signature = b'v@:@', ) remove2.isHidden = True instance_methods.add(remove2)
def start(self): try: newMenuItem = NSMenuItem(self.name, self.showWindow) Glyphs.menu[EDIT_MENU].append(newMenuItem) except: mainMenu = Glyphs.mainMenu() s = objc.selector(self.showWindow, signature='v@:@') newMenuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_(self.name, s, "") newMenuItem.setTarget_(self) mainMenu.itemWithTag_(5).submenu().addItem_(newMenuItem)
def addMenuItem(self): mainMenu = NSApplication.sharedApplication().mainMenu() s = objc.selector(self.selectGlyphsWithErrors,signature='v@:') newMenuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_( "Select Glyphs With Outline Errors", s, "" ) newMenuItem.setTarget_(self) mainMenu.itemAtIndex_(2).submenu().insertItem_atIndex_(newMenuItem, 11)
def service_selector(fn): """Set the selector signature to be that of a service Signature copied from: https://pythonhosted.org/pyobjc/examples/Cocoa/AppKit/SimpleService/index.html :param fn: the service :return: an objc-ified service method """ return objc.selector(fn, signature='v@:@@o^@')
def decorator(function): old = cls.instanceMethodForSelector_(selector) if old.isClassMethod: old = cls.methodForSelector_(selector) def wrapper(self, *args, **kwargs): return function(self, old, *args, **kwargs) new = objc.selector(wrapper, selector = old.selector, signature = old.signature, isClassMethod = old.isClassMethod) objc.classAddMethod(cls, selector, new) return wrapper
def decorator(fun): original = cls.instanceMethodForSelector_(sel) if original.isClassMethod: original = cls.methodForSelector_(sel) def wrapper(self, *args, **kwargs): return fun(self, original, *args, **kwargs) new = objc.selector(wrapper, selector = original.selector, signature = original.signature, isClassMethod = original.isClassMethod) objc.classAddMethod(cls, sel, new) return wrapper
def init(self): self.statusitemController = StatusItemController.alloc().init() statusItemView = NSStatusBar.systemStatusBar().statusItemWithLength_(STATUS_ITEM_VIEW_WIDTH).retain() statusItemView.setTitle_("MNPP") statusItemView.setHighlightMode_(YES) statusItemView.setTarget_(self.statusitemController) selector = objc.selector(self.statusitemController.togglePanel, signature = 'v@:') statusItemView.setAction_(selector) return self
def _addTextField(self, v, y, cnt): control = NSTextField.alloc().init() control.setStringValue_(v.value) control.setFrame_(((108,y-2),(172,15))) control.cell().setControlSize_(NSMiniControlSize) control.cell().setControlTint_(NSGraphiteControlTint) control.setFont_(MINI_FONT) control.setTarget_(self) control.setTag_(cnt) control.setAction_(objc.selector(self.textChanged_, signature="v@:@@")) self.panel.contentView().addSubview_(control)
def _addButton(self, v, y, cnt): control = NSButton.alloc().init() control.setFrame_(((108, y-2),(172,16))) control.setTitle_(v.name) control.setBezelStyle_(1) control.setFont_(SMALL_FONT) control.cell().setControlSize_(NSMiniControlSize) control.cell().setControlTint_(NSGraphiteControlTint) control.setTarget_(self) control.setTag_(cnt) control.setAction_(objc.selector(self.buttonClicked_, signature="v@:@@")) self.panel.contentView().addSubview_(control)