|
8 | 8 |
|
9 | 9 | import gc
|
10 | 10 | import os
|
| 11 | +import sys |
11 | 12 | import time
|
12 | 13 | from typing import TYPE_CHECKING, Callable
|
13 | 14 |
|
@@ -143,6 +144,40 @@ def run(view: View | None = None) -> None:
|
143 | 144 |
|
144 | 145 | now = time.perf_counter()
|
145 | 146 | 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): # type: ignore |
| 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 # type: ignore |
| 171 | + |
| 172 | + eventloop.dispatch_event("on_enter") |
| 173 | + eventloop.is_running = True |
| 174 | + |
| 175 | + eventloop.platform_event_loop.nsapp_start(interval or 0) # type: ignore |
| 176 | + |
| 177 | + eventloop.run = patched_run # type: ignore |
| 178 | + |
| 179 | + pyglet.app.run(None) |
| 180 | + |
146 | 181 | else:
|
147 | 182 | # Start the standard event loop (blocking)
|
148 | 183 | # Note that we pass None as the interval here because we register
|
|
0 commit comments