pyglet 3.0.dev11__tar.gz → 3.0.dev12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/PKG-INFO +3 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/README.md +1 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/__init__.py +2 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/__init__.pyi +4 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/app/__init__.py +7 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/app/async_app.py +80 -17
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/app/base.py +29 -12
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/app/cocoa.py +12 -8
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/app/ios.py +9 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/clock.py +1 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/__init__.py +17 -8
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/base.py +9 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/gl/__init__.py +13 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/gl/egl.py +5 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/gl/ios.py +16 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/gl/macos.py +62 -47
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/gl/webgl.py +7 -5
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/gl/windows.py +16 -17
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/config/gl/x11.py +4 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/customtypes.py +12 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/base.py +12 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/cocoa.py +4 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/emscripten.py +3 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/headless.py +5 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/ios.py +2 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/wayland.py +14 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/win32.py +105 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/xlib.py +88 -12
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/xlib_vidmoderestore.py +1 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/enums.py +25 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/event.py +8 -7
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/__init__.py +12 -12
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/base.py +64 -12
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/dwrite/__init__.py +65 -37
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/fontconfig.py +21 -19
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/freetype.py +7 -5
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/harfbuzz.py +18 -13
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/pyodide_js.py +40 -16
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/quartz.py +21 -13
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/ttf.py +28 -16
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/user.py +7 -5
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/win32.py +10 -5
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/__init__.py +13 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/allocation.py +15 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/__init__.py +2 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/base.py +29 -31
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/__init__.py +1 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/buffer.py +5 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/cocoa/context.py +3 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/context.py +29 -10
- pyglet-3.0.dev12/pyglet/graphics/api/gl/draw.py +93 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/egl/context.py +5 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/enums.py +37 -2
- pyglet-3.0.dev12/pyglet/graphics/api/gl/external.py +210 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/framebuffer.py +21 -5
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/gl.py +3 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/gl_fallback.py +3 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/gl_info.py +11 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/global_opengl.py +20 -17
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/ios/context.py +36 -11
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/lib.py +26 -10
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/renderer.py +5 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/shader.py +53 -52
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/shapes.py +2 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/sprite.py +4 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/state.py +191 -20
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/text.py +7 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/texture.py +221 -273
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/vertexarray.py +6 -7
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/vertexdomain.py +72 -52
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/win32/context.py +11 -12
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/win32/wgl_info.py +1 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/xlib/context.py +7 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/xlib/glx_info.py +2 -2
- pyglet-3.0.dev12/pyglet/graphics/api/gl2/draw.py +60 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/global_opengl.py +2 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/shader.py +9 -10
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/shapes.py +2 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/sprite.py +3 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/state.py +6 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/text.py +7 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/vertexdomain.py +26 -19
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/__init__.py +12 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/buffer.py +3 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/context.py +12 -5
- pyglet-3.0.dev12/pyglet/graphics/api/webgl/draw.py +84 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/enums.py +37 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/gl.py +2 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/renderer.py +8 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/shader.py +67 -51
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/shapes.py +2 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/sprite.py +4 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/state.py +189 -14
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/text.py +7 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/texture.py +174 -249
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/vertexarray.py +3 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/vertexdomain.py +66 -58
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/webgl_js.pyi +4 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/atlas.py +5 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/attributes.py +4 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/buffer.py +25 -7
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/draw.py +291 -59
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/framebuffer.py +8 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/instance.py +8 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/shader.py +98 -50
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/state.py +59 -21
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/texture.py +404 -211
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/vertexdomain.py +130 -57
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/vertexstorage.py +89 -32
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/gui/layout.py +3 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/gui/manager.py +26 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/gui/widgets.py +28 -10
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/__init__.py +3 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/animation.py +7 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/base.py +191 -48
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/__init__.py +8 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/dds.py +3 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/gdkpixbuf2.py +2 -3
- pyglet-3.0.dev11/pyglet/image/codecs/quartz.py → pyglet-3.0.dev12/pyglet/image/codecs/imageio.py +29 -26
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/ktx2.py +3 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/wic.py +7 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/info.py +34 -35
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/__init__.py +6 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/base.py +51 -37
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/emscripten/gamepad_js.py +82 -52
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/linux/__init__.py +1 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/linux/evdev.py +111 -62
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/macos/darwin_gc.py +151 -42
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/macos/darwin_hid.py +3 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/win32/__init__.py +32 -25
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/win32/directinput.py +74 -46
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/win32/xinput.py +56 -33
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/__init__.py +2 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/lib_appkit.py +1 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/lib_corefoundation.py +3 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/lib_uikit.py +5 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/runtime.py +5 -7
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/emscripten/__init__.py +12 -1
- pyglet-3.0.dev12/pyglet/libs/emscripten/dom.pyi +173 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/emscripten/filesystem.py +3 -3
- pyglet-3.0.dev12/pyglet/libs/emscripten/pyglet_emscripten.js +127 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/wayland/client.py +4 -0
- pyglet-3.0.dev12/pyglet/libs/linux/x11/xcursor.py +71 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/xf86vmode.py +2 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/xinerama.py +2 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/xinput.py +2 -9
- pyglet-3.0.dev12/pyglet/libs/linux/x11/xinput2.py +222 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/xlib.py +2 -9
- pyglet-3.0.dev12/pyglet/libs/linux/x11/xrandr.py +166 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/xsync.py +2 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/__init__.py +14 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/com.py +27 -12
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/constants.py +53 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/types.py +56 -11
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/math.py +11 -8
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/__init__.py +18 -12
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/base.py +262 -72
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/coreaudio.py +7 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg.py +116 -48
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg_lib/compat.py +1 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg_lib/libavcodec.py +8 -7
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg_lib/libavformat.py +7 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg_lib/libavutil.py +11 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg_lib/libswresample.py +2 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg_lib/libswscale.py +2 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/gstreamer.py +52 -24
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/pyogg.py +139 -69
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/wave.py +7 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/webaudio_pyodide.py +19 -8
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/wmf.py +33 -5
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/devices/win32.py +42 -27
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/base.py +89 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/directsound/adaptation.py +76 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/listener.py +4 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/openal/adaptation.py +105 -17
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/openal/interface.py +107 -70
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/openal/lib_alc.py +2 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/openal/lib_openal.py +2 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/pulse/adaptation.py +98 -16
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/pulse/interface.py +43 -33
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/pulse/lib_pulseaudio.py +2 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/pyodide_js/adaptation.py +4 -6
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/silent/adaptation.py +63 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/xaudio2/adaptation.py +123 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/xaudio2/interface.py +53 -20
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/player.py +215 -23
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/model/__init__.py +3 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/model/codecs/base.py +7 -7
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/model/codecs/gltf.py +1 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/model/codecs/obj.py +5 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/shapes.py +102 -37
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/sprite.py +6 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/storage.py +4 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/__init__.py +47 -15
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/caret.py +29 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/document.py +5 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/formats/structured.py +14 -8
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/layout/__init__.py +2 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/layout/base.py +174 -77
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/layout/boxes.py +205 -53
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/layout/flow.py +80 -20
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/layout/incremental.py +90 -21
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/layout/scrolling.py +4 -13
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/util.py +19 -4
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/__init__.py +198 -17
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/apple/cocoa/__init__.py +76 -49
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/apple/cocoa/pyglet_delegate.py +17 -19
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/apple/cocoa/pyglet_textview.py +12 -18
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/apple/cocoa/pyglet_view.py +213 -88
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/apple/cocoa/pyglet_window.py +5 -11
- pyglet-3.0.dev11/pyglet/window/apple/ios.py → pyglet-3.0.dev12/pyglet/window/apple/ios/__init__.py +90 -10
- pyglet-3.0.dev12/pyglet/window/apple/ios/textinput.py +240 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/camera/__init__.py +2 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/camera/base.py +170 -52
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/camera/camera2d.py +107 -23
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/camera/camera3d.py +35 -9
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/dialog/base.py +0 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/dialog/darwin.py +1 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/dialog/linux.py +5 -1
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/dialog/windows.py +2 -3
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/emscripten/__init__.py +306 -101
- pyglet-3.0.dev12/pyglet/window/emscripten/textinput.py +199 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/event.py +17 -2
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/headless/__init__.py +18 -7
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/key.py +2 -0
- pyglet-3.0.dev12/pyglet/window/pen.py +110 -0
- pyglet-3.0.dev12/pyglet/window/textinput.py +195 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/wayland/__init__.py +85 -10
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/win32/__init__.py +126 -36
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/xlib/__init__.py +310 -84
- pyglet-3.0.dev12/pyglet/window/xlib/pen.py +71 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyproject.toml +32 -5
- pyglet-3.0.dev11/pyglet/graphics/api/gl/draw.py +0 -45
- pyglet-3.0.dev11/pyglet/graphics/api/gl2/draw.py +0 -43
- pyglet-3.0.dev11/pyglet/graphics/api/webgl/draw.py +0 -38
- pyglet-3.0.dev11/pyglet/libs/emscripten/pyglet_emscripten.js +0 -79
- pyglet-3.0.dev11/pyglet/libs/linux/x11/xrandr.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/LICENSE +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/app/linux.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/app/win32.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/display/__init__.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/README.md +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/flaccodec.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/geoshader_sprite.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/hidraw.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/jobs.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/net.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/particles.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/experimental/win32priority.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/extlibs/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/extlibs/earcut.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/extlibs/png.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/dwrite/d2d1_lib.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/dwrite/d2d1_types_lib.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/dwrite/dwrite_lib.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/freetype_lib.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/font/group.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/base.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/cocoa/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/default_shaders.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/egl/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/gl_compat.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/gles.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/ios/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/win32/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl/xlib/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/buffer.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/gl2/framebuffer.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/framebuffer.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/api/webgl/gl_info.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/graphics/resource.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/gui/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/gui/ninepatch.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/gui/styles.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/bmp.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/gdiplus.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/gif.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/js_image.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/pil.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/png.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/image/codecs/qoi.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/controller.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/controller_db.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/emscripten/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/linux/evdev_constants.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/linux/x11_xinput.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/linux/x11_xinput_tablet.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/macos/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/input/win32/wintab.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/lib.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/agl.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/cocoahelpers.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/cocoatypes.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/lib_cocoa.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/lib_coregraphics.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/lib_coretext.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/cocoapy/lib_quartz.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/coreaudio.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/lib_agl.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/darwin/quartzkey.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/egl/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/egl/egl.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/egl/lib.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/emscripten/files.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/emscripten/proxies.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/glx/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/glx/glx.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/glx/lib_glx.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/ioctl.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/wayland/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/wayland/gbm.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/wayland/lib_wayland.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/wayland/wayland_egl.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/wayland/xkbcommon.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/cursorfont.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/linux/x11/xrender.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/lib_harfbuzz.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/spirv/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/spirv/lib_shaderc.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/spirv/lib_spirv_cross.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/exceptions.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/func.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/func_helpers.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vk_video.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vk_video.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_core.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_core.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_ios.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_ios.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_macos.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_macos.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_metal.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_metal.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_wayland.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_wayland.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_win32.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_win32.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_xcb.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_xcb.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_xlib.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_xlib.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_xlib_xrandr.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/shared/vulkan_lib/vulkan_xlib_xrandr.pyi +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/context_managers.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/dinput.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/lib_wgl.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/libwintab.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/wgl.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/wincodec.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/libs/win32/winkey.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/buffered_logger.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/codecs/ffmpeg_lib/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/devices/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/devices/base.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/directsound/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/directsound/exceptions.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/directsound/interface.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/directsound/lib_dsound.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/openal/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/pulse/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/pyodide_js/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/silent/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/xaudio2/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/drivers/xaudio2/lib_xaudio2.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/exceptions.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/instrumentation.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/player_worker_thread.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/media/synthesis.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/model/codecs/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/py.typed +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/resource.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/effects.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/formats/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/formats/attributed.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/formats/html.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/formats/plaintext.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/text/runlist.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/apple/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/apple/cocoa/systemcursor.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/dialog/__init__.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/dialog/emscripten.py +0 -0
- {pyglet-3.0.dev11 → pyglet-3.0.dev12}/pyglet/window/mouse.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pyglet
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.dev12
|
|
4
4
|
Summary: pyglet is a cross-platform games and multimedia package.
|
|
5
5
|
Author-email: Alex Holkner & contributors <Alex.Holkner@gmail.com>
|
|
6
|
-
Requires-Python: >=3.
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
7
|
Description-Content-Type: text/markdown
|
|
8
8
|
Classifier: Development Status :: 5 - Production/Stable
|
|
9
9
|
Classifier: Environment :: MacOS X
|
|
@@ -15,7 +15,6 @@ Classifier: Operating System :: MacOS :: MacOS X
|
|
|
15
15
|
Classifier: Operating System :: Microsoft :: Windows
|
|
16
16
|
Classifier: Operating System :: POSIX :: Linux
|
|
17
17
|
Classifier: Programming Language :: Python :: 3
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
20
19
|
Classifier: Programming Language :: Python :: 3.12
|
|
21
20
|
Classifier: Programming Language :: Python :: 3.13
|
|
@@ -79,7 +78,7 @@ Some features of pyglet are:
|
|
|
79
78
|
|
|
80
79
|
## Requirements
|
|
81
80
|
|
|
82
|
-
pyglet runs under Python 3.
|
|
81
|
+
pyglet runs under Python 3.11+. Being written in pure Python, it also works on other Python interpreters such as PyPy. Supported platforms are:
|
|
83
82
|
|
|
84
83
|
* Windows 7 or later
|
|
85
84
|
* macOS 10.9 or later.
|
|
@@ -48,7 +48,7 @@ Some features of pyglet are:
|
|
|
48
48
|
|
|
49
49
|
## Requirements
|
|
50
50
|
|
|
51
|
-
pyglet runs under Python 3.
|
|
51
|
+
pyglet runs under Python 3.11+. Being written in pure Python, it also works on other Python interpreters such as PyPy. Supported platforms are:
|
|
52
52
|
|
|
53
53
|
* Windows 7 or later
|
|
54
54
|
* macOS 10.9 or later.
|
|
@@ -20,10 +20,10 @@ if TYPE_CHECKING:
|
|
|
20
20
|
from typing import Any, Callable, ItemsView, Sized
|
|
21
21
|
|
|
22
22
|
#: The release version
|
|
23
|
-
version = '3.0.
|
|
23
|
+
version = '3.0.dev12'
|
|
24
24
|
__version__ = version
|
|
25
25
|
|
|
26
|
-
MIN_PYTHON_VERSION = 3,
|
|
26
|
+
MIN_PYTHON_VERSION = 3, 11
|
|
27
27
|
MIN_PYTHON_VERSION_STR = ".".join([str(v) for v in MIN_PYTHON_VERSION])
|
|
28
28
|
|
|
29
29
|
#: The Pyodide release used to develop and test pyglet's browser support.
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
|
|
2
2
|
from dataclasses import dataclass
|
|
3
3
|
from typing import Any, ItemsView, Literal, Sequence
|
|
4
|
+
from .enums import GraphicsAPI
|
|
5
|
+
|
|
6
|
+
def _install_trace() -> None: ...
|
|
4
7
|
|
|
5
8
|
from . import app as app
|
|
6
9
|
from . import clock as clock
|
|
@@ -74,7 +77,7 @@ class Options:
|
|
|
74
77
|
dpi_scaling: Literal["platform", "stretch"]
|
|
75
78
|
shader_bind_management: bool
|
|
76
79
|
wayland: bool
|
|
77
|
-
backend:
|
|
80
|
+
backend: Literal['opengl', 'gl2', 'gles3', 'gles2', 'webgl'] | GraphicsAPI
|
|
78
81
|
optimize_states: bool
|
|
79
82
|
opengl_persistent_buffers: bool
|
|
80
83
|
pyodide: PyodideOptions
|
|
@@ -35,13 +35,17 @@ import sys
|
|
|
35
35
|
import signal
|
|
36
36
|
import platform
|
|
37
37
|
import weakref
|
|
38
|
+
from typing import TYPE_CHECKING
|
|
39
|
+
|
|
40
|
+
if TYPE_CHECKING:
|
|
41
|
+
from pyglet.window import BaseWindow
|
|
38
42
|
|
|
39
43
|
import pyglet
|
|
40
44
|
from pyglet import compat_platform
|
|
41
45
|
from pyglet.app.base import EventLoop
|
|
42
46
|
|
|
43
47
|
|
|
44
|
-
if pyglet.IS_DOC_BUILD:
|
|
48
|
+
if TYPE_CHECKING or pyglet.IS_DOC_BUILD:
|
|
45
49
|
from pyglet.app.base import PlatformEventLoop
|
|
46
50
|
else:
|
|
47
51
|
if compat_platform == 'darwin':
|
|
@@ -67,7 +71,7 @@ class AppException(Exception):
|
|
|
67
71
|
pass
|
|
68
72
|
|
|
69
73
|
|
|
70
|
-
windows = weakref.WeakSet()
|
|
74
|
+
windows: weakref.WeakSet[BaseWindow] = weakref.WeakSet()
|
|
71
75
|
"""Set of all open windows (including invisible windows). Instances of
|
|
72
76
|
:class:`pyglet.window.Window` are automatically added to this set upon
|
|
73
77
|
construction. The set uses weak references, so windows are removed from
|
|
@@ -112,4 +116,4 @@ event_loop = EventLoop()
|
|
|
112
116
|
|
|
113
117
|
#: The platform-dependent event loop. Applications are strongly discouraged
|
|
114
118
|
#: from subclassing or replacing this :class:`PlatformEventLoop` object.
|
|
115
|
-
platform_event_loop = PlatformEventLoop()
|
|
119
|
+
platform_event_loop: PlatformEventLoop = PlatformEventLoop()
|
|
@@ -4,13 +4,15 @@ from __future__ import annotations
|
|
|
4
4
|
import asyncio
|
|
5
5
|
from contextlib import suppress
|
|
6
6
|
import sys
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, TYPE_CHECKING
|
|
8
8
|
|
|
9
9
|
import pyglet
|
|
10
10
|
from pyglet import app, clock, event
|
|
11
11
|
from pyglet.app.base import ClockWindowDrawSource, WindowDrawSource
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
14
|
+
from collections.abc import Callable
|
|
15
|
+
|
|
14
16
|
from pyglet.event import EventDispatcher
|
|
15
17
|
from pyglet.window import BaseWindow
|
|
16
18
|
|
|
@@ -22,13 +24,57 @@ except ImportError as exc:
|
|
|
22
24
|
from pyglet.libs.emscripten.proxies import ProxyRegistry
|
|
23
25
|
|
|
24
26
|
|
|
27
|
+
class _AsyncClock(clock.Clock):
|
|
28
|
+
"""Wake the event loop when new clock work is due sooner."""
|
|
29
|
+
|
|
30
|
+
def __init__(self, time_function: Callable[[], float], on_schedule: Callable[[float | None], None]) -> None:
|
|
31
|
+
"""Bind the clock to the event loop's deadline notification callback."""
|
|
32
|
+
super().__init__(time_function)
|
|
33
|
+
self._schedule_callback = on_schedule
|
|
34
|
+
|
|
35
|
+
def _next_interval_deadline(self) -> float:
|
|
36
|
+
if self._schedule_interval_items:
|
|
37
|
+
return self._schedule_interval_items[0].next_ts
|
|
38
|
+
return float('inf')
|
|
39
|
+
|
|
40
|
+
def _notify_earlier_deadline(self, previous_deadline: float) -> None:
|
|
41
|
+
deadline = self._next_interval_deadline()
|
|
42
|
+
if deadline < previous_deadline:
|
|
43
|
+
self._schedule_callback(deadline)
|
|
44
|
+
|
|
45
|
+
def schedule(self, func: Callable, *args: Any, **kwargs: Any) -> None:
|
|
46
|
+
super().schedule(func, *args, **kwargs)
|
|
47
|
+
self._schedule_callback(None)
|
|
48
|
+
|
|
49
|
+
def schedule_once(self, func: Callable, delay: float, *args: Any, **kwargs: Any) -> None:
|
|
50
|
+
previous_deadline = self._next_interval_deadline()
|
|
51
|
+
super().schedule_once(func, delay, *args, **kwargs)
|
|
52
|
+
self._notify_earlier_deadline(previous_deadline)
|
|
53
|
+
|
|
54
|
+
def schedule_interval(self, func: Callable, interval: float, *args: Any, **kwargs: Any) -> None:
|
|
55
|
+
previous_deadline = self._next_interval_deadline()
|
|
56
|
+
super().schedule_interval(func, interval, *args, **kwargs)
|
|
57
|
+
self._notify_earlier_deadline(previous_deadline)
|
|
58
|
+
|
|
59
|
+
def schedule_interval_fixed_delay(self, func: Callable, interval: float, *args: Any, **kwargs: Any) -> None:
|
|
60
|
+
previous_deadline = self._next_interval_deadline()
|
|
61
|
+
super().schedule_interval_fixed_delay(func, interval, *args, **kwargs)
|
|
62
|
+
self._notify_earlier_deadline(previous_deadline)
|
|
63
|
+
|
|
64
|
+
def schedule_interval_soft(self, func: Callable, interval: float, *args: Any, **kwargs: Any) -> None:
|
|
65
|
+
previous_deadline = self._next_interval_deadline()
|
|
66
|
+
super().schedule_interval_soft(func, interval, *args, **kwargs)
|
|
67
|
+
self._notify_earlier_deadline(previous_deadline)
|
|
68
|
+
|
|
69
|
+
|
|
25
70
|
class AsyncEventLoop(event.EventDispatcher):
|
|
26
71
|
"""Browser event loop which preserves pyglet's normal clock semantics."""
|
|
27
72
|
|
|
28
73
|
def __init__(self) -> None:
|
|
29
74
|
"""Create the browser clock and callback state."""
|
|
30
75
|
self._has_exit_event = asyncio.Event()
|
|
31
|
-
self.
|
|
76
|
+
self._clock_wait_deadline: float | None = None
|
|
77
|
+
self.clock = _AsyncClock(self._get_js_time, self._on_clock_schedule)
|
|
32
78
|
pyglet.clock.set_default(self.clock)
|
|
33
79
|
self.is_running = False
|
|
34
80
|
self._interval: float | None = None
|
|
@@ -36,6 +82,12 @@ class AsyncEventLoop(event.EventDispatcher):
|
|
|
36
82
|
self._window_draw_source: WindowDrawSource | None = None
|
|
37
83
|
self._window_draw_exception: tuple[type[BaseException], BaseException, Any] | None = None
|
|
38
84
|
|
|
85
|
+
def _on_clock_schedule(self, next_ts: float | None) -> None:
|
|
86
|
+
"""Wake the loop if new work is due before its next wakeup."""
|
|
87
|
+
deadline = self._clock_wait_deadline
|
|
88
|
+
if deadline is not None and (next_ts is None or next_ts < deadline):
|
|
89
|
+
app.platform_event_loop.notify()
|
|
90
|
+
|
|
39
91
|
def _get_js_time(self) -> float:
|
|
40
92
|
"""Use Javascripts performance.now for the clock accuracy.
|
|
41
93
|
|
|
@@ -51,7 +103,7 @@ class AsyncEventLoop(event.EventDispatcher):
|
|
|
51
103
|
try:
|
|
52
104
|
window.draw(dt)
|
|
53
105
|
except BaseException: # noqa: BLE001 - JS callbacks cannot unwind Python exceptions.
|
|
54
|
-
self._window_draw_exception = sys.exc_info()
|
|
106
|
+
self._window_draw_exception = sys.exc_info() # type: ignore[assignment]
|
|
55
107
|
self.exit()
|
|
56
108
|
|
|
57
109
|
def _raise_window_draw_exception(self) -> None:
|
|
@@ -104,6 +156,7 @@ class AsyncEventLoop(event.EventDispatcher):
|
|
|
104
156
|
self._interval = interval
|
|
105
157
|
self._has_exit_event.clear()
|
|
106
158
|
platform_event_loop = app.platform_event_loop
|
|
159
|
+
assert isinstance(platform_event_loop, AsyncPlatformEventLoop)
|
|
107
160
|
|
|
108
161
|
try:
|
|
109
162
|
platform_event_loop.start()
|
|
@@ -113,7 +166,16 @@ class AsyncEventLoop(event.EventDispatcher):
|
|
|
113
166
|
|
|
114
167
|
while not self._has_exit_event.is_set():
|
|
115
168
|
timeout = self.idle()
|
|
116
|
-
|
|
169
|
+
# idle finishes before wait() yields, so its timeout includes
|
|
170
|
+
# any work scheduled during that clock tick.
|
|
171
|
+
if timeout is None:
|
|
172
|
+
self._clock_wait_deadline = float('inf')
|
|
173
|
+
elif timeout > 0:
|
|
174
|
+
self._clock_wait_deadline = self.clock.time() + timeout
|
|
175
|
+
try:
|
|
176
|
+
await platform_event_loop.wait(timeout)
|
|
177
|
+
finally:
|
|
178
|
+
self._clock_wait_deadline = None
|
|
117
179
|
platform_event_loop.dispatch_posted_events()
|
|
118
180
|
finally:
|
|
119
181
|
self.is_running = False
|
|
@@ -195,20 +257,21 @@ class AsyncPlatformEventLoop:
|
|
|
195
257
|
self._is_running = True
|
|
196
258
|
|
|
197
259
|
async def wait(self, timeout: float | None) -> None:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
260
|
+
# Keep a wakeup sent before the wait(), so the loop can process it now.
|
|
261
|
+
if self._event_queue.empty() and not self._wake_event.is_set():
|
|
262
|
+
if timeout is None:
|
|
263
|
+
await self._wake_event.wait()
|
|
264
|
+
elif timeout > 0:
|
|
265
|
+
# wait_for() uses call_at(); Pyodide rejects its deadline if
|
|
266
|
+
# it expires during timer setup. Keep the delay relative.
|
|
267
|
+
timer = asyncio.get_running_loop().call_later(timeout, self._wake_event.set)
|
|
268
|
+
try:
|
|
269
|
+
await self._wake_event.wait()
|
|
270
|
+
finally:
|
|
271
|
+
timer.cancel()
|
|
272
|
+
else:
|
|
273
|
+
await asyncio.sleep(0)
|
|
201
274
|
self._wake_event.clear()
|
|
202
|
-
if not self._event_queue.empty():
|
|
203
|
-
return
|
|
204
|
-
|
|
205
|
-
if timeout is None:
|
|
206
|
-
await self._wake_event.wait()
|
|
207
|
-
elif timeout > 0:
|
|
208
|
-
with suppress(asyncio.TimeoutError):
|
|
209
|
-
await asyncio.wait_for(self._wake_event.wait(), timeout)
|
|
210
|
-
else:
|
|
211
|
-
await asyncio.sleep(0)
|
|
212
275
|
|
|
213
276
|
async def step(self, timeout: float | None = None) -> None:
|
|
214
277
|
await self.wait(timeout)
|
|
@@ -5,17 +5,20 @@ import sys
|
|
|
5
5
|
import threading
|
|
6
6
|
from abc import ABC, abstractmethod
|
|
7
7
|
from queue import Queue
|
|
8
|
-
from typing import TYPE_CHECKING, Any, Callable
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Callable, Generic, TypeVar
|
|
9
9
|
|
|
10
10
|
from pyglet import app, clock, event, IS_DOC_BUILD
|
|
11
|
+
from pyglet.customtypes import WindowT
|
|
11
12
|
|
|
12
13
|
if TYPE_CHECKING:
|
|
14
|
+
from types import TracebackType
|
|
15
|
+
|
|
13
16
|
from pyglet.event import EventDispatcher
|
|
14
17
|
from pyglet.window import BaseWindow
|
|
15
18
|
|
|
16
19
|
|
|
17
20
|
|
|
18
|
-
class WindowDrawSource(ABC):
|
|
21
|
+
class WindowDrawSource(ABC, Generic[WindowT]):
|
|
19
22
|
"""Control the source of automatic window draw opportunities.
|
|
20
23
|
|
|
21
24
|
Application-driven backends (Win32 and X11) use
|
|
@@ -40,17 +43,20 @@ class WindowDrawSource(ABC):
|
|
|
40
43
|
def stop(self) -> None:
|
|
41
44
|
"""Stop automatic drawing and release native resources."""
|
|
42
45
|
|
|
43
|
-
def add_window(self, window:
|
|
46
|
+
def add_window(self, window: WindowT) -> bool:
|
|
44
47
|
"""Add a window created while this source is running."""
|
|
45
48
|
return True
|
|
46
49
|
|
|
47
|
-
def remove_window(self, window:
|
|
50
|
+
def remove_window(self, window: WindowT) -> None:
|
|
48
51
|
"""Remove a window before its platform resources are destroyed."""
|
|
49
52
|
|
|
50
53
|
|
|
51
|
-
class ClockWindowDrawSource(WindowDrawSource):
|
|
54
|
+
class ClockWindowDrawSource(WindowDrawSource['BaseWindow']):
|
|
52
55
|
"""Application-driven drawing scheduled by the pyglet Clock."""
|
|
53
56
|
|
|
57
|
+
_clock: clock.Clock
|
|
58
|
+
_draw_windows: Callable[[float], None]
|
|
59
|
+
|
|
54
60
|
def __init__(self, app_clock: clock.Clock, draw_windows: Callable[[float], None]) -> None:
|
|
55
61
|
self._clock = app_clock
|
|
56
62
|
self._draw_windows = draw_windows
|
|
@@ -66,12 +72,19 @@ class ClockWindowDrawSource(WindowDrawSource):
|
|
|
66
72
|
self._clock.unschedule(self._draw_windows)
|
|
67
73
|
|
|
68
74
|
|
|
69
|
-
|
|
75
|
+
_EventLoopT = TypeVar('_EventLoopT', bound=event.EventDispatcher)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class PlatformEventLoop(Generic[_EventLoopT]):
|
|
70
79
|
"""Abstract class, implementation depends on platform.
|
|
71
80
|
|
|
81
|
+
The type parameter identifies the application loop accepted by the
|
|
82
|
+
platform's window draw source.
|
|
83
|
+
|
|
72
84
|
.. versionadded:: 1.2
|
|
73
85
|
"""
|
|
74
|
-
_event_queue: Queue[tuple[EventDispatcher, str, Any]]
|
|
86
|
+
_event_queue: Queue[tuple[EventDispatcher, str, tuple[Any, ...]]]
|
|
87
|
+
_is_running: threading.Event
|
|
75
88
|
|
|
76
89
|
def __init__(self) -> None: # noqa: D107
|
|
77
90
|
self._event_queue = queue.Queue()
|
|
@@ -126,13 +139,13 @@ class PlatformEventLoop:
|
|
|
126
139
|
def start(self) -> None:
|
|
127
140
|
pass
|
|
128
141
|
|
|
129
|
-
def step(self, timeout:
|
|
142
|
+
def step(self, timeout: float | None = None) -> bool | None:
|
|
130
143
|
raise NotImplementedError('abstract')
|
|
131
144
|
|
|
132
|
-
def set_timer(self, func: Callable, interval: float) -> None:
|
|
145
|
+
def set_timer(self, func: Callable[[], None] | None, interval: float | None) -> None:
|
|
133
146
|
pass
|
|
134
147
|
|
|
135
|
-
def create_window_draw_source(self, event_loop:
|
|
148
|
+
def create_window_draw_source(self, event_loop: _EventLoopT) -> WindowDrawSource[BaseWindow] | None:
|
|
136
149
|
"""Create a display-driven draw source, or return ``None``.
|
|
137
150
|
|
|
138
151
|
Returning ``None`` selects application-driven Clock drawing.
|
|
@@ -158,7 +171,11 @@ class EventLoop(event.EventDispatcher):
|
|
|
158
171
|
"""
|
|
159
172
|
_interval: float | None
|
|
160
173
|
_has_exit_condition: threading.Condition
|
|
161
|
-
_has_exit = False
|
|
174
|
+
_has_exit: bool = False
|
|
175
|
+
_window_draw_source: WindowDrawSource[BaseWindow] | None
|
|
176
|
+
_window_draw_exception: tuple[type[BaseException] | None, BaseException | None, TracebackType | None] | None
|
|
177
|
+
clock: clock.Clock
|
|
178
|
+
is_running: bool
|
|
162
179
|
|
|
163
180
|
def __init__(self) -> None: # noqa: D107
|
|
164
181
|
self._has_exit_condition = threading.Condition()
|
|
@@ -318,7 +335,7 @@ class EventLoop(event.EventDispatcher):
|
|
|
318
335
|
timeout = self.clock.get_sleep_time(True)
|
|
319
336
|
app.platform_event_loop.set_timer(self._blocking_timer, timeout)
|
|
320
337
|
|
|
321
|
-
def idle(self) ->
|
|
338
|
+
def idle(self) -> float | None:
|
|
322
339
|
"""Called during each iteration of the event loop.
|
|
323
340
|
|
|
324
341
|
The method is called immediately after any window events (i.e., after
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import signal
|
|
4
4
|
import time
|
|
5
|
-
from typing import TYPE_CHECKING
|
|
5
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
6
6
|
|
|
7
7
|
import pyglet
|
|
8
8
|
from pyglet import app
|
|
@@ -60,7 +60,7 @@ def create_menu():
|
|
|
60
60
|
appMenuItem.release()
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
class _AppDelegate(NSObject):
|
|
63
|
+
class _AppDelegate(NSObject): # type: ignore[valid-type, misc]
|
|
64
64
|
|
|
65
65
|
@objc_method(b'@' + PyObjectEncoding)
|
|
66
66
|
def init(self, pyglet_loop):
|
|
@@ -163,16 +163,20 @@ class CocoaAlternateEventLoop(EventLoop):
|
|
|
163
163
|
self.platform_event_loop.nsapp_stop()
|
|
164
164
|
|
|
165
165
|
|
|
166
|
-
class CocoaWindowDrawSource(WindowDrawSource):
|
|
166
|
+
class CocoaWindowDrawSource(WindowDrawSource['CocoaWindow']):
|
|
167
167
|
"""Display driven drawing backed by one CADisplayLink."""
|
|
168
168
|
|
|
169
|
+
_active: bool
|
|
170
|
+
_interval: float | None
|
|
171
|
+
|
|
169
172
|
def __init__(self) -> None:
|
|
170
173
|
self._active = False
|
|
171
174
|
self._interval = None
|
|
172
175
|
|
|
173
176
|
def start(self, interval: float) -> bool:
|
|
174
|
-
started_windows = []
|
|
175
|
-
for
|
|
177
|
+
started_windows: list[CocoaWindow] = []
|
|
178
|
+
for candidate in app.windows:
|
|
179
|
+
window = cast('CocoaWindow', candidate)
|
|
176
180
|
if not window._start_display_link(interval): # noqa: SLF001
|
|
177
181
|
for started_window in started_windows:
|
|
178
182
|
started_window._stop_display_link() # noqa: SLF001
|
|
@@ -190,10 +194,10 @@ class CocoaWindowDrawSource(WindowDrawSource):
|
|
|
190
194
|
self._active = False
|
|
191
195
|
self._interval = None
|
|
192
196
|
for window in app.windows:
|
|
193
|
-
window._stop_display_link() # noqa: SLF001
|
|
197
|
+
cast('CocoaWindow', window)._stop_display_link() # noqa: SLF001
|
|
194
198
|
|
|
195
199
|
def add_window(self, window: CocoaWindow) -> bool:
|
|
196
|
-
return not self._active or window._start_display_link(self._interval) # noqa: SLF001
|
|
200
|
+
return not self._active or (self._interval is not None and window._start_display_link(self._interval)) # noqa: SLF001
|
|
197
201
|
|
|
198
202
|
def remove_window(self, window: CocoaWindow) -> None:
|
|
199
203
|
window._stop_display_link() # noqa: SLF001
|
|
@@ -251,7 +255,7 @@ class CocoaPlatformEventLoop(PlatformEventLoop):
|
|
|
251
255
|
self.NSApp.activateIgnoringOtherApps_(True)
|
|
252
256
|
self._finished_launching = True
|
|
253
257
|
|
|
254
|
-
def create_window_draw_source(self,
|
|
258
|
+
def create_window_draw_source(self, event_loop: EventLoop) -> WindowDrawSource | None: # noqa: ARG002
|
|
255
259
|
if pyglet.options.osx_displaylink and self._display_link_supported:
|
|
256
260
|
return CocoaWindowDrawSource()
|
|
257
261
|
return None
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
import os
|
|
5
|
+
from typing import Any
|
|
5
6
|
|
|
6
7
|
from pyglet import app
|
|
7
8
|
from pyglet.app.base import EventLoop, PlatformEventLoop, WindowDrawSource
|
|
@@ -31,10 +32,10 @@ NSRunLoop = ObjCClass('NSRunLoop')
|
|
|
31
32
|
CADisplayLink = ObjCClass('CADisplayLink')
|
|
32
33
|
|
|
33
34
|
|
|
34
|
-
class _PygletIOSDisplayLinkTarget(NSObject):
|
|
35
|
+
class _PygletIOSDisplayLinkTarget(NSObject): # type: ignore[valid-type, misc]
|
|
35
36
|
|
|
36
37
|
@objc_method(b'@' + PyObjectEncoding)
|
|
37
|
-
def initWithDrawSource_(self, draw_source: IOSDisplayLinkDrawSource) -> ObjCInstance | None:
|
|
38
|
+
def initWithDrawSource_(self: Any, draw_source: IOSDisplayLinkDrawSource) -> ObjCInstance | None:
|
|
38
39
|
self = ObjCInstance(send_super(self, 'init'))
|
|
39
40
|
if not self:
|
|
40
41
|
return None
|
|
@@ -49,6 +50,10 @@ class _PygletIOSDisplayLinkTarget(NSObject):
|
|
|
49
50
|
class IOSDisplayLinkDrawSource(WindowDrawSource):
|
|
50
51
|
"""One UIKit display link that paces all pyglet window drawing."""
|
|
51
52
|
|
|
53
|
+
_target: ObjCInstance | None
|
|
54
|
+
_display_link: ObjCInstance | None
|
|
55
|
+
_event_loop: IOSEventLoop
|
|
56
|
+
|
|
52
57
|
def __init__(self, event_loop: IOSEventLoop) -> None:
|
|
53
58
|
self._event_loop = event_loop
|
|
54
59
|
self._display_link = None
|
|
@@ -98,7 +103,7 @@ class IOSDisplayLinkDrawSource(WindowDrawSource):
|
|
|
98
103
|
self._last_timestamp, dt = get_display_link_dt(display_link, self._last_timestamp)
|
|
99
104
|
self._event_loop._tick_app(dt) # noqa: SLF001
|
|
100
105
|
|
|
101
|
-
class IOSPlatformEventLoop(PlatformEventLoop):
|
|
106
|
+
class IOSPlatformEventLoop(PlatformEventLoop['IOSEventLoop']):
|
|
102
107
|
"""Schedules pyglet work from UIKit's already-running main run loop."""
|
|
103
108
|
|
|
104
109
|
def __init__(self) -> None:
|
|
@@ -116,7 +121,7 @@ class IOSPlatformEventLoop(PlatformEventLoop):
|
|
|
116
121
|
def stop(self) -> None:
|
|
117
122
|
self._is_running.clear()
|
|
118
123
|
|
|
119
|
-
def create_window_draw_source(self, event_loop:
|
|
124
|
+
def create_window_draw_source(self, event_loop: IOSEventLoop) -> IOSDisplayLinkDrawSource:
|
|
120
125
|
return IOSDisplayLinkDrawSource(event_loop)
|
|
121
126
|
|
|
122
127
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from typing import TYPE_CHECKING, NamedTuple
|
|
5
|
+
from typing import TYPE_CHECKING, NamedTuple, cast
|
|
6
6
|
|
|
7
7
|
import pyglet
|
|
8
8
|
|
|
@@ -12,7 +12,8 @@ from .base import SurfaceConfig, UserConfig # noqa: TC001
|
|
|
12
12
|
from .gl import OpenGLUserConfig, WebGLUserConfig
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
-
from pyglet.window import
|
|
15
|
+
from pyglet.window import BaseWindow
|
|
16
|
+
from pyglet.window.emscripten import EmscriptenWindow
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
class Config:
|
|
@@ -26,15 +27,23 @@ class Config:
|
|
|
26
27
|
__slots__ = 'gl2', 'gles2', 'gles3', 'opengl', 'vulkan', 'webgl'
|
|
27
28
|
|
|
28
29
|
def __init__(self) -> None: # noqa: D107
|
|
29
|
-
self.opengl: OpenGLUserConfig = OpenGLUserConfig(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
self.
|
|
30
|
+
self.opengl: OpenGLUserConfig = OpenGLUserConfig(
|
|
31
|
+
double_buffer=True, depth_size=24, major_version=3, minor_version=3, api=GraphicsAPI.OPENGL,
|
|
32
|
+
)
|
|
33
|
+
self.gl2: OpenGLUserConfig = OpenGLUserConfig(
|
|
34
|
+
double_buffer=True, depth_size=24, major_version=2, minor_version=0, api=GraphicsAPI.OPENGL_2,
|
|
35
|
+
)
|
|
36
|
+
self.gles2: OpenGLUserConfig = OpenGLUserConfig(
|
|
37
|
+
double_buffer=True, depth_size=24, major_version=2, minor_version=0, api=GraphicsAPI.OPENGL_ES_2,
|
|
38
|
+
)
|
|
39
|
+
self.gles3: OpenGLUserConfig = OpenGLUserConfig(
|
|
40
|
+
double_buffer=True, depth_size=24, major_version=3, minor_version=2, api=GraphicsAPI.OPENGL_ES_3,
|
|
41
|
+
)
|
|
33
42
|
self.webgl: WebGLUserConfig = WebGLUserConfig()
|
|
34
43
|
# self.vulkan: TBD
|
|
35
44
|
|
|
36
45
|
|
|
37
|
-
def match_surface_config(config: UserConfig, surface:
|
|
46
|
+
def match_surface_config(config: UserConfig, surface: BaseWindow) -> SurfaceConfig | None:
|
|
38
47
|
if isinstance(config, OpenGLUserConfig):
|
|
39
48
|
from pyglet.config.gl import get_surface_config # noqa: PLC0415
|
|
40
49
|
return get_surface_config(config, surface)
|
|
@@ -42,7 +51,7 @@ def match_surface_config(config: UserConfig, surface: Window) -> SurfaceConfig |
|
|
|
42
51
|
if isinstance(config, WebGLUserConfig):
|
|
43
52
|
if pyglet.compat_platform == 'emscripten':
|
|
44
53
|
from pyglet.config.gl.webgl import match # noqa: PLC0415
|
|
45
|
-
return match(config, surface)
|
|
54
|
+
return match(config, cast('EmscriptenWindow', surface))
|
|
46
55
|
return None
|
|
47
56
|
|
|
48
57
|
msg = f"Matching for '{config.__class__}' is not yet implemented."
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
from typing import Any, TYPE_CHECKING
|
|
3
|
+
from typing import Any, Generic, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from pyglet.customtypes import WindowT
|
|
4
6
|
|
|
5
7
|
if TYPE_CHECKING:
|
|
6
|
-
from pyglet.window import Window
|
|
7
8
|
from pyglet.enums import GraphicsAPI
|
|
8
9
|
|
|
9
10
|
|
|
@@ -16,12 +17,16 @@ class UserConfig:
|
|
|
16
17
|
return False
|
|
17
18
|
|
|
18
19
|
|
|
19
|
-
class SurfaceConfig:
|
|
20
|
+
class SurfaceConfig(Generic[WindowT]):
|
|
20
21
|
"""Surface configuration information returned by a platform.
|
|
21
22
|
|
|
22
23
|
This describes the information a desired surface or window can support.
|
|
23
24
|
"""
|
|
24
|
-
|
|
25
|
+
_window: WindowT
|
|
26
|
+
config: UserConfig
|
|
27
|
+
handle: Any
|
|
28
|
+
|
|
29
|
+
def __init__(self, window: WindowT, config: UserConfig, handle: Any) -> None:
|
|
25
30
|
"""A config representing the capabilities of a specific surface.
|
|
26
31
|
|
|
27
32
|
This is returned by the platform on a specific window and is not meant to be created by users.
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import TYPE_CHECKING, cast
|
|
4
|
+
from typing import Any, TYPE_CHECKING, cast
|
|
5
5
|
|
|
6
6
|
import pyglet
|
|
7
7
|
|
|
8
8
|
from pyglet.enums import GraphicsAPI
|
|
9
9
|
from pyglet.config.base import UserConfig, SurfaceConfig
|
|
10
|
+
from pyglet.customtypes import WindowT
|
|
10
11
|
|
|
11
12
|
if TYPE_CHECKING:
|
|
13
|
+
from pyglet.graphics.api.gl.context import OpenGLSurfaceContext
|
|
14
|
+
from pyglet.graphics.api.gl.global_opengl import OpenGLBackend
|
|
15
|
+
from pyglet.window import BaseWindow
|
|
12
16
|
from pyglet.window.apple.cocoa import CocoaWindow
|
|
13
17
|
from pyglet.window.apple.ios import IOSWindow
|
|
14
18
|
from pyglet.window.headless import HeadlessWindow
|
|
@@ -17,9 +21,15 @@ if TYPE_CHECKING:
|
|
|
17
21
|
from pyglet.window.xlib import XlibWindow
|
|
18
22
|
|
|
19
23
|
|
|
20
|
-
class GLSurfaceConfig(SurfaceConfig):
|
|
24
|
+
class GLSurfaceConfig(SurfaceConfig[WindowT]):
|
|
21
25
|
config: OpenGLUserConfig
|
|
22
26
|
|
|
27
|
+
def __init__(self, window: WindowT, config: OpenGLUserConfig, handle: Any) -> None:
|
|
28
|
+
super().__init__(window, config, handle)
|
|
29
|
+
|
|
30
|
+
def create_context(self, opengl_backend: OpenGLBackend, share: Any) -> OpenGLSurfaceContext:
|
|
31
|
+
raise NotImplementedError
|
|
32
|
+
|
|
23
33
|
|
|
24
34
|
# Platform Specific Configurations
|
|
25
35
|
|
|
@@ -107,7 +117,7 @@ class WebGLUserConfig(UserConfig):
|
|
|
107
117
|
return False
|
|
108
118
|
|
|
109
119
|
|
|
110
|
-
def get_surface_config(user_config: OpenGLUserConfig, surface:
|
|
120
|
+
def get_surface_config(user_config: OpenGLUserConfig, surface: BaseWindow) -> SurfaceConfig | None:
|
|
111
121
|
|
|
112
122
|
if pyglet.options.headless or pyglet.options.wayland:
|
|
113
123
|
from pyglet.config.gl.egl import match as match_egl # noqa: PLC0415
|
|
@@ -7,7 +7,7 @@ from typing import TYPE_CHECKING
|
|
|
7
7
|
from pyglet import options
|
|
8
8
|
from pyglet.graphics.api.gl.egl.context import EGLContext
|
|
9
9
|
import pyglet.libs.egl as egl
|
|
10
|
-
from pyglet.config import
|
|
10
|
+
from pyglet.config.gl import GLSurfaceConfig
|
|
11
11
|
from pyglet.enums import GraphicsAPI
|
|
12
12
|
|
|
13
13
|
if TYPE_CHECKING:
|
|
@@ -72,8 +72,7 @@ def match(config: OpenGLUserConfig, window: HeadlessWindow | WaylandWindow) -> E
|
|
|
72
72
|
return result[0]
|
|
73
73
|
|
|
74
74
|
|
|
75
|
-
class EGLSurfaceConfig(
|
|
76
|
-
window: HeadlessWindow | WaylandWindow
|
|
75
|
+
class EGLSurfaceConfig(GLSurfaceConfig['HeadlessWindow | WaylandWindow']):
|
|
77
76
|
|
|
78
77
|
attribute_ids = { # noqa: RUF012
|
|
79
78
|
'buffer_size': egl.EGL_BUFFER_SIZE,
|
|
@@ -88,7 +87,7 @@ class EGLSurfaceConfig(SurfaceConfig):
|
|
|
88
87
|
'samples': egl.EGL_SAMPLES,
|
|
89
88
|
}
|
|
90
89
|
|
|
91
|
-
def __init__(self, window: HeadlessWindow | WaylandWindow, config: OpenGLUserConfig, egl_config:
|
|
90
|
+
def __init__(self, window: HeadlessWindow | WaylandWindow, config: OpenGLUserConfig, egl_config: int | None) -> None:
|
|
92
91
|
super().__init__(window, config, egl_config)
|
|
93
92
|
self._egl_config = egl_config
|
|
94
93
|
|
|
@@ -112,8 +111,8 @@ class EGLSurfaceConfig(SurfaceConfig):
|
|
|
112
111
|
setattr(self, name, value.value)
|
|
113
112
|
|
|
114
113
|
# TODO: real attributes?
|
|
115
|
-
for name,
|
|
116
|
-
setattr(self, name,
|
|
114
|
+
for name, fake_value in _fake_gl_attributes.items():
|
|
115
|
+
setattr(self, name, fake_value)
|
|
117
116
|
|
|
118
117
|
def create_context(self, opengl_backend: OpenGLBackend, share: EGLContext | None) -> EGLContext:
|
|
119
118
|
return EGLContext(opengl_backend, self._window, self, share)
|