def setFrameSize_(self, size): cocoapy.send_super(self, 'setFrameSize:', size, argtypes=[cocoapy.NSSize]) # This method is called when view is first installed as the # contentView of window. Don't do anything on first call. # This also helps ensure correct window creation event ordering. if not self._window.context.canvas: return width, height = int(size.width), int(size.height) self._window.switch_to() self._window.context.update_geometry() self._window.dispatch_event("on_resize", width, height) self._window.dispatch_event("on_expose") # Can't get app.event_loop.enter_blocking() working with Cocoa, because # when mouse clicks on the window's resize control, Cocoa enters into a # mini-event loop that only responds to mouseDragged and mouseUp events. # This means that using NSTimer to call idle() won't work. Our kludge # is to override NSWindow's nextEventMatchingMask_etc method and call # idle() from there. if self.inLiveResize(): from pyglet import app if app.event_loop is not None: app.event_loop.idle()
def dealloc(self): self._window = None # cocoapy.end_message(self.objc_self, 'removeFromSuperviewWithoutNeedingDisplay') self._textview.release() self._textview = None self._tracking_area.release() self._tracking_area = None cocoapy.send_super(self, 'dealloc')
def initWithFrame_cocoaWindow_(self, frame, window): # The tracking area is used to get mouseEntered, mouseExited, and cursorUpdate # events so that we can custom set the mouse cursor within the view. self._tracking_area = None self = cocoapy.ObjCInstance( cocoapy.send_super(self, 'initWithFrame:', frame, argtypes=[cocoapy.NSRect])) if not self: return None # CocoaWindow object. self._window = window self.updateTrackingAreas() # Create an instance of PygletTextView to handle text events. # We must do this because NSOpenGLView doesn't conform to the # NSTextInputClient protocol by default, and the insertText: method will # not do the right thing with respect to translating key sequences like # "Option-e", "e" if the protocol isn't implemented. So the easiest # thing to do is to subclass NSTextView which *does* implement the # protocol and let it handle text input. PygletTextView = cocoapy.ObjCClass('PygletTextView') self._textview = PygletTextView.alloc().initWithCocoaWindow_(window) # Add text view to the responder chain. self.addSubview_(self._textview) return self
def initWithWindow_(self, window): self = ObjCInstance(send_super(self, 'init')) if not self: return None # CocoaWindow object. self._window = window window._nswindow.setDelegate_(self) # Register delegate for hide and unhide notifications so that we # can dispatch the corresponding pyglet events. notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver_selector_name_object_( self, get_selector('applicationDidHide:'), NSApplicationDidHideNotification, None) notificationCenter.addObserver_selector_name_object_( self, get_selector('applicationDidUnhide:'), NSApplicationDidUnhideNotification, None) # Flag set when we pause exclusive mouse mode if window loses key status. self.did_pause_exclusive_mouse = False return self
def initWithCocoaWindow_(self, window): self = ObjCInstance(send_super(self, 'init')) if not self: return None self._window = window # Interpret tab and return as raw characters self.setFieldEditor_(False) self.empty_string = CFSTR("") return self
def nextEventMatchingMask_untilDate_inMode_dequeue_(self, mask, date, mode, dequeue): if self.inLiveResize(): # Call the idle() method while we're stuck in a live resize event. from pyglet import app if app.event_loop is not None: app.event_loop.idle() event = send_super(self, 'nextEventMatchingMask:untilDate:inMode:dequeue:', mask, date, mode, dequeue, argtypes=[NSUInteger, c_void_p, c_void_p, c_bool]) if event.value == None: return 0 else: return event.value
def dealloc(self): # Unregister delegate from notification center. notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.removeObserver_(self) self._window = None send_super(self, 'dealloc')