Skip to content

Commit c2c34c8

Browse files
committed
patch pyglet event loop until it is fixed for macOS
1 parent 78061b9 commit c2c34c8

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

arcade/window_commands.py

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88

99
import gc
1010
import os
11+
import sys
1112
import time
12-
from typing import TYPE_CHECKING, Callable
13+
from typing import Callable, TYPE_CHECKING
1314

1415
import pyglet
1516

16-
from arcade.types import RGBA255, Color
17+
from arcade.types import Color, RGBA255
1718

1819
if TYPE_CHECKING:
1920
from arcade import Window
@@ -143,6 +144,40 @@ def run(view: View | None = None) -> None:
143144

144145
now = time.perf_counter()
145146
delta_time, last_time = now - last_time, now
147+
elif sys.platform == "darwin":
148+
# On macOS we have to patch the eventloop until a new pyglet version is released
149+
eventloop = pyglet.app.event_loop
150+
151+
def patched_run(interval=1 / 60):
152+
if interval is None:
153+
pass
154+
elif not interval:
155+
eventloop.clock.schedule(eventloop._redraw_windows)
156+
else:
157+
eventloop.clock.schedule_interval(eventloop._redraw_windows, interval)
158+
159+
eventloop.has_exit = False
160+
161+
from pyglet.window import Window
162+
163+
Window._enable_event_queue = False
164+
165+
# Dispatch pending events
166+
for window in pyglet.app.windows:
167+
window.switch_to()
168+
window.dispatch_pending_events()
169+
170+
eventloop.platform_event_loop = pyglet.app.platform_event_loop
171+
172+
eventloop.dispatch_event("on_enter")
173+
eventloop.is_running = True
174+
175+
eventloop.platform_event_loop.nsapp_start(interval or 0)
176+
177+
eventloop.run = patched_run
178+
179+
pyglet.app.run(None)
180+
146181
else:
147182
# Start the standard event loop (blocking)
148183
# Note that we pass None as the interval here because we register

0 commit comments

Comments
 (0)