From c2c34c82794295565a7d4a64a962ad514d8f6e47 Mon Sep 17 00:00:00 2001 From: Maic Siemering Date: Mon, 10 Mar 2025 21:24:59 +0100 Subject: [PATCH 1/2] patch pyglet event loop until it is fixed for macOS --- arcade/window_commands.py | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/arcade/window_commands.py b/arcade/window_commands.py index 92013ed513..fbfb2cceaa 100644 --- a/arcade/window_commands.py +++ b/arcade/window_commands.py @@ -8,12 +8,13 @@ import gc import os +import sys import time -from typing import TYPE_CHECKING, Callable +from typing import Callable, TYPE_CHECKING import pyglet -from arcade.types import RGBA255, Color +from arcade.types import Color, RGBA255 if TYPE_CHECKING: from arcade import Window @@ -143,6 +144,40 @@ def run(view: View | None = None) -> None: now = time.perf_counter() delta_time, last_time = now - last_time, now + elif sys.platform == "darwin": + # On macOS we have to patch the eventloop until a new pyglet version is released + eventloop = pyglet.app.event_loop + + def patched_run(interval=1 / 60): + if interval is None: + pass + elif not interval: + eventloop.clock.schedule(eventloop._redraw_windows) + else: + eventloop.clock.schedule_interval(eventloop._redraw_windows, interval) + + eventloop.has_exit = False + + from pyglet.window import Window + + Window._enable_event_queue = False + + # Dispatch pending events + for window in pyglet.app.windows: + window.switch_to() + window.dispatch_pending_events() + + eventloop.platform_event_loop = pyglet.app.platform_event_loop + + eventloop.dispatch_event("on_enter") + eventloop.is_running = True + + eventloop.platform_event_loop.nsapp_start(interval or 0) + + eventloop.run = patched_run + + pyglet.app.run(None) + else: # Start the standard event loop (blocking) # Note that we pass None as the interval here because we register From ec3367750f7bf4dd161013f1c9770f762e6a1513 Mon Sep 17 00:00:00 2001 From: Maic Siemering Date: Mon, 10 Mar 2025 22:00:16 +0100 Subject: [PATCH 2/2] fix typing --- arcade/window_commands.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/arcade/window_commands.py b/arcade/window_commands.py index fbfb2cceaa..da4c9e2123 100644 --- a/arcade/window_commands.py +++ b/arcade/window_commands.py @@ -10,11 +10,11 @@ import os import sys import time -from typing import Callable, TYPE_CHECKING +from typing import TYPE_CHECKING, Callable import pyglet -from arcade.types import Color, RGBA255 +from arcade.types import RGBA255, Color if TYPE_CHECKING: from arcade import Window @@ -148,7 +148,7 @@ def run(view: View | None = None) -> None: # On macOS we have to patch the eventloop until a new pyglet version is released eventloop = pyglet.app.event_loop - def patched_run(interval=1 / 60): + def patched_run(interval=1 / 60): # type: ignore if interval is None: pass elif not interval: @@ -167,14 +167,14 @@ def patched_run(interval=1 / 60): window.switch_to() window.dispatch_pending_events() - eventloop.platform_event_loop = pyglet.app.platform_event_loop + eventloop.platform_event_loop = pyglet.app.platform_event_loop # type: ignore eventloop.dispatch_event("on_enter") eventloop.is_running = True - eventloop.platform_event_loop.nsapp_start(interval or 0) + eventloop.platform_event_loop.nsapp_start(interval or 0) # type: ignore - eventloop.run = patched_run + eventloop.run = patched_run # type: ignore pyglet.app.run(None)