pyglet 2.0.8__zip → 2.0.10__zip
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-2.0.8 → pyglet-2.0.10}/.github/workflows/unittests.yml +1 -5
- {pyglet-2.0.8 → pyglet-2.0.10}/.gitignore +3 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/.readthedocs.yml +5 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/PKG-INFO +3 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/README.md +2 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/RELEASE_NOTES +55 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/qt_sprite_preview.py +774 -586
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/conf.py +6 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/shapes.rst +8 -8
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/window_key.rst +9 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/eventloop.rst +57 -53
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/keyboard.rst +194 -67
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/media.rst +297 -67
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/quickstart.rst +1 -0
- pyglet-2.0.10/examples/clipboard.py +18 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/controller.py +4 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/media_info.py +1 -9
- pyglet-2.0.10/examples/media/soundspace/README +38 -0
- pyglet-2.0.10/examples/media/soundspace/reader.py +117 -0
- pyglet-2.0.10/examples/media/soundspace/res/bass.wav +0 -0
- pyglet-2.0.10/examples/media/soundspace/res/drums.wav +0 -0
- pyglet-2.0.10/examples/media/soundspace/res/guitar.wav +0 -0
- pyglet-2.0.10/examples/media/soundspace/res/piano.wav +0 -0
- pyglet-2.0.10/examples/media/soundspace/res/space.txt +24 -0
- pyglet-2.0.10/examples/media/soundspace/soundspace.py +660 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/fpscamera.py +50 -38
- pyglet-2.0.10/examples/net/client.py +18 -0
- pyglet-2.0.10/examples/net/server.py +25 -0
- pyglet-2.0.10/examples/opengl/compute_shader.py +39 -0
- {pyglet-2.0.8/examples/graphics → pyglet-2.0.10/examples}/shapes.py +3 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/fixed_resolution.py +37 -34
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/__init__.py +21 -10
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/base.py +13 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/cocoa.py +6 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/clock.py +47 -116
- pyglet-2.0.10/pyglet/customtypes.py +12 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/event.py +16 -16
- pyglet-2.0.10/pyglet/experimental/README.md +6 -0
- pyglet-2.0.10/pyglet/experimental/geoshader_sprite.py +792 -0
- pyglet-2.0.10/pyglet/experimental/net.py +247 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/directwrite.py +33 -59
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/win32.py +85 -25
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/base.py +195 -46
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/gl_info.py +4 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib.py +1 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/win32.py +30 -30
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/__init__.py +9 -21
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/shader.py +53 -50
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/vertexarray.py +8 -9
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/vertexbuffer.py +50 -74
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/vertexdomain.py +54 -97
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gui/frame.py +2 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gui/widgets.py +31 -3
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/__init__.py +35 -14
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/atlas.py +9 -9
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/buffer.py +19 -16
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/wic.py +8 -10
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/controller_db.py +19 -23
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/evdev.py +3 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/xinput.py +2 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/cocoalibs.py +1 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/__init__.py +12 -1
- pyglet-2.0.10/pyglet/libs/win32/com.py +397 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/types.py +9 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/math.py +18 -43
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/wmf.py +16 -22
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/devices/base.py +28 -24
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/devices/win32.py +93 -47
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/base.py +6 -4
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/adaptation.py +13 -8
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/lib_dsound.py +0 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/listener.py +1 -3
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/adaptation.py +17 -7
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/adaptation.py +2 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/interface.py +12 -9
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/lib_xaudio2.py +16 -34
- pyglet-2.0.10/pyglet/media/mediathreads.py +129 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/player.py +8 -3
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/__init__.py +4 -17
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/codecs/obj.py +1 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/shapes.py +194 -143
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/sprite.py +4 -17
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/__init__.py +2 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/caret.py +2 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/layout.py +171 -189
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/util.py +6 -35
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/__init__.py +75 -35
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/__init__.py +28 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_textview.py +11 -4
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/key.py +10 -1
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/win32/__init__.py +37 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/xlib/__init__.py +142 -5
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/PKG-INFO +3 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/SOURCES.txt +68 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/app/test_eventloop.py +1 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/test_imagegrid.py +3 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/test_texture3d.py +3 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_driver.py +15 -12
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_16bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_1bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_24bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_32bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_4bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgb_8bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_bmp_loading[rgba_32bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_buffer_copy.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_buffer_saving.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_checkerboard.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgb_dxt1.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgba_dxt1.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgba_dxt3.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_dds_loading[rgba_dxt5.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_depth_buffer_saving.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[8bpp.gif].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[l.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_loading[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_loading[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_loading[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[l.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp_trans.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_loading[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[l.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pypng_saving[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_16bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_1bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_24bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_32bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_4bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_8bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgba_32bpp.bmp].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_buffer_copy.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_buffer_saving.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_checkerboard.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgb_dxt1.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt1.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt3.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt5.dds].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_depth_buffer_saving.001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[8bpp.gif].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[l.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[l.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_saving[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgb_8bpp_trans.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[l.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[la.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[rgb.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_saving[rgba.png].001.png +0 -0
- pyglet-2.0.10/tests/interactive/shapes/test_shapes.py +179 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_inline_elements.py +20 -17
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_inline_elements_style_change.py +15 -14
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_multiline_wrap.py +18 -18
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_plain.py +5 -5
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_style.py +5 -5
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/conftest.py +5 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/test_shapes.py +24 -2
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_events.py +31 -21
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/gencontrollerdb.py +3 -3
- pyglet-2.0.8/experimental/geoshader_sprite.py +0 -367
- pyglet-2.0.8/pyglet/libs/win32/com.py +0 -340
- pyglet-2.0.8/pyglet/media/mediathreads.py +0 -152
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_24bpp.bmp].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_32bpp.bmp].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_4bpp.bmp].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_8bpp.bmp].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgba_32bpp.bmp].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_checkerboard.001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgb_dxt1.dds].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt1.dds].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt3.dds].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_dds_loading[rgba_dxt5.dds].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[8bpp.gif].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[l.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[la.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgb.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_gdkpixbuf2_loading[rgba.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[la.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgb.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[rgba.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[la.png].001.png +0 -0
- pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[rgba.png].001.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/.coveragerc +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/.github/ISSUE_TEMPLATE/questions--or-other.md +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/.github/workflows/codeql.yml +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/LICENSE +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/MANIFEST.in +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/README +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/asedemo.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/aseprite.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/aseprite_codec/running.ase +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/logo3d/logo3d.jpg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/logo3d/logo3d.obj.zip +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/logo3d/logo3d.wings +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/scenemanager.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/contrib/toys/follow_mouse.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/Makefile +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/README.md +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/favicon.ico +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/logo.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/logo5.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/_static/relatedlogo.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/external_resources.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/index.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/contributing.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/dist.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/doc.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/generated.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/gl.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/media_logging_manual.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/media_manual.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/testing.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/virtualenv.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/wraptypes-class.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/internal/wraptypes.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/make.bat +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/app.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/canvas.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/clock.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/event.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/font.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/gl.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/allocation.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/index.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/shader.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/vertexbuffer.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/graphics/vertexdomain.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/gui.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/image/animation.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/image/atlas.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/image/index.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/info.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/input.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/math.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/media.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/media_synthesis.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/pyglet.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/resource.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/sprite.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/caret.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/document.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/index.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/text/layout.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/window.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/modules/window_mouse.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/context.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/debug.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/events.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/examplegame.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/gl.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/graphics.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/image.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/abstract_image.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/abstract_image.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/buffer_image.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/buffer_image.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/context_flow.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/context_flow.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_crosshair.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_default.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_hand.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_no.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_down.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_left.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_left_right.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_right.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_up.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_size_up_down.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_text.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_mac_wait.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_crosshair.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_default.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_hand.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_help.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_no.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_left_right.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_nesw.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_nwse.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_size_up_down.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_text.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_wait.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/cursor_win_wait_arrow.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/explosion.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/font_metrics.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/font_metrics.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_classes.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_classes.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_grid.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_grid.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_sequence.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/image_sequence.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/mouse_coordinates.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/mouse_coordinates.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/screens.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/screens.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/text_classes.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/text_classes.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_location.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_location.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_borderless.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_default.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_dialog.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_osx_tool.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_default.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_dialog.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_overlay.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_tool.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/img/window_xp_transparent.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/input.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/installation.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/math.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/migration.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/mouse.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/options.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/resources.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/shapes.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/text.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/time.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/programming_guide/windowing.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/doc/requirements.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/events_key_state_handler.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/register_event_type.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/window_events.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/events/window_platform_event.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/file_dialog.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/asteroid.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/bullet.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/bullet.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/engine_flame.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/resources/player.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/asteroid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/game/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/game/load.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version1/game/resources.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/asteroid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/load.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/physicalobject.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version2/game/resources.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/asteroid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/load.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/physicalobject.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/resources.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version3/game/util.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/asteroid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/asteroid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/bullet.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/load.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/physicalobject.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/resources.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version4/game/util.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/asteroid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/asteroid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/bullet.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/load.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/physicalobject.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/resources.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/game/version5/game/util.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/graphics/image_convert.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/graphics/image_display.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/bar.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/button_down.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/button_hover.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/button_up.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/knob.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/gui/widgets.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/hello_world.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/apple_remote.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/input.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/joystick.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/input/tablet.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/media_player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/README +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/ball.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/ball.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/noisy/noisy.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/synthesizer.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/media/video.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/box.mtl +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/box.obj +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/logo3d.mtl +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/logo3d.obj +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/model.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/model/pyglet.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/egl_context.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_context.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_core.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_scissor.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/opengl_shader.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/opengl/pyglet.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/animation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/dinosaur.gif +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/events.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/hello_world.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/image_viewer.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/kitten.jpg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/programming_guide/window_subclass.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/resources/kitten.jpg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/resources/pyglet.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/depth_sprite.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/display_sprite.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/multi_texture_sprite.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/sprite/sprite_batching.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/advanced_font.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/font_comparison.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/html_label.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/pyglet.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/text/text_input.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/timer.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/camera.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/camera_group.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/multiple_windows.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/overlay_window.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/examples/window/transparent_window.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/README +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/genfield.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/py.df.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/py.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/dist_field/renderfield.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/flaccodec.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/hello_world.svg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/spritebenchmark.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/svg_test.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/wayland/gbm_egl_context.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/experimental/win32priority.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/make.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/cocoa.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/win32.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/app/xlib.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/base.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/headless.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/win32.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/xlib.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/canvas/xlib_vidmoderestore.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/extlibs/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/extlibs/png.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/base.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/fontconfig.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/freetype.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/freetype_lib.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/quartz.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/ttf.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/user.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/font/win32query.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/agl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/cocoa.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/gl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/gl_compat.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glx.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glx_info.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glxext_arb.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glxext_mesa.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/glxext_nv.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/headless.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib_agl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib_glx.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/lib_wgl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wgl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wgl_info.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wglext_arb.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/wglext_nv.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gl/xlib.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/graphics/allocation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/gui/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/animation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/bmp.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/dds.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/gdiplus.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/gdkpixbuf2.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/gif.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/pil.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/png.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/quartz.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/image/codecs/s3tc.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/info.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/base.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/controller.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/evdev_constants.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/x11_xinput.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/linux/x11_xinput_tablet.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/macos/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/macos/darwin_hid.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/directinput.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/input/win32/wintab.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/lib.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/cocoatypes.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/cocoapy/runtime.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/coreaudio.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/darwin/quartzkey.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/egl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/eglext.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/egl/lib.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/wayland/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/wayland/gbm.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/wayland/xkbcommon.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/constants.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/context_managers.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/dinput.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/libwintab.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/win32/winkey.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/cursorfont.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xf86vmode.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xinerama.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xinput.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xlib.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/libs/x11/xsync.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/buffered_logger.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/base.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/coreaudio.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/compat.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libavcodec.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libavformat.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libavutil.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libswresample.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/ffmpeg_lib/libswscale.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/gstreamer.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/pyogg.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/codecs/wave.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/devices/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/exceptions.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/directsound/interface.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/interface.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/lib_alc.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/openal/lib_openal.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/adaptation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/interface.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/pulse/lib_pulseaudio.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/silent/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/silent/adaptation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/drivers/xaudio2/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/exceptions.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/instrumentation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/media/synthesis.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/codecs/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/model/codecs/gltf.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/resource.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/document.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/attributed.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/html.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/plaintext.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/formats/structured.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/text/runlist.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_delegate.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_view.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/pyglet_window.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/cocoa/systemcursor.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/event.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/headless/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet/window/mouse.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/dependency_links.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/top_level.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyglet.egg-info/zip-safe +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pyproject.toml +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/pytest.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/setup.cfg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/setup.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/annotations.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/data.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/event_loop.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/interactive.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/performance.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/base/test_interactive_test_base.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/conftest.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/README +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man.ttf +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man_bold.ttf +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man_bold_italic.ttf +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/action_man_italic.ttf +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/fonts/courR12-ISO8859-1.pcf +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/8bpp.gif +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/cursor.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/dinosaur.gif +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/gdk_close.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/grey_background.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon1.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size1.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size2.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size3.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size4.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/icon_size5.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/l.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/la.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/multitexture.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_16bpp.bmp +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_1bpp.bmp +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_24bpp.bmp +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_32bpp.bmp +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_4bpp.bmp +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_8bpp.bmp +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_8bpp.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_8bpp_trans.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgb_dxt1.dds +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_32bpp.bmp +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_dxt1.dds +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_dxt3.dds +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/rgba_dxt5.dds +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/images/tests.interactive.test_interactive_test_base._Test.test_1.001.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/README +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/alert.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/login.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/logout.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/receive.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/send.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sawtooth_16_11025_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sawtooth_16_44800_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_silence_16_11025_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_silence_16_44800_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_simplefm_16_11025_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_simplefm_16_44800_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sine_16_11025_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_sine_16_44800_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_square_16_11025_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_square_16_44800_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_triangle_16_11025_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/media/synthesis_triangle_16_44800_1ch.wav +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/models/logo3d.mtl +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/data/models/logo3d.obj +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/app/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/font/test_fontconfig.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/font/test_freetype_face.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/graphics/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/graphics/test_allocation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/image/test_gdkpixbuf2.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/mock_player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_directsound.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_openal.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/media/test_pulse.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/model/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/model/test_loading.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/test_linux_fontconfig.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/test_win_context_managers.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/platform/test_win_multicore_clock.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir1/dir1/f3.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir1/f2.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir1/res.zip +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/dir2/f6.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/f1.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/rgbm.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/test_resource_image_loading.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/resource/test_resource_loading.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/text/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/text/test_empty_document.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/test_context_share.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/test_event_sequence.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/integration/window/test_window_caption.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/conftest.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/graphics/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/graphics/test_multitexture.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/image/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/image/test_image.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/media/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/media/test_player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/committed/README +0 -0
- /pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.graphics.test_multitexture.test_multitexture.001.png → /pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[rgb.png].001.png +0 -0
- /pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_16bpp.bmp].001.png → /pyglet-2.0.10/tests/interactive/screenshots/committed/tests.interactive.image.test_image.test_pil_saving[rgba.png].001.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/session/README +0 -0
- /pyglet-2.0.8/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_bmp_loading[rgb_1bpp.bmp].001.png → /pyglet-2.0.10/tests/interactive/screenshots/session/tests.interactive.graphics.test_multitexture.test_multitexture.001.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pil_loading[l.png].001.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/screenshots/session/tests.interactive.image.test_image.test_pypng_loading[l.png].001.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_caret_color.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_content_valign.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/text/test_html.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_events.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_fullscreen.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_modes.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_multisample.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_open.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_settings.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/test_window_styles.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/window/window_util.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/interactive/windowed_test_base.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/requirements.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_listener.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_player.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_sources.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/media/test_synthesis.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/conftest.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/shapes/test_bordered_rectangle.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_atlas.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_clock.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_clock_freq.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_font.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_input.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_math.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_resource_path.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_sprite.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/test_text.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/text/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/text/test_caret.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tests/unit/text/test_layout.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/al_info.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/bokeh_timeline.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/compare.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/configure.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/extractors.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/fs.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/mp.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/mpexceptions.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/playmany.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/readme_ffmpeg_debbuging_branch.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/readme_run_tests.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/report.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/reports.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/retry_crashed.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/run_test_suite.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/summarize.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/test_instrumentation.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/ffmpeg/timeline.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/gendist.sh +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/gengl.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/gengl_old.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/genwrappers.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/gl.template +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/gl.xml +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/gl_info.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/inspect_font.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/requirements.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wgl.h +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/__init__.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/cparser.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/ctypesparser.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/lex.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/preprocessor.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/wrap.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/tools/wraptypes/yacc.py +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/LICENSE.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/README.rst +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/assets/favicon.ico +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/assets/static/css/example-custom-styles.css +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/assets/static/images/pyglet.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/404.html/contents.lr +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/404.html/ngc-5793.jpg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/authors/benjamin/contents.lr +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/authors/benjamin/pyglet.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/authors/contents.lr +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/blog/contents.lr +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/blog/welcome-blog/contents.lr +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/contents.lr +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/content/eclipse.jpg +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/pyglet.lektorproject +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/AUTHORS.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/CHANGELOG.md +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/CONTRIBUTING.md +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/LICENSE.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/NOTICE.txt +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/README.md +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/bootstrap.css +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/icomoon.css +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/magnific-popup.css +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/css/style.css +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/icomoon/icomoon.ttf +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/fonts/icomoon/icomoon.woff +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/images/Preloader_2.gif +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/images/placeholder_person.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery-3.3.1.min.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.easing.min.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.magnific-popup.min.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.stellar.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.stellar.min.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/jquery.waypoints.min.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/magnific-popup-options.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/main-singlelayout.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/assets/static/js/main.js +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/content.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/gallery.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/gallery_item.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/member.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/mission.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/mission_tab.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/service.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/services.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/flowblocks/team.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/blog-index.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/full-blog.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/full-page.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/gallery-404.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/gallery-singlepage.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/mainpage-screenshots.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/images/responsive-layout.png +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/404.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/author.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/authors.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/blog-post.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/blog.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/page.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/models/single-layout.ini +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/404.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/author.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/authors.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/content.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/gallery.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/mission.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/services.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blocks/team.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blog-layout.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blog-post.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/blog.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/layout.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/macros/blog.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/macros/pagination.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/none.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/page.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/templates/single-layout.html +0 -0
- {pyglet-2.0.8 → pyglet-2.0.10}/website/themes/lektor-icon/theme.ini +0 -0
|
@@ -1,41 +1,42 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
|
+
from enum import Enum, auto
|
|
3
|
+
from typing import Dict, Optional
|
|
2
4
|
|
|
3
5
|
from pyglet import event
|
|
4
|
-
from pyglet.util import with_metaclass
|
|
5
6
|
|
|
6
7
|
|
|
7
|
-
class DeviceState:
|
|
8
|
-
ACTIVE =
|
|
9
|
-
DISABLED =
|
|
10
|
-
MISSING =
|
|
11
|
-
UNPLUGGED =
|
|
8
|
+
class DeviceState(Enum):
|
|
9
|
+
ACTIVE = auto()
|
|
10
|
+
DISABLED = auto()
|
|
11
|
+
MISSING = auto()
|
|
12
|
+
UNPLUGGED = auto()
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
class DeviceFlow:
|
|
15
|
-
OUTPUT =
|
|
16
|
-
INPUT =
|
|
17
|
-
INPUT_OUTPUT =
|
|
15
|
+
class DeviceFlow(Enum):
|
|
16
|
+
OUTPUT = auto()
|
|
17
|
+
INPUT = auto()
|
|
18
|
+
INPUT_OUTPUT = auto()
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
class AudioDevice:
|
|
21
22
|
"""Base class for a platform independent audio device.
|
|
22
23
|
_platform_state and _platform_flow is used to make device state numbers."""
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
platform_state: Dict[int, DeviceState] = {} # Must be defined by the parent.
|
|
25
|
+
platform_flow: Dict[int, DeviceFlow] = {} # Must be defined by the parent.
|
|
25
26
|
|
|
26
|
-
def __init__(self, dev_id, name, description, flow, state):
|
|
27
|
+
def __init__(self, dev_id: str, name: str, description: str, flow: int, state: int):
|
|
27
28
|
self.id = dev_id
|
|
28
|
-
self.flow = flow
|
|
29
|
-
self.state = state
|
|
29
|
+
self.flow = flow # platform value
|
|
30
|
+
self.state = state # platform value
|
|
30
31
|
self.name = name
|
|
31
32
|
self.description = description
|
|
32
33
|
|
|
33
34
|
def __repr__(self):
|
|
34
|
-
return "{}(name={}, state={}, flow={})".format(
|
|
35
|
-
self.__class__.__name__, self.name, self.
|
|
35
|
+
return "{}(name='{}', state={}, flow={})".format(
|
|
36
|
+
self.__class__.__name__, self.name, self.platform_state[self.state].name, self.platform_flow[self.flow].name)
|
|
36
37
|
|
|
37
38
|
|
|
38
|
-
class AbstractAudioDeviceManager(
|
|
39
|
+
class AbstractAudioDeviceManager(event.EventDispatcher, metaclass=ABCMeta):
|
|
39
40
|
|
|
40
41
|
def __del__(self):
|
|
41
42
|
"""Required to remove handlers before exit, as it can cause problems with the event system's weakrefs."""
|
|
@@ -66,20 +67,23 @@ class AbstractAudioDeviceManager(with_metaclass(ABCMeta, event.EventDispatcher,
|
|
|
66
67
|
"""Returns a list of all audio devices, no matter what state they are in."""
|
|
67
68
|
pass
|
|
68
69
|
|
|
69
|
-
def on_device_state_changed(self, device, old_state, new_state):
|
|
70
|
-
"""Event, occurs when the state of a device changes, provides old state and new state."""
|
|
70
|
+
def on_device_state_changed(self, device: AudioDevice, old_state: DeviceState, new_state: DeviceState):
|
|
71
|
+
"""Event, occurs when the state of a device changes, provides the old state and new state."""
|
|
71
72
|
pass
|
|
72
73
|
|
|
73
|
-
def on_device_added(self, device):
|
|
74
|
+
def on_device_added(self, device: AudioDevice):
|
|
74
75
|
"""Event, occurs when a new device is added to the system."""
|
|
75
76
|
pass
|
|
76
77
|
|
|
77
|
-
def on_device_removed(self, device):
|
|
78
|
+
def on_device_removed(self, device: AudioDevice):
|
|
78
79
|
"""Event, occurs when an existing device is removed from the system."""
|
|
79
80
|
pass
|
|
80
81
|
|
|
81
|
-
def on_default_changed(self, device):
|
|
82
|
-
"""Event, occurs when the default audio device changes.
|
|
82
|
+
def on_default_changed(self, device: Optional[AudioDevice], flow: DeviceFlow):
|
|
83
|
+
"""Event, occurs when the default audio device changes.
|
|
84
|
+
If there is no device that can be the default on the system, can be None.
|
|
85
|
+
The flow determines whether an input or output device became it's respective default.
|
|
86
|
+
"""
|
|
83
87
|
pass
|
|
84
88
|
|
|
85
89
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from typing import List, Optional, Tuple
|
|
2
|
+
|
|
1
3
|
from pyglet.libs.win32 import com
|
|
2
4
|
from pyglet.libs.win32 import _ole32 as ole32
|
|
3
5
|
from pyglet.libs.win32.constants import CLSCTX_INPROC_SERVER
|
|
@@ -5,7 +7,7 @@ from pyglet.libs.win32.types import *
|
|
|
5
7
|
from pyglet.media.devices import base
|
|
6
8
|
from pyglet.util import debug_print
|
|
7
9
|
|
|
8
|
-
_debug = debug_print('
|
|
10
|
+
_debug = debug_print('debug_input')
|
|
9
11
|
|
|
10
12
|
EDataFlow = UINT
|
|
11
13
|
# Audio rendering stream. Audio data flows from the application to the audio endpoint device, which renders the stream.
|
|
@@ -49,7 +51,7 @@ class PROPERTYKEY(ctypes.Structure):
|
|
|
49
51
|
return "PROPERTYKEY({}, pid={})".format(self.fmtid, self.pid)
|
|
50
52
|
|
|
51
53
|
|
|
52
|
-
REFPROPERTYKEY = PROPERTYKEY
|
|
54
|
+
REFPROPERTYKEY = POINTER(PROPERTYKEY)
|
|
53
55
|
|
|
54
56
|
PKEY_Device_FriendlyName = PROPERTYKEY(
|
|
55
57
|
com.GUID(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0), 14)
|
|
@@ -81,45 +83,60 @@ IID_IMMDeviceEnumerator = com.GUID(0xa95664d2, 0x9614, 0x4f35, 0xa7, 0x46, 0xde,
|
|
|
81
83
|
class IMMNotificationClient(com.IUnknown):
|
|
82
84
|
_methods_ = [
|
|
83
85
|
('OnDeviceStateChanged',
|
|
84
|
-
com.
|
|
86
|
+
com.STDMETHOD(LPCWSTR, DWORD)),
|
|
85
87
|
('OnDeviceAdded',
|
|
86
|
-
com.
|
|
88
|
+
com.STDMETHOD(LPCWSTR)),
|
|
87
89
|
('OnDeviceRemoved',
|
|
88
|
-
com.
|
|
90
|
+
com.STDMETHOD(LPCWSTR)),
|
|
89
91
|
('OnDefaultDeviceChanged',
|
|
90
|
-
com.
|
|
92
|
+
com.STDMETHOD(EDataFlow, ERole, LPCWSTR)),
|
|
91
93
|
('OnPropertyValueChanged',
|
|
92
|
-
com.
|
|
94
|
+
com.STDMETHOD(LPCWSTR, PROPERTYKEY)),
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
IID_IMMEndpoint = com.GUID(0x1BE09788, 0x6894, 0x4089, 0x85, 0x86, 0x9A, 0x2A, 0x6C, 0x26, 0x5A, 0xC5)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class IMMEndpoint(com.pIUnknown):
|
|
102
|
+
_methods_ = [
|
|
103
|
+
('GetDataFlow',
|
|
104
|
+
com.STDMETHOD(POINTER(EDataFlow))),
|
|
93
105
|
]
|
|
94
106
|
|
|
95
107
|
|
|
96
108
|
class AudioNotificationCB(com.COMObject):
|
|
97
109
|
_interfaces_ = [IMMNotificationClient]
|
|
98
110
|
|
|
99
|
-
def __init__(self, audio_devices):
|
|
111
|
+
def __init__(self, audio_devices: 'Win32AudioDeviceManager'):
|
|
100
112
|
super().__init__()
|
|
101
113
|
self.audio_devices = audio_devices
|
|
102
114
|
self._lost = False
|
|
103
115
|
|
|
104
|
-
def OnDeviceStateChanged(self,
|
|
116
|
+
def OnDeviceStateChanged(self, pwstrDeviceId, dwNewState):
|
|
105
117
|
device = self.audio_devices.get_cached_device(pwstrDeviceId)
|
|
106
118
|
|
|
107
119
|
old_state = device.state
|
|
120
|
+
|
|
121
|
+
pyglet_old_state = Win32AudioDevice.platform_state[old_state]
|
|
122
|
+
pyglet_new_state = Win32AudioDevice.platform_state[dwNewState]
|
|
108
123
|
assert _debug(
|
|
109
|
-
"Audio device {} changed state. From
|
|
124
|
+
f"Audio device '{device.name}' changed state. From: {pyglet_old_state} to: {pyglet_new_state}")
|
|
110
125
|
|
|
111
126
|
device.state = dwNewState
|
|
112
|
-
self.audio_devices.dispatch_event('on_device_state_changed', device,
|
|
127
|
+
self.audio_devices.dispatch_event('on_device_state_changed', device, pyglet_old_state, pyglet_new_state)
|
|
113
128
|
|
|
114
|
-
def OnDeviceAdded(self,
|
|
115
|
-
|
|
116
|
-
|
|
129
|
+
def OnDeviceAdded(self, pwstrDeviceId):
|
|
130
|
+
dev = self.audio_devices.add_device(pwstrDeviceId)
|
|
131
|
+
assert _debug(f"Audio device was added {pwstrDeviceId}: {dev}")
|
|
132
|
+
self.audio_devices.dispatch_event('on_device_added', dev)
|
|
117
133
|
|
|
118
|
-
def OnDeviceRemoved(self,
|
|
119
|
-
|
|
120
|
-
|
|
134
|
+
def OnDeviceRemoved(self, pwstrDeviceId):
|
|
135
|
+
dev = self.audio_devices.remove_device(pwstrDeviceId)
|
|
136
|
+
assert _debug(f"Audio device was removed {pwstrDeviceId} : {dev}")
|
|
137
|
+
self.audio_devices.dispatch_event('on_device_removed', dev)
|
|
121
138
|
|
|
122
|
-
def OnDefaultDeviceChanged(self,
|
|
139
|
+
def OnDefaultDeviceChanged(self, flow, role, pwstrDeviceId):
|
|
123
140
|
# Only support eConsole role right now
|
|
124
141
|
if role == 0:
|
|
125
142
|
if pwstrDeviceId is None:
|
|
@@ -127,9 +144,12 @@ class AudioNotificationCB(com.COMObject):
|
|
|
127
144
|
else:
|
|
128
145
|
device = self.audio_devices.get_cached_device(pwstrDeviceId)
|
|
129
146
|
|
|
130
|
-
|
|
147
|
+
pyglet_flow = Win32AudioDevice.platform_flow[flow]
|
|
148
|
+
assert _debug(f"Default device was changed to: {device} ({pyglet_flow})")
|
|
149
|
+
|
|
150
|
+
self.audio_devices.dispatch_event('on_default_changed', device, pyglet_flow)
|
|
131
151
|
|
|
132
|
-
def OnPropertyValueChanged(self,
|
|
152
|
+
def OnPropertyValueChanged(self, pwstrDeviceId, key):
|
|
133
153
|
pass
|
|
134
154
|
|
|
135
155
|
|
|
@@ -171,14 +191,14 @@ class IMMDeviceEnumerator(com.pIUnknown):
|
|
|
171
191
|
|
|
172
192
|
|
|
173
193
|
class Win32AudioDevice(base.AudioDevice):
|
|
174
|
-
|
|
194
|
+
platform_state = {
|
|
175
195
|
DEVICE_STATE_ACTIVE: base.DeviceState.ACTIVE,
|
|
176
196
|
DEVICE_STATE_DISABLED: base.DeviceState.DISABLED,
|
|
177
197
|
DEVICE_STATE_NOTPRESENT: base.DeviceState.MISSING,
|
|
178
198
|
DEVICE_STATE_UNPLUGGED: base.DeviceState.UNPLUGGED
|
|
179
199
|
}
|
|
180
200
|
|
|
181
|
-
|
|
201
|
+
platform_flow = {
|
|
182
202
|
eRender: base.DeviceFlow.OUTPUT,
|
|
183
203
|
eCapture: base.DeviceFlow.INPUT,
|
|
184
204
|
eAll: base.DeviceFlow.INPUT_OUTPUT
|
|
@@ -192,14 +212,42 @@ class Win32AudioDeviceManager(base.AbstractAudioDeviceManager):
|
|
|
192
212
|
byref(self._device_enum))
|
|
193
213
|
|
|
194
214
|
# Keep all devices cached, and the callback can keep them updated.
|
|
195
|
-
self.devices = self._query_all_devices()
|
|
215
|
+
self.devices: List[Win32AudioDevice] = self._query_all_devices()
|
|
196
216
|
|
|
197
217
|
super().__init__()
|
|
198
218
|
|
|
199
219
|
self._callback = AudioNotificationCB(self)
|
|
200
220
|
self._device_enum.RegisterEndpointNotificationCallback(self._callback)
|
|
201
221
|
|
|
202
|
-
def
|
|
222
|
+
def add_device(self, pwstrDeviceId: str) -> Win32AudioDevice:
|
|
223
|
+
dev = self.get_device(pwstrDeviceId)
|
|
224
|
+
self.devices.append(dev)
|
|
225
|
+
return dev
|
|
226
|
+
|
|
227
|
+
def remove_device(self, pwstrDeviceId: str) -> Win32AudioDevice:
|
|
228
|
+
dev = self.audio_devices.get_cached_device(pwstrDeviceId)
|
|
229
|
+
self.audio_devices.devices.remove(dev)
|
|
230
|
+
return dev
|
|
231
|
+
|
|
232
|
+
def get_device(self, pwstrDeviceId: str) -> Win32AudioDevice:
|
|
233
|
+
device = IMMDevice()
|
|
234
|
+
|
|
235
|
+
self._device_enum.GetDevice(pwstrDeviceId, byref(device))
|
|
236
|
+
dev_id, name, desc, dev_state = self.get_device_info(device)
|
|
237
|
+
|
|
238
|
+
ep = IMMEndpoint()
|
|
239
|
+
device.QueryInterface(IID_IMMEndpoint, byref(ep))
|
|
240
|
+
|
|
241
|
+
dataflow = EDataFlow()
|
|
242
|
+
ep.GetDataFlow(byref(dataflow))
|
|
243
|
+
flow = dataflow.value
|
|
244
|
+
|
|
245
|
+
windevice = Win32AudioDevice(dev_id, name, desc, flow, dev_state)
|
|
246
|
+
ep.Release()
|
|
247
|
+
device.Release()
|
|
248
|
+
return windevice
|
|
249
|
+
|
|
250
|
+
def get_default_output(self) -> Optional[Win32AudioDevice]:
|
|
203
251
|
"""Attempts to retrieve a default audio output for the system. Returns None if no available devices found."""
|
|
204
252
|
try:
|
|
205
253
|
device = IMMDevice()
|
|
@@ -207,14 +255,14 @@ class Win32AudioDeviceManager(base.AbstractAudioDeviceManager):
|
|
|
207
255
|
dev_id, name, desc, dev_state = self.get_device_info(device)
|
|
208
256
|
device.Release()
|
|
209
257
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
return
|
|
213
|
-
except OSError:
|
|
214
|
-
assert _debug("No default audio output was found.")
|
|
258
|
+
cached_dev = self.get_cached_device(dev_id)
|
|
259
|
+
cached_dev.state = dev_state
|
|
260
|
+
return cached_dev
|
|
261
|
+
except OSError as err:
|
|
262
|
+
assert _debug("No default audio output was found.", err)
|
|
215
263
|
return None
|
|
216
264
|
|
|
217
|
-
def get_default_input(self):
|
|
265
|
+
def get_default_input(self) -> Optional[Win32AudioDevice]:
|
|
218
266
|
"""Attempts to retrieve a default audio input for the system. Returns None if no available devices found."""
|
|
219
267
|
try:
|
|
220
268
|
device = IMMDevice()
|
|
@@ -222,37 +270,35 @@ class Win32AudioDeviceManager(base.AbstractAudioDeviceManager):
|
|
|
222
270
|
dev_id, name, desc, dev_state = self.get_device_info(device)
|
|
223
271
|
device.Release()
|
|
224
272
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
return
|
|
228
|
-
except OSError:
|
|
229
|
-
assert _debug("No default input output was found.")
|
|
273
|
+
cached_dev = self.get_cached_device(dev_id)
|
|
274
|
+
cached_dev.state = dev_state
|
|
275
|
+
return cached_dev
|
|
276
|
+
except OSError as err:
|
|
277
|
+
assert _debug("No default input output was found.", err)
|
|
230
278
|
return None
|
|
231
279
|
|
|
232
|
-
def get_cached_device(self, dev_id):
|
|
280
|
+
def get_cached_device(self, dev_id) -> Win32AudioDevice:
|
|
233
281
|
"""Gets the cached devices, so we can reduce calls to COM and tell current state vs new states."""
|
|
234
282
|
for device in self.devices:
|
|
235
283
|
if device.id == dev_id:
|
|
236
284
|
return device
|
|
237
285
|
|
|
238
|
-
raise Exception("Attempted to get a device that does not exist.")
|
|
239
|
-
|
|
240
|
-
# return None
|
|
286
|
+
raise Exception("Attempted to get a device that does not exist.", dev_id)
|
|
241
287
|
|
|
242
|
-
def get_output_devices(self, state=DEVICE_STATE_ACTIVE):
|
|
288
|
+
def get_output_devices(self, state=DEVICE_STATE_ACTIVE) -> List[Win32AudioDevice]:
|
|
243
289
|
return [device for device in self.devices if device.state == state and device.flow == eRender]
|
|
244
290
|
|
|
245
|
-
def get_input_devices(self, state=DEVICE_STATE_ACTIVE):
|
|
291
|
+
def get_input_devices(self, state=DEVICE_STATE_ACTIVE) -> List[Win32AudioDevice]:
|
|
246
292
|
return [device for device in self.devices if device.state == state and device.flow == eCapture]
|
|
247
293
|
|
|
248
|
-
def get_all_devices(self):
|
|
294
|
+
def get_all_devices(self) -> List[Win32AudioDevice]:
|
|
249
295
|
return self.devices
|
|
250
296
|
|
|
251
|
-
def _query_all_devices(self):
|
|
297
|
+
def _query_all_devices(self) -> List[Win32AudioDevice]:
|
|
252
298
|
return self.get_devices(flow=eRender, state=DEVICE_STATEMASK_ALL) + self.get_devices(flow=eCapture,
|
|
253
299
|
state=DEVICE_STATEMASK_ALL)
|
|
254
300
|
|
|
255
|
-
def get_device_info(self, device):
|
|
301
|
+
def get_device_info(self, device: IMMDevice) -> Tuple[str, str, str, int]:
|
|
256
302
|
"""Return the ID, Name, and Description of the Audio Device."""
|
|
257
303
|
store = IPropertyStore()
|
|
258
304
|
device.OpenPropertyStore(STGM_READ, byref(store))
|
|
@@ -293,13 +339,13 @@ class Win32AudioDeviceManager(base.AbstractAudioDeviceManager):
|
|
|
293
339
|
return devices
|
|
294
340
|
|
|
295
341
|
@staticmethod
|
|
296
|
-
def get_pkey_value(store, pkey):
|
|
342
|
+
def get_pkey_value(store: IPropertyStore, pkey: PROPERTYKEY):
|
|
297
343
|
try:
|
|
298
344
|
propvar = PROPVARIANT()
|
|
299
345
|
store.GetValue(pkey, byref(propvar))
|
|
300
346
|
value = propvar.pwszVal
|
|
301
|
-
ole32.PropVariantClear(propvar)
|
|
302
|
-
except Exception
|
|
347
|
+
ole32.PropVariantClear(byref(propvar))
|
|
348
|
+
except Exception:
|
|
303
349
|
value = "Unknown"
|
|
304
350
|
|
|
305
351
|
return value
|
|
@@ -4,10 +4,9 @@ import weakref
|
|
|
4
4
|
from abc import ABCMeta, abstractmethod
|
|
5
5
|
|
|
6
6
|
import pyglet
|
|
7
|
-
from pyglet.util import with_metaclass
|
|
8
7
|
|
|
9
8
|
|
|
10
|
-
class AbstractAudioPlayer(
|
|
9
|
+
class AbstractAudioPlayer(metaclass=ABCMeta):
|
|
11
10
|
"""Base class for driver audio players.
|
|
12
11
|
"""
|
|
13
12
|
|
|
@@ -165,7 +164,10 @@ class AbstractAudioPlayer(with_metaclass(ABCMeta)):
|
|
|
165
164
|
|
|
166
165
|
@property
|
|
167
166
|
def source(self):
|
|
168
|
-
"""Source to play from.
|
|
167
|
+
"""Source to play from.
|
|
168
|
+
May be swapped out for one of an equal audio format, but ensure that
|
|
169
|
+
the player has been paused and cleared beforehand.
|
|
170
|
+
"""
|
|
169
171
|
return self._source
|
|
170
172
|
|
|
171
173
|
@source.setter
|
|
@@ -173,7 +175,7 @@ class AbstractAudioPlayer(with_metaclass(ABCMeta)):
|
|
|
173
175
|
self._source = weakref.proxy(value)
|
|
174
176
|
|
|
175
177
|
|
|
176
|
-
class AbstractAudioDriver(
|
|
178
|
+
class AbstractAudioDriver(metaclass=ABCMeta):
|
|
177
179
|
@abstractmethod
|
|
178
180
|
def create_audio_player(self, source, player):
|
|
179
181
|
pass
|
|
@@ -69,6 +69,10 @@ class DirectSoundAudioPlayer(AbstractAudioPlayer):
|
|
|
69
69
|
# eos for one buffer size.
|
|
70
70
|
self._eos_cursor = None
|
|
71
71
|
|
|
72
|
+
# Whether the source has hit its end; protect against duplicate
|
|
73
|
+
# dispatch of on_eos events.
|
|
74
|
+
self._has_underrun = False
|
|
75
|
+
|
|
72
76
|
# Indexes into DSound circular buffer. Complications ensue wrt each
|
|
73
77
|
# other to avoid writing over the play cursor. See _get_write_size and
|
|
74
78
|
# write().
|
|
@@ -101,13 +105,13 @@ class DirectSoundAudioPlayer(AbstractAudioPlayer):
|
|
|
101
105
|
|
|
102
106
|
def play(self):
|
|
103
107
|
assert _debug('DirectSound play')
|
|
104
|
-
self.driver.worker.add(self)
|
|
105
108
|
|
|
106
109
|
if not self._playing:
|
|
107
|
-
self._get_audiodata() # prebuffer if needed
|
|
108
110
|
self._playing = True
|
|
111
|
+
self._get_audiodata() # prebuffer if needed
|
|
109
112
|
self._ds_buffer.play()
|
|
110
113
|
|
|
114
|
+
self.driver.worker.add(self)
|
|
111
115
|
assert _debug('return DirectSound play')
|
|
112
116
|
|
|
113
117
|
def stop(self):
|
|
@@ -128,6 +132,7 @@ class DirectSoundAudioPlayer(AbstractAudioPlayer):
|
|
|
128
132
|
self._play_cursor = self._write_cursor
|
|
129
133
|
self._eos_cursor = None
|
|
130
134
|
self._audiodata_buffer = None
|
|
135
|
+
self._has_underrun = False
|
|
131
136
|
del self._events[:]
|
|
132
137
|
del self._timestamps[:]
|
|
133
138
|
|
|
@@ -153,10 +158,6 @@ class DirectSoundAudioPlayer(AbstractAudioPlayer):
|
|
|
153
158
|
self.write(None, write_size)
|
|
154
159
|
write_size = 0
|
|
155
160
|
|
|
156
|
-
def _has_underrun(self):
|
|
157
|
-
return (self._eos_cursor is not None
|
|
158
|
-
and self._play_cursor > self._eos_cursor)
|
|
159
|
-
|
|
160
161
|
def _dispatch_new_event(self, event_name):
|
|
161
162
|
MediaEvent(event_name).sync_dispatch_to_player(self.player)
|
|
162
163
|
|
|
@@ -243,9 +244,13 @@ class DirectSoundAudioPlayer(AbstractAudioPlayer):
|
|
|
243
244
|
del self._timestamps[0]
|
|
244
245
|
|
|
245
246
|
def _check_underrun(self):
|
|
246
|
-
if
|
|
247
|
+
if (
|
|
248
|
+
not self._has_underrun and
|
|
249
|
+
self._playing and
|
|
250
|
+
(self._eos_cursor is not None and self._play_cursor > self._eos_cursor)
|
|
251
|
+
):
|
|
247
252
|
assert _debug('underrun, stopping')
|
|
248
|
-
self.
|
|
253
|
+
self._has_underrun = True
|
|
249
254
|
self._dispatch_new_event('on_eos')
|
|
250
255
|
|
|
251
256
|
def _get_write_size(self):
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
from abc import ABCMeta, abstractmethod
|
|
2
2
|
|
|
3
|
-
from pyglet.util import with_metaclass
|
|
4
3
|
|
|
5
|
-
|
|
6
|
-
class AbstractListener(with_metaclass(ABCMeta, object)):
|
|
4
|
+
class AbstractListener(metaclass=ABCMeta):
|
|
7
5
|
"""The listener properties for positional audio.
|
|
8
6
|
|
|
9
7
|
You can obtain the singleton instance of this class by calling
|
|
@@ -101,6 +101,10 @@ class OpenALAudioPlayer(AbstractAudioPlayer):
|
|
|
101
101
|
# Cursor position of end of queued AL buffer.
|
|
102
102
|
self._write_cursor = 0
|
|
103
103
|
|
|
104
|
+
# Whether the source hit its end; protect against duplicate dispatch
|
|
105
|
+
# of on_eos events.
|
|
106
|
+
self._has_underrun = False
|
|
107
|
+
|
|
104
108
|
# List of currently queued buffer sizes (in bytes)
|
|
105
109
|
self._buffer_sizes = []
|
|
106
110
|
|
|
@@ -177,6 +181,7 @@ class OpenALAudioPlayer(AbstractAudioPlayer):
|
|
|
177
181
|
self._buffer_cursor = 0
|
|
178
182
|
self._play_cursor = 0
|
|
179
183
|
self._write_cursor = 0
|
|
184
|
+
self._has_underrun = False
|
|
180
185
|
del self._events[:]
|
|
181
186
|
del self._buffer_sizes[:]
|
|
182
187
|
del self._buffer_timestamps[:]
|
|
@@ -271,15 +276,15 @@ class OpenALAudioPlayer(AbstractAudioPlayer):
|
|
|
271
276
|
def _get_new_audiodata(self):
|
|
272
277
|
assert _debug('Getting new audio data buffer.')
|
|
273
278
|
compensation_time = self.get_audio_time_diff()
|
|
274
|
-
self._audiodata_buffer= self.source.get_audio_data(self.ideal_buffer_size, compensation_time)
|
|
279
|
+
self._audiodata_buffer = self.source.get_audio_data(self.ideal_buffer_size, compensation_time)
|
|
275
280
|
|
|
276
281
|
if self._audiodata_buffer is not None:
|
|
277
282
|
assert _debug('New audio data available: {} bytes'.format(self._audiodata_buffer.length))
|
|
278
283
|
self._queue_events(self._audiodata_buffer)
|
|
279
284
|
else:
|
|
280
285
|
assert _debug('No audio data left')
|
|
281
|
-
if self.
|
|
282
|
-
assert _debug('
|
|
286
|
+
if self._has_just_underrun():
|
|
287
|
+
assert _debug('Freshly underrun')
|
|
283
288
|
MediaEvent('on_eos').sync_dispatch_to_player(self.player)
|
|
284
289
|
|
|
285
290
|
def _queue_audio_data(self, audio_data, length):
|
|
@@ -297,12 +302,17 @@ class OpenALAudioPlayer(AbstractAudioPlayer):
|
|
|
297
302
|
|
|
298
303
|
def _queue_events(self, audio_data):
|
|
299
304
|
for event in audio_data.events:
|
|
300
|
-
cursor = self._write_cursor + event.timestamp *
|
|
301
|
-
self.source.audio_format.bytes_per_second
|
|
305
|
+
cursor = self._write_cursor + event.timestamp * self.source.audio_format.bytes_per_second
|
|
302
306
|
self._events.append((cursor, event))
|
|
303
307
|
|
|
304
|
-
def
|
|
305
|
-
|
|
308
|
+
def _has_just_underrun(self):
|
|
309
|
+
if self._has_underrun:
|
|
310
|
+
return False
|
|
311
|
+
|
|
312
|
+
if self.alsource.buffers_queued == 0:
|
|
313
|
+
self._has_underrun = True
|
|
314
|
+
|
|
315
|
+
return self._has_underrun
|
|
306
316
|
|
|
307
317
|
def get_time(self):
|
|
308
318
|
# Update first, might remove buffers
|
|
@@ -89,7 +89,6 @@ class XAudio2AudioPlayer(AbstractAudioPlayer):
|
|
|
89
89
|
if not self._buffers:
|
|
90
90
|
self._xa2_driver.return_voice(self._xa2_source_voice)
|
|
91
91
|
|
|
92
|
-
|
|
93
92
|
def play(self):
|
|
94
93
|
assert _debug('XAudio2 play')
|
|
95
94
|
|
|
@@ -137,6 +136,8 @@ class XAudio2AudioPlayer(AbstractAudioPlayer):
|
|
|
137
136
|
Unlike the other drivers this does not carve pieces of audio from the buffer and slowly
|
|
138
137
|
consume it. This submits the buffer retrieved from the decoder in it's entirety.
|
|
139
138
|
"""
|
|
139
|
+
if not self._xa2_source_voice:
|
|
140
|
+
return
|
|
140
141
|
|
|
141
142
|
buffers_queued = self._xa2_source_voice.buffers_queued
|
|
142
143
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import weakref
|
|
2
2
|
from collections import namedtuple, defaultdict
|
|
3
3
|
|
|
4
|
+
from pyglet.media.devices.base import DeviceFlow
|
|
5
|
+
|
|
4
6
|
import pyglet
|
|
5
7
|
from pyglet.libs.win32.types import *
|
|
6
8
|
from pyglet.util import debug_print
|
|
@@ -69,15 +71,16 @@ class XAudio2Driver:
|
|
|
69
71
|
|
|
70
72
|
self._players.clear()
|
|
71
73
|
|
|
72
|
-
def on_default_changed(self, device):
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
74
|
+
def on_default_changed(self, device, flow: DeviceFlow):
|
|
75
|
+
if flow == DeviceFlow.OUTPUT:
|
|
76
|
+
"""Callback derived from the Audio Devices to help us determine when the system no longer has output."""
|
|
77
|
+
if device is None:
|
|
78
|
+
assert _debug('Error: Default audio device was removed or went missing.')
|
|
79
|
+
self._dead = True
|
|
80
|
+
else:
|
|
81
|
+
if self._dead:
|
|
82
|
+
assert _debug('Warning: Default audio device added after going missing.')
|
|
83
|
+
self._dead = False
|
|
81
84
|
|
|
82
85
|
def _create_xa2(self, device_id=None):
|
|
83
86
|
self._xaudio2 = lib.IXAudio2()
|
|
@@ -192,17 +192,19 @@ XAUDIO2_NO_VIRTUAL_AUDIO_CLIENT = 0x10000 # Used in CreateMasteringVoice to cr
|
|
|
192
192
|
class IXAudio2VoiceCallback(com.Interface):
|
|
193
193
|
_methods_ = [
|
|
194
194
|
('OnVoiceProcessingPassStart',
|
|
195
|
-
com.
|
|
195
|
+
com.VOIDMETHOD(UINT32)),
|
|
196
196
|
('OnVoiceProcessingPassEnd',
|
|
197
|
-
com.
|
|
198
|
-
('
|
|
199
|
-
com.
|
|
200
|
-
('
|
|
201
|
-
com.
|
|
197
|
+
com.VOIDMETHOD()),
|
|
198
|
+
('OnStreamEnd',
|
|
199
|
+
com.VOIDMETHOD()),
|
|
200
|
+
('OnBufferStart',
|
|
201
|
+
com.VOIDMETHOD(ctypes.c_void_p)),
|
|
202
202
|
('OnBufferEnd',
|
|
203
|
-
com.
|
|
203
|
+
com.VOIDMETHOD(ctypes.c_void_p)),
|
|
204
204
|
('OnLoopEnd',
|
|
205
|
-
com.
|
|
205
|
+
com.VOIDMETHOD(ctypes.c_void_p)),
|
|
206
|
+
('OnVoiceError',
|
|
207
|
+
com.VOIDMETHOD(ctypes.c_void_p, HRESULT))
|
|
206
208
|
]
|
|
207
209
|
|
|
208
210
|
|
|
@@ -220,20 +222,9 @@ class XA2SourceCallback(com.COMObject):
|
|
|
220
222
|
_interfaces_ = [IXAudio2VoiceCallback]
|
|
221
223
|
|
|
222
224
|
def __init__(self, xa2_player):
|
|
225
|
+
super().__init__()
|
|
223
226
|
self.xa2_player = xa2_player
|
|
224
227
|
|
|
225
|
-
def OnVoiceProcessingPassStart(self, bytesRequired):
|
|
226
|
-
pass
|
|
227
|
-
|
|
228
|
-
def OnVoiceProcessingPassEnd(self):
|
|
229
|
-
pass
|
|
230
|
-
|
|
231
|
-
def onStreamEnd(self):
|
|
232
|
-
pass
|
|
233
|
-
|
|
234
|
-
def onBufferStart(self, pBufferContext):
|
|
235
|
-
pass
|
|
236
|
-
|
|
237
228
|
def OnBufferEnd(self, pBufferContext):
|
|
238
229
|
"""At the end of playing one buffer, attempt to refill again.
|
|
239
230
|
Even if the player is out of sources, it needs to be called to purge all buffers.
|
|
@@ -241,10 +232,7 @@ class XA2SourceCallback(com.COMObject):
|
|
|
241
232
|
if self.xa2_player:
|
|
242
233
|
self.xa2_player.refill_source_player()
|
|
243
234
|
|
|
244
|
-
def
|
|
245
|
-
pass
|
|
246
|
-
|
|
247
|
-
def onVoiceError(self, this, pBufferContext, hresult):
|
|
235
|
+
def OnVoiceError(self, pBufferContext, hresult):
|
|
248
236
|
raise Exception("Error occurred during audio playback.", hresult)
|
|
249
237
|
|
|
250
238
|
|
|
@@ -362,24 +350,18 @@ class IXAudio2MasteringVoice(IXAudio2Voice):
|
|
|
362
350
|
class IXAudio2EngineCallback(com.Interface):
|
|
363
351
|
_methods_ = [
|
|
364
352
|
('OnProcessingPassStart',
|
|
365
|
-
com.
|
|
353
|
+
com.VOIDMETHOD()),
|
|
366
354
|
('OnProcessingPassEnd',
|
|
367
|
-
com.
|
|
355
|
+
com.VOIDMETHOD()),
|
|
368
356
|
('OnCriticalError',
|
|
369
|
-
com.
|
|
357
|
+
com.VOIDMETHOD(HRESULT)),
|
|
370
358
|
]
|
|
371
359
|
|
|
372
360
|
|
|
373
361
|
class XA2EngineCallback(com.COMObject):
|
|
374
362
|
_interfaces_ = [IXAudio2EngineCallback]
|
|
375
363
|
|
|
376
|
-
def
|
|
377
|
-
pass
|
|
378
|
-
|
|
379
|
-
def OnProcessingPassEnd(self):
|
|
380
|
-
pass
|
|
381
|
-
|
|
382
|
-
def OnCriticalError(self, this, hresult):
|
|
364
|
+
def OnCriticalError(self, hresult):
|
|
383
365
|
raise Exception("Critical Error:", hresult)
|
|
384
366
|
|
|
385
367
|
|