2021-04-16 23:21:06 +08:00
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
# pyglet
|
|
|
|
# Copyright (c) 2006-2008 Alex Holkner
|
2021-04-17 01:14:38 +08:00
|
|
|
# Copyright (c) 2008-2021 pyglet contributors
|
2021-04-16 23:21:06 +08:00
|
|
|
# All rights reserved.
|
|
|
|
#
|
|
|
|
# Redistribution and use in source and binary forms, with or without
|
|
|
|
# modification, are permitted provided that the following conditions
|
|
|
|
# are met:
|
|
|
|
#
|
|
|
|
# * Redistributions of source code must retain the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer.
|
|
|
|
# * Redistributions in binary form must reproduce the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer in
|
|
|
|
# the documentation and/or other materials provided with the
|
|
|
|
# distribution.
|
|
|
|
# * Neither the name of pyglet nor the names of its
|
|
|
|
# contributors may be used to endorse or promote products
|
|
|
|
# derived from this software without specific prior written
|
|
|
|
# permission.
|
|
|
|
#
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
|
|
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
|
|
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
|
|
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
|
|
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
|
|
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
# POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
from ctypes import c_void_p, c_bool
|
|
|
|
|
|
|
|
from pyglet.libs.darwin.cocoapy import ObjCClass, ObjCSubclass, send_super
|
|
|
|
from pyglet.libs.darwin.cocoapy import NSUInteger, NSUIntegerEncoding
|
|
|
|
from pyglet.libs.darwin.cocoapy import NSRectEncoding
|
|
|
|
|
|
|
|
|
|
|
|
class PygletWindow_Implementation:
|
|
|
|
PygletWindow = ObjCSubclass('NSWindow', 'PygletWindow')
|
|
|
|
|
|
|
|
@PygletWindow.method('B')
|
|
|
|
def canBecomeKeyWindow(self):
|
|
|
|
return True
|
|
|
|
|
|
|
|
# When the window is being resized, it enters into a mini event loop that
|
|
|
|
# only looks at mouseDragged and mouseUp events, blocking everything else.
|
|
|
|
# Among other things, this makes it impossible to run an NSTimer to call the
|
|
|
|
# idle() function in order to update the view during the resize. So we
|
|
|
|
# override this method, called by the resizing event loop, and call the
|
|
|
|
# idle() function from here. This *almost* works. I can't figure out what
|
|
|
|
# is happening at the very beginning of a resize event. The NSView's
|
|
|
|
# viewWillStartLiveResize method is called and then nothing happens until
|
|
|
|
# the mouse is dragged. I think NSApplication's nextEventMatchingMask_etc
|
|
|
|
# method is being called instead of this one. I don't really feel like
|
|
|
|
# subclassing NSApplication just to fix this. Also, to prevent white flashes
|
|
|
|
# while resizing, we must also call idle() from the view's reshape method.
|
|
|
|
@PygletWindow.method(b'@'+NSUIntegerEncoding+b'@@B')
|
|
|
|
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,
|
|
|
|
superclass_name='NSWindow',
|
|
|
|
argtypes=[NSUInteger, c_void_p, c_void_p, c_bool])
|
|
|
|
|
|
|
|
if event.value is None:
|
|
|
|
return 0
|
|
|
|
else:
|
|
|
|
return event.value
|
|
|
|
|
|
|
|
# Need this for set_size to not flash.
|
|
|
|
@PygletWindow.method(b'd'+NSRectEncoding)
|
|
|
|
def animationResizeTime_(self, newFrame):
|
|
|
|
return 0.0
|
|
|
|
|
|
|
|
|
|
|
|
class PygletToolWindow_Implementation:
|
|
|
|
PygletToolWindow = ObjCSubclass('NSPanel', 'PygletToolWindow')
|
|
|
|
|
|
|
|
@PygletToolWindow.method(b'@'+NSUIntegerEncoding+b'@@B')
|
|
|
|
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
|
|
|
|
|
|
|
|
# Need this for set_size to not flash.
|
|
|
|
@PygletToolWindow.method(b'd'+NSRectEncoding)
|
|
|
|
def animationResizeTime_(self, newFrame):
|
|
|
|
return 0.0
|
|
|
|
|
|
|
|
|
|
|
|
PygletWindow = ObjCClass('PygletWindow')
|
|
|
|
PygletToolWindow = ObjCClass('PygletToolWindow')
|