pyglet 3.0.dev11__tar.gz → 3.0.dev12__tar.gz

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