From 66cfee806d63114c8e57d3428e26dfba44cecd51 Mon Sep 17 00:00:00 2001 From: Henrik Skov Midtiby Date: Sat, 16 Aug 2025 21:51:59 +0200 Subject: [PATCH] Modify setter to ensure that the type of config.window_size is a tuple[int, int] --- manim/_config/utils.py | 36 ++++++++++++++++++++++-- manim/renderer/opengl_renderer_window.py | 28 +++--------------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/manim/_config/utils.py b/manim/_config/utils.py index 31290f802a..e7169d7a3a 100644 --- a/manim/_config/utils.py +++ b/manim/_config/utils.py @@ -25,6 +25,7 @@ from typing import TYPE_CHECKING, Any, ClassVar, NoReturn import numpy as np +from screeninfo import get_monitors from manim import constants from manim.constants import RendererType @@ -143,6 +144,35 @@ def _determine_quality(qual: str) -> str: return qual +def _convert_window_size(window_size: str | tuple[int, int]) -> tuple[int, int]: + from manim.renderer.opengl_renderer import config + + monitors = get_monitors() + mon_index = config.window_monitor + monitor = monitors[min(mon_index, len(monitors) - 1)] + + if window_size == "default": + # make window_width half the width of the monitor + # but make it full screen if --fullscreen + window_width = monitor.width + if not config.fullscreen: + window_width //= 2 + + # by default window_height = 9/16 * window_width + window_height = int( + window_width * config.frame_height // config.frame_width, + ) + size = (window_width, window_height) + elif len(window_size.split(",")) == 2: + (window_width, window_height) = tuple(map(int, window_size.split(","))) + size = (window_width, window_height) + else: + raise ValueError( + "Window_size must be specified as 'width,height' or 'default'.", + ) + return size + + class ManimConfig(MutableMapping): """Dict-like class storing all config options. @@ -1417,13 +1447,13 @@ def window_position(self, value: str) -> None: self._d.__setitem__("window_position", value) @property - def window_size(self) -> str: + def window_size(self) -> tuple[int, int]: """The size of the opengl window as 'width,height' or 'default' to automatically scale the window based on the display monitor.""" return self._d["window_size"] @window_size.setter - def window_size(self, value: str) -> None: - self._d.__setitem__("window_size", value) + def window_size(self, value: str | tuple[int, int]) -> None: + self._d.__setitem__("window_size", _convert_window_size(value)) def resolve_movie_file_extension(self, is_transparent: bool) -> None: prev_file_extension = self.movie_file_extension diff --git a/manim/renderer/opengl_renderer_window.py b/manim/renderer/opengl_renderer_window.py index 4472ba6c2a..0f341dade0 100644 --- a/manim/renderer/opengl_renderer_window.py +++ b/manim/renderer/opengl_renderer_window.py @@ -25,37 +25,17 @@ class Window(PygletWindow): def __init__( self, renderer: OpenGLRenderer, - window_size: str = config.window_size, + window_size: tuple[int, int] = config.window_size, **kwargs: Any, ) -> None: monitors = get_monitors() mon_index = config.window_monitor monitor = monitors[min(mon_index, len(monitors) - 1)] - if window_size == "default": - # make window_width half the width of the monitor - # but make it full screen if --fullscreen - window_width = monitor.width - if not config.fullscreen: - window_width //= 2 - - # by default window_height = 9/16 * window_width - window_height = int( - window_width * config.frame_height // config.frame_width, - ) - size = (window_width, window_height) - elif len(window_size.split(",")) == 2: - (window_width, window_height) = tuple(map(int, window_size.split(","))) - size = (window_width, window_height) - else: - raise ValueError( - "Window_size must be specified as 'width,height' or 'default'.", - ) - - super().__init__(size=size) + super().__init__(size=window_size) self.title = f"Manim Community {__version__}" - self.size = size + self.size = window_size self.renderer = renderer mglw.activate_context(window=self) @@ -65,7 +45,7 @@ def __init__( self.swap_buffers() - initial_position = self.find_initial_position(size, monitor) + initial_position = self.find_initial_position(window_size, monitor) self.position = initial_position # Delegate event handling to scene.